Mariadb galera cluster 安装配置

 

MariaDB做为Mysql的一个分支,在开源项目中已经普遍使用,例如大热的openstack,因此,为了保证服务的高可用性,同时提升系统的负载能力,集群部署是必不可少的。node

MariaDB Galera Cluster 介绍

MariaDB集群是MariaDB同步多主机集群。它仅支持XtraDB/ InnoDB存储引擎(虽然有对MyISAM实验支持 - 看wsrep_replicate_myisam系统变量)。mysql

主要功能:sql

  • 同步复制
  • 真正的multi-master,即全部节点能够同时读写数据库
  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户能够直接链接集群,使用感觉上与MySQL彻底一致

优点:数据库

  • 由于是多主,因此不存在Slavelag(延迟)
  • 不存在丢失事务的状况
  • 同时具备读和写的扩展能力
  • 更小的客户端延迟
  • 节点间数据是同步的,而Master/Slave模式是异步的,不一样slave上的binlog多是不一样的

技术: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