MariaDB做爲Mysql的一個分支,在開源項目中已經普遍使用,例如大熱的openstack,因此,爲了保證服務的高可用性,同時提升系統的負載能力,集羣部署是必不可少的。node
MariaDB集羣是MariaDB同步多主機集羣。它僅支持XtraDB/ InnoDB存儲引擎(雖然有對MyISAM實驗支持 - 看wsrep_replicate_myisam系統變量)。mysql
主要功能:sql
優點:數據庫
技術:centos
Galera集羣的複製功能基於Galeralibrary實現,爲了讓MySQL與Galera library通信,特別針對MySQL開發了wsrep API。安全
Galera插件保證集羣同步數據,保持數據的一致性,靠的就是可認證的複製,工做原理以下圖: 異步
當客戶端發出一個commit的指令,在事務被提交以前,全部對數據庫的更改都會被 write-set
收集起來,而且將write-set
紀錄的內容發送給其餘節點。ide
write-set
將在每一個節點進行認證測試,測試結果決定着節點是否應用write-set
更改數據。測試
若是認證測試失敗,節點將丟棄 write-set
;若是認證測試成功,則事務提交。ui
安裝過程:
1. 節點配置
準備三個節點,環境是centos6.5
db1 1.1.1.1 db2 1.1.1.2 db3 1.1.1.3
2. 添加MariaDB 倉庫
建立/etc/yum.repos.d/mariadb.repo,內容以下
[mariadb] name = MariaDB baseurl = http://yum.mariadb.org/10.0/centos6-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1
3. 修改防火牆模式,全部節點執行
sudo setenforce0
4. 安裝
yum install socat MariaDB-Galera-server MariaDB-client rsync galera
5.設置MariaDB安全配置
service mysql start
執行下面命令
/usr/bin/mysql_secure_installation
本文設置數據庫密碼爲dbpass,全部問題都是default
6.建立mariaDB galera cluster用戶
咱們首先建立sst_user,sst_user是在State Transfer Snapsho(SST)階段節點之間進行驗證的用戶
在全部節點上執行
mysql -u root -p
mysql> DELETE FROM mysql.user WHERE user=''; mysql> GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY 'dbpass'; mysql> GRANT USAGE ON *.* to sst_user@'%' IDENTIFIED BY 'dbpass'; mysql> GRANT ALL PRIVILEGES on *.* to sst_user@'%'; mysql> FLUSH PRIVILEGES; mysql> quit
7. 建立mariaDB galera cluster配置
全部節點執行
service mysql stop
db1中的配置文件
cat >> /etc/my.cnf.d/server.cnf << EOF
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://1.1.1.1,1.1.1.2,1.1.1.3" wsrep_cluster_name='galera_cluster' wsrep_node_address='1.1.1.1' wsrep_node_name='db1' wsrep_sst_method=rsync wsrep_sst_auth=sst_user:dbpass EOF
db二、db3中相似,只是相應字段進行替換
db2:
wsrep_node_address=1.1.1.2 wsrep_node_name='db2'
db3:
wsrep_node_address='1.1.1.3' wsrep_node_name='db3'
8. 啓動第一個集羣節點
db1上執行
/etc/init.d/mysql start --wsrep-new-cluster
在db1上執行下面命令
mysql -uroot -p -e "show status like 'wsrep%'"
能夠看到結果
wsrep_local_state_comment | Synced <-- cluster is synced wsrep_incoming_addresses | 1.1.1.1:3306 <-- node db1 is a provider wsrep_cluster_size | 1 <-- cluster consists of 1 node wsrep_ready | ON <-- good :)
9. 添加其餘節點
db2上執行mysql 啓動
service mysql start
查看狀態
mysql -uroot -p -e "show status like 'wsrep%'"
顯示結果
| wsrep_local_state_comment | Synced | | wsrep_incoming_addre sses | 1.1.1.1:3306,1.1.1.2:3306 | | wsrep_cluster_size | 2 | | wsrep_connected | ON | | wsrep_ready | ON |
db3啓動
service mysql start
顯示結果
| wsrep_local_state_comment | Synced | | wsrep_incoming_addresses | 1.1.1.3:3306,1.1.1.1:3306,1.1.1.2:3306 | | wsrep_cluster_size | 3 | | wsrep_connected | ON | | wsrep_ready | ON |
9. 驗證複製
mysql -u root -p -e 'CREATE DATABASE clustertest;' mysql -u root -p -e 'CREATE TABLE clustertest.mycluster ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), ipaddress VARCHAR(20), PRIMARY KEY(id));' mysql -u root -p -e 'INSERT INTO clustertest.mycluster (name, ipaddress) VALUES ("db1", "1.1.1.1");'
在各個節點上檢查是否存在數據庫clustertest和表mycluster