2017-10-19 11:44

Galera Cluster实现MariaDB多主复制集群


一、简介


Galera Cluster for MySQL是一套基于同步复制的多主MySQL集群解决方案,使用简单,没有单点故障,可用性高,能很好保证业务不断增长时我们数据的安全和随时的扩展。


主要特点:


1.同步复制

2.真正的multi-master,既所有节点可以同时读写数据库

3.自动的节点成员控制,失效节点自动被清除

4.新节点加入数据自动复制

5.真正的并行复制,行级

6.用户可以直接连接集群,使用感受上与MySQL完全一致


优势:


1.因为是多主,所以不存在Slave lag(延迟)

2.不存在丢失事务的情况

3.同时具有读和写的扩展能力

4.更小的客户端延迟

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


Galera本质是一个wsrep提供者(provider),运行依赖于wsrep的API接口。wsrep API定义了一系列应用回调和复制调用库,来实现事务数据库同步写集(wsrepset)复制以及相似应用。目的在于从应用细节上实现抽象的,隔离的复制。虽然这个接口的主要目标是基于认证的多主复制,但同样适用于异步和同步的主从复制。


使用前的注意事项:

1、使用Galera必须要给MySQL-Server打wsrep补丁。可以直接使用官方提供的已经打好补丁的MySQL安装包,如果服务器上已经安装了标准版MYSQL,需要先卸载再重新安装。卸载前注意备份数据。


2、MySQL/Galera集群只支持InnoDB存储引擎。如果你的数据表使用的MyISAM,需要转换为InnoDB,否则记录不会在多台复制。可以在备份老数据时,为mysqldump命令添加–skip-create-options参数,这样会去掉表结构的声明信息,再导入集群时自动使用InnoDB引擎。不过这样会将AUTO_INCREMENT一并去掉,已有AUTO_INCREMENT列的表,必须在导入后重新定义。


3、MySQL 5.5及以下的InnoDB引擎不支持全文索引(FULLTEXT indexes),如果之前使用MyISAM并建了全文索引字段的话,只能安装MySQL 5.6 with wsrep patch。

4、所有数据表必须要有主键(PRIMARY),如果没有主键可以建一条AUTO_INCREMENT列。


5、MySQL/Galera集群不支持下面的查询:LOCK/UNLOCK TABLES,不支持下面的系统变量:character_set_server、utf16、utf32及ucs2。


6、数据库日志不支持保存到表,只能输出到文件(log_output = FILE),不能设置binlog-do-db、binlog-ignore-db。


7、跟其他集群一样,为了避免节点出现脑裂而破坏数据,建议Galera集群最低添加3个节点。


8、在高并发的情况下,多主同时写入时可能会发生事务冲突,此时只有一个事务请求会成功,其他的全部失败。可以在写入/更新失败时,自动重试一次,再返回结果。


9、节点中每个节点的地位是平等的,没有主次,向任何一个节点读写效果都是一样的。实际可以配合VIP/LVS或HA使用,实现高可用性。


一台启动的服务器必须以空地址启动:mysqld_safe –wsrep_cluster_address=gcomm:// >/dev/null &


典型的Galera Cluster集群应用场景


二、安装Galera Cluster

2.1、Galera Cluster下载地址


官方参考文档:


直接下载RPM包地址:,下载对应的版本。


2.2、安装前准备


(1) 至少需要三台MariaDB(MySQL)服务器,如果只有两台做cluster的话,一旦出现数据不一致的情况,就可能发生脑裂,需要一台仲裁服务器,如果直接三台做cluster的话,就不需要仲裁。


(2) 配置集群内所有主机可以使用hosts文件实现主机名解析


(3) 建议配置集群内主机实现SSH无密钥通信


(4) 本次实现使用三台虚拟机主机列表如下



2.3、配置主机名解析及SSH互信


2.4、所有节点配置YUM源


2.5、所有节点安装Galera Cluster

1

[root@Bj-1-141 ~]# yum -y install MariaDB-client MariaDB-Galera-server galera

注意:在三台服务器上都要执行上面安装操作。


2.6、配置Galera Cluster配置文件


配置好一个节点而后复制到其它两个节点即可。


2.7、启动Galera Cluster集群


首次启动时,需要初始化集群,在其中一个节点上执行如下命令:

1

/etc/init.d/mysql start --wsrep-new-cluster

而后正常启动其它节点即可:

1

/etc/init.d/mysql start

本例在192.168.1.141上执行初始化操作:

1

2

[root@Bj-1-141 ~]# /etc/init.d/mysql start --wsrep-new-cluster

Starting MySQL..... SUCCESS!

192.168.1.142,192.168.1.144上执行正常启动

1

2

3

4

5

[root@bj-1-142 ~]# /etc/init.d/mysql start

Starting MySQL.....SST in progress, setting sleep higher. SUCCESS!

 

[root@bj-1-144 ~]# /etc/init.d/mysql start

Starting MySQL.....SST in progress, setting sleep higher. SUCCESS!

2.8、测试

在任意一个节点上创建数据库而后查看其它两个节点;

查看其它两个节点是否同步

至此Galera Cluster实现MariaDB(MySQL)多主复制集群结束,需要注意的是当数据表存在自增ID时,插入数据ID的编号不是按照顺序来定义的,可以通过其它程序来生成一个全局的ID避免使用自增ID。