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;如果认证测试成功,则事务提交。

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/selinuxselinux设置成disabled并重启机器,这样初始化环境就完成了。

安装MariaDB Galera Cluster

MariaDB Repository Generator选择对应的系统版本和MariaDB版本,复制相应的yum源配置到/etc/yum.repos.d/MariaDB.repo

1
2
3
[root@node1 ~]# yum install -y MariaDB-Galera-server galera rsync MariaDB-client
[root@node2 ~]# yum install -y MariaDB-Galera-server galera rsync MariaDB-client
[root@node3 ~]# yum install -y MariaDB-Galera-server galera rsync MariaDB-client

配置 MariaDB Galera Cluster

初始化数据库服务(只在一个节点进行,然后关闭数据库)

1
2
[root@node1 ~]# service mysql start
[root@node1 ~]# service mysql stop

修改/etc/my.cnf.d/galera.cnf

1
2
3
4
5
6
[root@node1 ~]# cat /etc/my.cnf.d/galera.cnf
[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

将此文件复制到node2node3,注意要把wsrep_node_namewsrep_node_address改成相应节点的hostnameip

启动MariaDB Galera Cluster服务

1
[root@node1 ~]# mysqld --wsrep-new-cluster --user=root &

此时会出现如下报错:

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
3
4
5
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`

[root@node2 ~]# service mysql start
[root@node3 ~]# service mysql start

注:--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 ~]# mysql -e 'show status like "wsrep_%"'
+------------------------------+----------------------------------------------------------------+
| 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 ~]# mysql -e "create database galera_koen"

[root@node2 ~]# mysql -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| galera_koen |
| mysql |
| performance_schema |
| test |
+--------------------+

[root@node3 ~]# mysql -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| galera_koen |
| mysql |
| performance_schema |
| test |
+--------------------+

至此,MariaDB Galera Cluster已经成功部署。

  • EOF

本文作者:Koen

参考链接:http://code.oneapm.com/database/2015/07/02/mariadb-galera-cluster/