2015年1月26日

如何設定 MariaDB Cluster

MariaDB 建置備援環境有兩個選擇,Replication 或是 Cluster,以下將設定 cluster 的步驟記錄下來。

測試環境

DB1: 192.168.1.10
DB2: 192.168.1.20

目標是要建置這兩個 DB 的 cluster 環境

安裝 MariaDB galera

在兩個 DB 上分別安裝 MariaDB galera,將 MariaDB 的 respository 加到 yum 中。

vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/centos6-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

安裝 MariaDB cluster 版本

yum -y install MariaDB-Galera-server galera MariaDB-client MariaDB-devel

建立給 cluster 使用的 DB 帳號

mysql -u root -p

GRANT ALL PRIVILEGES ON *.* TO galerauser@localhost IDENTIFIED BY 'dbpassword';
GRANT ALL PRIVILEGES ON *.* TO 'galerauser'@'192.168.1.%' IDENTIFIED BY 'dbpassword';
flush privileges;
\q

設定 galera

將設定的 sample 複製到 MariaDB 的設定資料夾中

cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/

修改 wsrep.cnf,調整下面列出來的設定項目,其他的設定值不需要修改。

vi /etc/my.cnf.d/wsrep.cnf

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://"
wsrep_cluster_name="dbcluster"
wsrep_node_address='192.168.1.20'
wsrep_node_name='db1'
wsrep_sst_auth=galerauser:dbpassword
wsrep_sst_method=rsync

首先要注意的是 wsrep_cluster_address 這個設定值,因為我們是初始化 cluster,所以必須先填為 gcomm:// ,意思就是這個初始節點不需要依賴其他DB機器的資料,建立一個 cluster 初始節點。

利用以下指令初始化 cluster。

service mysql bootstrap

利用以下指令檢查 cluster 狀態,可注意 wsrep_ready 是否為 ON,另外就是查閱 wsrep_incoming_addresses, wsrep_cluster_conf_id, wsrep_cluster_size 這幾個欄位的資料,wsrep_cluster_size 目前應該為 1 。

mysql -e "SHOW STATUS LIKE 'wsrep_%'; " -p

檢查 mysql daemon 使用的網路 port,galera 是使用 TCP Port 4567。

netstat -anlp | grep -e 4567 -e 3306

設定第二台 DB 的 galera

依照上面的步驟編輯 wsrep.cnf,要注意的是 wsrep_cluster_address 必須為 gcomm://192.168.1.10,因為這個 DB 節點是 192.168.1.10 的備援節點。

wsrep_cluster_name 必須跟 DB1 的設定一樣,wsrep_node_name 是這個 DB 的識別,要填為 db2。

vi /etc/my.cnf.d/wsrep.cnf

wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.10"
wsrep_cluster_name="dbcluster"
wsrep_node_address='192.168.1.20'
wsrep_node_name='db2'
wsrep_sst_auth=galerauser:dbpassword
wsrep_sst_method=rsync

啟動 MariaDB

service mysql start

在兩台機器上檢查 cluster 的狀態,會發現 wsrep_cluster_size 變成 2。

mysql -e "SHOW STATUS LIKE 'wsrep_%'; " -p

回頭修改 DB1 的 wsrep_cluster_address

一開始初始化 cluster 時,我們是使用這樣的設定。

wsrep_cluster_address="gcomm://"

但為了讓 DB1 離線之後,也能從 DB2 將資料同步過來,我們必須調整設定為

wsrep_cluster_address="gcomm://192.168.1.20"

調整後將 MariaDB 重新啟動

service mysql restart

auto_increment 欄位在 cluster 環境要注意的狀況

通常我們會在 table 裡面使用 auto_increment 欄位,作為 DB table 的識別欄位。

create table mytable
(
   mytableseq   int(12) not null auto_increment comment '流水序號',
   primary key (mytableseq)
);

在 DB 單機的狀況下,我們預期看到 mytableseq 欄位的資料,會是 1, 2, 3, 4 ... 這樣按照順序,一個 record 增加 1 的資料。

而當 DB 設定為 cluster 時,如果這個 cluster 環境裡面只有一台機器,或是兩個 DB 節點中,有一個因故障而離線的時候,也就是 wsrep_cluster_size 為 1 的時候,mytableseq 還是一樣會以一個 record 增加 1 的狀況產生出來。

而當 DB 設定為 cluster,而且 wsrep_cluster_size 為 2 的時候,DB1 的 mytableseq 就會變成 1, 3, 5, 7 這樣,而 DB2 會是 2, 4, 6, 8。

以一個實例來看結果,如果先在 DB1 insert 兩筆資料,然後到 DB2 insert 兩筆資料,再回到 DB1 insert 兩筆資料,這時候,我們在 table 裡面看到的結果會是

1    (DB1)
3    (DB1)
4    (DB2)
6    (DB2)
7    (DB1)
9    (DB1)

參考資料
Auto increments in Galera

DB cluster 裡面有三個節點

在初始化 DB cluster 之後,分別在 DB1, DB2, DB3 給予不同的 wsrep_cluster_address 設定,每一台 DB 可根據另外兩個 DB 的資料進行資料同步作業,這時候當然 auto_increment 欄位就會變成,一次增加 3。

DB1(192.168.1.10)

wsrep_cluster_address="gcomm://192.168.1.20,192.168.1.30"


DB2(192.168.1.20)

wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.30"


DB3(192.168.1.30)
wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.20"