程序猿成长日记 | MariaDB Galera Cluster多主集群设置技巧
Posted 博云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了程序猿成长日记 | MariaDB Galera Cluster多主集群设置技巧相关的知识,希望对你有一定的参考价值。
数据库作为线上服务器重要的一环,在实际生产中,我们通常需要对数据呵护备至。为了避免可抗和不可抗因素带来的数据损失,数据库的备份对我们来说尤为重要。
正所谓鸡蛋不要都放到了一个篮子里面,多一处备份,就多一处保险。为了保证数据的安全降低数据库负载压力,现如今用的最多的就是数据库的主备模型。但是主备模型真的无懈可击吗?
mysql数据库是线上最常用的数据库之一,当然MySQL的主备模型也是线上成熟的数据库集群解决方案。那MySQL集群在实际生产中有什么不足吗?金无足赤,人无完人,MySQL集群同样存在着缺点。在说MySQL集群的缺点之前,我们先聊聊MySQL集群实现的原理。
在线上业务中,试想一下,如果业务量巨大,我们只有一台数据库服务器,这台服务器既要负责数据的读取同时要兼顾数据的写入操作。这样MySQL的压力会不会很大呢?答案是肯定的,这时候MySQL集群有效的解决了这个问题。
我们利用三台或者多台服务器来做MySQL服务器,同时选定一个为主,通常叫做master,其余称作为备slave。而且我们分配给主和备明确的任务,master负责数据的写入操作,slave负责的是读取操作。这样MySQL的压力是不是小很多了呢。另外master端写入的数据会同步到slave端来保持数据的一致性。这样上文所说的问题,完美解决。
其实并不然,试想一下,master端的数据同步到slave端会产生问题吗?数据的一致性会不会出现问题呢?答案是肯定的,磁盘,网络,数据库本身的问题叠加在一起有时候会产生,slave的数据behind master的情况。也就是slave的数据落后于master端的数据。所以说MySQL集群虽然看起来很完美,但是同样的存在数据不一致的风险。那有没有什么解决方案呢?
MariaDB galera cluster的出现成功的解决了上面的提到MySQL的主从数据不同步的问题。下面简单的介绍下MariaDB galera cluster实现方法。
What is MariaDB?
MariaDB属于MySQL另外的一个开源的分支,操作习惯和MySQL基本一致,但是为什么会出现MariaDB这么一个分支结果呢,据说是MySQL以后有可能有闭源的风险。
2
What is MariaDB galera cluster?
MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的系统架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到各个节点上去。在数据方面完全兼容 MariaDB 和 MySQL。
3
How MariaDB galera cluster work?
工作流程为:
当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被write-set收集起来,并且将 write-set 纪录的内容发送给其他节点。
write-set 将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。
如果认证测试失败,节点将丢弃 write-set ;如果认证测试成功,则事务提交。
所以这不存在MySQL集群的主备数据不一致的情况,因为对于MariaDB galera cluster来说,每个服务器的角色都是master角色,数据的应用原则是:要么全部应用,要么全部丢弃。
模块介绍:
werep hooks:入侵到innodb事务,捕获对数据库发生更改的事务操作
dlopen:保证wsrep_provider和wsrep_hooks的协同工作的函数
Galera Replication Plugin: 集群节点之间数据复制的插件
4
Advantages and Disadvantages
优点:
同步复制 Synchronous replication
可对集群中任一节点进行数据读写
自动成员控制,故障节点自动从集群中移除
自动节点加入
真正并行的复制,基于行级
直接客户端连接,原生的 MySQL 接口
每个节点都包含完整的数据副本
多台数据库中数据同步由 wsrep 接口实现
缺点:
目前的复制仅仅支持InnoDB存储引擎。
DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.
在多主环境下LOCK/UNLOCK TABLES不支持。
允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
集群节点建议最少3个。(如果两个节点需要引入一个仲裁者的角色)
5
Deploy MariaDB Galera Cluster
(1) 创建yum文件:
cd /etc/yum.repos.d
vim Mariadb.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/5.5/rhel6-amd64
enabled = 1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
yum makecache
(2)安装:
yum -y install MariaDB-Galera-server galera MariaDB-client
(3)编辑机器的hosts文件:
节点介绍(由于资源有限,所以在此演示两个节点的操作,如果条件允许,建议最少使用三个节点):
192.168.248.129 bocloud2.com
192.168.248.128 bocloud1.com
(4)启动MySQL,授权集群同步的用户名和密码
MariaDB [(none)]> grant all privileges on *.* to bocloudadmin@'%' identified by 'exit';
MariaDB [(none)]> flush privileges;
(5)编辑配置文件
cp /usr/share/mysql/wsrep.cnf /etc/my.cnf.d/
vim /etc/my.cnf.d/wsrep.conf
修改配置文件
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
模块插件所在目录,利用此模块插件实现数据的复制
wsrep_cluster_address="gcomm://"
wsrep_sst_auth=bocloudadmin:exit
数据同步的账号密码
wsrep_sst_method=rsync
wsrep_sst_method用来保证当有新的节点要加入集群时,新节点会被初始化并和集群中其他已知节点同步。
wsrep_cluster_address="gcomm://192.168.248.128,192.168.248.129"
(默认监听的端口号为4567)
(6)在启动MariaDB之前建议排除iptables和selinux的影响。(此处,直接关掉)
iptables –F
setenforce 0
6
start MariaDB galera cluster
192.168.248.128启动日志截图:
当另外一个节点192.168.248.129启动时,128日志为:
从启动日志可以清楚的看到129已经添加到集群中里面了,并且监听了4567端口,每一个MariaDB拥有自己的一个id号码,标示自己的身份,从MySQL的数据目录下面的gvwstate.dat可以看到自己的id号码以及集群中其他的服务器的id标示号码。
129启动日志:
同样可以清晰的看到129加入到集群的过程。
7
show variables
show status like ‘%wsrep%’
8
Transfer data
128操作:
129查看同步情况:
至此,我们实现了MariaDB Galera Cluster的多主集群的设置,多主的方案在实现数据同步的过程中,也可以同时对外提供服务,降低服务器的压力。但是此方案同样存在缺点(上文已经提到)。只有适合自己的方案才是好方案,如果通过本篇文章使你以后再决定数据库集群方案时有所启发,这是在好不过的事情了。
精选
推荐
关于BoCloud博云
BoCloud 博云(苏州博纳讯动软件有限公司),为企业级客户提供针对互联网化、大数据业务应用、去 IOE 化(X86 服务器规模化应用)的底层云化架构和智能云运维系统,运用最新容器技术协助企业完成 IT 系统云架构的实施和运维, 帮助企业客户降低成本、 提升效率、简化运维、提高系统可靠性和安全性。凭借对客户业务流程和应用的深刻理解,以及先进技术产品的持续研发, BoCloud 博云以创新云技术支撑企业核心业务,构建数字化高效 IT 系统。
www.bocloud.com.cn
以上是关于程序猿成长日记 | MariaDB Galera Cluster多主集群设置技巧的主要内容,如果未能解决你的问题,请参考以下文章
mariadb galera - 节点关闭时出错 ERROR 1047 WSREP 尚未准备好节点以供应用程序使用
grails应用程序中的Mysql连接超时,在ELB上使用mariadb galera集群