1. 程式人生 > 實用技巧 >MySQL高可用架構——PXC叢集

MySQL高可用架構——PXC叢集

一、PXC簡介

PXC叢集是一個開源的MySQL高可用解決方案,它將Percona Server和Xtrabackup與Galera庫整合,以實現同步多主複製。基於Galera的高可用方案主要有MariaDB Galera Cluster(MGC)和Percona XtraDB Cluster(PXC),目前PXC架構在生產環境中用的更多而且更成熟些,PXC相比那些傳統的基於主從模式的叢集架構MHA和雙主,PXC最突出的特點就是解決了詬病已久的複製延遲問題,基本上可以達到實時同步。而且節點與節點之間,它們互相的關係是對等的。本身Galera Cluster也是一種多主架構。PXC是在儲存引擎層實現的同步複製,而非非同步複製,所以其資料的一致性是相當高的。

其工作原理如下:

要搭建PXC架構至少需要三臺MySQL例項來組成一個叢集,三個例項之間不是主從模式,而是各自為主,所以三者之間的關係是對等的,不分主從,這也叫multi-master架構,客戶端讀寫時,連線哪個例項都是一樣的,讀取到的資料是相同的,寫入任意一個例項後,叢集會將自己新寫入的資料同步到其他例項上,這種架構不共享任何資料,是一種高冗餘的MySQL叢集架構。

1.1 PXC叢集優缺點

優點

  • 實現了MySQL叢集的高可用性和資料的強一致性;
  • 完成了真正的多節點讀寫的叢集方案;
  • 改善了主從複製延遲的問題,基本上達到了實時同步;
  • 新加入的節點可以自動同步資料,無需提前手動備份,維護方便;
  • 由於是多節點寫入,所以資料庫故障切換很容易;

缺點

  • 加入新節點時開銷大,因為新增新節點時,必須從現有節點之一複製完整的資料集,如果現有的資料庫中資料為100GB,則複製100GB;
  • 任何更新的事務都需要全域性驗證通過,才會在其他節點上執行,叢集效能受限於最差的節點,也就是所謂的短板效應(木桶定律);
  • 因為需要保證資料的一致性,PXC採用的實時基於儲存引擎層來實現同步複製,所以在多節點併發寫入時,鎖衝突問題比較嚴重;
  • 存在寫擴大的問題,所有節點上都會發生寫操作,對於寫負載較大的場景,不推薦使用PXC;
  • 僅支援Innodb儲存引擎;

1.2 PXC工作原理

PXC的操作流程大體是這樣的,首先客戶端向請求連線的寫入節點提交事務之前,由該節點將需要產生的replication writeset廣播出去,然後獲取全域性事務ID,一併傳送到其它的節點上去。其它節點通過certification合併資料之後,發現沒有衝突資料,便執行apply_cb和commit_cb操作,否則就discard此次事務。

而當前節點(客戶端請求的寫入節點)通過驗證之後,執行commit_cb操作,並返回OK給客戶端。如果驗證沒有通過,則rollback_cb。

在生產線上的PXC叢集中,至少要有三臺節點。如果其中一個節點沒有驗證通過,出現了資料衝突,那麼此時採取的方式就是將出現資料不一致的節點踢出叢集,而且它會自動執行shutdown命令來自動關機。

1.3 PXC中重要概念

首先要規範叢集中節點的數量,整個叢集節點數控制在最少3個、最多8個的範圍內。最少3個是為了防止腦裂現象,因為只有在兩個節點的情況下才會出現腦裂。腦裂的表現就是輸出任何命令,返回結果都是unkown command。

當一個新節點要加入PXC叢集的時候,需要從叢集中各節點裡選舉出一個doner節點作為全量資料的貢獻者。PXC有兩種節點的資料傳輸方式,一種叫SST全量傳輸,另一種叫IST增量傳輸。SST傳輸有XtraBackup、mysqldump、rsync三種方式,而增量傳輸只有XtraBackup。一般資料量不大的時候可以使用SST作為全量傳輸,但也只使用XtraBackup方式。

節點在叢集中,會因新節點的加入或故障,同步失效等而發生狀態的切換,下面列舉出這些狀態的含義:

  • open:節點啟動成功,嘗試連線到叢集;
  • primary:節點已在叢集中,在新節點加入叢集時,選取donor進行資料同步時會產生式的狀態;
  • joiner:節點處於等待接收同步資料檔案的狀態;
  • joined:節點已完成了資料同步,嘗試保持和叢集中其它節點進度一致;
  • synced:節點正常提供服務的狀態,表示已經同步完成並和叢集進度保持一致;
  • doner:節點處於為新加入節點提供全量資料時的狀態;

二、部署PXC叢集

2.1 環境準備

OS hostname IP
Centos 7.5 pxc-01 192.168.1.1
Centos 7.5 pxc-02 192.168.1.2
Centos 7.5 pxc-03 192.168.1.3

注:所有主機都是不需要提前安裝MySQL服務的,在PXC的原始碼包中包括了MySQL服務的!
注:以下操作,三臺節點都需進行操作,如果是在單獨節點執行,會特別說明!

2.2 安裝依賴

[root@pxc-01 ~]# yum install -y libev lsof perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib \
perl-DBD-MySQL perl-DBI perl-Digest perl-Digest-MD5 perl-IO-Compress \
perl-Net-Daemon perl-PlRPC socat openssl openssl-devel

2.3 解除安裝mariadb

[root@pxc-01 ~]# yum -y erase mariadb && rpm -qa | grep mariadb | xargs rpm -e --nodeps

2.4 獲取所需軟體包

xtraBackupPercona-XtraDB-Clusterqpress

[root@pxc-01 ~]# wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.18/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm
[root@pxc-01 ~]# wget http://www.quicklz.com/qpress-11-linux-x64.tar
#上面這個包使用wget可能會報錯406,用瀏覽器開啟連結下載再上傳到伺服器即可。
[root@pxc-01 ~]# wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.28-31.41/binary/tarball/Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz
#這個包下載的話,時間會稍微長一些,耐心等待。

2.5 配置qpress命令並安裝xtrabackup

[root@pxc-01 ~]# tar xf qpress-11-linux-x64.tar -C /usr/bin
[root@pxc-01 ~]# rpm -ivh percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm

2.6 部署PXC服務

[root@pxc-01 ~]# useradd -M -r -s /bin/false mysql 
[root@pxc-01 ~]# tar zxf Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz
[root@pxc-01 ~]# mv Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101 /usr/local/mysql
[root@pxc-01 ~]# mkdir -p /usr/local/mysql/data
[root@pxc-01 ~]# chown -R mysql.mysql /usr/local/mysql/
[root@pxc-01 ~]# echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@pxc-01 ~]# source /etc/profile

2.7 定義MySQL服務的配置檔案

① pxc-01節點完整配置檔案
[root@pxc-01 ~]# cat > /etc/my.cnf << EOF
# Example: Percona XtraDB Cluster 5.7
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt="\u@\h \R:\m:\s[\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = db.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
#query_cache_size = 0
#query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
log-error = /usr/local/mysql/data/error.log
long_query_time = 0.1
server-id = 1813306
log-bin = /usr/local/mysql/data/mysql-bin
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row    #為了讓Galera正確工作,binlog格式應該是ROW
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
#innodb_max_undo_log_size = 4G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
# PXC  以上都是關於資料庫優化的一些資訊,大多數為可選配置,與pxc有關的都是下面的引數
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_name=my_pxc_cluster
wsrep_cluster_address=gcomm://192.168.1.1,192.168.1.2,192.168.1.3
wsrep_node_name=pxc01
wsrep_node_address=192.168.1.1
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:pwd@123
pxc_strict_mode=ENFORCING  
default_storage_engine=InnoDB    #myisam儲存引擎只能在測試環境中使用
innodb_autoinc_lock_mode=2    #此InnoDB自動增量鎖定模式是Galera強制的
[mysqldump]
quick
max_allowed_packet = 32M
EOF

PXC相關的部分引數解釋如下:

  • wsrep_provider:指定所需外掛的路徑(預設有這個外掛);
  • wsrep_provider_options="gcache.size=1G":Gcache環形緩衝區的大小,在啟動時預先分配,預設為10M。該配置還有其他選項:gcache.size代表用來快取寫集增量資訊的大小。它的預設大小是128MB,通過wsrep_provider_options變數引數設定。建議調整為2G-4G範圍,足夠的空間便於快取更多的增量資訊;
  • gcache.mem_size代表Gcache中記憶體快取的大小,適度調大可以提高整個叢集的效能;
  • gcache.page_size可以理解為如果記憶體不夠用(Gcache不足),就直接將寫集寫入到磁碟檔案中;
  • wsrep_cluster_name:此引數定義節點的邏輯叢集名稱,所有參與叢集的節點必須指定相同的名稱;
  • wsrep_cluster_address:使用此引數來確定群集中其他節點的IP地址,當前唯一支援生產的後端模式是gcomm;
  • wsrep_node_name:此引數用於設定節點自身的邏輯名稱;
  • wsrep_node_address:用於指定當前節點的IP地址;
  • wsrep_sst_method:用於指定資料同步的方法,建議使用xtrabackup-v2;
  • wsrep_sst_auth:定義要在sst複製資料時使用的使用者及密碼(資料庫節點必須要有指定的使用者及密碼);
  • pxc_strict_mode:嚴格模式,官方建議該引數值為ENFORCING。有了這個配置,那麼資料庫中建立的任何表都必須有主鍵,否則無法寫入資料;

更多更詳細的PXC引數解釋請移步:MySQL wsrep選項,會有驚奇的發現,同時,若要修改上面的配置項,還是建議去看詳細的選項解釋。

② pxc-02節點完整配置檔案

與pxc-01節點相比,只有三處不能一樣,下面都標註了出來!

root@pxc-02 ~]# cat > /etc/my.cnf << EOF
# Example: Percona XtraDB Cluster 5.7
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt="\u@\h \R:\m:\s[\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = db.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
#query_cache_size = 0
#query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
log-error = /usr/local/mysql/data/error.log
long_query_time = 0.1
server-id = 1813307                   # server-id不可以一樣
log-bin = /usr/local/mysql/data/mysql-bin
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row   
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
#innodb_max_undo_log_size = 4G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
# PXC  
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_name=my_pxc_cluster
wsrep_cluster_address=gcomm://192.168.1.1,192.168.1.2,192.168.1.3
wsrep_node_name=pxc02             # 節點的邏輯名稱不可以一樣
wsrep_node_address=192.168.1.2    #這裡的IP地址是本機的,當然也不一樣
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:pwd@123
pxc_strict_mode=ENFORCING
default_storage_engine=InnoDB 
innodb_autoinc_lock_mode=2    
[mysqldump]
quick
max_allowed_packet = 32M
EOF
③ pxc-03節點完整配置檔案

同樣,不能一樣的還是那三處配置,分別是server-id、節點邏輯名稱,以及節點IP地址。

[root@pxc-03 ~]# cat > /etc/my.cnf <<EOF
# Example: Percona XtraDB Cluster 5.7
[client]
port = 3306
socket = /tmp/mysql.sock
[mysql]
prompt="\u@\h \R:\m:\s[\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /tmp/mysql.sock
pid-file = db.pid
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
#query_cache_size = 0
#query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/data/slow.log
log-error = /usr/local/mysql/data/error.log
long_query_time = 0.1
server-id = 1813308
log-bin = /usr/local/mysql/data/mysql-bin
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row   
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
#innodb_max_undo_log_size = 4G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 4
innodb_read_io_threads = 4
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
# PXC  
wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_name=my_pxc_cluster
wsrep_cluster_address=gcomm://192.168.1.1,192.168.1.2,192.168.1.3
wsrep_node_name=pxc03
wsrep_node_address=192.168.1.3
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:pwd@123
pxc_strict_mode=ENFORCING
default_storage_engine=InnoDB 
innodb_autoinc_lock_mode=2    
[mysqldump]
quick
max_allowed_packet = 32M
EOF

2.8 各個節點初始化MySQL服務並開啟防火牆相關埠

[root@pxc-01 ~]# mysqld --initialize --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
#初始化MySQL服務
[root@pxc-01 ~]# firewall-cmd --permanent --add-port={3306,4567,4444,4568}/tcp
#開啟防火牆相關埠
[root@pxc-01 ~]# firewall-cmd --reload
[root@pxc-01 ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens33
  sources: 
  services: ssh dhcpv6-client
  ports: 3306/tcp 4567/tcp 4444/tcp 4568/tcp    #確認埠已新增
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

相關埠資訊如下:

  • 3306:mysql服務埠;
  • 4567:叢集通訊埠;
  • 4444:SST(State Snaphot Transfer)埠;
  • 4568:IST(Incremental State Transfer)埠;

注:接下來的操作,如沒有特殊宣告,都是在pxc-01節點上進行。

2.9 pxc-01節點初始化叢集

[root@pxc-01 ~]# mysqld --defaults-file=/etc/my.cnf --wsrep_new_cluster &
[root@pxc-01 ~]#  ss -anptl | grep mysql
LISTEN     0      128          *:4567                     *:*                   users:(("mysqld",pid=60655,fd=11))
LISTEN     0      128         :::3306                    :::*                   users:(("mysqld",pid=60655,fd=24))

2.10 在pxc01主機檢視初始密碼並登入到MySQL

[root@pxc-01 ~]# grep password /usr/local/mysql/data/error.log 
2020-04-24T08:44:25.856326Z 1 [Note] A temporary password is generated for root@localhost: 98,6c!Or(2kv
[root@pxc-01 ~]# mysql -uroot -p'98,6c!Or(2kv'
root@localhost 22:22: [(none)]> alter user root@localhost identified by '123.com';
#修改root使用者的初始密碼,才能進行其他操作
root@localhost 22:22: [(none)]> grant all privileges on *.* to sst@localhost identified by 'pwd@123';
# 建立配置檔案中指定的sst賬號,密碼一定要和配置檔案中指定的密碼一致

2.11 將其他節點新增到叢集

注:以下操作需要在每個要加入到pxc-01叢集中的節點上執行,我這裡是分別在pxc-02和pxc-03節點上執行的。

[root@pxc-02 ~]# mysqld --defaults-file=/etc/my.cnf &
[root@pxc-02 ~]# ss -anltp | grep mysql   
#耐心等待一會,當發現3306埠在監聽,則表示資料已同步,該節點已經加入到叢集中
LISTEN     0      128          *:4567                     *:*                   users:(("mysqld",pid=61731,fd=11))
LISTEN     0      128         :::3306                    :::*                   users:(("mysqld",pid=61731,fd=36))
#啟動成功後的節點,直接可以使用pxc-01節點設定的root密碼進行資料庫登入操作
#因為pxc-01節點的資料庫資訊已經同步到了本地資料庫節點。
[root@pxc-02 ~]# mysql -uroot -p123.com

2.12 驗證複製功能

在pxc-01節點建立庫及表
[root@pxc-01 ~]# mysql -uroot -p123.com
root@localhost 22:23: [(none)]> create database test01;
root@localhost 22:24: [(none)]> use test01
root@localhost 22:31: [test01]> create table t1(id int primary key,name varchar(10));

# 分別在三個節點上插入一條資料
# pxc-01:
root@localhost 22:31: [test01]> insert into t1(id,name) values(1,'張三');
# pxc-02:
root@localhost 22:33: [(none)]> insert into test01.t1(id,name) values(2,'李四');
# pxc-03:
root@localhost 22:33: [(none)]> insert into test01.t1(id,name) values(3,'王五');

最後,在任意節點檢視剛新建的表,它的資料應該都是以下這樣的:

root@localhost 22:35: [test01]> select * from test01.t1;
+----+--------+
| id | name   |
+----+--------+
|  1 | 張三   |
|  2 | 李四   |
|  3 | 王五   |
+----+--------+

2.13 新增MySQL為系統服務

新增為系統服務後,以後再啟停服務就不需要想第一次啟動服務一樣使用mysqld命令來啟動了,而是直接使用systemctl命令管理MySQL服務即可。

[root@pxc-01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
#拷貝指令碼檔案
[root@pxc-01 ~]# chkconfig --add mysqld    #新增為系統服務
[root@pxc-01 ~]# chkconfig mysqld on    #加入開機自啟

至此,這三個節點都加入到了這個叢集當中,以後若要新增其他的節點到該叢集中,只要進行和pxc-02或pxc-03節點一樣的配置即可(pxc-01節點的配置有些許不一樣,因為它是群集中的第一個節點)。

2.14 檢視叢集狀態

[root@pxc-01 ~]# mysql -uroot -p123.com
root@localhost 22:37: [(none)]> show global status like 'wsrep_cluster_s%';
+--------------------------+--------------------------------------+
| Variable_name            | Value                                |
+--------------------------+--------------------------------------+
| wsrep_cluster_size       | 3                                    |
| wsrep_cluster_state_uuid | da41833f-8607-11ea-8427-4e3fe6ff89a7 |
| wsrep_cluster_status     | Primary                              |
+--------------------------+--------------------------------------+

引數解釋如下:

  • wsrep_cluster_size:當前群集中節點的數量;
  • wsrep_cluster_state_uuid:群集的UUID,同一個叢集中的UUID值必須是一致的;
  • wsrep_cluster_status:群集組成的狀態,值為primary表示正常。以下是各個不同狀態值的解釋:
    • open:節點啟動成功,嘗試連線到叢集;
    • primary:節點已在叢集中,在新節點加入叢集時,選取donor進行資料同步時會產生式的狀態;
    • joiner:節點處於等待接收同步資料檔案的狀態;
    • joined:節點已完成了資料同步,嘗試保持和叢集中其它節點進度一致;
    • synced:節點正常提供服務的狀態,表示已經同步完成並和叢集進度保持一致;
    • doner:節點處於為新加入節點提供全量資料時的狀態;
root@localhost 22:38: [(none)]> show global status like 'wsrep_local_state';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| wsrep_local_state | 4     |
+-------------------+-------+

wsrep_local_state:顯示當前節點狀態,值為4表示正常。該狀態有四個值:

  • joining:表示節點正在加入叢集;
  • doner:節點處於為新加入節點提供全量資料時的狀態;
  • joined:當前節點已成功加入叢集;
  • synced:當前節點與叢集中各節點是同步狀態;