MySQL Galera 集羣安裝與配置詳解

galera 集羣概述與搭建

alt

Galera replication原理

從客戶端看整體的流程

其中對應的角色分爲2個:協調者和參與者

alt

協調者:

1、 接收客戶端請求 
2、 廣播請求到其他參與者(包括自己) 
3、 作爲參與者進行數據更新 
4、 更新失敗或者成功返回給客戶端

參與者

1、接收協調者的廣播請求,然後進行數據庫的更新

時序圖

alt

關鍵技術

1、全局唯一ID生成,保證ID的唯一和遞增 
2、協調者自己也是通過廣播接收後進行的數據庫業務操作,各個節點平等,保證了併發 
3、事務傳輸要麼成功傳給了所有節點,要麼都失敗 
4、事務在所有節點中的順序一致 
5、每個節點知道所有節點的狀態(通過廣播實現)

優勢

  • 與異步複製相比:
    數據一致性強,傳統異步複製並不能保證主從數據一致性,這是由於一般情況下,主庫多線程併發執行
    事務,但從庫卻只有一個線程重做事務,在高壓力情況下必然會導致主從延遲。

  • 與使用半同步複製或分佈式鎖實現的同步複製相比:
    性能高,擴展性好,半同步複製在高負載甚至從庫性能較差的情況下,難以保證其性能。即使自動的
    從半同步複製切換到異步複製,也會犧牲其最大的優點:一致性。其擴展友好度也較差

  • galera集羣的獨特優勢:

1. 同步複製,主備無延遲
2. 支持多主同時讀寫,保證數據一致性
3. 集羣中各節點保存全量數據
4. 節點添加/刪除,自動檢測和配置
5. 行級別並行複製
6. 不需要寫binlog

缺點:

DDL操作會嚴重阻塞同步線程,線上大動作DDL會導致有可能導致節點堵塞無響應,更進一步會導致
部分節點下線。實際使用中需要搭配pt-osc或者gh-osc等在線DDL工具來進行操作DDL。

galera 集羣架構搭建

alt

步驟:

一、集羣節點中的主機名能互相解析(/etc/hosts 文件一致)

[root@rehl-14 ~]# vim /etc/hosts
192.168.10.10 rehl-10
192.168.10.14 rehl-14
192.168.10.15 rehl-15

二、3臺主機 分別安裝 galera集羣對應的 rpm 包

galera集羣對應的 rpm 包連接下載
鏈接:https://pan.baidu.com/s/1Z4cV__uhw79IMJpJ_r9CMg 密碼:4k5u

yum install rsync 

 yum remove   mariadb-libs  ##卸載mariadb 衝突的軟件包
 
 rpm -ivh mysql-wsrep-common-5.7-5.7.21-25.14.el7.x86_64.rpm
 rpm -ivh mysql-wsrep-libs-5.7-5.7.21-25.14.el7.x86_64.rpm
 rpm -ivh mysql-wsrep-client-5.7-5.7.21-25.14.el7.x86_64.rpm 

yum install  mysql-wsrep-server-5.7-5.7.21-25.14.el7.x86_64.rpm
yum install galera-3-25.3.23-2.el7.x86_64.rpm

三、對一下配置進行關閉

如果下列配置有開啓就必須要關閉,否則會影響到galera集羣的啓動!

[root@rehl-14 ~]# vim /etc/my.cnf
sync_binlog=0
# basedir=/usr/local/mysql57   ##註釋掉
binlog_rows_query_log_events=OFF ##導致集羣多寫入時失敗,一定要關閉!
   
#plugin-load=rpl_semi_sync_master=semisync_master.so  ##關閉半同步複製,提供了同步複製。
#rpl_semi_sync_master_enabled=1
    
gtid-mode=ON     ##啓用GTID功能。
enforce-gtid-consistency=ON

再次附上 /etc/my.cnf 的配置文件;可參照以下配置,複製應用時,創建對應的文件目錄即可
鏈接:https://pan.baidu.com/s/1ciNC-_pV4iAvzAOttWj6lQ 密碼:f0ff

四、進行數據庫的初始化,啓動服務修改密碼

[root@rehl-14 ~]# mysqld --initialize --user=mysql   ##此時會在/mysql 下,產生全新的數據庫
[root@rehl-14 ~]# mysqld --daemonize --datadir=/mysql  ##啓動數據庫

五、創建表和用戶進行授權

新建一個新數據庫名 class,授權一個新用戶 mary 在數據庫 class 下允許所有權限,密碼 123123 允許的網段爲 192.168.10.%

[root@rehl-14 ~]# grant all on class.*  to 'mary'@'192.168.10.%' IDENTIFIED BY '123123';

六、停止數據庫增加配置選項

[root@rehl-14 ~]# killall mysqld
[root@rehl-14 ~]# vim /etc/my.cnf
wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  ##要確認插件是存在的
wsrep_cluster_name='cluster1'        ##集羣名稱
wsrep_cluster_address='gcomm://'     ##首次作爲發起人,此處爲空,不向任何人同步數據。
wsrep_node_name='rehl-14'            ##本機的主機名
wsrep_node_address='192.168.10.14'   ##本機的 IP 地址
wsrep_sst_auth=mary:123123           ##同步數據時,使用的賬號密碼,各個集羣節點應該一致。
wsrep_sst_method=rsync               ##同步數據時使用的組件

七、從新登陸數據庫察看集羣信息

[root@rehl-14 ~]# mysqld --daemonize --datadir=/mysql
mysql>  show status like “%wsrep%”;

alt

八、在第一二加入的服務器上對配置的增加修改

在第一加入(rehl-10 192.168.10.10)修改(/etc/my.cnf)

[root@rehl-10 ~]# vim /etc/my.cnf
server-id=2  #不能重複

wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  ##要確認插件是存在的
wsrep_cluster_name='cluster1'        ##集羣名稱
wsrep_cluster_address='gcomm://192.168.10.14,192.168.10.15'  ##向其他人同步數據同步數據。
wsrep_node_name='rehl-10'            ##本機的主機名
wsrep_node_address='192.168.10.10'   ##本機的 IP 地址
wsrep_sst_auth=mary:123123           ##同步數據時,使用的賬號密碼,各個集羣節點應該一致。
wsrep_sst_method=rsync               ##同步數據時使用的組件

在第二加入(rehl-10 192.168.10.15)修改(/etc/my.cnf)

[root@rehl-15 ~]# vim /etc/my.cnf
server-id=3  #不能重複

wsrep_on=on
wsrep_provider=/usr/lib64/galera-3/libgalera_smm.so  ##要確認插件是存在的
wsrep_cluster_name='cluster1'        ##集羣名稱
wsrep_cluster_address='gcomm://192.168.10.14,192.168.10.10'  ##向其他人同步數據同步數據。
wsrep_node_name='rehl-15'            ##本機的主機名
wsrep_node_address='192.168.10.15'   ##本機的 IP 地址
wsrep_sst_auth=mary:123123           ##同步數據時,使用的賬號密碼,各個集羣節點應該一致。
wsrep_sst_method=rsync               ##同步數據時使用的組件

從服務器啓動服務後,在主服務器察看集羣信息

mysqld --daemonize --datadir=/mysql
mysql>  show status like “%wsrep%”;

alt

發現對多了兩個ip地址,證明galera集羣已實現

Galera 集羣搭建完成,進行測試

測試一

分別向三個節點 建庫,建表, 插入數據操作,驗證多點寫入,觀察數據是否同步

alt

在所有其餘兩個數據庫中都可以查詢到插入數據的存在

測試二:

下線其中一個節點 killall mysqld (不要是發起人 192.168.10.14 ),剩餘節點繼續添加數據, 拉開距離。
此時離線數據庫重新上線,啓動服務即可,觀察是否能追上其他人的數據

當斷開後一段時間重新連接會發現數據一樣能夠自動同步回來

測試三:

讓 發起人節點 離線。 剩餘服務器繼續插入數據,拉開距離
再讓 發起人 重新上線

[root@rehl-14 ~]# vim /etc/my.cnf
wsrep_cluster_address='gcomm://192.168.10.15,192.168.10.10' 

此時 gcomm:// 不在爲空,要向其他服務器同步數據

測試四:

停止集羣所有數據庫

最後離開集羣/停止的數據庫 主機, 要最先 啓動。否則可能導致數據丟失
如果要一臺不是最後離開的主機強制啓動。 修改 /mysql/grastate.dat
修改 safe_to_bootstrap: 0 爲1,修改最先啓動的數據庫/etc/my.cnf
修改 wsrep_cluster_address='gcomm://‘ 爲空,不向任何主機進行同步
然後再啓動數據庫服務,接着啓動其他數據庫!

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