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