apt-get install galera-3 galera-arbitrator-3 mysql-wsrep-5.7
8 開始在三個Ubuntu服務器上配置相應的節點
(1)在主節點133上設置以下:
編輯mysql配置文件/etc/my.cnf,沒有的話就本身建立該文件。
cd /etc
nano -w my.cnf
在該文件中添加內容:
[mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql binlog_format=ROW bind-address=0.0.0.0
#bind-address=127.0.0.1 default_storage_engine=innodb innodb_autoinc_lock_mode=2 innodb_flush_log_at_trx_commit=0 innodb_buffer_pool_size=122M wsrep_provider=/usr/lib/libgalera_smm.so wsrep_provider_options="gcache.size=300M; gcache.page_size=300M" wsrep_cluster_name="mycluster" wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134" wsrep_sst_method=rsync [mysql_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
[mysql]
wsrep_cluster_name="mycluster" wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_node_name="mynode133"#是否加引號?
wsrep_node_address="192.168.93.133"#主節點IP
特別注意:
(1)確保mysql配置文件包括 conf.d/
.
!includedir /etc/mysql/conf.d/
(2)確保二進制日誌格式設置爲使用行級複製,而不是語句級複製。
(3)確保默認InnoDB存儲引擎
default_storage_engine=InnoDB
Galera集羣不會使用MyISAM或相似nontransactional存儲引擎。
(2)在從節點132上設置以下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
binlog_format=ROW
bind-address=0.0.0.0
#bind-address=127.0.0.1
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=122M
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_sst_method=rsync
[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_node_name="mynode132"#是否加引號?
wsrep_node_address="192.168.93.132"#從節點1的IP
(3)在從節點134上設置以下:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
binlog_format=ROW
bind-address=0.0.0.0
#bind-address=127.0.0.1
default_storage_engine=innodb
innodb_autoinc_lock_mode=2
innodb_flush_log_at_trx_commit=0
innodb_buffer_pool_size=122M
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_provider_options="gcache.size=300M; gcache.page_size=300M"
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_sst_method=rsync
[mysql_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysql]
wsrep_cluster_name="mycluster"
wsrep_cluster_address="gcomm://192.168.93.133,192.168.93.132,192.168.93.134"
wsrep_node_name="mynode134"#是否加引號?
wsrep_node_address="192.168.93.134"#從節點2的IP
9 啓動集羣
當您完成安裝和配置Galera集羣時,您已經準備好要使用的數據庫了,可是它們尚未鏈接到一塊兒來造成集羣。要作到這一點,您須要在一個節點上啓動mysqld,使用--wsrep-new-cluster新建集羣選項。這將初始化集羣的新主組件。在此以後開始的每一個節點將鏈接到組件並開始複製。
(1)啓動第一個集羣節點
默認狀況下,節點不會做爲主組件的一部分開始。相反,他們假設主組件已經存在於集羣中的某個地方。當節點開始時,它們嘗試與集羣中的其餘節點創建網絡鏈接。對於他們找到的每一個節點,他們檢查是否它是主組件的一部分。當他們找到主組件時,他們請求一個狀態傳輸,以便將本地數據庫與集羣同步。若是他們找不到主要的組件,則仍然處於非操做狀態。
集羣啓動時沒有主組件。爲了初始化它,您須要顯式地告訴一個節點使用--wsrep-new-cluster新建集羣參數來執行此操做。按照約定,初始化主組件的節點稱爲第一個節點,由於它是第一個開始運行的節點。當您啓動一個新的集羣時,任何節點均可以做爲第一個節點,由於全部的數據庫都是空的。
記住,第一個節點只是「第一個」,它初始化主組件。這個節點能夠落在後面,離開集羣而沒必要影響主組件。要啓動第一個節點,在第一個節點上啓動數據庫服務器。要使用的命令取決於您的操做系統和Galera集羣版本。
對全部系統使用SysV init
腳本,運行如下命令:
service mysql start --wsrep-new-cluster//經常使用該命令
系統使用 systemd
和Galera集羣5.5或5.6,使用這個命令:
systemctl start mysql --wsrep-new-cluster
系統使用 systemd
和Galera集羣5.7,使用專用的 mysqld_bootstrap
腳本:
/usr/bin/mysqld_bootstrap
一旦節點啓動數據庫服務器,經過檢查wsrep_cluster_size來檢查該啓動是否成功。在數據庫客戶端,運行如下查詢:
SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+
這個狀態變量告訴您鏈接到集羣的節點的數量。由於您剛剛啓動了第一個節點,因此值是1。
此時,不要從新啓動mysqld。
(2)在集羣中添加額外的節點
當您啓動第一個節點時,您將初始化一個新的集羣。完成此操做後,添加全部其餘節點的過程是相同的。
要向現有的集羣添加一個節點,能夠像往常同樣啓動mysqld。若是您的系統使用init,運行如下命令:
service mysql start
對於使用systemd的系統,能夠運行如下命令:
systemctl start mysql
當數據庫服務器初始化爲一個新節點時,它鏈接到由wsrep_cluster_address參數定義的集羣成員。使用該參數,它將自動檢索集羣映射並鏈接到全部可用的節點。
您可使用wsrep_cluster_size狀態變量來測試節點鏈接是否成功。在數據庫客戶端,運行如下查詢
SHOW STATUS LIKE 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+
這代表第二個節點如今鏈接到集羣。重複這個過程,將剩下的節點添加到集羣中。
當集羣中的全部節點都贊成成員狀態時,就會啓動狀態交換。在狀態交換中,新節點檢查集羣狀態。若是節點狀態與集羣狀態不一樣,(一般狀況下是這樣),新節點將請求從集羣中傳輸狀態快照,並將其安裝到本地數據庫中。
完成此操做以後,新節點就可使用了。
10 測試集羣
當您的集羣啓動並運行時,您可能想要測試某些特性,以確保它們正常工做,或者爲可能出現的實際問題作好準備。
(1)複製測試
要測試Galera集羣是否按照預期工做,請完成如下步驟:
1 在數據庫客戶機上,驗證全部節點之間是否相互鏈接
SHOW STATUS LIKE 'wsrep_%'; +---------------------------+------------+ | Variable_name | Value | +---------------------------+------------+ ... | wsrep_local_state_comment | Synced (6) | | wsrep_cluster_size | 3 | | wsrep_ready | ON | +---------------------------+------------+
wsrep_local_state_comment:值同步代表該節點鏈接到集羣和操做。
wsrep_cluster_size:該值表示集羣中的節點。
wsrep_ready:該值代表該節點鏈接到集羣並可以處理事務。
2 在node1的數據庫客戶機上,建立一個表和插入數據:
CREATE DATABASE galeratest; USE galeratest; CREATE TABLE test_table ( id INT PRIMARY KEY AUTO_INCREMENT, msg TEXT ) ENGINE=InnoDB; INSERT INTO test_table (msg) VALUES ("Hello my dear cluster."); INSERT INTO test_table (msg) VALUES ("Hello, again, cluster dear.");
3 在node2的數據庫客戶機上,檢查數據是否被正確複製:
USE galeratest; SELECT * FROM test_table; +----+-----------------------------+ | id | msg | +----+-----------------------------+ | 1 | Hello my dear cluster. | | 2 | Hello, again, cluster dear. | +----+-----------------------------+
SELECT查詢中給出的結果代表,您在node1中輸入的數據已經複製到node2中。
(2) split - brain測試
爲了在兩個節點集羣上測試Galera集羣,請完成如下步驟:
(1)斷開兩個集羣節點之間的網絡鏈接。quorum丟失,節點不服務請求。
(2)從新鏈接網絡鏈接。quorum仍然丟失,節點不提供請求
(3)在一個數據庫客戶機上,從新設置quorum:
SET GLOBAL wsrep_provider_options='pc.bootstrap=1';
quorum被重置,集羣恢復
(3)故障仿真
您還能夠經過模擬三個節點上的各類故障狀況來測試Galera集羣:
要模擬單個mysqld進程的崩潰,能夠在下面的一個節點上運行如下命令:
killall -9 mysqld
爲了模擬網絡斷開,使用iptables或netem來阻止全部的ip流量到一個節點
要模擬整個服務器崩潰,在虛擬的來賓中運行每一個mysqld,並完全終止整個虛擬實例
(4)重啓集羣
偶爾,您可能不得不從新啓動整個Galera集羣。例如,在停電的狀況下,每一個節點都被關閉,而且根本沒有mysqld進程,這可能會發生。
要從新啓動整個Galera集羣,請完成如下步驟:
使用數據狀態最新的節點狀態ID標識節點。
啓動該節點做爲集羣的第一個節點。
像往常同樣啓動節點的其他部分。
如何識別數據最新的節點:經過比較集羣中不一樣節點上的全局事務ID值來肯定數據最新的節點的狀態ID。你能夠在grastate.dat文件中找到它。該文件位於數據庫的datadir中,若是grastate.dat文件以下所見,您已經找到了數據最新的節點的狀態ID:
# GALERA saved state version: 2.1 uuid: 5ee99582-bb8d-11e2-b8e3-23de375c1d30 seqno: 8204503945773 cert_index:
要找到最後一個提交事務的序列號,使用--wsrep-recover選項運行mysqld。這將把InnoDB表空間恢復到一致狀態,將對應的全局事務ID值打印到錯誤日誌中,而後退出。例如:
130514 18:39:13 [Note] WSREP: Recovered position: 5ee99582-bb8d-11e2-b8e3- 23de375c1d30:8204503945771
這個值是節點狀態ID,您可使用它來手動更新grastate.dat文件。經過爲seqno字段輸入該文件,或者讓 mysqld_safe
自動恢復,並在下一次啓動時將值傳遞給數據庫服務器。
(5)引導的安全保護
從提供者版本3.19開始,Galera還提供了額外的保護,以防止在集羣關閉以前的集羣中最後一個節點上使用一個節點來引導集羣.
若是Galera可以決定性地肯定最後一個節點是哪一個節點,那麼它將被標記爲「安全引導」,就像這個例子中的grastate.dat:
# GALERA saved state version: 2.1 uuid: 5981f182-a4cc-11e6-98cc-77fabedd360d seqno: 1234 safe_to_bootstrap: 1
這樣的節點能夠用來引導集羣。嘗試使用任何其餘節點的引導將致使如下錯誤消息:
2016-11-07 01:49:19 5572 [ERROR] WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat file manually and set safe_to_bootstrap to 1 .
(6)GCACHE復甦
從提供者版本3.19開始,Galera提供了gcache。恢復參數。若是設置爲yes,Galera將嘗試在節點啓動時恢復gcache。
若是gcache恢復成功,則該節點將處於向其餘鏈接節點提供支持的位置,這將加快整個集羣的整體重啓時間。
Gcache恢復要求整個Gcache文件被讀取兩次。對於位於慢磁盤上的大型gcache文件,此操做可能須要一些時間。
Gcache恢復是「最好的努力」操做。若是恢復不成功,則節點將繼續正常運行,可是其餘節點在嘗試鏈接時將返回到SST。