• 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MariaDB Galera Cluster Deploy

MySQL 彭东稳 8年前 (2016-09-01) 34431次浏览 已收录 0个评论

MariaDB Galera Cluster

Galera Cluster是MariaDB的一个双活多主集群,其可以使得MariDB的所有节点保持同步,Galera为MariaDB提供了同步复制(相对于原生的异步复制),因此其可以保证HA,且其当前仅支持XtraDB/InnoDB存储引擎(扩展支持MyISAM),并且只可在Linux下使用。

MariaDB 10.1开始,在Galera Cluster中默认已经包含wsrep API。在MariaDB 10.0MariaDB 5.5时还是独立的,所以在安装部署上可能会有所不同,具体看MariaDB官方介绍。

Galera Cluster的特性:

● 真正的多主架构,任何节点都可以进行读写。

● 同步复制,各节点间无延迟且节点宕机不会导致数据丢失。

● 紧密耦合,所有节点均保持相同状态,节点间无不同数据。

● 无需主从切换操作或使用VIP。

● 热Standby,在Failover过程中无停机时间(由于不需要Failover)。

● 自动节点配置,无需手工备份当前数据库并拷贝至新节点。

● 支持InnoDB存储引擎。

● 对应于透明,无需更改应用或是进行极小的更改。

● 无需进行读写分离。

Galera Cluster的优势:

● 因为是多主,所以不存在Slavelag(延迟)。

● 不存在丢失事务的情况。

● 同时具有读和写的扩展能力。

● 更小的客户端延迟。

● 节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的。

Galera Cluster局限性:

● 目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的。

● DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集。

● 在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…。

● 查询日志不能保存在表中,如果开启查询日志,只能保存到文件中。

● 允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义,任何大型操作将被拒绝,如大型的LOAD DATA操作。

● 由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK))。

● XA事务不支持,由于在提交上可能回滚。

● 整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。

● 集群节点建议最少3个。

● 如果DDL语句有问题将破坏集群。

Galera Cluster技术实现:

Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。

Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制,工作原理如下图:

MariaDB Galera Cluster Deploy

当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将write-set纪录的内容发送给其他节点。

write-set将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。

如果认证测试失败,节点将丢弃write-set;如果认证测试成功,则事务提交。

部署MariaDB Galera Cluster

一、部署前环境准备

安装MariaDB集群至少需要3台服务器(如果只有两台的话需要特殊配置,请参照官方文档)。

在这里,我列出三台试验机器的配置:

1)各个节点配置主机名

2)各个节点配置hosts实现本地解析

3)关闭各节点防火墙和SELINUX

注意:一定要关闭系统防火墙和SELINUX,如果需要防火墙,则参照官方网站增加防火墙信息设置,MariaDB Galera Cluster主机之间需要通信,防火墙默认是阻挡的,从而会导致你的MariaDB启动不了(启动时需要通信)。

4)配置NTP(chrony)

查看时间同步源状态

PS:集群中的主机都需要时间同步,具体chrony如何使用自行查资料。

以上做完,系统初始化工作就搞定了,下面就开始来部署MariaDB Galera Cluster。

二、开始部署MariaDB Galera Cluster

自MariaDB 10.1版本开始 wsrep API已经集成在MariaDB中,配置比之前简便了许多,具体配置过程参考下文。

1)安装配置MariaDB Galera Cluster 10.1

部署MariaDB Galera Cluster 10.1版本有两种选择,一个是使用MariaDB官方,第二种是使用OpenStack源, OpenStack云平台很多核心组件都需要用到数据库服务(有些服务使用noSQL),OpenStack默认就使用MariaDB数据库,并且推荐使用MariaDB Galera Cluster。

这里我们使用OpenStack源安装MariaDB Galera Cluster,如果使用MariaDB官方源安装也一样,但在安装包上不太相同,具体看官方。配置上基本没有太大差别,除了个别配置文件的名称以及默认配置略有差别外。

先下载OpenStack源。

然后在各个节点上分别安装MariaDB集群相关软件包。

查看安装的软件包

MariaDB基本配置(各个节点)

MariaDB Galera Cluster基本配置(各个节点)

可以在第一个节点配置完成后,将配置文件拷贝到其他节点,只需要修改如下两项为节点自己的参数即可

wsrep_node_name=[每个节点配置自己的主机名]

wsrep_node_address=[每个节点配置自己的IP地址]

重要参数解释:

wsrep_on=ON

#该配置项从10.1.1版本增加的,必须配置ON选项。

binlog_format=ROW

#二进制日志的格式必须为ROW格式。

default-storage-engine=innodb

#指定默认存储引擎为inodb。

bind-address=0.0.0.0

#指定Galera监听的地址。

wsrep_provider=/usr/lib64/galera/libgalera_smm.so

#指定Galera的库。

wsrep_cluster_name=”my_wsrep_cluster”

#MariaDB集群的名称,一般不需要更改,名称最好不要带特殊字符,如”-“是MariaDB无法识别的。

wsrep_cluster_address=”gcomm://mc01,mc02,mc03″

#在之前的版本galera集群的第一个节点配置wsrep_cluster_address =”gcomm:// “,即空置,但是现在可以每个节点都配置一样了,在启动cluster的脚步会自动处理。

wsrep_node_name=mc01

#每个节点配置自己的主机名。

wsrep_node_address=172.29.32.200

#每个节点配置自己的IP地址。

wsrep_sst_method=rsync

#指定集群间通信的方式,默认使用rsync(在安装MariaDB时就安装了),通过tcp进行通信的,具体可以看MariaDB启动时的日志信息,默认在/var/log/mariadb/mariadb.log。

wsrep_sst_auth=root:

#集群间的身份验证,指不指定都行。

wsrep_slave_threads

#可以指定wsrep的线程数,提高复制效率。

2)启动MariaDB Galera Cluster

当各个节点都配置完后,这时候我们只需要在其中一个节点执行启动MariaDB Galera Cluster。并且要使用Galera自带的工具启动,如下:

这里又需要注意,只有在第一次启动时需要使用该工具启动,并且只需要在一个节点上启动,它会生成一个集群ID。以后的每次启动使用systemctl start mariadb.service即可。

启动完成后检查日志是否有错误信息(/var/log/mariadb/mariadb.log),并逐一解决。也可以查看一下MariaDB是否正常启动:

其中3306端口是MariaDB开启的端口,而4567端口是Galera启动的端口。

3)启动剩余节点MariaDB服务

如果都正常启动固然是好,如果启动报错,你可以一边启动一边去看MariaDB的启动日志,基本都有启动不了的原因。如下,我碰到的报错:

就是由于我的主机防火墙忘记关了导致各个节点之间无法探测。

当各个节点都启动完成后,此时MariaDB Galera Cluster应该就已经在工作了。

4)检查集群是否构建成功

具体参数含义解释

以下参数能对整个集群的做集群完整性检查、节点状态检查、复制健康状态检查、网络瓶颈检查、冲突或死锁检测等,具体参数如下:

wsrep_cluster_state_uuid

#此参数的值是集群的UUID,每个节点应该一致,可以由此看出节点是否还是集群的一员。

wsrep_cluster_status

#集群节点的状态, 正常应该返回primary,其他状态异常,说明出现”分区”或是”split-brain”状况。

wsrep_cluster_conf_id

#显示集群变更次数,所有节点应该一致, 反之说明有节点与集群断开了。

wsrep_cluster_size

#集群中节点的数量。

wsrep_incoming_addresses

#集群中成员的IP地址和端口。

wsrep_connected

#当前是否连接中,如果该值为Off,且wsrep_ready的值也为Off,则说明该节点没有连接到集群。

wsrep_flow_control_paused

#表示复制停止了多长时间,即表明集群因为Slave延迟而慢的程度,值为0~1,越靠近0越好。值为1表示复制完全停止,可优化wsrep_slave_threads的值来改善。

wsrep_flow_control_sent

wsrep_flow_control_sent

#表示该节点已经停止复制了多少次。

wsrep_last_committed

#最新提交事物的记录。

wsrep_local_commits

#本地SQL提交记录。

wsrep_local_cert_failures

#本地事物提交失败记录。

wsrep_local_bf_aborts

#本地事物回滚的次数。

wsrep_local_send_queue

wsrep_local_recv_queue 

#本地发送和接收的队列。

wsrep_local_send_queue_avg

wsrep_local_recv_queue_avg 

#表示slave事务队列的平均长度,slave瓶颈的预兆。

wsrep_local_state_comment

#是否在同步中,如果wsrep_connected为On,但wsrep_ready为OFF,则可以从该项查看原因。

wsrep_ready

#插件是否应用中。

wsrep_replicated

#随着复制发出的次数。

wsrep_replicated_bytes

#随着复制发出的字节数。

5)验证数据同步

我们可以使用初始化MariaDB的方式来验证数据同步,使用MariaDB自带的mysql_secure_installation工具增强MariaDB的安全性,这个工具会删除多余用户及测试库,然后会让你设置root密码。

在其中的一台主机上使用此工具,如下:

具体过程省略,当你设置密码后,如果登录各个节点都需要密码了,就证明主机之间开始同步了。

当然最简单的就是创建一个数据库,看看其他主机是否同步过去了。

MariaDB负载均衡

当MariaDB Galera Cluster集群搭建完成后,通过任意一个节点都可以连接进行数据操作。当然我们可以借助于haproxy或lvs来实现MySQL数据库集群之间的负载均衡,也很简单,有需要的自行查阅资料。

http://blog.sina.com.cn/s/blog_53b13d950102uxpw.html


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (4)
[资助本站您就扫码 谢谢]
分享 (0)

您必须 登录 才能发表评论!