galera 集羣概述與搭建
Galera replication原理
從客戶端看整體的流程
其中對應的角色分爲2個:協調者和參與者
協調者:
1、 接收客戶端請求
2、 廣播請求到其他參與者(包括自己)
3、 作爲參與者進行數據更新
4、 更新失敗或者成功返回給客戶端
參與者
1、接收協調者的廣播請求,然後進行數據庫的更新
時序圖
關鍵技術
1、全局唯一ID生成,保證ID的唯一和遞增
2、協調者自己也是通過廣播接收後進行的數據庫業務操作,各個節點平等,保證了併發
3、事務傳輸要麼成功傳給了所有節點,要麼都失敗
4、事務在所有節點中的順序一致
5、每個節點知道所有節點的狀態(通過廣播實現)
優勢
-
與異步複製相比:
數據一致性強,傳統異步複製並不能保證主從數據一致性,這是由於一般情況下,主庫多線程併發執行
事務,但從庫卻只有一個線程重做事務,在高壓力情況下必然會導致主從延遲。 -
與使用半同步複製或分佈式鎖實現的同步複製相比:
性能高,擴展性好,半同步複製在高負載甚至從庫性能較差的情況下,難以保證其性能。即使自動的
從半同步複製切換到異步複製,也會犧牲其最大的優點:一致性。其擴展友好度也較差 -
galera集羣的獨特優勢:
1. 同步複製,主備無延遲
2. 支持多主同時讀寫,保證數據一致性
3. 集羣中各節點保存全量數據
4. 節點添加/刪除,自動檢測和配置
5. 行級別並行複製
6. 不需要寫binlog
缺點:
DDL操作會嚴重阻塞同步線程,線上大動作DDL會導致有可能導致節點堵塞無響應,更進一步會導致
部分節點下線。實際使用中需要搭配pt-osc或者gh-osc等在線DDL工具來進行操作DDL。
galera 集羣架構搭建
步驟:
一、集羣節點中的主機名能互相解析(/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%”;
八、在第一二加入的服務器上對配置的增加修改
在第一加入(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%”;
發現對多了兩個ip地址,證明galera集羣已實現
Galera 集羣搭建完成,進行測試
測試一
分別向三個節點 建庫,建表, 插入數據操作,驗證多點寫入,觀察數據是否同步
在所有其餘兩個數據庫中都可以查詢到插入數據的存在
測試二:
下線其中一個節點 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://‘ 爲空,不向任何主機進行同步
然後再啓動數據庫服務,接着啓動其他數據庫!