资讯 > 行业资讯

程序猿成长日记 | MariaDB Galera Cluster多主集群设置技巧
2017/3/23 14:50:47

  作者:王文雅 BoCloud博云 前端开发工程师

  数据库作为线上服务器重要的一环,在实际生产中,我们通常需要对数据呵护备至。为了避免可抗和不可抗因素带来的数据损失,数据库的备份对我们来说尤为重要。

  正所谓鸡蛋不要都放到了一个篮子里面,多一处备份,就多一处保险。为了保证数据的安全降低数据库负载压力,现如今用的最多的就是数据库的主备模型。但是主备模型真的无懈可击吗?

  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实现方法。

  1.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用来保证当有新的节点要加入集群时,新节点会被初始化并和集群中其他已知节点同步。

  note:"gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。

  如果集群启动以后,我们关闭了第一个节点,那么再次启动的时候必须先修改(centos6存在启动问题centos7正常,如果是6系列此地址建议一直留空)

  "gcomm://"为其他节点的集群地址,例如:
  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%’

  变量中显示了集群的节点个数,节点地址,以及本机器节点的uuid等信息。

  8.Transfer data

  128操作:

  129查看同步情况:

  至此,我们实现了MariaDB  Galera Cluster的多主集群的设置,多主的方案在实现数据同步的过程中,也可以同时对外提供服务,降低服务器的压力。但是此方案同样存在缺点(上文已经提到)。只有适合自己的方案才是好方案,如果通过本篇文章使你以后再决定数据库集群方案时有所启发,这是在好不过的事情了。

版权所有:苏州博纳讯动软件有限公司     苏ICP备13004761号