一、MySQL Galera介紹
1、galera特性
MySQL/Galera是MySQL/InnoDB的多主集羣,有以下特性:
1)同步複製
2)Active-active的多主拓撲結構
3)集羣任意節點可以讀和寫
4)自動身份控制,失敗節點自動脫離集羣
5)自動節點接入
6)真正的基於”行”級別和ID檢查的並行複製
7)無單點故障,易擴展
2、架構圖
二、Galera Cluster安裝
1、安裝前的準備
1)需要至少三臺mysql服務器,如果只有兩臺做cluster的話,一旦出現數據不一致的情況,就可能發生腦裂,需要一臺仲裁服務器,如果直接三臺做cluster的話,就不再需要仲裁
2)如果是對現有環境做galera集羣,需要對mysql現有表做檢查,包括表,表引擎,是否無主鍵,是否有全文索引,是否有空間索引:
SELECT DISTINCT |
2、實驗環境:
mysql1:172.16.5.156
mysql2:172.16.5.157
mysql3:172.16.5.158
3、安裝相關依賴包:
yum groupinstall -y "Development Tools" "Server Platform Development"
4、安裝含wsrep patch的mysql版本
yum install -y libaio-devel
tar xf mysql-5.6.16_wsrep_25.5-linux-x86_64.tar.gz
mv mysql-5.6.16_wsrep_25.5-linux-x86_64 /usr/local/mysql
useradd -s /sbin/nologin -M mysql
mkdir /data/mydata
./scripts/mysql_install_db --no-defaults --datadir=/data/mydata --user=mysql
chown -R mysql.mysql /data/mydata/
chown root.mysql /usr/local/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
5、安裝galera複製插件
wget https://launchpad.net/galera/3.x/25.3.5/+download/galera-25.3.5-src.tar.gz
tar xf galera-25.3.5-src.tar.gz
cd galera-25.3.5-src
scons
cp garb/garbd /usr/local/mysql/bin
cp libgalera_smm.so /usr/local/mysql/lib/plugin/
6、編輯mysql配置文件my.cnf
[mysqld] basedir = /usr/local/mysql datadir = /data/mydata port = 3306 server-id=101 socket = /tmp/mysql.sock pid-file=/data/mydata/mysql.pid sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES wsrep_node_name = mysql1 wsrep_provider = /usr/local/mysql/lib/plugin/libgalera_smm.so wsrep_sst_method = rsync #wsrep_sst_auth=sst:sstpass #使用sst的用戶和密碼,這裏如果開啓,需要在mysql上創建該用戶,並授予其足夠的權限 default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 innodb_locks_unsafe_for_binlog=1 innodb_flush_log_at_trx_commit=1 innodb_file_per_table=1 binlog_format=ROW log-bin=mysql-bin relay-log=mysql-relay-bin log-slave-updates=1 |
7、啓動mysql
service mysqld start --wsrep_cluster_address=gcomm://
注:
1)"gcomm://"是特殊地址,僅僅是galera cluster初始化啓動時候使用,再次啓動時需要使用具體的ip地址
2)wsrep默認使用4567端口,mysql啓動後,除了檢查mysql的3306端口外,還要檢查此端口
8、給Galera添加一個新的mysql節點
在Galera Cluster中,新接入的節點叫Joiner,給joiner提供複製的節點叫Donor。
在生產環境中,建議設置一個專用的donor,這個專用的donor不執行任何來自客戶端的SQL請求,這樣做有以下幾點好處:
1)數據的一致性:
因爲donor本身不執行任何客戶端SQL,所以在這個節點上發生事務衝突的可能性最小,因此,如果發現集羣有數據不一致時,donor上的數據應該是整個集羣中最準確的。
2)數據安全性:
因爲專用donor本身不執行任何客戶端SQL,所以在這個節點上發生災難事件的可能性最小,因此當整個集羣宕掉的時候,該節點應該是恢復集羣的最佳節點。
3)高可用性:
專用donor可以作爲專門的state snapshot donor。因爲該節點不服務於客戶端,因此當使用此節點進行sst的時候,不影響用戶體驗,並且前端的負載均衡設備也不需要重新配置。
添加的新節點需要滿足以下幾個條件:
1)安裝帶有wsrep patch的mysql版本
2)安裝galera複製插件
3)配置好新節點的mysql(參考donor的my.cnf)
4)配置或啓動的gcomm://的地址需要使用donor的IP。
由此,可以參考172.16.5.156配置172.16.5.157,啓動mysql如下:
service mysqld start --wsrep_cluster_address="gcomm://172.16.5.156:4567"
注:
指定集羣ip的方式有三種:
1)如上所示,在mysql啓動時,加--wsrep_cluster_address參數指定
2)在my.cnf中配置wsrep_cluster_address
3)直接修改全局變量:set global wsrep_cluster_address="gcomm://172.16.5.156:4567"
另外需要說明的是,gcomm://的值可以有多個,彼此間用逗號隔開,例:gcomm://172.16.5.156:4567, 172.16.5.158:4567
9、添加仲裁節點
在只有兩臺數據庫節點的galera集羣中,爲了解決腦裂問題,需要引入仲裁節點,集羣中可以有多個仲裁節點。仲裁節點上沒有數據,它僅僅只是在集羣發生腦裂時仲裁。仲裁節點加入集羣的方法如下:
garbd -a gcomm://172.16.5.156:4567 -g my_wsrep_cluster -d
-a:指定集羣地址
-d:以守護進程的方式運行
-g:集羣名稱
三、Galera監控
1、常用查詢指令
查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';
查看wsrep有關的所有變量: mysql> SHOW VARIABLES LIKE 'wsrep%' \G
查看Galera集羣狀態: mysql> show status like 'wsrep%';
2、參數說明
1)集羣完整性檢查:
wsrep_cluster_state_uuid:在集羣所有節點的值應該是相同的,有不同值的節點,說明其沒有連接入集羣.
wsrep_cluster_conf_id:正常情況下所有節點上該值是一樣的.如果值不同,說明該節點被臨時”分區”了.當節點之間網絡連接恢復的時候應該會恢復一樣的值.
wsrep_cluster_size:如果這個值跟預期的節點數一致,則所有的集羣節點已經連接.
wsrep_cluster_status:集羣組成的狀態.如果不爲”Primary”,說明出現”分區”或是”split-brain”狀況.
2)節點狀態檢查:
wsrep_ready: 該值爲ON,則說明可以接受SQL負載.如果爲Off,則需要檢查wsrep_connected.
wsrep_connected: 如果該值爲Off,且wsrep_ready的值也爲Off,則說明該節點沒有連接到集羣.(可能是wsrep_cluster_address或wsrep_cluster_name等配置錯造成的.具體錯誤需要查看錯誤日誌)
wsrep_local_state_comment:如果wsrep_connected爲On,但wsrep_ready爲OFF,則可以從該項查看原因.
3)複製健康檢查:
wsrep_flow_control_paused:表示複製停止了多長時間.即表明集羣因爲Slave延遲而慢的程度.值爲0~1,越靠近0越好,值爲1表示複製完全停止.可優化wsrep_slave_threads的值來改善.
wsrep_cert_deps_distance:有多少事務可以並行應用處理.wsrep_slave_threads設置的值不應該高出該值太多.
wsrep_flow_control_sent:表示該節點已經停止複製了多少次.
wsrep_local_recv_queue_avg:表示slave事務隊列的平均長度.slave瓶頸的預兆.
最慢的節點的wsrep_flow_control_sent和wsrep_local_recv_queue_avg這兩個值最高.這兩個值較低的話,相對更好.
4)檢測慢網絡問題:
wsrep_local_send_queue_avg:網絡瓶頸的預兆.如果這個值比較高的話,可能存在網絡瓶
5)衝突或死鎖的數目:
wsrep_last_committed:最後提交的事務數目
wsrep_local_cert_failures和wsrep_local_bf_aborts:回滾,檢測到的衝突數目
四、Galera的狀態快照轉移(SST)
SST允許新接入的節點使用定製的方法來獲取最初的數據,當前mysql支持三種SST方法:
1、mysqldump
這需要接收服務器在轉移前完全初始化和準備接收連接。此方法是通過定義阻塞,阻止修改自身狀態轉移的持續時間。這也是最慢的方式,可能會帶來高負載的問題。
2、rsync
最快的方式,也是galera默認使用的方式。rsync腳本運行在發送和接收端上。在接收端,開啓rsync服務模式,等待發送端連接。在發送端,開啓rsync客戶端模式,發送mysql數據目錄內容到連接節點。這種方法也會阻塞,但是比mysqldump快。
3、xtrabackup
也很快,但需要額外安裝。