Centos 7.4部署PXC詳細記錄
1,利用官方yum源安裝Percona-XtraDB-Cluster-57
實驗環境:
節點1:192.168.2.11
節點2:192.168.2.12
節點3:192.168.2.13
官方yum源地址:http://repo.percona.com/release/centos/latest/RPMS/x86_64/
或者執行以下命令安裝官方yum源repo配置文件:
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
在三個節點上配置好yum源後,分別執行以下命令安裝PXC:
yum install Percona-XtraDB-Cluster-57
遇到的問題:yum安裝失敗
報錯信息如下:
Transaction check error:
file /etc/my.cnf conflicts between attempted installs of Percona-XtraDB-Cluster-server-57-5.7.21-29.26.1.el7.x86_64 and MariaDB-common-10.2.11-1.el7.centos.x86_64
file /usr/lib64/mysql/plugin/dialog.so conflicts between attempted installs of Percona-XtraDB-Cluster-server-57-5.7.21-29.26.1.el7.x86_64 and MariaDB-common-10.2.11-1.el7.centos.x86_64
有兩文件存在衝突,應該是前面安裝mariadb的殘留文件。
於是刪除兩文件,再次yum安裝:
[root@node1 ~]#ls /etc/my.cnf
my.cnf my.cnf.d/
[root@node1 ~]#ls /etc/my.cnf.d/mysql-clients.cnf
/etc/my.cnf.d/mysql-clients.cnf
[root@node1 ~]#rm -rf /etc/my.cnf
[root@node1 ~]#rm -rf /etc/my.cnf.d/
但是再次報錯,信息如下:
Transaction check error:
file /etc/my.cnf conflicts between attempted installs of Percona-XtraDB-Cluster-server-57-5.7.21-29.26.1.el7.x86_64 and MariaDB-common-10.2.11-1.el7.centos.x86_64
file /usr/lib64/mysql/plugin/dialog.so conflicts between attempted installs of Percona-XtraDB-Cluster-server-57-5.7.21-29.26.1.el7.x86_64 and MariaDB-common-10.2.11-1.el7.centos.x86_64
猜測是否存在某個之前安裝的mariadb相關的程序包導致的衝突,於是使用yum remove "mariadb*"
命令,果然有兩個相關的依賴包存在。(我還試過MariaDB等關鍵字,但沒有有用信息。)
[root@node1 ~]#yum remove "mariadb*"
…… ……
Erasing : 2:postfix-2.10.1-6.el7.x86_64 1/2
Erasing : 1:mariadb-libs-5.5.56-2.el7.x86_64 2/2
Verifying : 1:mariadb-libs-5.5.56-2.el7.x86_64 1/2
Verifying : 2:postfix-2.10.1-6.el7.x86_64 2/2
Removed:
mariadb-libs.x86_64 1:5.5.56-2.el7
Dependency Removed:
postfix.x86_64 2:2.10.1-6.el7
Complete!
再次使用yum安裝Percona-XtraDB-Cluster-57成功。
另外,在安裝之前,建議關閉selinux和防火牆,或者在防火牆中開放以下端口:3306、4444、4567、4568,否則可能會導致服務啓動失敗。這四個端口在PXC集羣中的作用如下:
3306 數據庫對外提供服務的端口
4444 鏡像數據傳輸SST,集羣數據同步端口,全量同步,新節點加入時起作用
4567 集羣節點間相互通信的端口
4568 增量數據同步IST,節點下線、重啓後使用該端口,增量同步數據。
2,修改默認密碼
各節點安裝完成後需要啓動mysqld服務,在第一次啓動服務時PXC會創建隨機默認密碼並保存在日誌文件/var/log/mysqld.log
中,使用grep
命令搜索關鍵字temporary password
即可查看。
[root@node1 ~]#systemctl start mysqld
[root@node1 ~]#grep "temporary password" /var/log/mysqld.log
2018-05-27T00:29:52.534443Z 1 [Note] A temporary password is generated for root@localhost: rkMXb7doO>Pu
然後使用該密碼登錄mysql,並使用alter user
命令修改root賬戶密碼。
[root@node1 ~]#mysql -uroot -p'rkMXb7doO>Pu'
mysql> alter user 'root'@'localhost' identified by 'admin';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)
mysql> quit
3,修改各個節點的配置文件
在修改配置文件之前,需要先停止mysqld服務systemctl stop mysqld
,然後在節點1的配置文件/etc/my.cnf
中添加以下信息:
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so #Galera庫文件路徑
wsrep_cluster_name=pxc-cluster #集羣的邏輯名稱,各節點應該統一
wsrep_cluster_address=gcomm://192.168.2.11,192.168.2.12,192.168.2.13 #列出集羣內所有節點的IP
wsrep_node_name=pxc1 #當前節點的邏輯名稱
wsrep_node_address=192.168.2.11 #當前節點的IP
wsrep_sst_method=xtrabackup-v2 #全量同步(SST)方式
wsrep_sst_auth=sstuser:password #用於SST的賬戶信息(需要自行創建)
pxc_strict_mode=ENFORCING #PXC嚴格模式,建議開啓
binlog_format=ROW #binlog格式,PXC只支持格式爲ROW的binlog
default_storage_engine=InnoDB #PXC對InnoDB存儲引擎有最好的支持
innodb_autoinc_lock_mode=2 #在向有auto_increment 列的表插入數據時,PXC只支持interleaved(2)交錯鎖
節點2和節點3的配置文件同節點1,但分別有兩處配置需要修改:
節點2:
wsrep_node_name=pxc2
wsrep_node_address=192.168.2.12
節點3:
wsrep_node_name=pxc3
wsrep_node_address=192.168.2.13
4,初始化集羣
不同於通常的mysql服務啓動方式,節點1作爲初始化PXC集羣的節點,在初始化集羣啓動mysql服務時需要以比較特別的方式啓動:
systemctl start mysql@bootstrap.service
不幸的是,節點1啓動服務失敗:
[root@node2 ~]#systemctl start mysql@bootstrap.service
Job for mysql@bootstrap.service failed because the control process exited with error code. See "systemctl status [email protected]" and "journalctl -xe" for details.
錯誤信息如下:
[root@node1 ~]#systemctl status [email protected]
● mysql@bootstrap.service - Percona XtraDB Cluster with config /etc/sysconfig/mysql.bootstrap
Loaded: loaded (/usr/lib/systemd/system/mysql@.service; disabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Sun 2018-05-27 18:16:48 CST; 11s ago
Process: 4210 ExecStopPost=/usr/bin/mysql-systemd stop-post (code=exited, status=0/SUCCESS)
Process: 4168 ExecStop=/usr/bin/mysql-systemd stop (code=exited, status=2)
Process: 4010 ExecStartPost=/usr/bin/mysql-systemd start-post $MAINPID (code=exited, status=1/FAILURE)
Process: 4009 ExecStart=/usr/bin/mysqld_safe --basedir=/usr ${EXTRA_ARGS} (code=exited, status=1/FAILURE)
Process: 3951 ExecStartPre=/usr/bin/mysql-systemd start-pre (code=exited, status=0/SUCCESS)
Main PID: 4009 (code=exited, status=1/FAILURE)
May 27 18:16:48 node1.test.com mysql-systemd[4210]: my_print_defaults: [ERROR] Fatal error in defaults handling. Program aborted!
May 27 18:16:48 node1.test.com mysql-systemd[4210]: my_print_defaults: [ERROR] Found option without preceding group in config file /etc/...ine 13!
May 27 18:16:48 node1.test.com mysql-systemd[4210]: my_print_defaults: [ERROR] Fatal error in defaults handling. Program aborted!
May 27 18:16:48 node1.test.com mysql-systemd[4210]: my_print_defaults: [ERROR] Found option without preceding group in config file /etc/...ine 13!
May 27 18:16:48 node1.test.com mysql-systemd[4210]: my_print_defaults: [ERROR] Fatal error in defaults handling. Program aborted!
May 27 18:16:48 node1.test.com mysql-systemd[4210]: WARNING: mysql pid file /var/lib/mysql/node1.test.com.pid empty or not readable
May 27 18:16:48 node1.test.com mysql-systemd[4210]: WARNING: mysql may be already dead
May 27 18:16:48 node1.test.com systemd[1]: Failed to start Percona XtraDB Cluster with config /etc/sysconfig/mysql.bootstrap.
May 27 18:16:48 node1.test.com systemd[1]: Unit mysql@bootstrap.service entered failed state.
May 27 18:16:48 node1.test.com systemd[1]: mysql@bootstrap.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
查閱相關文檔後得知,需要在配置文件/etc/my.cnf
第一行添加[mysqld]
。而該文件的最初的配置如下:
[root@node1 ~]#cat /etc/my.cnf
#
# The Percona XtraDB Cluster 5.7 configuration file.
#
#
# * IMPORTANT: Additional settings that can override those from this file!
# The files must end with '.cnf', otherwise they'll be ignored.
# Please make any edits and changes to the appropriate sectional files
# included below.
#
!includedir /etc/my.cnf.d/
!includedir /etc/percona-xtradb-cluster.conf.d/
確實沒有[mysqld]
。同時,仔細研究PXC在/etc/my.cnf
被註釋了的補充配置文件中,可以發現[mysqld]
的相關配置信息:
[root@node1 ~]#cat /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
# Template my.cnf for PXC
# Edit to your requirements.
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=1
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7
現在在/etc/my.cnf
第一行添加[mysqld]
,然後重新啓動服務成功(節點2和節點3的也需要參照節點1在配置文件/etc/my.cnf
的第一行添加[mysqld]
)。
[root@node1 ~]#grep "^[^#]" /etc/my.cnf
[mysqld]
!includedir /etc/my.cnf.d/
!includedir /etc/percona-xtradb-cluster.conf.d/
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.2.11,192.168.2.12,192.168.2.13
wsrep_node_name=pxc1
wsrep_node_address=192.168.2.11
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:password
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
[root@node1 ~]#systemctl start mysql@bootstrap.service
[root@node1 ~]#systemctl status mysql@bootstrap.service
● mysql@bootstrap.service - Percona XtraDB Cluster with config /etc/sysconfig/mysql.bootstrap
Loaded: loaded (/usr/lib/systemd/system/mysql@.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2018-05-27 18:32:30 CST; 5s ago
Process: 4210 ExecStopPost=/usr/bin/mysql-systemd stop-post (code=exited, status=0/SUCCESS)
Process: 4168 ExecStop=/usr/bin/mysql-systemd stop (code=exited, status=2)
Process: 4419 ExecStartPost=/usr/bin/mysql-systemd start-post $MAINPID (code=exited, status=0/SUCCESS)
Process: 4378 ExecStartPre=/usr/bin/mysql-systemd start-pre (code=exited, status=0/SUCCESS)
Main PID: 4418 (mysqld_safe)
CGroup: /system.slice/system-mysql.slice/mysql@bootstrap.service
├─4418 /bin/sh /usr/bin/mysqld_safe --basedir=/usr --wsrep-new-cluster
└─4982 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --wsrep-provider=/...
監聽端口3306和4567:
[root@node1 ~]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
LISTEN 0 128 *:22 *:*
LISTEN 0 128 *:4567 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 80 :::3306 :::*
在初始化啓動節點1的mysql後,需要創建用於節點直接同步數據的賬戶。
mysql> GRANT RELOAD,LOCK TABLES,PROCESS,REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected, 1 warning (0.03 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.02 sec)
此處應注意,該賬戶只需要在節點1上創建即可,且賬戶的host爲localhost
。
可使用命令show status like 'wsrep%'
查看PXC集羣當前狀態:
mysql> show status like 'wsrep%';
+----------------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------------+--------------------------------------+
| wsrep_local_state_uuid | 1869fabe-6145-11e8-8589-9740e28b11bb |
| wsrep_protocol_version | 8 |
| wsrep_last_applied | 4 |
| wsrep_last_committed | 4 |
| wsrep_replicated | 2 |
| wsrep_replicated_bytes | 504 |
| wsrep_gcomm_uuid | 3d64d29d-6199-11e8-982a-8fce70c54ebc |
| wsrep_cluster_conf_id | 1 |
| wsrep_cluster_size | 1 |
| …… | …… |
| 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 <[email protected]> |
| wsrep_provider_version | 3.26(rac090bc) |
| wsrep_ready | ON |
+----------------------------------+--------------------------------------+
68 rows in set (0.00 sec)
參數wsrep_cluster_size
的值爲1,顯示當前PXC集羣只有一個節點。在初始化集羣過程中,要注意節點1的服務的啓動方式,下一步就是將其他節點加入集羣。
5,添加其他節點
其餘兩個節點按照正常啓動mysql方式即可,不需要按照節點1的bootstrap啓動方式:
systemctl start mysqld
進入mysql查看PXC集羣狀態:
[root@node2 ~]#mysql -uroot -padmin
mysql> show status like 'wsrep%';
+----------------------------------+-------------------------------------------------------+
| Variable_name | Value |
+----------------------------------+-------------------------------------------------------+
| wsrep_local_state_uuid | 1869fabe-6145-11e8-8589-9740e28b11bb |
| wsrep_protocol_version | 8 |
| wsrep_last_applied | 4 |
| wsrep_last_committed | 4 |
| …… | …… |
| wsrep_local_state_comment | Synced |
| …… | …… |
| wsrep_incoming_addresses | 192.168.2.11:3306,192.168.2.12:3306,192.168.2.13:3306 |
| 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 | 73c206cd-61c4-11e8-a802-4642ddf2cd8c |
| wsrep_cluster_conf_id | 7 |
| wsrep_cluster_size | 3 |
| wsrep_cluster_state_uuid | 1869fabe-6145-11e8-8589-9740e28b11bb |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| …… | …… |
| wsrep_provider_version | 3.26(rac090bc) |
| wsrep_ready | ON |
+----------------------------------+-------------------------------------------------------+
wsrep_cluster_size
顯示此時的集羣節點數爲3。
如果在這個過程中,節點2或者節點3的mysql服務無法啓動,可以從以下幾個方向着手:
(1)配置文件錯誤
(2)防火牆沒有開放相應的端口,比如默認的4567端口
(3)忘記進行授權賬號
(4)xtrabackup沒有安裝或者安裝有問題
兩個節點按照正常方式啓動mysql後,會按照配置文件自動加入PXC集羣。當所有節點添加完畢時,將節點1的mysql服務關閉,然後再以正常方式啓動mysql服務:
[root@node1 ~]#systemctl stop mysql@bootstrap
[root@node1 ~]#systemctl start mysql
[root@node1 ~]#systemctl status mysql
● mysql.service - Percona XtraDB Cluster
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2018-05-28 00:03:40 CST; 1min 31s ago
Process: 1873 ExecStopPost=/usr/bin/mysql-systemd stop-post (code=exited, status=0/SUCCESS)
Process: 1838 ExecStop=/usr/bin/mysql-systemd stop (code=exited, status=0/SUCCESS)
Process: 7155 ExecStartPost=/usr/bin/mysql-systemd start-post $MAINPID (code=exited, status=0/SUCCESS)
Process: 7114 ExecStartPre=/usr/bin/mysql-systemd start-pre (code=exited, status=0/SUCCESS)
Main PID: 7154 (mysqld_safe)
CGroup: /system.slice/mysql.service
├─7154 /bin/sh /usr/bin/mysqld_safe --basedir=/usr
└─7701 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib64/mysql/plugin --user=mysql --wsrep-provider=/...
6,同步測試
首先在節點上上創建數據庫,並寫入數據:
[root@node1 ~]#mysql -uroot -padmin
mysql> CREATE DATABASE percona;
Query OK, 1 row affected (0.02 sec)
mysql> USE percona;
Database changed
mysql> CREATE TABLE example (node_id INT PRIMARY KEY, node_name VARCHAR(30));
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO percona.example VALUES (1, 'percona1');
Query OK, 1 row affected (0.05 sec)
mysql> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
+---------+-----------+
1 row in set (0.00 sec)
在節點2和節點3上驗證數據是否同步:
[root@node2 ~]#mysql -uroot -padmin
mysql> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
+---------+-----------+
1 row in set (0.00 sec)
[root@node3 ~]#mysql -uroot -padmin
mysql> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
+---------+-----------+
1 row in set (0.00 sec)
然後分別在節點2和節點3上寫入數據:
節點2寫入數據:
mysql> INSERT INTO percona.example VALUES (3, 'percona3');
Query OK, 1 row affected (0.02 sec)
節點3寫入數據:
mysql> INSERT INTO percona.example VALUES (2, 'percona2');
Query OK, 1 row affected (0.05 sec)
在節點1上驗證數據是否同步:
mysql> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
| 2 | percona2 |
| 3 | percona3 |
+---------+-----------+
3 rows in set (0.00 sec)
PXC集羣內的所有節點均可寫入並同步複製到其他節點。
此時如果停止節點1的mysql服務,然後在其他節點寫入數據:
[root@node1 ~]#systemctl stop mysql
[root@node1 ~]#systemctl status mysql
● mysql.service - Percona XtraDB Cluster
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; vendor preset: disabled)
Active: inactive (dead) since Mon 2018-05-28 00:24:45 CST; 49s ago
Process: 34086 ExecStopPost=/usr/bin/mysql-systemd stop-post (code=exited, status=0/SUCCESS)
Process: 34051 ExecStop=/usr/bin/mysql-systemd stop (code=exited, status=0/SUCCESS)
Process: 30919 ExecStartPost=/usr/bin/mysql-systemd start-post $MAINPID (code=exited, status=0/SUCCESS)
Process: 30918 ExecStart=/usr/bin/mysqld_safe --basedir=/usr (code=exited, status=0/SUCCESS)
Process: 30878 ExecStartPre=/usr/bin/mysql-systemd start-pre (code=exited, status=0/SUCCESS)
Main PID: 30918 (code=exited, status=0/SUCCESS)
節點2寫入數據:
mysql> show status like 'wsrep_cluster%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_conf_id | 10 |
| wsrep_cluster_size | 2 |
| wsrep_cluster_state_uuid | 1869fabe-6145-11e8-8589-9740e28b11bb |
| wsrep_cluster_status | Primary |
+--------------------------+--------------------------------------+
4 rows in set (0.02 sec)
mysql> INSERT INTO percona.example VALUES (4, 'percona4');
Query OK, 1 row affected (0.02 sec)
wsrep_cluster_size
顯示此時的集羣節點數爲2。當再次啓動節點1的mysql服務,檢查節點2最近寫入的數據是否完成同步:
[root@node1 ~]#systemctl start mysql
[root@node1 ~]#mysql -uroot -padmin
mysql> SELECT * FROM percona.example;
+---------+-----------+
| node_id | node_name |
+---------+-----------+
| 1 | percona1 |
| 2 | percona2 |
| 3 | percona3 |
| 4 | percona4 |
+---------+-----------+
4 rows in set (0.00 sec)
由此可見,當集羣內的某個節點掉線後,其他節點仍可以正常的工作,新寫入的數據會在該節點重新上線後完成同步,以實現PXC的高可用。
針對重新上線的節點,PXC有兩種方式完成數據傳輸以保證數據同步:State Snapshot Transfer (SST)和Incremental State Transfer (IST)。
SST通常用在當有新的節點加入PXC集羣同時從已存在節點複製全部數據時採用,在PXC中有三種可用的方式完成SST過程:
– mysqldump
– rsync
– xtrabackup
mysqldump
和rsync
的缺點是在數據傳輸過程中法規,PXC集羣將會變成只讀模式,SST將會對數據庫施加只讀鎖(FLUSH TABLES WITH READ LOCK)。而使用xtrabackup
則不需要再數據同步過程中施加讀鎖,僅僅是同步.frm文件,類似於常規的備份。
IST用於只將數據的增量變化從一個節點複製到另一個節點。
儘管,如果SST使用xtrabackup
不需要施加讀鎖,SST仍可能擾亂了服務的正常運行。而IST則不會。如果一個節點掉線時間較短,當再次上線,它將只會從其他節點獲取掉線期間的數據變化部分。IST是在節點上使用緩存機制實現的。每個節點包含一個緩存,且環形緩衝區(大小是可配置的)存儲最後N個變化,並且節點能夠傳輸該緩存的一部分。顯然,只有當傳輸所需的更改量小於N時,纔可以執行IST,如果超過N,則加入的節點必須執行SST。