Centos 7.4部署PXC詳細記錄

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

mysqldumprsync的缺點是在數據傳輸過程中法規,PXC集羣將會變成只讀模式,SST將會對數據庫施加只讀鎖(FLUSH TABLES WITH READ LOCK)。而使用xtrabackup則不需要再數據同步過程中施加讀鎖,僅僅是同步.frm文件,類似於常規的備份。
IST用於只將數據的增量變化從一個節點複製到另一個節點。
儘管,如果SST使用xtrabackup不需要施加讀鎖,SST仍可能擾亂了服務的正常運行。而IST則不會。如果一個節點掉線時間較短,當再次上線,它將只會從其他節點獲取掉線期間的數據變化部分。IST是在節點上使用緩存機制實現的。每個節點包含一個緩存,且環形緩衝區(大小是可配置的)存儲最後N個變化,並且節點能夠傳輸該緩存的一部分。顯然,只有當傳輸所需的更改量小於N時,纔可以執行IST,如果超過N,則加入的節點必須執行SST。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章