天天看點

基于Centos7的PXC叢集環境搭建1. PXC簡介2. PXC特性3. PXC優缺點4. PXC常識5. PXC叢集搭建6. PXC初始化主節點7. 啟動其他節點

1. PXC簡介

​ Percona XtraDB Cluster(下文簡稱PXC)是一個開源的MySQL高可用的解決方案,它內建了Percona伺服器和Percona XtraBackup和Galera庫共同運用的同步多主複制,也就是說PXC是基于Galere協定的高可用方案,Galera是Codership提供的多主資料同步複制機制,可以實作多個節點間的資料同步複制以及讀寫,并且可保障資料庫的服務高可用及資料一緻性。基于Galera的高可用方案主要有MariaDB Galera Cluster和Percona XtraDB Cluster,目前PXC用的會比較多一些,

  • PXC是由節點組成的,推薦配置至少3個節點,但是也可以運作在2個節點上;
  • 每個節點都是普通的MySQL/Percona伺服器,可以将現有的資料庫伺服器組成叢集,反之,也可以将叢集拆分成單獨的伺服器;
  • 每個節點都包含完整的資料副本;
  • MariaDB的叢集原理跟PXC一樣,maridb-cluster其實就是PXC,兩者原理是一樣的。

2. PXC特性

  1. 同步複制,事務要麼在節點中都送出要麼不送出;
  2. 多主複制,可以在任意節點進行Write-Read操作;
  3. 在從伺服器上并行應用事件,真正意義上的并行複制;
  4. 節點自動配置,資料一緻性,不再是異步複制;
  5. PXC最大的優勢:強一緻性、無同步延遲

3. PXC優缺點

  • 優點:
    1. 服務高可用;
    2. 資料同步複制(并發複制),幾乎無延遲;
    3. 多個節點支援同時讀寫,可實作寫擴充,不過最好事先進行分庫分表,讓各個節點分别寫不同的庫或者表,避免讓galera解決資料沖突;
    4. 新節點可以自動部署,部署操作簡單;
    5. 資料嚴格一緻性,尤其适合電商類應用(訂單,金額等敏感資料);
    6. 完全相容MySQL。
  • 缺點:
    1. 隻支援InnoDB引擎;低版本(5.6.20)的複制隻支援InnoDB引擎,其他存儲引擎的更改不複制。然而,DDL(Data Definition Language) 語句在statement級别被複制,并且,對mysql.*表的更改會基于此被複制。例如CREATE USER…語句會被複制,但是 INSERT INTO mysql.user…語句則不會;
    2. PXC叢集一緻性控制機制,事有可能被終止,原因如下:叢集允許在兩個節點上同時執行操作同一行的兩個事務,但是隻有一個能執行成功,另一個會被終止,叢集會給被終止的。用戶端傳回死鎖錯誤(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK));
    3. 寫入效率取決于節點中最弱的一台,因為PXC叢集采用的是強一緻性原則,一個更改操作在所有節點都成功才算執行成功;
    4. 所有表都需要有主鍵;
    5. 叢集吞吐量/性能取決于短闆;
    6. 新加入節點采用SST時代價高;
    7. 鎖沖突、死鎖問題相對更多。

4. PXC常識

  • 端口号

    3306:資料庫對外服務的端口号;

    4444:請求SST SST: 指資料一個鏡像傳輸 xtrabackup , rsync ,mysqldump;

    4567: 組成員之間進行溝通的一個端口号;

    4568: 傳輸IST用的。相對于SST來說的一個增量。

  • 名詞介紹

    WS:write set 寫資料集

    IST: Incremental State Transfer 增量同步

    SST:State Snapshot Transfer 全量同步

  • 狀态機變化階段

    OPEN: 節點啟動成功,嘗試連接配接到叢集,如果失敗則根據配置退出或建立新的叢集;

    PRIMARY: 節點處于叢集PC中,嘗試從叢集中選取donor進行資料同步;

    JOINER: 節點處于等待接收/接收資料檔案狀态,資料傳輸完成後在本地加載資料;

    JOINED: 節點完成資料同步工作,嘗試保持和叢集進度一緻;

    SYNCED:節點正常提供服務:資料的讀寫,叢集資料的同步,新加入節點的sst請求;

    DONOR(貢獻資料者):節點處于為新節點準備或傳輸叢集全量資料狀态,對用戶端不可用。

  • 狀态機變化因素

    新節點加入叢集;

    節點故障恢複;

    節點同步失敗。

  • 傳輸SST的方法

    mysqldump、xtrabackup、rsync

  • 配置檔案各項配置意義

    wsrep_provider:指定Galera庫的路徑

    wsrep_cluster_name:Galera叢集的名稱

    wsrep_cluster_address:Galera叢集中各節點位址。位址使用組通信協定gcomm://(group communication)

    wsrep_node_name:本節點在Galera叢集中的名稱

    wsrep_node_address:本節點在Galera叢集中的通信位址

    wsrep_sst_method:state_snapshot_transfer(SST)使用的傳輸方法,可用方法有mysqldump、rsync和xtrabackup,前兩者在傳輸時都需要對Donor加全局隻讀鎖(FLUSH TABLES WITH READ LOCK),xtrabackup則不需要(它使用percona自己提供的backup lock)。強烈建議采用xtrabackup

    wsrep_sst_auth:在SST傳輸時需要用到的認證憑據,格式為:“使用者:密碼”

    pxc_strict_mode:是否限制PXC啟用正在試用階段的功能,ENFORCING是預設值,表示不啟用

    binlog_format:二進制日志的格式。Galera隻支援row格式的二進制日志

    default_storage_engine:指定預設存儲引擎。Galera的複制功能隻支援InnoDB

    innodb_autoinc_lock_mode:隻能設定為2,設定為0或1時會無法正确處理死鎖問題

5. PXC叢集搭建

5.1 環境描述

本文檔所涉及IP均為虛假IP。
Name IP
master 192.168.5.139
test1 192.168.5.138
test2 192.168.5.137

​ 三個節點上的iptables與firewalld需先關閉,否則應開放3306、4444、4567、4568端口的通路,同時應關閉selinux。

5.2 安裝PXC

# 三台主機都需執行,安裝Persona倉庫
$ yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
# 執行指令修改SELINUX項
$ vi /etc/selinux/config 
	SELINUX=disabled # 修改該項為disabled
# Seliux安全子產品可能會對Percona XtraDB叢集的資料進行限制通路,最好的方法是更改模式為許可
$ setenforce 0
# 安裝PXC
$ yum -y --nogpgcheck install Percona-XtraDB-Cluster-57
# 開放相應端口(如無開啟防火牆可忽略)
$ firewall-cmd --zone=public --add-port=3306/tcp --permanent
$ firewall-cmd --zone=public --add-port=4444/tcp --permanent
$ firewall-cmd --zone=public --add-port=4567/tcp --permanent
$ firewall-cmd --zone=public --add-port=4568/tcp --permanent
$ firewall-cmd --reload
# 開啟PXC服務
$ systemctl start mysqld.service
           

5.3 接入MySQL

# 查詢MySQL臨時生成密碼
$ cat /var/log/mysqld.log | grep password
2019-06-28T10:02:12.733076Z 5 [Note] [MY-010454] [Server] A temporary password is generated for [email protected]: rldW%6_5J3h<
# 進入MySQL登入
$ mysql -u root -p
# 使用上述的臨時密碼進行登入
Enter password: rldW%6_5J3h<
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.26-29-57-log Percona XtraDB Cluster (GPL), Release rel29, Revision 03540a3, WSREP version 31.37, wsrep_31.37
# 通過指令修改登入密碼
mysql> alter user 'root'@'localhost' identified with mysql_native_password by '所要修改的密碼需包含大小寫字母、數字及特殊符号';
           

​ 預設密碼檢查政策要求必須包含:大小寫字母、數字和特殊符号,并且長度不能少于8位,否則會提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。

5.4 遠端通路授權

# 建立遠端通路使用者
mysql> create user 'root'@'%' identified with mysql_native_password by '遠端通路密碼';
Query OK, 0 rows affected (0.01 sec)
# 允許通路權限
mysql> grant all privileges on *.* to 'root'@'%' with grant option;
Query OK, 0 rows affected (0.01 sec)
# 重新整理權限清單
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
           

5.5 PXC配置

​ 下述配置根據節點不同進行配置。

# 停止MySQL服務
$ systemctl stop mysqld
# 修改配置檔案 配置節點
$ vi  /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
# 叢集中節點的IP位址(本機填最後)
wsrep_cluster_address=gcomm://ip位址,IP位址,本機IP位址(用,号隔開)
# In order for Galera to work correctly binlog format should be ROW
binlog_format=ROW
# MyISAM storage engine has only experimental support
default_storage_engine=InnoDB
# Slave thread to use
wsrep_slave_threads= 8
wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera
innodb_autoinc_lock_mode=2
# Node IP address
# 目前節點IP
wsrep_node_address=IP位址
# Cluster name
# 叢集名稱
wsrep_cluster_name=pxc-cluster
#If wsrep_node_name is not specified,  then system hostname will be used
# 目前節點名稱
wsrep_node_name=pxc-cluster-node-1
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER
# 不使用實驗功能
pxc_strict_mode=ENFORCING
# SST method
#狀态快照傳輸(sst)方法,官方建議
wsrep_sst_method=xtrabackup-v2
#Authentication for SST method
# 使用者憑證——用于同步(mysql的使用者名和密碼)
wsrep_sst_auth="使用者名:密碼"
           

6. PXC初始化主節點

# 其中一個節點使用以下指令啟動
$ systemctl start [email protected]
# 登入MySQL
$ mysql -u root -p
# 開啟wsrep_causal_reads
mysql> set wsrep_causal_reads =1;
# 建立配置檔案中對應的使用者(此步驟所有節點的IP都需要建立)
mysql> create user '對應配置檔案的使用者名'@'%' identified with mysql_native_password by '對應配置檔案的密碼';
# 給予權限
mysql> grant all privileges on *.* to '使用者名'@'%' with grant option;
# 重新整理權限表
mysql> flush privileges;
           

7. 啟動其他節點

# 其他節點采用以下指令進行啟動
$ systemctl start mysqld
# 同時根據上述 6 步驟進行配置
# 開啟wsrep_causal_reads
mysql> set wsrep_causal_reads =1;
# 建立配置檔案中對應的使用者(此步驟所有節點的IP都需要建立)
mysql> create user '對應配置檔案的使用者名'@'%' identified with mysql_native_password by '對應配置檔案的密碼';
# 給予權限
mysql> grant all privileges on *.* to '使用者名'@'%' with grant option;
# 重新整理權限表
mysql> flush privileges;
# 驗證叢集
mysql> show status like 'wsrep%';
+----------------------------------+---------------------------------------+
| Variable_name                    | Value                                 |
+----------------------------------+---------------------------------------+
| wsrep_local_state_uuid           | 8cae2eb0-9ccb-11e9-afcb-5ea6cd71dc63  |
| wsrep_protocol_version           | 9                                     |
...
| wsrep_incoming_addresses         | 192.168.5.137:3306,192.168.5.138,192.168.5.139: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                 | 380130ce-9ccd-11e9-9386-6a21f3d1896f  |
| wsrep_cluster_conf_id            | 6                                     |
| wsrep_cluster_size               | 3                                     |
| wsrep_cluster_state_uuid         | 8cae2eb0-9ccb-11e9-afcb-5ea6cd71dc63  |
| wsrep_cluster_status             | Primary                               |
| wsrep_connected                  | ON                                    |
| wsrep_local_bf_aborts            | 0                                     |
...
| wsrep_ready                      | ON                                    |
+----------------------------------+---------------------------------------+
71 rows in set (0.05 sec)
           

​ 至此PXC叢集搭建完成,可通過建庫驗證節點是否同步。

​ 服務的啟動和停止要對應

systemctl stop mysqld   ------>  啟動時用systemctl start mysqld
           

​ 或者

systemctl stop [email protected]   ----->  啟用是用 systemctl start [email protected] 
           

如果忘記root密碼,則按以下操作恢複:

​ 在[mysqld]的段中加上一句:skip-grant-tables 儲存并且退出vi。

mysql  -u root
update mysql.user set authentication_string=password('123qwe') where user='root' and Host = 'localhost';
flush privileges
           

繼續閱讀