MariaDB Galera Cluster 部署
MariaDB作為Mysql的一個分支,在開源項目中已經廣泛使用,例如大熱的openstack,所以,為了保證服務的高可用性,同時提高系統的負載能力,集群部署是必不可少的。
MariaDB Galera Cluster 介紹
MariaDB集群是MariaDB同步多主機集群。它僅支持XtraDB/ InnoDB存儲引擎(雖然有對MyISAM實驗支持 - 看wsrep_replicate_myisam系統變量)。
主要功能:
- 同步復制
- 真正的multi-master,即所有節點可以同時讀寫數據庫
- 自動的節點成員控制,失效節點自動被清除
- 新節點加入數據自動復制
- 真正的并行復制,行級
- 用戶可以直接連接集群,使用感受上與MySQL完全一致
優勢:
- 因為是多主,所以不存在Slavelag(延遲)
- 不存在丟失事務的情況
- 同時具有讀和寫的擴展能力
- 更小的客戶端延遲
- 節點間數據是同步的,而Master/Slave模式是異步的,不同slave上的binlog可能是不同的
技術:
Galera集群的復制功能基于Galeralibrary實現,為了讓MySQL與Galera library通訊,特別針對MySQL開發了wsrep API。
Galera插件保證集群同步數據,保持數據的一致性,靠的就是可認證的復制,工作原理如下圖:
當客戶端發出一個commit的指令,在事務被提交之前,所有對數據庫的更改都會被write-set收集起來,并且將write-set紀錄的內容發送給其他節點。
write-set將在每個節點進行認證測試,測試結果決定著節點是否應用write-set更改數據。
如果認證測試失敗,節點將丟棄write-set;如果認證測試成功,則事務提交。
1 安裝環境準備
安裝MariaDB集群至少需要3臺服務器(如果只有兩臺的話需要特殊配置,請參照 官方文檔 )
在這里,我列出試驗機器的配置:
操作系統版本:centos7
node4:10.128.20.16 node5:10.128.20.17 node6:10.128.20.18
以第一行為例,node4為hostname,10.128.20.16為ip,在三臺機器修改/etc/hosts文件,我的文件如下:
10.128.20.16 node4 10.128.20.17 node5 10.128.20.18 node6
為了保證節點間相互通信,需要禁用防火墻設置(如果需要防火墻,則參照 官方網站 增加防火墻信息設置)
在三個節點分別執行命令:
systemctl stop firewalld
然后將/etc/sysconfig/selinux的selinux設置成disabled,這樣初始化環境就完成了。
2 安裝 MariaDB Galera Cluster
[root@node4 ~]# yum install -y mariadb mariadb-galera-server mariadb-galera-common galera rsync
[root@node5 ~]# yum install -y mariadb mariadb-galera-server mariadb-galera-common galera rsync
[root@node6 ~]# yum install -y mariadb mariadb-galera-server mariadb-galera-common galera rsync
3 配置 MariaDB Galera Cluster
初始化數據庫服務,只在一個節點進行
[root@node4 mariadb]# systemctl start mariadb [root@node4 mariadb]# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] n ... skipping. Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] y ... Success! By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] n ... skipping. Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB!
關閉數據庫,修改/etc/my.cnf.d/galera.cnf
[root@node4 mariadb]# systemctl stop mariadb
[root@node4 ~]# vim /etc/my.cnf.d/galera.cnf
修改以下內容:
[mysqld] ...... wsrep_provider = /usr/lib64/galera/libgalera_smm.so wsrep_cluster_address = "gcomm://node4,node5,node6" wsrep_node_name = node4 wsrep_node_address=10.128.20.16 #wsrep_provider_options="socket.ssl_key=/etc/pki/galera/galera.key; socket.ssl_cert=/etc/pki/galera/galera.crt;"
提示:如果不用ssl的方式認證的話,請把wsrep_provider_options注釋掉。
將此文件復制到node5、node6,注意要把wsrep_node_name和wsrep_node_address改成相應節點的hostname和ip。
4 啟動 MariaDB Galera Cluster 服務
[root@node4 ~]# /usr/libexec/mysqld --wsrep-new-cluster --user=root &
觀察日志:
[root@node4 ~]# tail -f /var/log/mariadb/mariadb.log 150701 19:54:17 [Note] WSREP: wsrep_load(): loading provider library 'none' 150701 19:54:17 [Note] /usr/libexec/mysqld: ready for connections. Version: '5.5.40-MariaDB-wsrep' socket: '/var/lib/mysql/mysql.sock' port: 3306 MariaDB Server, wsrep_25.11.r4026
出現ready for connections,證明我們啟動成功,繼續啟動其他節點:
[root@node5 ~]# systemctl start mariadb
[root@node6 ~]# systemctl start mariadb
可以查看/var/log/mariadb/mariadb.log,在日志可以看到節點均加入了集群中。
警告?:--wsrep-new-cluster這個參數只能在初始化集群使用,且只能在一個節點使用。
5 查看集群狀態
我們可以關注幾個關鍵的參數:
wsrep_connected = on鏈接已開啟
wsrep_local_index = 1在集群中的索引值
wsrep_cluster_size =3集群中節點的數量
wsrep_incoming_addresses = 10.128.20.17:3306,10.128.20.16:3306,10.128.20.18:3306集群中節點的訪問地址
6 驗證數據同步
我們在node4上新建數據庫galera_test,然后在node5和node6上查詢,如果可以查詢到galera_test這個庫,說明數據同步成功,集群運行正常。
[root@node4 ~]# mysql -uroot -proot -e "create database galera_test"
[root@node5 ~]# mysql -uroot -proot -e "show databases" +--------------------+ | Database | +--------------------+ | information_schema | | galera_test | | mysql | | performance_schema | +--------------------+
[root@node6 ~]# mysql -uroot -proot -e "show databases" +--------------------+ | Database | +--------------------+ | information_schema | | galera_test | | mysql | | performance_schema | +--------------------+
至此,我們的 MariaDB Galera Cluster 已經成功部署。
參考文章:
- http://galeracluster.com/documentation-webpages/
- https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/