溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySQL中PXC集群的介紹

發(fā)布時間:2020-05-27 14:37:02 來源:億速云 閱讀:448 作者:鴿子 欄目:MySQL數(shù)據(jù)庫

一、PXC介紹

參考:Percona官方

PXC是一個開源的MySQL高可用解決方案,它將Percona Server和Xtrabackup與Galera庫集成,以實現(xiàn)同步多主復(fù)制。基于Galera的高可用方案主要有MariaDB Galera Cluster(MGC)和Percona XtraDB Cluster(PXC),目前PXC架構(gòu)在生產(chǎn)環(huán)境中用的更多而且更成熟些,PXC相比那些傳統(tǒng)的基于主從模式的集群架構(gòu)MHA和雙主,PXC最突出的特點就是解決了詬病已久的復(fù)制延遲問題,基本上可以達(dá)到實時同步。而且節(jié)點與節(jié)點之間,它們互相的關(guān)系是對等的。本身Galera Cluster也是一種多主架構(gòu)。PXC是在存儲引擎層實現(xiàn)的同步復(fù)制,而非異步復(fù)制,所以其數(shù)據(jù)的一致性是相當(dāng)高的。

要搭建PXC架構(gòu)至少需要三臺MySQL實例來組成一個集群,三個實例之間不是主從模式,而是各自為主,所以三者之間的關(guān)系是對等的,不分主從,這也叫multi-master架構(gòu),客戶端讀寫時,連接哪個實例都是一樣的,讀取到的數(shù)據(jù)是相同的,寫入任意一個實例后,集群會將自己新寫入的數(shù)據(jù)同步到其他實例上,這種架構(gòu)不共享任何數(shù)據(jù),是一種高冗余的MySQL集群架構(gòu)。

1、PXC優(yōu)缺點

優(yōu)點:

  • 實現(xiàn)了MySQL集群的高可用性和數(shù)據(jù)的強一致性。
  • 完成了真正的多節(jié)點讀寫的集群方案。
  • 改善了主從復(fù)制延遲的問題,基本上達(dá)到了實時同步。
  • 新加入的節(jié)點可以自動同步數(shù)據(jù),無需提前手動備份,維護方便。
  • 由于是多節(jié)點寫入,所以數(shù)據(jù)庫故障切換很容易。

缺點:

  • 加入新節(jié)點時開銷大,因為添加新節(jié)點時,必須從現(xiàn)有節(jié)點之一復(fù)制完整的數(shù)據(jù)集,如果現(xiàn)有的數(shù)據(jù)庫中數(shù)據(jù)為100GB,則復(fù)制100GB。
  • 任何更新的事務(wù)都需要全局驗證通過,才會在其他節(jié)點上執(zhí)行,集群性能受限于最差的節(jié)點,也就是所謂的短板效應(yīng)(木桶定律)。
  • 因為需要保證數(shù)據(jù)的一致性,PXC采用的實時基于存儲引擎層來實現(xiàn)同步復(fù)制,所以在多節(jié)點并發(fā)寫入時,鎖沖突問題比較嚴(yán)重。
  • 存在寫擴大的問題,所有節(jié)點上都會發(fā)生寫操作,對于寫負(fù)載較大的場景,不推薦使用PXC。
  • 僅支持Innodb存儲引擎。

2、PXC工作原理

PXC的操作流程大體是這樣的,首先客戶端向請求連接的寫入節(jié)點提交事務(wù)之前,由該節(jié)點將需要產(chǎn)生的replication writeset廣播出去,然后獲取全局事務(wù)ID,一并傳送到其它的節(jié)點上去。其它節(jié)點通過certification合并數(shù)據(jù)之后,發(fā)現(xiàn)沒有沖突數(shù)據(jù),便執(zhí)行apply_cb和commit_cb操作,否則就discard此次事務(wù)。
而當(dāng)前節(jié)點(客戶端請求的寫入節(jié)點)通過驗證之后,執(zhí)行commit_cb操作,并返回OK給客戶端。如果驗證沒有通過,則rollback_cb。
在生產(chǎn)線上的PXC集群中,至少要有三臺節(jié)點。如果其中一個節(jié)點沒有驗證通過,出現(xiàn)了數(shù)據(jù)沖突,那么此時采取的方式就是將出現(xiàn)數(shù)據(jù)不一致的節(jié)點踢出集群,而且它會自動執(zhí)行shutdown命令來自動關(guān)機。

3、PXC中的重要概念

首先要規(guī)范集群中節(jié)點的數(shù)量,整個集群節(jié)點數(shù)控制在最少3個、最多8個的范圍內(nèi)。最少3個是為了防止腦裂現(xiàn)象,因為只有在兩個節(jié)點的情況下才會出現(xiàn)腦裂。腦裂的表現(xiàn)就是輸出任何命令,返回結(jié)果都是unkown command。
當(dāng)一個新節(jié)點要加入PXC集群的時候,需要從集群中各節(jié)點里選舉出一個doner節(jié)點作為全量數(shù)據(jù)的貢獻(xiàn)者。PXC有兩種節(jié)點的數(shù)據(jù)傳輸方式,一種叫SST全量傳輸,另一種叫IST增量傳輸。SST傳輸有XtraBackup、mysqldump、rsync三種方式,而增量傳輸只有XtraBackup。一般數(shù)據(jù)量不大的時候可以使用SST作為全量傳輸,但也只使用XtraBackup方式。

節(jié)點在集群中,會因新節(jié)點的加入或故障,同步失效等而發(fā)生狀態(tài)的切換,下面列舉出這些狀態(tài)的含義:

  • open:節(jié)點啟動成功,嘗試連接到集群
  • primary:節(jié)點已在集群中,在新節(jié)點加入集群時,選取donor進(jìn)行數(shù)據(jù)同步時會產(chǎn)生式的狀態(tài)。
  • joiner:節(jié)點處于等待接收同步數(shù)據(jù)文件的狀態(tài)。
  • joined:節(jié)點已完成了數(shù)據(jù)同步,嘗試保持和集群中其它節(jié)點進(jìn)度一致。
  • synced:節(jié)點正常提供服務(wù)的狀態(tài),表示已經(jīng)同步完成并和集群進(jìn)度保持一致。
  • doner:節(jié)點處于為新加入節(jié)點提供全量數(shù)據(jù)時的狀態(tài)。

二、部署PXC集群

1、環(huán)境準(zhǔn)備

OS主機名IP
Cent OS 7.5pxc-01192.168.20.2
Cent OS 7.5pxc-02192.168.20.3
Cent OS 7.5pxc-03192.168.20.4

注:所有主機都是不需要提前安裝MySQL服務(wù)的,在PXC的源碼包中包括了MySQL服務(wù)的。

注:2-8小結(jié)的所有操作,三臺節(jié)點都是需要執(zhí)行的。如果有什么是不需要在三臺節(jié)點都執(zhí)行的,我會特別說明的。

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

3、卸載Mariadb

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

4、下載所需軟件包(xtraBackup、Percona-XtraDB-Cluster及qpress)

[root@pxc-01 bin]# 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 bin]# wget http://www.quicklz.com/qpress-11-linux-x64.tar
#上面這個包使用wget可能會報錯406,用瀏覽器打開鏈接下載再上傳到服務(wù)器即可。
[root@pxc-01 bin]# 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
#這個包下載的話,時間會稍微長一些,耐心等待。

5、配置qpress命令并安裝xtrabackup

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

6、部署PXC服務(wù)

#創(chuàng)建MySQL系統(tǒng)用戶
[root@pxc-01 bin]# useradd -M -r -s /bin/false mysql 
#解包
[root@pxc-01 bin]# tar zxf Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz
#移動到指定目錄
[root@pxc-01 bin]# mv Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101 /usr/local/mysql
#創(chuàng)建data目錄并更改目錄屬主屬組為MySQL
[root@pxc-01 bin]# mkdir -p /usr/local/mysql/data
[root@pxc-01 bin]# chown -R mysql.mysql /usr/local/mysql/
#為MySQL命令配置全局變量
[root@pxc-01 bin]# echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
[root@pxc-01 bin]# source /etc/profile

7、定義MySQL服務(wù)的配置文件

1)pxc-01完整配置文件如下:
[root@pxc-01 bin]# cat /etc/my.cnf
# 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格式應(yīng)該是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  以上都是關(guān)于數(shù)據(jù)庫優(yōu)化的一些信息,大多數(shù)為可選配置,與pxc有關(guān)的都是下面的參數(shù)
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.20.2,192.168.20.3,192.168.20.4
wsrep_node_name=pxc01
wsrep_node_address=192.168.20.2
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sst:pwd@123
pxc_strict_mode=ENFORCING  
default_storage_engine=InnoDB    # myisam存儲引擎只能在測試環(huán)境中使用
innodb_autoinc_lock_mode=2    # 此 InnoDB 自動增量鎖定模式是 Galera 強制的
[mysqldump]
quick
max_allowed_packet = 32M

PXC相關(guān)的部分參數(shù)解釋如下:

  • wsrep_provider:指定所需插件的路徑(默認(rèn)有這個插件)。
  • wsrep_provider_options="gcache.size=1G":Gcache環(huán)形緩沖區(qū)的大小,在啟動時預(yù)先分配,默認(rèn)為10M。該配置還有其他選項:gcache.size代表用來緩存寫集增量信息的大小。它的默認(rèn)大小是128MB,通過wsrep_provider_options變量參數(shù)設(shè)置。建議調(diào)整為2G-4G范圍,足夠的空間便于緩存更多的增量信息。
    gcache.mem_size代表Gcache中內(nèi)存緩存的大小,適度調(diào)大可以提高整個集群的性能。
    gcache.page_size可以理解為如果內(nèi)存不夠用(Gcache不足),就直接將寫集寫入到磁盤文件中。
  • wsrep_cluster_name:此參數(shù)定義節(jié)點的邏輯集群名稱,所有參與集群的節(jié)點必須指定相同的名稱。
  • wsrep_cluster_address:使用此參數(shù)來確定群集中其他節(jié)點的IP地址,當(dāng)前唯一支持生產(chǎn)的后端模式是gcomm。
  • wsrep_node_name:此參數(shù)用于設(shè)置節(jié)點自身的邏輯名稱。
  • wsrep_node_address:用于指定當(dāng)前節(jié)點的IP地址。
  • wsrep_sst_method:用于指定數(shù)據(jù)同步的方法,建議使用xtrabackup-v2
  • wsrep_sst_auth:定義要在sst復(fù)制數(shù)據(jù)時使用的用戶及密碼(數(shù)據(jù)庫節(jié)點必須要有指定的用戶及密碼)
  • pxc_strict_mode:嚴(yán)格模式,官方建議該參數(shù)值為ENFORCING。有了這個配置,那么數(shù)據(jù)庫中創(chuàng)建的任何表都必須有主鍵,否則無法寫入數(shù)據(jù)。

更多更詳細(xì)的PXC參數(shù)解釋請移步:MySQL wsrep選項,會有驚奇的發(fā)現(xiàn),同時,若要修改上面的配置項,還是建議去看詳細(xì)的選項解釋。

2)pxc-02節(jié)點完整配置文件如下:

與pxc-01節(jié)點相比,只有三處不能一樣,下面都標(biāo)注了出來

[root@pxc-02 src]# cat /etc/my.cnf 
# 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.20.2,192.168.20.3,192.168.20.4
wsrep_node_name=pxc02             # 節(jié)點的邏輯名稱不可以一樣
wsrep_node_address=192.168.20.3     #這里的IP地址是本機的,當(dāng)然也不一樣
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
3)pxc-03完整配置文件如下:

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

[root@pxc-03 src]# cat /etc/my.cnf 
# 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.20.2,192.168.20.3,192.168.20.4
wsrep_node_name=pxc03
wsrep_node_address=192.168.20.4
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

8、各個節(jié)點初始化MySQL服務(wù)并開啟防火墻相關(guān)端口

#初始化MySQL服務(wù)
[root@pxc-01 ~]# mysqld --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/ --initialize
#開啟防火墻相關(guān)端口
[root@pxc-01 ~]# firewall-cmd --permanent --add-port={3306,4567,4444,4568}/tcp
success
[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    #確認(rèn)端口已添加
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

相關(guān)端口信息如下:

  • mysql服務(wù)端口:3306
  • 集群通訊端口:4567
  • SST(State Snaphot Transfer)端口:4444
  • IST(Incremental State Transfer)端口:4568

注:接下來的操作,如沒有特殊聲明,都是在pxc-01節(jié)點上進(jìn)行。

9、引導(dǎo)pxc-01節(jié)點初始化集群

[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=61739,fd=11))
LISTEN     0      128         :::3306                    :::*                   users:(("mysqld",pid=61739,fd=31))

10、在pxc01主機查看初始密碼并登錄到MySQL

# 查看初始密碼
[root@pxc-01 ~]# grep password /usr/local/mysql/data/error.log 
2020-02-26T13:11:29.770228Z 1 [Note] A temporary password is generated for root@localhost: j?wh;jn=7uB.
#登錄數(shù)據(jù)庫,由于有特殊字符,所以要給密碼用單引號引起來
[root@pxc-01 ~]# mysql -uroot -p'j?wh;jn=7uB.'    
#修改root用戶的初始密碼,才能進(jìn)行其他操作。
root@localhost 21:47: [(none)]> alter user root@localhost identified by '123.com';
# 創(chuàng)建配置文件中指定的sst賬號,密碼一定要和配置文件中指定的密碼一致。
root@localhost 21:47: [(none)]> grant all privileges on *.* to sst@localhost identified by 'pwd@123';

11、將其他節(jié)點添加到集群

注:以下操作需要在每個要加入到pxc-01集群中的節(jié)點上執(zhí)行,我這里是分別在pxc-02和pxc-03節(jié)點上執(zhí)行的。

[root@pxc-02 src]# mysqld --defaults-file=/etc/my.cnf &
[1] 61731
[root@pxc-02 src]# ss -anltp | grep mysql    #此刻新加入集群的節(jié)點,正在從群集內(nèi)的節(jié)點中同步數(shù)據(jù)
LISTEN     0      128          *:4567                     *:*                   users:(("mysqld",pid=61731,fd=11))
[root@pxc-02 src]# ss -anltp | grep mysql   
#耐心等待一會,當(dāng)發(fā)現(xiàn)3306端口在監(jiān)聽,則表示數(shù)據(jù)已同步,該節(jié)點已經(jīng)加入到集群中
LISTEN     0      128          *:4567                     *:*                   users:(("mysqld",pid=61731,fd=11))
LISTEN     0      128         :::3306                    :::*                   users:(("mysqld",pid=61731,fd=36))
#啟動成功后的節(jié)點,直接可以使用pxc-01節(jié)點設(shè)置的root密碼進(jìn)行數(shù)據(jù)庫登錄操作
#因為pxc-01節(jié)點的數(shù)據(jù)庫信息已經(jīng)同步到了本地數(shù)據(jù)庫節(jié)點。
[root@pxc-02 src]# mysql -uroot -p123.com

12 、驗證復(fù)制功能

在pxc-01節(jié)點創(chuàng)建庫及表
[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));

# 分別在三個節(jié)點上插入一條數(shù)據(jù)
# 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,'王五');


13、添加MySQL為系統(tǒng)服務(wù)

添加為系統(tǒng)服務(wù)后,以后再啟停服務(wù)就不需要想第一次啟動服務(wù)一樣使用mysqld命令來啟動了,而是直接使用systemctl start mysqld命令即可。

#拷貝腳本文件
[root@pxc-01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@pxc-01 ~]# chkconfig --add mysqld    #添加為系統(tǒng)服務(wù)
[root@pxc-01 ~]# chkconfig mysqld on    #加入開機自啟

至此,這三個節(jié)點都加入到了這個集群當(dāng)中,以后若要添加其他的節(jié)點到該集群中,只要進(jìn)行和pxc-02或pxc-03節(jié)點一樣的配置即可(pxc-01節(jié)點的配置有些許不一樣,因為它是群集中的第一個節(jié)點)。

14、查看集群狀態(tài)

上述參數(shù)解釋如下:

  • wsrep_cluster_size:當(dāng)前群集中節(jié)點的數(shù)量。
  • wsrep_cluster_state_uuid:群集的UUID,同一個集群中的UUID值必須是一致的。
  • wsrep_cluster_status:群集組成的狀態(tài),值為primary表示正常。以下是各個不同狀態(tài)值的解釋:
    • open:節(jié)點啟動成功,嘗試連接到集群。
    • primary:節(jié)點已在集群中,在新節(jié)點加入集群時,選取donor進(jìn)行數(shù)據(jù)同步時會產(chǎn)生式的狀態(tài)。
    • joiner:節(jié)點處于等待接收同步數(shù)據(jù)文件的狀態(tài)。
    • joined:節(jié)點已完成了數(shù)據(jù)同步,嘗試保持和集群中其它節(jié)點進(jìn)度一致。
    • synced:節(jié)點正常提供服務(wù)的狀態(tài),表示已經(jīng)同步完成并和集群進(jìn)度保持一致。
    • doner:節(jié)點處于為新加入節(jié)點提供全量數(shù)據(jù)時的狀態(tài)。

wsrep_local_state:顯示當(dāng)前節(jié)點狀態(tài),值為4表示正常。該狀態(tài)有四個值:

  • joining:表示節(jié)點正在加入集群
  • doner:節(jié)點處于為新加入節(jié)點提供全量數(shù)據(jù)時的狀態(tài)。
  • joined:當(dāng)前節(jié)點已成功加入集群。
  • synced:當(dāng)前節(jié)點與集群中各節(jié)點是同步狀態(tài)。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI