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;如果认证测试成功,则事务提交。
MariaDB Galera Cluster 安装配置
安装环境准备
安装MariaDB集群至少需要3台服务器
操作系统版本:CentOS7.1(CentOS-7-x86_64-Minimal-1503-01)
在三台机器上修改/etc/hosts文件:
1 2 3 4 5
| cat >> /etc/hosts << EOF 192.168.128.131 node1 192.168.128.132 node2 192.168.128.133 node3 EOF
|
为了保证节点间相互通信,需要禁用三台机器的防火墙设置(如果需要防火墙,则参照官方网站增加防火墙信息设置)
1 2
| systemctl stop firewalld systemctl disable firewalld
|
然后将/etc/sysconfig/selinux的selinux设置成disabled并重启机器,这样初始化环境就完成了。
安装MariaDB Galera Cluster
在MariaDB Repository Generator选择对应的系统版本和MariaDB版本,复制相应的yum源配置到/etc/yum.repos.d/MariaDB.repo
1 2 3
| [root@node1 ~] [root@node2 ~] [root@node3 ~]
|
配置 MariaDB Galera Cluster
初始化数据库服务(只在一个节点进行,然后关闭数据库)
1 2
| [root@node1 ~] [root@node1 ~]
|
修改/etc/my.cnf.d/galera.cnf文件
1 2 3 4 5 6
| [root@node1 ~] [mysqld] wsrep_provider = /usr/lib64/galera/libgalera_smm.so wsrep_cluster_address = "gcomm://node1,node2,node3" wsrep_node_name = node1 wsrep_node_address = 192.168.128.131
|
将此文件复制到node2、node3,然后要把wsrep_node_name和wsrep_node_address改成相应节点的hostname和ip。
启动MariaDB Galera Cluster服务
在node1上执行以下命令启动
此时可能会出现如下报错:
1
| 160907 17:05:55 [ERROR] WSREP: Only binlog_format = 'ROW' is currently supported. Configured value: 'STATEMENT'. Please adjust your configuration
|
解决方法
在/etc/my.cnf.d/galera.cnf中添加一行binlog_format=ROW,然后再次启动
在输出信息中看到类似如下信息证明启动成功
1 2
| 160907 17:09:08 [Note] mysqld: ready for connections. Version: '5.5.51-MariaDB-wsrep' socket: '/var/lib/mysql/mysql.sock' port: 3306 MariaDB Server, wsrep_25.14.r9949137`
|
依此启动其他节点
1 2
| [root@node2 ~] [root@node3 ~]
|
说明
--wsrep-new-cluster这个参数只能在初始化集群使用,且只能在一个节点使用。
查看集群状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| [root@node1 ~] +------------------------------+----------------------------------------------------------------+ | Variable_name | Value | +------------------------------+----------------------------------------------------------------+ | wsrep_local_state_uuid | bb27d68e-74da-11e6-8aa4-469f840e1e54 | | wsrep_protocol_version | 7 | | wsrep_last_committed | 0 | | wsrep_replicated | 0 | | wsrep_replicated_bytes | 0 | | wsrep_repl_keys | 0 | | wsrep_repl_keys_bytes | 0 | | wsrep_repl_data_bytes | 0 | | wsrep_repl_other_bytes | 0 | | wsrep_received | 7 | | wsrep_received_bytes | 699 | | wsrep_local_commits | 0 | | wsrep_local_cert_failures | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_max | 1 | | wsrep_local_send_queue_min | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_max | 2 | | wsrep_local_recv_queue_min | 0 | | wsrep_local_recv_queue_avg | 0.142857 | | wsrep_local_cached_downto | 18446744073709551615 | | wsrep_flow_control_paused_ns | 0 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_cert_deps_distance | 0.000000 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 0.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 0.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 0 | | wsrep_causal_reads | 0 | | wsrep_cert_interval | 0.000000 | | wsrep_incoming_addresses | 192.168.128.131:3306,192.168.128.132:3306,192.168.128.133:3306 | | wsrep_desync_count | 0 | | wsrep_evs_delayed | | | wsrep_evs_evict_list | | | wsrep_evs_repl_latency | 0/0/0/0/0 | | wsrep_evs_state | OPERATIONAL | | wsrep_gcomm_uuid | bb2686c8-74da-11e6-9cde-5fd4f88f878c | | wsrep_cluster_conf_id | 3 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | bb27d68e-74da-11e6-8aa4-469f840e1e54 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_local_bf_aborts | 0 | | wsrep_local_index | 2 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy <info@codership.com> | | wsrep_provider_version | 25.3.17(r3619) | | wsrep_ready | ON | | wsrep_thread_count | 2 | +------------------------------+----------------------------------------------------------------+
|
几个关键参数
wsrep_connected = on 链接已开启
wsrep_local_index = 2 在集群中的索引值
wsrep_cluster_size =3 集群中节点的数量
wsrep_incoming_addresses = 192.168.128.131:3306,192.168.128.132:3306,192.168.128.133:3306 集群中节点的访问地址
验证数据同步
在node1上新建数据库galera_koen,然后在node2和node3上查询,如果可以查询到galera_koen这个库,说明数据同步成功,集群运行正常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| [root@node1 ~]
[root@node2 ~] +--------------------+ | Database | +--------------------+ | information_schema | | galera_koen | | mysql | | performance_schema | | test | +--------------------+
[root@node3 ~] +--------------------+ | Database | +--------------------+ | information_schema | | galera_koen | | mysql | | performance_schema | | test | +--------------------+
|
至此,MariaDB Galera Cluster已经部署成功。