MariaDB Galera Cluster部署實踐


原理

官方地址:http://galeracluster.com/documentation-webpages/index.html

Galera Cluster與傳統的復制方式不同,不通過I/O_thread和sql_thread進行同步,而是在更底層通過wsrep實現文件系統級別的同步,可以做到幾乎實時同步,而其上的MySQL對此一無所知這就要求MySQL能夠調用wsrep提供的API來完成,在Mariadb10.1之前的版本,支持Galera Cluster的版本是與Mariadb分開發行的,其版本名稱就成為Mariadb-Galera,Mariadb10.1以后的版本中MariaDB Galera Cluste不再單獨發行,而是以galera-25.3.12-2.el7.x86_64包的形式出現

MariaDB Galera Cluster主要功能:
同步復制
真正的multi-master,即所有節點可以同時讀寫數據庫
自動的節點成員控制,失效節點自動被清除
新節點加入數據自動復制
真正的並行復制,行級
用戶可以直接連接集群,使用感受上與MySQL完全一致

 

同步流程:

當client端執行dml操作時,將操作發給server,server將數據庫所做的更改收集到一個寫集中發給group(cluster),
cluster中每個動作對應一個GTID,其它server接收到並通過驗證(合並數據)后,執行appyl_cb動作和commit_cb動作,若驗證沒通過,則會退出處理
當前server節點驗證通過后,執行commit_cb,並返回,若沒通過,執行rollback_cb。
只要當前節點執行了commit_cb和其它節點驗證通過后就可返回。

集群安裝

說明:Galera集群至少需要三個節點的服務器硬件,以下操作在三個節點執行。

1、主機名、hosts文件修改

10.17.12.98 node1
10.17.12.99 node2
10.17.12.101 node3

2、防火牆、selinux關閉等

setenforce 0 
sed -i  "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config 
systemctl disable firewalld.service 
systemctl stop firewalld.service  

3、配置yum源

 more mariadb.repo 
[mariadb]
name = mariadb
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

換成國內的鏡像,可能速度會好很多

[mariadb]
name = mariadb
baseurl = http://mirrors.ustc.edu.cn/mariadb/yum/10.0/centos7-amd64/
gpgkey=http://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck=1

4、安裝軟件

yum install MariaDB-Galera-server MariaDB-client galera -y

5、啟動數據庫

/etc/init.d/mysql start

6、設置密碼

mysqladmin -u root password 12345678

7、添加集群認證用戶

MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'galera'@'%' IDENTIFIED BY 'galera' WITH GRANT OPTION;
MariaDB [(none)]> flush privileges;

8、關閉所有數據庫

/etc/init.d/mysql stop

配置修改

編輯/etc/my.cnf,添加如下配置

[mariadb] 
query_cache_size=0    # 關閉查詢緩存
binlog_format=ROW     # binlog文件格式:行
default_storage_engine=innodb  # Mariadb 存儲引擎
innodb_autoinc_lock_mode=2     #主鍵自增模式修改為交叉模式  
wsrep_provider=/usr/lib64/galera/libgalera_smm.so                   #galera 庫文件
wsrep_cluster_address=gcomm://10.17.12.101,10.17.12.99,10.17.12.98  # galera集群url
wsrep_cluster_name='openstack'      # galera集群名稱
wsrep_node_address='10.17.12.98'    # 該節點的地址
wsrep_node_name='node3'             # 該節點的主機名
wsrep_sst_method=xtrabackup-v2              # 拷貝模式
wsrep_sst_auth=galera:galera        # galera集群認證用戶:密碼

其他節點的參數需要修改/etc/my.cnf中相應部分與每個節點對應

如果啟動其他節點數據庫有問題,建議改成rsync模式試試,但是最終我們建議使用xtrabackup-v2

將集群中的數據復制到某個節點上實現備份,或者節點新加入集群需要同步數據。
Galera Cluster有兩種數據復制方式:
State Snapshot Transfers (SST):全量同步
Incremental State Transfers (IST):增量同步
簡單來講。SST就是同步整個數據庫,IST是同步一個庫與另一個庫相差的部分事務。

啟動集群

#啟動第一個節點
/etc/init.d/mysql bootstrap
10.1以上的好像是galera_new_cluster命令啟動
#啟動其余節點
/etc/init.d/mysql start

 啟動數據庫服務后,登錄mysql數據庫庫,通過wsrep_cluster_size參數來判斷啟動是否成功。

SHOW STATUS LIKE 'wsrep_cluster_size';

運維常用命令

查看集群狀態

show status like 'ws%';
注釋:
wsrep_cluster_status為Primary,表示節點為主節點,正常讀寫。
wsrep_ready為ON,表示集群正常運行。
wsrep_connected: 如果該值為Off,且wsrep_ready的值也為Off,則說明該節點沒有連接到集群
wsrep_cluster_size為3,表示集群有三個節點。
wsrep_cluster_state_uuid:在集群所有節點的值應該是相同的,有不同值的節點,說明其沒有連接入集群。
wsrep_cluster_conf_id:正常情況下所有節點上該值是一樣的.如果值不同,說明該節點被臨時”分區”了.當節點之間網絡連接恢復的時候應該會恢復一樣的值。
wsrep_flow_control_paused:表示復制停止了多長時間.即表明集群因為Slave延遲而慢的程度.值為0~1,越靠近0越好,值為1表示復制完全停止.可優化wsrep_slave_threads的值來改善.
wsrep_flow_control_sent:表示該節點已經停止復制了多少次.

查看復制模式

show variables like "wsrep_sst_method";

wsrep_local_state_comment 狀態對照表

文件理解

grastate.dat
默認路徑為:/var/lib/docker/volumes/mariadb/_data/grastate.dat
可以通過該文件查看到該節點記錄的uuid和seqno,當節點正常退出Galera集群時,會將GTID的值更新到該文件中。
如果該節點數據庫服務正在運行,則seqno的值是-1的
在斷電的情況下,所有節點的seqno值可能都相同,此時需根 gvwstate.dat判斷啟動節點

gvwstate.dat
默認路徑為:/var/lib/docker/volumes/mariadb/_data/grastate.dat
此文件保存了集群狀態信息,如果集群正常關閉的話,這個文件會自動刪除掉。

查看節點狀態

wsrep_local_state:
節點的狀態,取值1-6。
取值1:The node starts and establishes a connection to the Primary Component.
取值2:When the node succeeds with a state transfer request, it begins to cache write-sets.
取值3:The node receives a State Snapshot Transfer. It now has all cluster data and begins to apply the cached write-sets.
Here the node enables Flow Control to ensure an eventual decrease in the slave queue.
取值4:The node finishes catching up with the cluster. Its slave queue is now empty and it enables Flow Control to keep it empty.
The node sets the MySQL status variable wsrep_ready to the value 1. The node is now allowed to process transactions.
取值5:The node receives a state transfer request. Flow Control relaxes to DONOR. The node caches all write-sets it cannot apply.
取值6:The node completes the state transfer to joiner node.

這是官方的,除此之外還有一個0狀態initialized,初始化狀態。

淺談

1、感覺性能遜色於主從架構

2、一個事物提交,在節點配置不同的情況下,會等待性能最差的節點結束,才能保持數據一致。

3、涉及到的端口

4444:請求SST(全量同步),在新節點加入時起作用
4568:傳輸IST(增量同步),節點下線,重啟加入時起作用
4567:組成員之間溝通的端口

 

問題

安裝

不知道是不是bug先用rsync模式啟動一次再改回xt模式就可以了

異常斷電

當機房突然停電,所有galera主機都非正常關機,來電后開機,會導致galera集群服務無法正常啟動。如何處理?
第1步:開啟galera集群的群主主機的mariadb服務。
第2步:開啟galera集群的成員主機的mariadb服務。
異常處理:galera集群的群主主機和成員主機的mysql服務無法啟動,如何處理?
解決方法一:第1步、刪除garlera群主主機的/var/lib/mysql/grastate.dat狀態文件
/bin/galera_new_cluster啟動服務。啟動正常。登錄並查看wsrep狀態。
第2步:刪除galera成員主機中的/var/lib/mysql/grastate.dat狀態文件
systemctl restart mariadb重啟服務。啟動正常。登錄並查看wsrep狀態。
解決方法二:第1步、修改garlera群主主機的/var/lib/mysql/grastate.dat狀態文件中的0為1
/bin/galera_new_cluster啟動服務。啟動正常。登錄並查看wsrep狀態。
第2步:修改galera成員主機中的/var/lib/mysql/grastate.dat狀態文件中的0為1
systemctl restart mariadb重啟服務。啟動正常。登錄並查看wsrep狀態。

腦裂

set global wsrep_provider_options="pc.bootstrap=true";
通過這個命令來強制恢復出現腦裂的節點。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM