Galera Cluster for MySQL

來源:互聯網
上載者:User

標籤:galera   mysql   mysql叢集   

一、MySQL Galera介紹


1、galera特性

 MySQL/Galera是MySQL/InnoDB的多主叢集,有以下特性: 

1)同步複製

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

3)叢集任意節點可以讀和寫

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

5)自動節點接入

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

7)無單點故障,易擴充


2、架構圖

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/41/04/wKioL1PQbDHwWT1rAAFTq8JqiSA437.jpg" title="clipboard1.png" alt="wKioL1PQbDHwWT1rAAFTq8JqiSA437.jpg" />650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />


二、Galera Cluster安裝

1、安裝前的準備

    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;


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

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


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。

650) this.width=650;" src="/e/u261/themes/default/images/spacer.gif" style="background:url("/e/u261/lang/zh-cn/images/localimage.png") no-repeat center;border:1px solid #ddd;" alt="spacer.gif" />650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/41/04/wKioL1PQbGPRBe8iAAD3ZA3Jwfw940.jpg" title="clipboard2.png" alt="wKioL1PQbGPRBe8iAAD3ZA3Jwfw940.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。


由此,可以參考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

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




本文出自 “無名小卒” 部落格,請務必保留此出處http://breezey.blog.51cto.com/2400275/1529503

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.