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)
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"
沒有留言:
張貼留言