1.快速入門
實驗環境:
Node | Host | IP |
---|---|---|
Node1 | pxc1 | 192.168.70.61 |
Node2 | pxc2 | 192.168.70.62 |
Node3 | pxc3 | 192.168.70.63 |
1.1 安裝Percona-XtraDb-Cluster
yum源:
[percona]
name=percona_repo
baseurl = https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled = 1
gpgcheck = 0
yum -y install Percona-XtraDB-Cluster-57
注意,裝了Percona-XtraDB-Cluster就自帶好了Percona-mysql,不要再裝MySQL,不要再裝MySQL,不要再裝MySQL。不止一個人因為這個問題,PXC死活啟動不了。典型錯誤提示:
unknown variable 'wsrep_provider=/usr/lib64/libgalera_smm.so'
1.2 提供配置檔案
第一個節點配置檔案/etc/my.cnf
[mysqld]
server-id=100 # 各節點不同
datadir=/data
socket=/data/mysql.sock
log-error=/data/error.log
pid-file=/data/mysqld.pid
log-bin=/data/master-bin
log_slave_updates
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63
wsrep_node_name=pxc1 # 各節點不同
wsrep_node_address=192.168.70.61 # 各節點不同
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
第二個節點配置檔案
[mysqld]
server-id=110 # 各節點不同
datadir=/data
socket=/data/mysql.sock
log-error=/data/error.log
pid-file=/data/mysqld.pid
log-bin=/data/master-bin
log_slave_updates
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63
wsrep_node_name=pxc2 # 各節點不同
wsrep_node_address=192.168.70.62 # 各節點不同
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
第三個節點配置檔案
[mysqld]
server-id=120 # 各節點不同
datadir=/data
socket=/data/mysql.sock
log-error=/data/error.log
pid-file=/data/mysqld.pid
log-bin=/data/master-bin
log_slave_updates
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://192.168.70.61,192.168.70.62,192.168.70.63
wsrep_node_name=pxc3 # 各節點不同
wsrep_node_address=192.168.70.63 # 各節點不同
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:passw0rd
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
配置檔案各項配置意義:
- 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加全局隻讀鎖(
),xtrabackup則不需要(它使用percona自己提供的backup lock)。強烈建議采用xtrabackupFLUSH TABLES WITH READ LOCK
- 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時會無法正确處理死鎖問題
1.3 引導Galera中的第一個節點
引導啟動Galera叢集。
/etc/init.d/mysql bootstrap-pxc
# 或
systemctl start [email protected]
引導後,檢視狀态:
[email protected]> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |
| ... | ... |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| ... | ... |
| wsrep_cluster_size | 1 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| ... | ... |
| wsrep_ready | ON |
+----------------------------+--------------------------------------+
上述狀态表示,該Galera叢集中隻有一個節點,狀态為Synced(4),表示資料已同步完成(因為是第一個引導節點,無資料需要同步)。角色為Primary,且已經完全連接配接并準備好,connected和ready狀态決定了該節點是否是Galera中的正式成員,正式成員才能向外提供MySQL服務。
正确引導了第一個節點後,需要在第一個節點(Galera的初始化引導節點)上建立SST的認證使用者,注意這個使用者名和密碼需要和配置檔案中的對應。
create user 'sstuser'@localhost identified by 'passw0rd';
grant reload,lock tables,process,replication client on *.* to 'sstuser'@localhost;
flush privileges;
1.4 向Galera中加入第二、第三個節點
加入節點非常簡單,隻需正常啟動MySQL服務即可,在啟動時會讀取配置檔案,并根據配置自動加入到對應的Galera叢集中。
#### 在第二個節點上執行
/etc/init.d/mysql start
#### 在第三個節點上執行
/etc/init.d/mysql start
檢視各節點狀态:
[email protected]> show status like 'wsrep%';
+----------------------------+--------------------------------------+
| Variable_name | Value |
+----------------------------+--------------------------------------+
| wsrep_local_state_uuid | c2883338-834d-11e2-0800-03c9c68e41ec |
| ... | ... |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
| ... | ... |
| wsrep_cluster_size | 3 |
| wsrep_cluster_status | Primary |
| wsrep_connected | ON |
| ... | ... |
| wsrep_ready | ON |
+----------------------------+--------------------------------------+
可見這兩個節點已經完成了資料同步,且已經是Galera叢集中的正式成員,可以向外提供MySQL服務。
注意,一個節點加入到Galera叢集有兩種情況:新節點加入叢集、暫時離組的成員再次加入叢集。
1.新節點加入Galera叢集
新節點加入叢集時,需要從目前叢集中選擇一個Donor節點來同步資料,也就是所謂的state_snapshot_tranfer(SST)過程。SST同步資料的方式由選項wsrep_sst_method決定,一般選擇的是xtrabackup。
必須注意,新節點加入Galera時,會删除新節點上所有已有資料,再通過xtrabackup(假設使用的是該方式)從Donor處完整備份所有資料進行恢複。是以,如果資料量很大,新節點加入過程會很慢。而且,在一個新節點成為Synced狀态之前,不要同時加入其它新節點,否則很容易将叢集壓垮。
如果是這種情況,可以考慮使用wsrep_sst_method=rsync來做增量同步,既然是增量同步,最好保證新節點上已經有一部分資料基礎,否則和全量同步沒什麼差別,且這樣會對Donor節點加上全局read only鎖。
2.舊節點加入Galera叢集
如果舊節點加入Galera叢集,說明這個節點在之前已經在Galera叢集中呆過,有一部分資料基礎,缺少的隻是它離開叢集時的資料。這時加入叢集時,會采用IST(incremental snapshot transfer)傳輸機制,即使用增量傳輸。
但注意,這部分增量傳輸的資料源是Donor上緩存在GCache檔案中的,這個檔案有大小限制,如果缺失的資料範圍超過已緩存的内容,則自動轉為SST傳輸。如果舊節點上的資料和Donor上的資料不比對(例如這個節點離組後人為修改了一點資料),則自動轉為SST傳輸。
關于GCache以及Galera是如何判斷資料狀态的,本文不展開描述,可參見Understanding GCache in Galera
1.5 驗證Galera叢集是否正确工作
可在不同節點上寫入資料、不同節點上查詢資料,看看個節點上資料能否同步。