一、Galera集群介绍
在之前写了,这种一主一备的数据容灾架构,但是这种架构存在几点问题:
1、如果主节点宕机,应用程序无法写入,即无法执行insertupdatealterdelete等增删改的操作,因为备节点是read-only的
2、MySQL的主从复制是异步复制的,从之前的原理图也可以看到,是在主节点执行完操作后把日志写入binlog,然后slave节点拉取然后进行数据重放的,这个过程就会导致主从节点数据同步有时延,而且slave数据重放失败主库也是不知道的,这样就会导致数据的差异。
基于以上问题呢,MySQLMariaDB有一个galera集群的解决方案,galera是一套真正的多主同步复制集群,能够解决MySQL主从同步存在的异步复制导致的数据差异和单点故障隐患,galera集群有如下特点:
galera的缺点也是有的,galera作为同步复制的集群,因此随着节点的增加将会导致事务的响应时间也会跟着增加,并且导致节点间冲突和死锁的概率呈指数级增长(相关的公式为m=n×o×t)。
galera cluster是依靠wsrep api复制插件来实现多主同步复制的,在galera官网上对wsrep的解释是:
Galera复制插件实现了wsrep API。它作为 wsrep 提供程序运行。从技术角度来看,Galera复制插件由以下组件组成:认证层:此层准备写入集并对其执行认证检查,确保可以应用它们。复制层:此层管理复制协议并提供总排序功能。群组沟通框架:该层为连接到Galera Cluster的各种群组通信系统提供了一个插件架构。
wsrep API 是数据库的通用复制插件接口。它定义了一组应用程序回调和复制插件调用。wsrep API 使用将数据库服务器视为具有状态的复制模型。该状态是指数据库的内容。当数据库正在使用中并且客户端修改数据库内容时,其状态将更改。wsrep API 将数据库状态中的更改表示为一系列原子更改或事务。在数据库集群中,所有节点始终具有相同的状态。它们通过以相同的序列顺序复制和应用状态更改来相互同步。
为了在整个集群中保持状态相同,wsrep API 使用全局事务 ID 或 GTID。这允许它识别状态更改,并识别与上次状态更改相关的当前状态
下边还有一段:
从更技术的角度来看,Galera Cluster通过以下方式处理状态更改:在群集中的一个节点上,数据库中发生状态更改。在数据库中,wsrep 挂钩将更改转换为写入集。dlopen()然后使 WSREP 提供程序函数可用于 WSREP 挂钩。Galera Replication插件处理写入集认证和复制到集群。对于群集中的每个节点,应用程序进程由高优先级事务发生。
galera集群当前只支持在Linux系统上运行,并且只支持数据库存储引擎为InnoDB的(MyISAM还在开发中),因为上边提到galera集群的特点是所有集群节点上的事务都会并行执行,而MyISAM引擎是一个非事务性的引擎,所以在使用galera集群时数据库引擎要为InnoDB。
二、Galera集群安装
在安装galera集群时我们也不能使用原来的安装包,需要卸载原有的MySQL或者MariaDB数据库,然后安装打了MySQL-wsrep补丁的安装包,先准备好3台虚拟机,本次环境使用的centos7.6.1810版本,然后做如下前置操作:
1、关闭防火墙firewalld
systemctl stop firewalld
systemctl status firewalld
2、关闭selinux
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
3、卸载原有的MySQL相关包,不然安装时会起冲突
rpm -qa | grep mysql | xargs -i yum -y remove {}
4、准备galera安装包
Galera 3 Replication Library
通过登录galera官网可以看到,galera 3版本对应的当前最新的打了galera补丁包的MySQL版本是MySQL-5.7.44版本,同时提醒到MySQL5.7版本在去年10月份已经停止了支持,建议用户升级到8.0版本。
Galera 4 Replication Library
而galera 4版本对应MySQL最新版本是4月30日最新发布的MySQL-8.0.36-26.18。同时下载还可以根据系统来选择,点进去其实就是一个yum源,根据自己的需求选择5.7版本还是8.0版本,本次使用8.0版本。
我搜了阿里镜像和清华镜像这几个我常用的镜像站都没有相关的镜像,使用国外源站的yum源下载实在太慢了,加上宽带本身也不高,网速贼慢,所以只能在本地构建yum源,刚好之前有一台阿里云的ECS机器,于是通过这台机器先把这13个包给下载下载,然后再下载到vmware虚拟机里面,这样速度就快多了。
虽然下载速度也只有1M多点,但是比本地下载速度快多了,本地只有几十KB。下载完使用scp传到本地
将3个节点的hostname分别改为node{1-3}并添加到/etc/hosts
hostnamectl set-hostname node1
#/etc/hosts
192.168.28.7 node1
192.168.28.8 node2
192.168.28.9 node3
开始构建yum源,首先安装createrepo包
yum -y install createrepo
安装完成后,使用命令createrepo /opt/galera构建repo元数据
使用yum makecache构建yum缓存
然后就开始安装galera和mysql-wsrep-8.0,直接执行命令
yum -y install galera-4-26.4.18-1.el7.x86_64.rpm mysql-wsrep-server-8.0.36-26.18.el7.x86_64.rpm
yum会自动解决相关依赖,等待安装完成即可,
安装完成后,开始准备配置文件,初始化集群
首先启动MySQL,创建用于复制的账号,后边配置中会用到
create user 'sst'@'%' identified by '12345678';
grant all privileges on *.* to 'sst'@'%';
这个账号只需要在第一台节点上创建即可,在创建时由于mysql8.0加了很多安全性的功能,如果密码太过简单会导致创建失败,可以修改密码校验的级别,可以通过show variables like “%password.policy%”;查看当前密码策略是什么
#将其改为low就只是校验密码位数,最低8位密码set global validate_password.policy=low;
每台机器安装完成后都会生成/etc/my.cnf,在最后一行加上!includedir /etc/my.cnf.d/,然后在/etc/my.cnf.d/下新建galera.cnf,写入如下配置
node1配置文件/etc/my.cnf.d/galera.cnf,即第一台机器
[mysqld]
user = mysql
#缓存表和索引数据的InnoDB缓冲池大小
innodb_buffer_pool_size = 128M
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#MySQL服务器的ID,必须是唯一的,集群各个节点也不同
server_id=1
#日志时间和系统时间保持一致
log_timestamps=SYSTEM
# galera集群的名字,节点无法连接到名称不同的集群,因此在同一集群中的所有节点上都必须相同
wsrep_cluster_name='galera_cluster'
#wsrep模块的位置
wsrep_provider = /usr/lib64/galera-4/libgalera_smm.so
#wsrep节点的ID,必须是唯一的,集群各个节点也不同
wsrep_node_name = node1
#启动时要连接的节点地址,每个节点都应该填除自己之外的其他两个节点
#第一台节点首次初始化时填:wsrep_cluster_address = "gcomm://"
wsrep_cluster_address = "gcomm://node2,node3"
# 本机节点地址,可以使用主机名或IP
wsrep_node_address = node1
# 集群同步方式,可选方法有rsyncmysqldumpxtrabackupxtrabackup-v2mariabackup
wsrep_sst_method=rsync
# 集群同步的用户名密码,如果wsrep_sst_method设置为 rsync ,则不使用,这儿的密码则为上边在第一台节点创建的sst账号
wsrep_sst_auth=sst:12345678
# 一个逗号分割的节点串作为状态转移源,比如 wsrep_sst_donor=node1,node2,node3 如果node1可用,用node2,如果node2不可用,用node3,最后的逗号表明让提供商自己选择一个最优的。
wsrep_sst_donor='node1,node2,node3'
node2节点/etc/my.cnf.d/galera.cnf
[mysqld]
#缓存表和索引数据的InnoDB缓冲池大小
innodb_buffer_pool_size = 128M
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#MySQL服务器的ID,必须是唯一的,集群各个节点也不同
server_id=2
#日志时间和系统时间保持一致
log_timestamps=SYSTEM
# galera集群的名字,节点无法连接到名称不同的集群,因此在同一集群中的所有节点上都必须相同
wsrep_cluster_name='galera_cluster'
#wsrep模块的位置
wsrep_provider = /usr/lib64/galera-4/libgalera_smm.so
#wsrep节点的ID,必须是唯一的,集群各个节点也不同
wsrep_node_name = node2
#启动时要连接的节点地址,每个节点都应该填除自己之外的其他两个节点
wsrep_cluster_address = "gcomm://node1,node3"
# 本机节点地址,可以使用主机名或IP
wsrep_node_address = node2
# 集群同步方式,可选方法有rsyncmysqldumpxtrabackupxtrabackup-v2mariabackup
wsrep_sst_method=rsync
# 集群同步的用户名密码,如果wsrep_sst_method设置为 rsync ,则不使用
wsrep_sst_auth=sst:12345678
# 一个逗号分割的节点串作为状态转移源,比如 wsrep_sst_donor=node1,node2,node3 如果node1可用,用node2,如果node2不可用,用node3,最后的逗号表明让提供商自己选择一个最优的。
wsrep_sst_donor='node1,node2,node3'
node3节点/etc/my.cnf.d/galera.cnf配置
[mysqld]
#缓存表和索引数据的InnoDB缓冲池大小
innodb_buffer_pool_size = 128M
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#MySQL服务器的ID,必须是唯一的,集群各个节点也不同
server_id=3
#日志时间和系统时间保持一致
log_timestamps=SYSTEM
# galera集群的名字,节点无法连接到名称不同的集群,因此在同一集群中的所有节点上都必须相同
wsrep_cluster_name='galera_cluster'
#wsrep模块的位置
wsrep_provider = /usr/lib64/galera-4/libgalera_smm.so
#wsrep节点的ID,必须是唯一的,集群各个节点也不同
wsrep_node_name = node3
#启动时要连接的节点地址,每个节点都应该填除自己之外的其他两个节点
wsrep_cluster_address = "gcomm://node1,node2"
# 本机节点地址,可以使用主机名或IP
wsrep_node_address = node3
# 集群同步方式,可选方法有rsyncmysqldumpxtrabackupxtrabackup-v2mariabackup
wsrep_sst_method=rsync
# 集群同步的用户名密码
wsrep_sst_auth=sst:12345678
# 一个逗号分割的节点串作为状态转移源,比如 wsrep_sst_donor=node1,node2,node3 如果node1可用,用node2,如果node2不可用,用node3,最后的逗号表明让提供商自己选择一个最优的。
wsrep_sst_donor='node1,node2,node3'
#如果wsrep_sst_method设置为 rsync ,则不使用
上述操作准备好以后,就可以开始初始化集群,如果都是新节点,随便选择一台机器作为第一台节点,但是第一台节点在初始化时一定配置为wsrep_cluster_address = “gcomm://”,因为第一台机器还没有其他可以连接的节点,当连接不上时会报错,导致无法启动。
初始化根据安装galera版本,初始化的方式也不一样,如果是使用的MySQL版本的galera,那么初始化方式为
/usr/bin/mysqld_bootstrap
如果为mariadb的版本,初始化的方式为
mysqld --wsrep-new-cluster
如果为Percona XtraDB 集群,初始化方式为
systemctl start mysql@bootstrap.service
本次使用的是基于MySQL的galera,所以初始化流程为:1、/usr/bin/mysqld_bootstrap,执行完成后,可以使用netstat -tunlp查看45673306等端口是否起来,也可以登录MySQL,查看wsrep的状态2、启动完成后,初始化已经完成,
3、将其停掉,在/etc/my.cnf.d/galera.cnf配置项wsrep_cluster_address更改为”wsrep_cluster_address = “gcomm://node2,node3″,
4、使用systemctlstart mysqld启动即可,启动完成后检查4567、3306端口是否起来,
5、将剩下2台机器使用systemctl start mysql启动就好
6、启动完成后,登录MySQL检查wsrep状态
然后我们在28.7这个节点上创建一个表
另外两个节点马上就可以同步到,然后在28.9这个节点插入一条数据
同样实时同步,这样一个3节点的galera for mysql数据容灾集群就搭建完成了,3个节点随便一个节点宕机不影响其他两个节点的数据读写,这样就实现了数据容灾的目的。
原创文章,作者:筱凯,如若转载,请注明出处:https://www.jingyueyun.com/ask/347.html