Galera Cluster搭建与维护入门

Galera Cluster是一个MySQLMulti Master插件简而言之在多台服务器上配置好Galera Cluster以后它们表现得像是同一个数据库可同时读写数据会自动同步而且同步不需要低延迟的网络通信它可以跨WAN工作

简介

优点

  • Multi-Master所有节点均可写
  • 可跨WAN工作对延迟不敏感
  • 可自举拓扑结构节点会自动转发数据
  • 自定义能力强

限制

  • 只对InnoDB引擎有较好的支持MyISAM尚在测试
  • 默认配置的安全性不足稍后会谈到
  • 需要较快的网速因为每个节点启动需要完整同步一次数据以及稳定的网络
  • 选举机制
  • 默认配置无法自举

同步技术

Galera基于选举机制Cluster中已经同步上的多数节点组成的集合被称为PCPrimary Content

Galera的同步分为以下四个阶段

  1. 读取配置文件连接到第一个节点从该节点获得cluster拓扑以及其余节点的连接数据
  2. 尝试连接某个PC节点如果连不上请求其它节点或尝试自动转发
  3. 向该PC节点请求一份完整的数据库dump这个过程称为SSTState Snapshot Transfer
  4. 进入增量同步模式启动MySQL服务

Cluster拓扑设计

Cluster是一个运行时概念一旦Cluster中多于半数的节点同下线其余节点会认为自己和PC断开连接而拒绝bootstrap重新启动的新节点整个Cluster就不复存在了而重建过程需要下线所有节点所以设计Cluster拓扑的时候要考虑以下几点

  • 最多有多少台节点会同时下线这个数量严格不能多于半数
  • 如果节点之间不是full mesh连通那么是否有可能有两条连接同时断开把cluster划分成元素个数均小于全集半数的三个子集如果你使用过IRC的话可能比较熟悉net.split
  • 长期在线的节点数量必须是奇数否则可能出现选举机制投票失败的情况Galera提供了一个假的节点程序Galera Arbitrator可以用于平衡节点数量以及自动转发数据但是它自己并不存储完整的数据库

一个显而易见的结论是cluster需要至少三个节点

祝你图论愉快

安全性

SST过程可能没有任何鉴权或链路加密在默认配置下任何知道你数据库IP地址和SST端口的人都可以拿到你的数据库的完整dump如果你的所有节点都在可信的LAN里面那么问题不大不过如果数据库暴露在公网上的话问题可就大了这边推荐几种方法

集群配置

设计好Cluster以后是时候来建立我们的第一个集群了

在所有节点上安装数据库

MariaDBPercona Server都默认带了Galera Cluster模块我就不细说如何在MySQL上安装该模块了在所有节点上安装MariaDB

适用于Ubuntu 16.04MariaDB 10.2其余系统或数据库版本请参考官方文档

如果service自动启动了那么先停止

Systemd用户请注意由于节点启动时SST需要很长时间数据库大的话可能长达几个小时SST过程中service会处于starting状态因此我们需要增加starting状态的超时时间

配置第一个节点

第一个节点的启动过程和其余不一样因为它将被强制设为PC

新建文件 /etc/mysql/conf.d/galera.cnf 填入以下内容

解释一下几个参数

  • wsrep_cluster_name cluster的名字任意字符串整个cluster里的所有节点要设成一样
  • wsrep_cluster_address 格式为gcomm://后面加上它能连上的那部分节点IPv4包括本机的IPv6支持可能需要自己折腾一下逗号分隔
  • wsrep_sst_method SST使用的方法不同的方法的性能和副作用不同也可能需要额外配置参见官方文档我这边使用了最简单的rsync
  • wsrep_node_address 填写其它节点可以访问到的本机IP本机只有一个网络端口的话可以不写这个选项如果其它节点可能通过多个IP访问本机的话写多个逗号分隔
  • wsrep_node_name 一个字符串作为本节点标识符其余节点可以用这个字符串找到本节点需要全局唯一里面可以有空格

然后启动第一个节点

Systemd其余init用户参见文档

半自动配置其余节点

首先用第一个节点的 /etc/mysql 覆盖其余节点的配置文件建议这么做而不只是复制 galera.conf 的原因是系统在安装数据库时会建立一个随机密码的用户用于对数据库执行一些定时清理任务这个随机密码会被写在某个配置文件里deb系是 /etc/mysql/debian.cnf 其余发行版我不清楚cluster起来以后数据库的用户密码会被同步过来如果该用户在配置文件里的密码没一起更改定时清理会失败

每台机子上 galera.conf需要修改的内容如下

    • wsrep_cluster_address 如果这个节点只能连接到部分节点那么只需要填写该部分节点的IP
    • wsrep_node_address 本机IP
    • wsrep_node_name 取一个独一无二的名字
    • wsrep_sst_donor 如果这个节点到某些节点的网络特别好或者到某些节点的网络特别差那么建议强制设置SST从哪台机子完成语法为一个 wsrep_node_name的列表逗号分隔建议在最后加个逗号表示如果找不到列表里的节点那么尝试其余节点而不是报错退出参见文档

然后删除该机子上原有的数据库

最后启动节点

你会看到一系列SST日志等到日志出现

说明SST结束数据库开始工作了

如果节点之间不是full mesh连接请注意启动顺序

集群维护

重启某一台节点

不需要特殊注意重启即可节点会重新进行SST注意SST视方法的不同可能阻塞donor节点需要考虑该过程对生产环境的影响

重启cluster

前面说过了cluster是个运行时概念如果出现下列情况之一

  • 超过半数节点同时下线
  • 网络断开导致所有尚互相连接的集群子集内节点数量均小于集群节点总数的半数
  • 一台节点在启动时日志出现 [Warning] WSREP: Member x.0 (node_name) requested state transfer from '* any*', but it is impossible to select State Transfer donor: Resource temporarily unavailable

这意味着cluster已经消失了这时候就需要人工重启集群

首先需要找到数据库内容最全的节点如果你能确定某个节点是数据最完整的例如事实上只有某个节点有写入操作那么可以不用找否则在每台节点上查看 /var/lib/mysql/grastate.dat 文件其内容大致如下

找到 seqno 最大的那台节点它上面有着最完整的数据库内容 seqno 为 -1 意味着这个节点的MySQL没有graceful shutdown把该节点的 safe_to_bootstrap 改成 1 保存然后把它作为第一台节点启动

然后启动其余节点即可如果节点之间不是full mesh连接请注意启动顺序

离线备份数据库

Galera Cluster可以很简单地离线备份数据库启动一个节点专门用于备份在需要备份时将该节点下线完成备份后再启动该节点让它重新同步即可


参考

发表回复

您的邮箱地址不会被公开 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论了解你的评论数据如何被处理