設定MariaDB Cluster
首先要確定二台資料庫的機器都已經安裝好MariaDB後,我們就要開始設定Cluster了。下方我們先針對資料庫1的機器來執行設定
啟動MariaDB
請先以root的相同權限的帳號登入資料庫1,登入後我們就要啟動MariaDB,透過下方的指令 service mysql start來啟動MariaDB(這邊指令雖然是mysql,但實際上啟動的是MariaDB)
設定MariaDB的root密碼
請輸入指令/usr/bin/mysql_secure_installation
這時會詢問目前的root密碼,因為還沒有設定所以直接按Enter通過。
接著下來是詢問是否設定密碼,輸入y後,接著輸入密碼,我們在這邊先輸入一個dbpass的密碼。
接下來詢問的是是否刪除MariaDB用的預設使用者,一樣輸入y後,進入下一個設定。
接著是詢問是否允許root從遠端登入,因為我們等一下會做相關設定,所以先輸入y後,繼續接著設定。
詢問是否刪除一個預設的test資料庫,test資料庫是用來做簡單的連線測試用而已,請自行判斷需不需要保留,我們這邊不保留,輸入y後刪除test。
最後是詢問設定是否要立即生效,當然是y啦。
這樣就設定完成了,其實除了輸入密碼外,全部都按y就對了。注意一點,上述的設定只在資料庫1上設定而已,資料庫2先不動。
新增sst_user的使用者與權限設定
這個部份要進入到MariaDB裡做設定,所以我們要先進入到MariaDB的命令列,進入的指令是:
mysql -uroot -p (-u後接使用者名稱,-p代表需要密碼),輸入剛剛設定的密碼dbpass後,進入到資料庫的命令列。
輸入下列指令
-
DELETE FROM mysql.user WHERE user='';
=>說明:刪除使用者名稱為空的刪除 -
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'dbpass';
=>說明:建立root的最大權限,其中*.*代表所有資料庫及資料表,'root'@'%' 代表使用者root可從任意一個IP登入;如果要限制IP,將'%'改為IP即可,例如:'root'@'192.168.43.2' ,最後設定root的密碼為dbpass。
-
GRANT USAGE ON *.* to sst_user@'%' IDENTIFIED BY 'dbpass';
=>說明:同上,不過使用者名稱換為sst_user。
-
GRANT ALL PRIVILEGES on *.* to sst_user@'%';
=>說明:設定所有的權限給sst_user。
-
FLUSH PRIVILEGES;
=>說明:即時生效。
-
quit
=>說明:離開MariaDB的命令列。
結果如下圖。
關閉MariaDB服務
因為要設定Cluster時,會動到MariaDB的設定檔,而設定檔要生效,MariaDB必須重啟,所以我們就直接先停掉MariaDB後,再來調整調定檔,關閉MariaDB的指令如下: service mysql stop
設定Cluster
剛剛上方的講述的指令,都是在資料庫1的機器下運作,接下來的Cluster設定,則是分別在資料庫1與資料庫2上執行。
首先我們來編輯資料庫1上的/etc/my.cnf.d/server.cnf檔案,指令如下:
vi /etc/my.cnf.d/server.cnf
在vi模式下,按下G(大寫)來跳到檔案的最下方,加入下方文字:
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.43.101,192.168.43.102"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.43.101'
wsrep_node_name='DB1'
wsrep_sst_method=rsync
wsrep_sst_auth=sst_user:dbpass
一樣在資料庫2上編輯/etc/my.cnf.d/server.cnf,在最下方加入如下內容:
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.43.101,192.168.43.102"
wsrep_cluster_name='galera_cluster'
wsrep_node_address='192.168.43.102'
wsrep_node_name='DB2'
wsrep_sst_method=rsync
wsrep_sst_auth=sst_user:dbpass
我們加入的文字有四段是粗體字,我們來解釋一下這個部份:
-
wsrep_cluster_address="gcomm://192.168.43.101,192.168.43.102"
說明:這段在描述有那幾台機器的IP是要架設Cluster的。 -
wsrep_node_address='192.168.43.102'
說明:當前機器的IP。
-
wsrep_node_name='DB2'
說明:機器的別名,可用來判斷當前是連到那一台。
-
wsrep_sst_auth=sst_user:dbpass
說明:我們在上一節新增的使用者sst_user及密碼。
啟動MariaDB Cluster
MariaDB Cluster特性與啟動順序
MariaDB Cluster是屬於AA(Active-Active)特性的Cluster,所以在一開始啟動時,必須先人工判斷是否已經有Cluster內的機器處於Active狀態,如果有的話,啟動指令是:
service mysql start
;如果沒有的話,啟動指令會變成:
service mysql bootstrap
這樣子說明可能有點抽象,我們來假設一下各種情況,我們先假設我們有三台資料庫在做Cluster,分別是db1、db2與db3。
-
狀況1:db1、db2、db3皆未啟動。
此時因為沒有任何一台是屬於Active的狀況,所以請不要三台同時啟動,而是先選擇一台啟動,啟動指令為service mysql bootstrap。確定第一台啟動成功後,後續二台的啟動指令為service mysql start。
-
狀況2:db1一開始下的指令為service mysql bootstrap,接下來db2與db3下指令service mysql start後,正常啟動MariaDB;不過此時db1因故需重開機。
在這種狀況下,因為Cluster裡已經有Active的機器,所以即使db1一開始的啟動命令為service mysql bootstrap,不過重新啟動的命令是:service mysql start。
總之,只有Cluster裡第一台啟動的命令比較特殊,之後的啟動命令就比較正常。
啟動MariaDB Cluster
請務必先在資料庫1的機器上下service mysql bootstrap的指令,因為我們的使用者root、sst_user是在資料庫1上。
確認資料庫1的MariaDB啟動成功後,再到資料庫2執行service mysql start。
此時會看到一段奇怪的文字「SST in progress, setting sleep higher.」,代表二邊的資料在同步,同步完後就可以使用了。
測試Cluster功能
即然我們Cluster設定並啟動了,接下來我們就是來確認Cluster結果。
利用root登入資料庫2
還有印象我們並沒有設定資料庫2的root密碼嗎?如果Cluster成功啟動的話,我們就可以直接用資料庫1的設定密碼dbpass登入資料庫2了。
上圖是從利用帳號root,與密碼dbpass,成功登入資料庫2的擷圖。
在資料庫2建立資料表,並在資料庫1查看
上圖是在資料庫2上執行建立資料庫的指令後,下圖是切換到資料庫1的機器上查看,我們可以看到資料已經被同步了。
至此我們已經完成MariaDB的安裝了。不過,因為是Cluster的架構,所以如果直接指定IP來連線的話,當機器掛掉時,無法做failover的處理,那就浪費了Cluster的架構了,為了儘量發揮Cluster的架構,我們還需要一台Load Balance來幫我們做分流與failover。