Linux CentOS7 部署 MySql數據庫 PXC 集羣



前言

什麼是PXC集羣

Percona XtraDB Cluster是一套 MySQL 高可用集羣解決方案,與傳統的基於主從複製模式的集羣架構相比 PXC 最突出特點就是解決了詬病已久的數據複製延遲問題,基本上可以達到實時同步。而且節點與節點之間,他們相互的關係是對等的。PXC 最關注的是數據的一致性,對待事物的行爲時,要麼在所有節點上執行,要麼都不執行,它的實現機制決定了它對待一致性的行爲非常嚴格,這也能非常完美的保證 MySQL 集羣的數據一致性

PXC特性及優點

完全兼容 MySQL。
同步複製,事務要麼在所有節點提交或不提交。
多主複製,可以在任意節點進行寫操作。
在從服務器上並行應用事件,真正意義上的並行複製。
節點自動配置,數據一致性,不再是異步複製。
故障切換:因爲支持多點寫入,所以在出現數據庫故障時可以很容易的進行故障切換。
自動節點克隆:在新增節點或停機維護時,增量數據或基礎數據不需要人工手動備份提供,galera cluster會自動拉取在線節點數據,集羣最終會變爲一致;

PXC最大的優勢:強一致性、無同步延遲

PXC的侷限和劣勢

複製只支持InnoDB 引擎,其他存儲引擎的更改不復制
寫入效率取決於節點中最慢的一臺

PXC與Replication的區別

Replication PXC
數據同步是單向的,master負責寫,然後異步複製給slave;如果slave寫入數據,不會複製給master 數據同步時雙向的,任何一個mysql節點寫入數據,都會同步到集羣中其它的節點
異步複製,從和主無法保證數據的一致性 同步複製,事務在所有集羣節點要麼同時提交,要麼同時不提交

PXC與Replication的一般使用場景

Replication PXC
【低價值業務】 【高價值業務】
日誌 訂單
新聞 賬戶
帖子 財務

正題

準備工作


準備兩臺 Linux CentOS 7.X 的主機

我這裏直接選用阿里雲的主機:

1.選擇CentOS 7.6 鏡像

在這裏插入圖片描述

2.修改兩臺服務器的host

1.進入配置文件編輯

vim /etc/hosts

2.將兩臺服務器的IP加入其中
第一臺配置信息如圖:
在這裏插入圖片描述

第二臺配置信息如圖:
在這裏插入圖片描述

3.安全組要保證所需端口開放

#mysql實例端口:3306
#PXC cluster相互通訊的端口:4567
#用於SST傳送的端口:4444
#用於IST傳送的端口:4568 

在這裏插入圖片描述

4.創建並啓動服務器

在這裏插入圖片描述


搭建第一個節點

1.登錄服務器,我這裏使用的軟件爲Xshell 6

在這裏插入圖片描述

2.關閉自帶防火牆

【查看防火牆】

sudo systemctl status firewalld

【關閉防火牆】

sudo systemctl stop firewalld

查看了一下發現默認是關閉的,inactive(dead) 代表關閉了,如果是active(running)就意味着防火牆開啓了,我這裏是測試也就讓防火牆關閉着,如果不可以關就把上文中那四個需要的端口給開放即可
在這裏插入圖片描述

3.關閉SELINUX 【這是一個 Linux 內核模塊,也是個安全子系統】

1.輸入命令進入配置文件

vim /etc/selinux/config

2.將SELINUX的值設置爲disabled
修改後的文件如圖所示
在這裏插入圖片描述
3.輸入命令使關閉生效

setenforce 0

4.安裝Persona倉庫

1.輸入安裝命令

sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

在這裏插入圖片描述
2.按【y】繼續
在這裏插入圖片描述
3.安裝完成
在這裏插入圖片描述

5.安裝 Percona XtraDB Cluster 的包

1.輸入安裝命令

sudo yum install Percona-XtraDB-Cluster-57

在這裏插入圖片描述
2.按【y】繼續在這裏插入圖片描述
3.按【y】繼續a
4.安裝完成
在這裏插入圖片描述

6.修改初始密碼

1.先啓動 Percona XtraDB Cluster 服務

sudo systemctl start mysqld

在這裏插入圖片描述
2.查看自動生成的ROOT臨時密碼

sudo grep 'temporary password' /var/log/mysqld.log

如圖所示,這次我的臨時密碼就是 wBL(K6HD9yml
在這裏插入圖片描述
3.登錄 MySQL

mysql -u root -p

將臨時密碼複製粘貼,注意密碼錄入會自動隱藏,粘貼完直接回車即可
在這裏插入圖片描述
登錄成功進入Mysql命令行
在這裏插入圖片描述
4.輸入命令,將密碼修改爲molimoli

ALTER USER 'root'@'localhost' IDENTIFIED BY 'molimoli';

在這裏插入圖片描述

5.退出

exit

在這裏插入圖片描述

6.關閉 MySQL 服務

sudo systemctl start mysqld

在這裏插入圖片描述

7.修改配置文件 my.cnf

1.輸入命令編輯my.cnf文件

sudo vim /etc/my.cnf

在這裏插入圖片描述2.按下Ins建 開啓編輯模式(開啓後左下角有提示)
在這裏插入圖片描述3.在內容尾部追加信息
注意:將【88.88.88.88】改爲你第一個服務器的IP,將【99.99.99.99】改爲你第二個服務器的IP

[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://99.99.99.99,88.88.88.88

wsrep_node_name=ml1
wsrep_node_address=88.88.88.88

wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:molimoli

pxc_strict_mode=ENFORCING

binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

在這裏插入圖片描述

配置參數說明

wsrep_provider
指定 Galera 庫的路徑。

wsrep_cluster_name
指定集羣的邏輯名稱,集羣內的所有節點,這個名稱必須一致。

wsrep_cluster_address
指定集羣內節點的 IP 地址,建議將集羣節點都配上。

wsrep_node_name
指定單個節點的邏輯名稱,如果沒有指定,將使用 hostname 作爲邏輯名稱。

wsrep_node_address
指定此特定節點的 IP 地址。

wsrep_sst_method
默認的使用 Percona Xtrabackup 進行 State Snapshot Transfer (SST),強烈建議使用 wsrep_sst_method=xtrabackup-v2

wsrep_sst_auth
指定 sst 的身份驗證憑據,使用<sst_user>:<sst_pass> 這種格式,啓動第一個節點時必須創建,並且提供相應的權限。

pxc_strict_mode
關閉實驗性的或者不支持的特性

binlog_format
Galera 只支持 row-level replication,所以設置爲 binlog_format=ROW。

default_storage_engine
Galera 只支持 InnoDB 引擎,所以設置爲 default_storage_engine=InnoDB。

innodb_autoinc_lock_mode
Galera 只支持 lock mode 爲 2 的 InnoDB 引擎,所以設置爲 innodb_autoinc_lock_mode=2

4.按ESC退出編輯模式,然後按shift + Z +Z 退出並保存
在這裏插入圖片描述

8.啓動第一個節點

1.輸入該命令啓動第一個節點
注:使用 bootstrap 模式啓動,默認會設置 wsrep_cluster_address=gcomm://,後面沒有 IP,表示初始化集羣。

sudo systemctl start mysql@bootstrap

在這裏插入圖片描述
2.登錄Mysql

mysql -u root -p

在這裏插入圖片描述
3.查看PXC集羣狀態

show status like 'wsrep%';

在這裏插入圖片描述
打印了一長串信息,這就是PXC集羣狀態監控指標,可以看到集羣數量時 1,本節點爲 Synced 狀態,表示連接成功,並且準備好進行 write-set replication。
在這裏插入圖片描述常用PXC集羣狀態監控指標說明:

1)wsrep_local_state_uuid:與wsrep_cluster_state_uuid的值一致,且所有節點該值都相同

(2)wsrep_cluster_state_uuid:所有節點該值都相同,如果有不同值的節點,說明該節點沒有與集羣建立連接

(3)wsrep_last_committed:集羣已經提交事務的數量,是一個累計值,所有節點該值都相同,如果出現不一致,說明事務有延遲,可以用來計算延

(4)wsrep_replicated:從本節點複製出去的寫集數量,wsrep_replicated_bytes爲寫集的總字節數,可以用於參考節點間的負載均衡是否平衡,該值較大的節點較爲繁忙

(5)wsrep_received:與wsrep_replicated對應,本節點接收來自其它節點的寫集數量

(6)wsrep_local_state:所有節點該值都應該爲4,表示正常,節點狀態有如下6個取值

     a、取值1:節點啓動並與集羣建立連接

     b、取值2:當節點成功執行狀態傳輸請求時,該節點開始緩存寫集

          c、取值3:節點接收了SST全量數據傳輸,該節點現在擁有所有集羣數據,並開始應用已緩存的寫集

     d、取值4:節點完成與集羣數據的同步,它的從屬隊列現在是空的,並啓用流控使其保持爲空

     e、取值5:節點接收了狀態傳輸請求,該節點現在對donor不執行流控,該節點已緩存所有的寫集但無法應用

     f、取值6:節點完成對joiner節點的狀態傳輸

(7)wsrep_incoming_addresses:集羣中所有節點的IP,且每個節點該值都相同

(8)wsrep_cluster_size:集羣中的節點數量,所有節點該值都相同

(9)wsrep_cluster_conf_id:所有節點該值都相同,如果值不同,說明該節點被臨時“分區”了

(10)wsrep_cluster_status:集羣組成的狀態,所有節點該值都爲“Primary”,如果該值不爲“Primary”,說明該節點出現“分區”或“腦裂”現象

(11)wsrep_connected:所有節點該值都爲“ON”,表示本節點已經與集羣建立連接

(12)wsrep_ready:所有節點該值都爲“ON”,表示本節點可以正常提供服務

9.添加 SST 用戶並分配相應的權限

1.創建用戶
注:用戶名和密碼必須跟配置文件匹配

CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'molimoli';

2.授權

GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';

3.刷新

FLUSH PRIVILEGES;

在這裏插入圖片描述

搭建第二個節點

1.重複第一個節點前五步操作(包括第五步),這裏不再重複寫了,記得先不要啓動第二臺節點

2.修改配置文件 my.cnf

1.輸入命令編輯my.cnf文件

sudo vim /etc/my.cnf

2.在內容尾部追加信息
注意:將【88.88.88.88】改爲你第一個服務器的IP,將【99.99.99.99】改爲你第二個服務器的IP

[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so

wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://88.88.88.88,99.99.99.99

wsrep_node_name=ml2
wsrep_node_address=99.99.99.99

wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:molimoli

pxc_strict_mode=ENFORCING

binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2

第二節點的配置文件與第一節點的配置文件區別是

wsrep_node_name=ml1
wsrep_node_address=88.88.88.88

變爲

wsrep_node_name=ml2
wsrep_node_address=99.99.99.99

也就是將邏輯名改爲第二節點,IP改爲第二節點的IP,如果你要創建第三節點,同理只需要改這兩處即可

3.啓動第二節點

1.輸入命令啓動第二節點

sudo systemctl start mysqld

2.登錄Mysql,並查詢狀態

mysql -u root -p
show status like 'wsrep%';

可以看到 wsrep_cluster_size 的值是 2 表示集羣已經有 2 個節點了。wsrep_local_state_comment 的值是 Synced 表示已經同步了。
在這裏插入圖片描述

注意 如果 wsrep_local_state_comment 的狀態是 Joiner,表示正在同步,請不要啓動第三個第四個節點的服務。

修改允許遠程訪問

在sql命令行下輸入

grant all on *.* to root@'%' identified by 'molimoli' with grant option; 

測試

採用Navicat進行集羣同步測試

1.將兩個數據庫加入Navicat列表中(確保開啓遠程訪問)

1.填寫信息
在這裏插入圖片描述
2.點擊測試按鈕,確保可以正常連接,然後單擊確定即可完成節點1的添加
在這裏插入圖片描述
3.節點2添加同理,最終效果如圖
在這裏插入圖片描述

2.向節點1數據庫建立表及數據

1.隨便建立一個庫【MoLiTest】
在這裏插入圖片描述

2.隨便建立個表【moli】
在這裏插入圖片描述
3.往這個表中加點數據
在這裏插入圖片描述

3.查看節點2,看是否數據同步了

可以看到節點2同步了節點1的數據,如果開啓更多的節點也都是同樣的效果
在這裏插入圖片描述

總結及注意事項

1.所有其他節點的數據和配置都會被第一個節點的數據覆蓋
2.不用同時加入多個節點,避免數據或網絡開銷過大


文章結束


這是我通過學習對知識的整理及備忘,本博客的所有內容,僅是自己的一些學習筆記,如有錯誤,歡迎指正。如有侵權,請告知修改。

參考文章:
http://www.mamicode.com/info-detail-2652214.html
http://www.imooc.com/article/28832?block_id=tuijian_wz
https://qizhanming.com/blog/2019/05/16/how-to-install-percona-xtradb-cluster-on-centos-7
https://cloud.tencent.com/developer/article/1177822

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章