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. 节点配置
准备三个节点,环境是centos6.5
db1 1.1.1.1db2 1.1.1.2db3 1.1.1.3
2. 添加MariaDB 仓库
创建/etc/yum.repos.d/mariadb.repo,内容如下
[mariadb]name = MariaDBbaseurl = http://yum.mariadb.org/10.0/centos6-amd64gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDBgpgcheck=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=ROWdefault-storage-engine=innodbinnodb_autoinc_lock_mode=2innodb_locks_unsafe_for_binlog=1query_cache_size=0query_cache_type=0bind-address=0.0.0.0datadir=/var/lib/mysqlinnodb_log_file_size=100Minnodb_file_per_tableinnodb_flush_log_at_trx_commit=2wsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_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=rsyncwsrep_sst_auth=sst_user:dbpassEOF
db2、db3中类似,只是相应字段进行替换
db2:
wsrep_node_address=1.1.1.2wsrep_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 syncedwsrep_incoming_addresses | 1.1.1.1:3306 <-- node db1 is a providerwsrep_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