Galera Cluster 實現mysql羣集

參考:http://blog.itpub.net/14431099/viewspace-1316643/ 前端

http://lovestoned.blog.51cto.com/2904444/1617817 node

http://www.itbaofeng.com/?p=59 mysql

http://lansgg.blog.51cto.com/5675165/1180305 linux

http://1130739.blog.51cto.com/1120739/1852319 c++

1、MySQL Galera介紹sql

MySQL/Galera是MySQL/InnoDB的多主集羣,有如下特性: 數據庫

1)同步複製安全

2)Active-active的多主拓撲結構bash

3)集羣任意節點能夠讀和寫服務器

4)自動身份控制,失敗節點自動脫離集羣

5)自動節點接入

6)真正的基於」行」級別和ID檢查的並行複製

7)無單點故障,易擴展

二、架構圖

 wKioL1Wd32KiRavcAAGodn34Chk758.jpg

2、Galera Cluster安裝

一、安裝前的準備

    1)須要至少三臺mysql服務器,若是隻有兩臺作cluster的話,一旦出現數據不一致的狀況,就可能發生腦裂,須要一臺仲裁服務器,若是直接三臺作cluster的話,就再也不須要仲裁。


    2)若是是對現有環境作galera集羣,須要對mysql現有表作檢查,包括表,表引擎,是否無主鍵,是否有全文索引,是否有空間索引:

SELECT DISTINCT

       CONCAT(t.table_schema,'.',t.table_name) as tbl,

       t.engine,

       IF(ISNULL(c.constraint_name),'NOPK','') AS nopk,

       IF(s.index_type = 'FULLTEXT','FULLTEXT','') as ftidx,

       IF(s.index_type = 'SPATIAL','SPATIAL','') as gisidx

  FROM information_schema.tables AS t

  LEFT JOIN information_schema.key_column_usage AS c

    ON (t.table_schema = c.constraint_schema AND t.table_name = c.table_name

        AND c.constraint_name = 'PRIMARY')

  LEFT JOIN information_schema.statistics AS s

    ON (t.table_schema = s.table_schema AND t.table_name = s.table_name

        AND s.index_type IN ('FULLTEXT','SPATIAL'))

  WHERE t.table_schema NOT IN ('information_schema','performance_schema','mysql')

    AND t.table_type = 'BASE TABLE'

    AND (t.engine <> 'InnoDB' OR c.constraint_name IS NULL OR s.index_type IN ('FULLTEXT','SPATIAL'))

  ORDER BY t.table_schema,t.table_name;

二、實驗環境:

操做系統:Centos6.5-X64

mysql1:192.168.100.6

mysql2:192.168.100.3

mysql3:192.168.100.2

 

三、主機192.168.100.6上面安裝相關依賴包:

yum groupinstall -y "Development Tools" "Server Platform Development"

 

四、安裝含wsrep patch的mysql版本

yum install -y libaio-devel gcc gcc-c++ boost-devel scons check-devel openssl-devel
wget https://launchpad.net/codership-mysql/5.6/5.6.16-25.5/+download/mysql-5.6.16_wsrep_25.5-linux-x86_64.tar.gz 
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

 五、安裝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/

 六、編輯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

 

七、啓動mysql

service mysqld start --wsrep_cluster_address=gcomm://

 查看mysqld監聽的端口

[root@root ~]# netstat -plantu | grep mysqld
tcp     0      0 0.0.0.0:4567       0.0.0.0:*          LISTEN      3656/mysqld         
tcp     0      0 0.0.0.0:3306       0.0.0.0:*          LISTEN      3656/mysqld

關閉mysql

[root@root ~]# /usr/local/mysql/bin/mysqladmin -uroot -p shutdown

注意:

    1)"gcomm://"是特殊地址,僅僅是galera cluster初始化啓動時候使用,再次啓動時須要使用具體的ip地址

    2)wsrep默認使用4567端口,mysql啓動後,除了檢查mysql的3306端口外,還要檢查此端口4567.


八、給Galera添加一個新的mysql節點

 在Galera Cluster中,新接入的節點叫Joiner,給joiner提供複製的節點叫Donor。

wKioL1WfgrHyuz68AAEIosZ2-XY510.jpg

在生產環境中,建議設置一個專用的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。

 由此,能夠參考192.168.100.6配置192.168.100.3,啓動mysql以下:

service mysqld start --wsrep_cluster_address="gcomm://192.168.100.6:4567"

 

注意:

指定集羣ip的方式有三種:

1)如上所示,在mysql啓動時,加--wsrep_cluster_address參數指定

2)在my.cnf中配置wsrep_cluster_address

3)直接修改全局變量:set global wsrep_cluster_address="gcomm://192.168.100.6:4567"

另外須要說明的是,gcomm://的值能夠有多個,彼此間用逗號隔開,例:gcomm://192.168.100.6:4567, 192.168.100.2:4567

 

 

九、添加仲裁節點

在只有兩臺數據庫節點的galera集羣中,爲了解決腦裂問題,須要引入仲裁節點,集羣中能夠有多個仲裁節點。仲裁節點上沒有數據,它僅僅只是在集羣發生腦裂時仲裁。能夠參考192.168.100.6配置192.168.100.2節點。

仲裁節點加入集羣的方法以下:

/usr/local/mysql/bin/garbd -a gcomm://192.168.100.6:4567 -g my_wsrep_cluster -d
-a:指定集羣地址
-d:以守護進程的方式運行
-g:集羣名稱

 

3、Galera監控

一、經常使用查詢指令

查看mysql版本:mysql> SHOW GLOBAL VARIABLES LIKE 'version';

查看wsrep版本: mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';

查看wsrep有關的全部變量: mysql> SHOW VARIABLES LIKE 'wsrep%'\G

查看Galera集羣狀態: mysql> show status like 'wsrep%'

 

 

二、參數說明

 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:回滾,檢測到的衝突數目

4、Galera狀態快照轉移(SST)

    SST容許新接入的節點使用定製的方法來獲取最初的數據,當前mysql支持三種SST方法:

    一、mysqldump

        這須要接收服務器在轉移前徹底初始化和準備接收鏈接。此方法是經過定義阻塞,阻止修改自身狀態轉移的持續時間。這也是最慢的方式,可能會帶來高負載的問題。

    二、rsync

        最快的方式,也是galera默認使用的方式。rsync腳本運行在發送和接收端上。在接收端,開啓rsync服務模式,等待發送端鏈接。在發送端,開啓rsync客戶端模式,發送mysql數據目錄內容到鏈接節點。這種方法也會阻塞,可是比mysqldump快。

    三、xtrabackup

        也很快,但須要額外安裝。

相關文章
相關標籤/搜索