Replication | PXC |
---|---|
數(shù)據(jù)同步是單向的,master負責(zé)寫,然后異步復(fù)制給slave;如果slave寫入數(shù)據(jù),不會復(fù)制給master。 | 數(shù)據(jù)同步時雙向的,任何一個mysql節(jié)點寫入數(shù)據(jù),都會同步到集群中其它的節(jié)點。 |
異步復(fù)制,從和主無法保證數(shù)據(jù)的一致性 | 同步復(fù)制,事務(wù)在所有集群節(jié)點要么同時提交,要么同時不提交 |
1.5 PXC 常用端口
名詞解釋:
與 MySQL 不同的是 PXC 官方提供了 Docker 鏡像,所以我們可以很方便的搭建 PXC 集群。
1)下載 Docker 鏡像
docker pull percona/percona-xtradb-cluster:5.7
重命名鏡像名稱
docker tag percona/percona-xtradb-cluster:5.7 pxc:5.7
3)刪除原始鏡像
docker rmi percona/percona-xtradb-cluster:5.7
創(chuàng)建 Docker 網(wǎng)絡(luò),用于 PXC 集群獨立使用
docker network create pxc-network
創(chuàng)建數(shù)據(jù)卷用于之后掛載
docker volume create --name v1 docker volume create --name v2 docker volume create --name v3
注:PXC容器只支持數(shù)據(jù)卷掛載方式,不支持目錄掛載
創(chuàng)建第一個節(jié)點
docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 pxc:5.7
因為后續(xù)節(jié)點的添加需要關(guān)聯(lián)到第一個節(jié)點,所以需要等待數(shù)據(jù)庫啟動完成。通過 docker logs pn1 查看日志,如果出現(xiàn)下面的輸出,證明啟動成功:
2019-09-04T06:27:30.085880Z 0 [Note] InnoDB: Buffer pool(s) load completed at 190904 6:27:30
注:CLUSTER_NAME 名稱不要用關(guān)鍵字PXC,否則無法啟動。
加入第二個節(jié)點
docker run -di --name=pn2 --net=pxc-network -p 9001:3306 -v v2:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn1 pxc:5.7
需要注意是第二個節(jié)點開始需要增加 e CLUSTER_JOIN=pn1 參數(shù),表示與 pn1 節(jié)點同步,否則 pn1 容器會自動關(guān)閉。
當 PXC集群中存在兩個節(jié)點以上之后就沒有主節(jié)點的概念了。集群中最后一個退出的節(jié)點就會變?yōu)橹鞴?jié)點,在 /var/lib/mysql/grastate.dat 文件中屬性 safe_to_bootstrap 的值 會從 0 被設(shè)置為 1 表示該節(jié)點是主節(jié)點。
8)加入第三個節(jié)點
docker run -di --name=pn3 --net=pxc-network -p 9002:3306 -v v3:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7
可以看到我們這次我們 CLUSTER_JOIN 的是 pn2 容器,可以證明我們剛剛說的 當 PXC 集群存在兩個節(jié)點以上之后就沒有主節(jié)點的概念了 這個說法是正確的。
9)進入 pn1 節(jié)點
docker exec -it pn1 /usr/bin/mysql -uroot -p123456
查看狀態(tài)
mysql> show status like 'wsrep%'; +----------------------------------+-------------------------------------------------+ | Variable_name | Value | +----------------------------------+-------------------------------------------------+ | wsrep_local_state_uuid | 068dd5e8-cedd-11e9-904d-466e75bd8fe1 | | wsrep_protocol_version | 9 | | wsrep_last_applied | 16 | | wsrep_last_committed | 16 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_received | 10 | | wsrep_received_bytes | 800 | | wsrep_local_commits | 0 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 2 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0.100000 | | wsrep_local_cached_downto | 0 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_flow_control_interval | [ 173, 173 ] | | wsrep_flow_control_interval_low | 173 | | wsrep_flow_control_interval_high | 173 | | wsrep_flow_control_status | OFF | | wsrep_cert_deps_distance | 0.000000 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 0 | | wsrep_cert_bucket_count | 22 | | wsrep_gcache_pool_size | 1592 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_open_transactions | 0 | | wsrep_open_connections | 0 | | wsrep_ist_receive_status | | | wsrep_ist_receive_seqno_start | 0 | | wsrep_ist_receive_seqno_current | 0 | | wsrep_ist_receive_seqno_end | 0 | | wsrep_incoming_addresses | 172.19.0.2:3306,172.19.0.3:3306,172.19.0.4:3306| | wsrep_cluster_weight | 3 | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | OPERATIONAL | | wsrep_gcomm_uuid | 11ed51e2-cedd-11e9-b362-af453a7ac074 | | wsrep_cluster_conf_id | 3 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | 068dd5e8-cedd-11e9-904d-466e75bd8fe1 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 0 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy info@codership.com> | | wsrep_provider_version | 3.37(rff05089) | | wsrep_ready | ON | +----------------------------------+-------------------------------------------------+ 71 rows in set (0.06 sec)
可以看到 wsrep_incoming_addresses 的值就是我們?nèi)齻€容器的IP地址
| wsrep_incoming_addresses | 172.19.0.2:3306,172.19.0.3:3306,172.19.0.4:3306 |
集群完整性檢查:
屬性 | 含義 |
---|---|
wsrep_cluster_state_uuid | 在集群所有節(jié)點的值應(yīng)該是相同的,有不同值的節(jié)點,說明其沒有連接入集群. |
wsrep_cluster_conf_id | 正常情況下所有節(jié)點上該值是一樣的.如果值不同,說明該節(jié)點被臨時”分區(qū)”了.當節(jié)點之間網(wǎng)絡(luò)連接恢復(fù) 的時候應(yīng)該會恢復(fù)一樣的值. |
wsrep_cluster_size | 如果這個值跟預(yù)期的節(jié)點數(shù)一致,則所有的集群節(jié)點已經(jīng)連接. |
wsrep_cluster_status | 集群組成的狀態(tài).如果不為”Primary”,說明出現(xiàn)”分區(qū)”或是”split-brain”腦裂狀況. |
節(jié)點狀態(tài)檢查:
屬性 | 含義 |
---|---|
wsrep_ready | 該值為 ON,則說明可以接受 SQL 負載.如果為 Off,則需要檢查 wsrep_connected |
wsrep_connected | 如果該值為 Off,且 wsrep_ready 的值也為 Off,則說明該節(jié)點沒有連接到集群.(可能是 wsrep_cluster_address 或 wsrep_cluster_name 等配置錯造成的.具體錯誤需要查看錯誤日志) |
wsrep_local_state_comment | 如果 wsrep_connected 為 On,但 wsrep_ready 為 OFF,則可以從該項查看原因 |
復(fù)制健康檢查:
屬性 | 含義 |
---|---|
wsrep_flow_control_paused | 表示復(fù)制停止了多長時間.即表明集群因為 Slave 延遲而慢的程度.值為 0~1,越靠近 0 越好,值為 1 表示 復(fù)制完全停止.可優(yōu)化 wsrep_slave_threads 的值來改善 |
wsrep_cert_deps_distance | 有多少事務(wù)可以并行應(yīng)用處理.wsrep_slave_threads 設(shè)置的值不應(yīng)該高出該值太多 |
wsrep_flow_control_sent | 表示該節(jié)點已經(jīng)停止復(fù)制了多少次 |
*wsrep_local_recv_queue_avg | 表示 slave 事務(wù)隊列的平均長度.slave 瓶頸的預(yù)兆. 最慢的節(jié)點的 wsrep_flow_control_sent 和 wsrep_local_recv_queue_avg 這兩個值最高.這兩個值較低的話,相對更好 |
檢測慢網(wǎng)絡(luò)問題:
屬性 | 含義 |
---|---|
wsrep_local_send_queue_avg | 網(wǎng)絡(luò)瓶頸的預(yù)兆.如果這個值比較高的話,可能存在網(wǎng)絡(luò)瓶頸 |
沖突或死鎖的數(shù)目:
屬性 | 含義 |
---|---|
wsrep_last_committed | 最后提交的事務(wù)數(shù)目 |
wsrep_local_cert_failures 和 wsrep_local_bf_aborts | 回滾,檢測到的沖突數(shù)目 |
在節(jié)點一上創(chuàng)建數(shù)據(jù)庫 test
mysql> create database test; Query OK, 1 row affected (0.02 sec)
節(jié)點二上查看:
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec)
在節(jié)點二上創(chuàng)建表
mysql> use test; Database changed mysql> create table sys_user(id int ,name varchar(30)); Query OK, 0 rows affected (0.11 sec)
4)在節(jié)點三上查看表結(jié)構(gòu)
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | sys_user | +----------------+ 1 row in set (0.00 sec)
在節(jié)點三上插入數(shù)據(jù)
mysql> insert into sys_user values(1,'a'); ERROR 1105 (HY000): Percona-XtraDB-Cluster prohibits use of DML command on a table (test.sys_user) without an explicit primary key with pxc_strict_mode = ENFORCING or MASTER
看到?jīng)]有顯示的主鍵就無法插入數(shù)據(jù),我們修改下表結(jié)構(gòu):
alter table sys_user add primary key (id);
插入數(shù)據(jù):
mysql> insert into sys_user values(1,'a'); Query OK, 1 row affected (0.05 sec)
6)在節(jié)點一查看表數(shù)據(jù)
mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | a | +----+------+ 1 row in set (0.00 sec)
可以看到三個節(jié)點數(shù)據(jù)正常同步,并且都可讀可寫。
當數(shù)據(jù)庫不夠用時,我們通常需要增加數(shù)據(jù)庫節(jié)點來分擔壓力,我們來演示一下新增節(jié)點的操作。
創(chuàng)建數(shù)據(jù)卷
docker volume create --name v4
2)新增容器
docker run -di --name=pn4 --net=pxc-network -p 9003:3306 -v v4:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn3 pxc:5.7
要注意的是,這次 CLUSTER_JOIN 連的是 pn3。
進入節(jié)點4查看數(shù)據(jù)
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> show tables; +----------------+ | Tables_in_test | +----------------+ | sys_user | +----------------+ 1 row in set (0.00 sec) mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | a | +----+------+ 1 row in set (0.00 sec)
可以看到之前的數(shù)據(jù)也自動同步過來了。
將節(jié)點pn4容器關(guān)閉,造成宕機現(xiàn)象
docker stop pn4
在節(jié)點 pn2 上做查看集群狀態(tài)
mysql> show status like 'wsrep%'; ...... | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 3 | ...... | wsrep_incoming_addresses | 172.19.0.4:3306,172.19.0.3:3306,172.19.0.2:3306 |
可以看到集群應(yīng)該有4個節(jié)點,但是現(xiàn)在只有3個正常連接。
3)在節(jié)點 pn2 上做修改操作
mysql> update sys_user set name='b' where id=1; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0
將節(jié)點 pn4 容器啟動
[root@VM_0_15_centos ~]# docker start pn4
進入容器 pn4 查看修改操作是否同步
docker exec -it pn4 /usr/bin/mysql -uroot -p123456
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | b | +----+------+ 1 row in set (0.00 sec)
可以看到節(jié)點正常加入集群,并且數(shù)據(jù)也同步了。
pn4 是以指定主節(jié)點形式進入 PXC 集群創(chuàng)建的容器,那么 pn1直接以自身為主節(jié)點啟動的容器會怎么樣呢?我們來演示一下:
關(guān)閉 pn1 節(jié)點
docker stop pn1
在 pn2 節(jié)點上插入一條數(shù)據(jù)
mysql> insert into sys_user values('2','c'); Query OK, 1 row affected (0.01 sec)
啟動 pn1節(jié)點
docker start pn1
等待一分鐘,查看容器啟動列表
docker ps -a
發(fā)現(xiàn) pn1 節(jié)點并沒有啟動
CONTAINER ID IMAGE ...... STATUS NAMES fa123563e787 pxc:5.7 ...... Exited (1) About a minute ago pn1
查看下錯誤日志:
docker logs pn1
異常信息如下:
2019-09-04T07:21:56.412918Z 0 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .
2019-09-04T07:21:56.412922Z 0 [ERROR] WSREP: Provider/Node (gcomm://) failed to establish connection with cluster (reason: 7)
2019-09-04T07:21:56.412929Z 0 [ERROR] Aborting
翻譯成中文:
2019-09-04T07:21:56.412918Z 0 [錯誤] WSREP:從此節(jié)點引導(dǎo)群集可能不安全。 它不是離開群集的最后一個,可能不包含所有更新。 要使用此節(jié)點強制群集引導(dǎo),請手動編輯grastate.dat文件并將safe_to_bootstrap設(shè)置為1。
2019-09-04T07:21:56.412922Z 0 [錯誤] WSREP:提供者/節(jié)點(gcomm://)無法與群集建立連接(原因:7)
2019-09-04T07:21:56.412929Z 0 [錯誤]中止
錯誤提示很明顯了,因為 pn1 節(jié)點不是最后一個離開集群的不能再以主節(jié)點的形式啟動了,如果要以主節(jié)點的形式啟動必須調(diào)整 grastate.dat文件中的 safe_to_bootstrap 參數(shù)為 1。
但是要注意的是因為集群中其他節(jié)點并沒有關(guān)閉,這樣啟動的容器跟之前的集群就沒有關(guān)系了數(shù)據(jù)也不會同步,我們來驗證下看看:
查看數(shù)據(jù)卷存放的路徑
docker volume inspect v1 [ { "CreatedAt": "2019-09-05T09:22:22+08:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/v1/_data", "Name": "v1", "Options": {}, "Scope": "local" } ]
進入數(shù)據(jù)卷目錄,查看是否存在 grastate.dat文件
[root@VM_0_15_centos ~]# cd /var/lib/docker/volumes/v1/_data [root@VM_0_15_centos _data]# ll total 323444 -rw-r----- 1 1001 1001 56 Sep 5 08:34 auto.cnf -rw------- 1 1001 1001 1680 Sep 5 08:34 ca-key.pem -rw-r--r-- 1 1001 1001 1120 Sep 5 08:34 ca.pem -rw-r--r-- 1 1001 1001 1120 Sep 5 08:34 client-cert.pem -rw------- 1 1001 1001 1676 Sep 5 08:34 client-key.pem -rw-r----- 1 1001 1001 2 Sep 5 08:34 fa123563e787.pid -rw-r----- 1 1001 1001 134219048 Sep 5 09:22 galera.cache -rw-r----- 1 1001 1001 113 Sep 5 09:21 grastate.dat -rw-r----- 1 1001 1001 1300 Sep 5 08:34 ib_buffer_pool -rw-r----- 1 1001 1001 79691776 Sep 5 09:15 ibdata1 -rw-r----- 1 1001 1001 50331648 Sep 5 09:15 ib_logfile0 -rw-r----- 1 1001 1001 50331648 Sep 5 08:34 ib_logfile1 -rw-r----- 1 1001 1001 12582912 Sep 5 08:38 ibtmp1 -rw-r----- 1 1001 1001 34751 Sep 5 08:38 innobackup.backup.log drwxr-x--- 2 1001 1001 4096 Sep 5 08:34 mysql drwxr-x--- 2 1001 1001 4096 Sep 5 08:34 performance_schema -rw------- 1 1001 1001 1676 Sep 5 08:34 private_key.pem -rw-r--r-- 1 1001 1001 452 Sep 5 08:34 public_key.pem -rw-r--r-- 1 1001 1001 1120 Sep 5 08:34 server-cert.pem -rw------- 1 1001 1001 1676 Sep 5 08:34 server-key.pem drwxr-x--- 2 1001 1001 12288 Sep 5 08:34 sys drwxr-x--- 2 1001 1001 4096 Sep 5 09:07 test -rw-r--r-- 1 1001 1001 143 Sep 5 09:22 version_info -rw-r----- 1 1001 1001 3932160 Sep 5 09:15 xb_doublewrite
編輯文件
vim grastate.dat
將 safe_to_bootstrap 參數(shù)值修改為1,保存退出
# GALERA saved state version: 2.1 uuid: 068dd5e8-cedd-11e9-904d-466e75bd8fe1 seqno: 20 safe_to_bootstrap: 1
重啟 pn1 容器
docker start pn1
進入容器,查看數(shù)據(jù)
docker exec -it pn1 /usr/bin/mysql -uroot -p123456
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | b | +----+------+ 1 row in set (0.01 sec)
發(fā)現(xiàn)數(shù)據(jù)并沒有同步,那么要怎么將 pn1 節(jié)點加入到集群中呢?
我們可以直接將 pn1 容器刪除,以加入節(jié)點的形式重新創(chuàng)建容器,并且因為我們之前已經(jīng)將容器的數(shù)據(jù)掛載到數(shù)據(jù)卷了,所以數(shù)據(jù)也不會存在丟失的風(fēng)險,我們來操作下:
刪除 pn1容器
docker stop pn1 docker rm pn1
以從節(jié)點方式加入集群
docker run -di --name=pn1 --net=pxc-network -p 9000:3306 -v v1:/var/lib/mysql --privileged -e MYSQL_ROOT_PASSWORD=123456 -e CLUSTER_NAME=cluster1 -e XTRABACKUP_PASSWORD=123456 -e CLUSTER_JOIN=pn2 pxc:5.7
等待容器初始化完畢
3)進入容器,查看數(shù)據(jù)是否同步
docker exec -it pn1 /usr/bin/mysql -uroot -p123456
mysql> use test; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select * from sys_user; +----+------+ | id | name | +----+------+ | 1 | b | | 2 | c | +----+------+ 2 rows in set (0.00 sec)
發(fā)現(xiàn)數(shù)據(jù)已經(jīng)同步了。
到此這篇關(guān)于MySQL之PXC集群搭建的方法步驟的文章就介紹到這了,更多相關(guān)MySQL PXC集群搭建 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!