解決主要得問題:
無論是一主多從,還是多主架構,數據同步都是基於二進制日志完成,如果某子一節點掛了,都需要及時的,手動的去提升一個子節點為主節點。
Galera Cluster介紹:
它是一個集成了galera插件的mysql集群(采用了多主集群架構)。更是是一種新型的,數據不共享的,高度冗余的高可用方案(數據一致性,完整性,性能無法與單台單台機器相比)。目前galera cluster有兩個版本。一個是Percona Xtradb Cluster以及Mariadb Cluster。
Galera Cluster優缺點:
優點:
多主結構:數據在任何時候讀寫都是最新的(比如:數據的更新操作,當一個節點收到請求后都需要與其他節點進行校驗,校驗之后在更新本地數據,最后在同步)
故障切換:在數據庫出現故障時,因為支持多點寫入,切換容易
熱插拔:在服務期間,如果數據庫掛了,只需要停止該節點的數據庫服務,不影整個集群(其他節點)。而且如果該節點修復后,只需啟動數據庫服務即可自動加入集群環境(原集群配置環境還存在)
同步復制:在集群種的不同節點之間數據同步,沒有延遲,而且單個節點數據庫掛了之后,數據不會丟失
並發復制:支持並行執行,提升性能
自動節點克隆:在新增節點時,增量數據(即在基礎數據上發送變化的數據)或基礎數據無需手動備份提供,因為新增節點上mysql服務一旦開啟,它將自動拉取在線節點數據。
缺點:
新節點加入需要全量拷貝數據,有時會導致數據同步的提供者無法提供讀寫,只有等待整個拷貝完成。
只支持innodb存儲引擎
而且集群的性能取決於集群中性能最差的節點的性能(全局校驗過程)
Galera Cluster工作流程(不一定准確,自己的理解):
Galera Cluster包括兩個組件
1. Galera replication library (galera-3)
2.WSREP:MySQL extended with the Write Set Replication
提示:PXC(Percona XtraDB Cluster)是Percona對Galera的實現。
MariaDB Galera Cluster是mariadb對Galera的實現。
兩者都需要至少三個節點(至多8個節點),且不能安裝mysql-server或mairadb-server
RPM包
PXC:
https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
MariaDB Galera Cluster:
https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.X/yum/centos7-amd64/
先介紹PXC(Percona XtraDB Cluster)
1.使用到的端口:(4個)
3306:數據庫對外服務的端口
444:請求SST(State Snapshot Transfer,全量數據傳送)的端口號
4567:組成員之間進行溝通的端口號
4568:用於傳輸IST(Incremental State Transfer,增量數據傳送)的端口號
2.節點狀態的變化階段
OPEN:節點啟動成功,嘗試連接到集群時的狀態
PRIMARY:節點已處於集群中,在新節點加入並選取donor進行數據同步時的狀態
JOINER:節點處於等待接收同步文件時的狀態
JOINERD:節點完成數據同步工作,嘗試保持和集群進度一致時的狀態
SYNCED:節點正常提供服務時的狀態,表示已經同步完成並和集群進度保持一致
DONOR(數據的提供者):節點處於為新加入的節點提供全量數據時的狀態
3.GCache模塊:
在PXC中一個特別重要的模塊,它的核心功能就是為每個節點緩存當前最新的寫集。
如果有新節點加入進來,就可以把新數據的增量傳遞給新節點,而不需要再使用SST傳輸方式,這
樣可以讓節點更快地加入集群中。建議優化的參數如下:
gcache size:緩存寫集增量信息的大小,它的默認大小是128MB,通過wsrep_provider_options
參數設置,建議調整為2GB~4GB范圍,足夠的空間便於緩存更多的增量信息
gcache.mem_size:GCache中內存緩存的大小,適度調大可以提高整個集群的性能
gcache.page_size:如果內存不夠用(GCache不足),就直接將寫集寫入磁盤文件中
演示percona XtraDB Cluster(pxc5.7)
環境准備:
以三台主機為例(centos7),各自的ip地址分別為:10.0.0.113,10.0.0.114,10.0.0.115
如果主機安裝了mysql或mariadb必須先卸載。
關閉防火牆和selinux,時間要同步:
關閉防火牆方法:
查看狀態:systemctl status firewalld
臨時關閉:systemctl stop firewalld
永久關閉:systemctl disable firewalld
禁用selinux方法:
查看狀態:getenforce
臨時禁用:setenforce 0
永久關閉:將/etc/sysconfig/selinux中SELINUX改為disabled,必須重啟才能有效。
為了演示方便區分主機(節點),這里將其主機名分別改為pxe1,pxe2,pxe3
方法如下:
臨時修改:hostname pxe1
永久關閉:hostnamectl set-hostname pxe1
此處使用清華大學的yum源為例,安裝pxc5.7。
[root@pxe1 ~]# vi /etc/yum.repos.d/pxe.repo
[percona]
name=percona_repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled=1
gpgcheck=0
然后將其傳送到10.0.0.114,10.0.0.115主機上,並且安裝Percona-XtraDB-Cluster-57(這里可以用任何方式【如:scp命令,ansible工具等】)
[root@pxe1 ~]#scp /etc/yum.repos.d/pxe.repo 10.0.0.114:/etc/yum.repos.d/pxe.repo
[root@pxe1 ~]#scp /etc/yum.repos.d/pxe.repo 10.0.0.115:/etc/yum.repos.d/pxe.repo
[root@pxc1 ~]#yum install Percona-XtraDB-Cluster-57 -y
[root@pxc2 ~]#yum install Percona-XtraDB-Cluster-57 -y
[root@pxc3 ~]#yum install Percona-XtraDB-Cluster-57 -y
#此命令可以查看安裝后生成的所有文件
[root@pxc1 ~]#rpm -ql rpm -ql Percona-XtraDB-Cluster-server-57
在各個節點上分別配置mysql及集群配置文件:
/etc/my.cnf:主配置文件
也包括其他三個配置文件:mysqld.cnf,mysqld_safe.cnf,wsrep.cnf
修改的文件:
1. mysqld.cnf(可選),為例保證其server_id與各個節點不同,以及log_bin二進制日志功能
2./etc/percona-xtradb-cluster.conf.d/wsrep.cnf。必需改
[root@pxe1 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so #指定Galera庫的路徑
wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115 #Galera集群中各節點地址。gcomm:// [地址使用組通信協議]
binlog_format=ROW #二進制日志的格式。目前只支持row格式
default_storage_engine=InnoDB #指定默認引擎,但目前只支持innoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2 #只能設置為2,設置為0或1時無法正確處理思索問題
wsrep_cluster_name=pxc-cluster #集群名稱,可自定義,但各個節點需與之保持一致
wsrep_node_address=10.0.0.113 #本節點在Galera集群中的通信地址,也是本機ip地址
wsrep_node_name=pxc-cluster-node-1 #本節點在Galera集群中的通信名稱,可自定義
pxc_strict_mode=ENFORCING #是否限制PXC啟用正在試用階段的功能,ENFORCING是默認值,表示不啟用
wsrep_sst_method=xtrabackup-v2 #state_snapshot_transfer(SST)使用的傳輸方法
wsrep_sst_auth="sstuser:s3cretPass" 在SST傳輸時需要用到的認證憑據,格式為:"用戶:密碼",可自定義,但各個節點需與之保持一致.而且此賬號還不存在,需要創建並授權
[root@pxe2 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.114
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-2
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
[root@pxe3 ~]# grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.115
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-3
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
啟動第一個節點(在三個主機選任何一個主機都可以,這里選擇10.0.0.113)。注意:第一個節點的啟動方法與后面的節點啟動方法不一樣
[root@pxc1 ~]#systemctl start mysql@bootstrap.service
#查看端口是否開啟3306,4567
[root@pxc1 ~]#ss -tnl
登錄mysql數據庫,創建/etc/percona-xtradb-cluster.conf.d/wsrep.cnf文件中的“sstuser:s3cretPass”賬戶和密碼並授權。
注意,第一次登錄的賬戶默認為root@'localhost',密碼隨機的,需要查看/var/log/mysqld.log獲取。
[root@px1~]# grep '\<password\>' /var/log/mysqld.log
#登錄mysql數據庫
[root@px1~]# mysql -uroot -p')+yf3W;qBe8Y'
#修改密碼
mysql> ALTER USER root@'loclahost' IDENTIFIED BY '123456';
#創建sstuser用戶並授權
mysql> CREATE USER ssuser@'locallhost' IDENTIFIED BY 's3cretPass';
mysql> GRANT RELOAD,LOCK TABLES,PROCESS,REPLICATION CLIENT ON *.* TO ssuser@'locallhost';
#查看相關變量,重點關注wsrep_local_state,wsrep_cluster_size(集群中節點數量),wsrep_cluster_status等
mysql> SHOW VAROABLES LIKE 'wsrep%'\G;
#查看單個變量的值
mysql> SHOW VAROABLES LIKE '變量名';
啟動集群中的其他節點(10.0.0.114,10.0.0.115).而且啟動之后數據會自動與10.0.0.113主機同步(故其他機器上登錄數據庫的賬戶都可以使用root@'loaclhost' 123456),啟動方法如下:
[root@pxc2 ~]#systemctl start mysql
[root@pxc3 ~]#systemctl start mysql
[root@pxc2 ~]#ss -tnl #查看端口3306,4567端口
驗證集群狀態,即驗證搭建是否成功。
在任何節點查看集群狀態,如果wsrep_cluster_size變量顯示為3,說明成功
[root@pxc3 ~]#mysql -uroot -p123456
mysql> SHOW VARIABLES LIKE 'wsrep_cluster_size';
驗證數據是否同步:
1. 在任何主機上創建一個數據庫,然后再其他主機上查詢。
mysql> CREATE DATABASE DB1;
mysql> SHOW DATABASES;
2.利用xshell軟件,同時再三個節點數據庫創建一個數據庫,查看執行結果。(只有一個執行成功,其他提示數據庫已存在)
mysql> CREATE DATABASE DB2;
至此基於pxc的集群環境已搭建成功並且已驗證完成。其中有些命令是手打上去的;有些東西也是按自己理解寫的;如果有錯,歡迎評論,謝謝!
后期如何將一個節點加到該集群中:比如pxc4 (ip:10.0.0.116),簡單過程如下:
1.拷貝/etc/yum.repos.d/pxc.repo到新主機上
2.安裝 Percona-XtraDB-Cluster-57 程序
3.修改/etc/percona-xtradb-cluster.conf.d/wsrep.cnf中某些字段。如下
[root@pxc3 ~]#vi /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://10.0.0.113,10.0.0.114,10.0.0.115,10.0.0.116 #修改此處
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.116 #修改此處
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-4 #修改此處
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretPass"
4.啟動mysql服務
5.查看及驗證
演示二:MariaDB Galera Cluster
環境准備:
以三台主機為例(centos8),各自的ip地址分別為:10.0.0.115,10.0.0.116,10.0.0.117
如果主機安裝了mysql或mariadb必須先卸載。
關閉防火牆和selinux,時間要同步
為了演示方便區分主機(節點),這里將其主機名分別改為mgc1,mgc2,mgc3
詳細過程:
1.三台主機分別安裝mariadb-server-galera.x86_64(AppStream里有,如果沒有需要配置epel源)包。
這里有個小技巧,利用xshell遠程三台主機,然后再xshell菜單欄選擇-->工具-->發送鍵輸入到所有會話中。
[root@mgc1 ~]# yum install mariadb-server-galera.x86_64 -y
2.修改/etc/my.cnf.d/galera.cnf文件,將三台主機ip加到wsrep_cluster_address字段中。並且該協議為gcomm://(記住一定的改)
3.將修改的文件分別傳輸到其他兩台主機上,並且覆蓋。
[root@mgc1 ~]# scp /etc/my.cnf.d/galera.cnf 10.0.0.116:/etc/my.cnf.d/galera.cnf
[root@mgc1 ~]# scp /etc/my.cnf.d/galera.cnf 10.0.0.117:/etc/my.cnf.d/galera.cnf
4.啟動第一個節點,並且連接數據庫(賬戶默認為root,密碼為空)查看變量wsrep_cluster_size的值。
[root@mgc1 ~]#galera_new_cluster
[root@mgc1 ~]#mysql
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';
5.在啟動其他主機的mariadb服務,在任何一台主機上查看wsrep_cluster_size的值
[root@mgc2 ~]#systemctl start mariadb
[root@mgc3 ~]#systemctl start mariadb
6.驗證(與pxc一樣,1.新增一條數據,查看各節點之間數據是否同步。2.同時執行創建一個數據庫操作,看各個節點之間執行結果 3. 停止某一個節點,查看wsrep_cluster_size是否有變動。4.新增一台主機加入到集群中,看數據是否自動同步...)
提示:如果在centos7上搭建MariaDB Galera Cluster(5.5)集群環境,需要配置源。
參考倉庫:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.X/yum/centos7-amd64/
后續操作與演示二一致,只是啟動第一個節點時需要有區別:
首次啟動時,需要初始化集群,在其中一個節點上執行命令:/etc/init.d/mysql start --wsrep-new-cluster
至此基於MariaDB Galera Cluster的集群環境已搭建成功並且已驗證完成。其中有些命令是手打上去的;有些東西也是按自己理解寫的;如果有錯,歡迎評論,謝謝!