作者: zhaorenhai
本文尝试在x86和arm64平台上混合部署MariaDB集群,看看是否可以部署成功。
部署环境计划在华为云上进行,OS采用openEuler20.03版本,MariaDB采用10.3.9版本。
MariaDB官方文档里面,高可用环境部署方法一共两种类型,比较简单的是复制,然后是Galera集群。
我们分别尝试下这两种高可用环境,是否支持在x86和arm64平台上混合部署。
复制
复制,顾名思义,就是一个或者多个从数据库从一个主数据库实时的复制数据,从而保证两个数据库的数据是一样的。(当然复制也支持多个主数据库,这种情况较复杂,而且容易出问题,而且现实场景应用不多,本文先主要尝试一主一从的场景)
复制的用途:
• 可以将读请求分布在多个数据库上,从而分散主数据库的压力,最常用的场景是读多写少的场景。
• 数据分析场景。分析数据库中的数据一般需要比较复杂的sql,如果在主数据库上执行会对主数据库造成不少的压力,因为主数据库一般都设计成OLTP类型的数据库,也不太适合分析型的需求。如果将数据复制到从数据库,数据分析就可以只在从数据库执行,减小主数据库的压力。
• 备份场景。备份本身也会对数据库造成比较大的性能影响,可以将数据复制到从库,在从库上进行备份就可以避免对主库的影响。更新和插入比较频繁的数据库,可以备份时,将从库和主库断开,这样备份更快,备份完再恢复。
• 数据分布,可以通过复制,将数据分布到各个不同的地域。
复制的技术原理:首先将主库数据备份一份,然后在从库上恢复,保证两个数据库的基础数据一致,然后通过配置,让从库实时应用主库的binlog,来保证两个数据库数据的一致性。
复制的部署步骤
首先在华为云同一个网络区域购买两个云服务器,一个x86的,一个arm64的,确保内网能够互通,OS镜像都选择openEuler。
然后在x86上部署主库:
1 | yum install mariadb-server |
创建数据文件目录
1 | mkdir /var/db/mariadbdatadir |
配置数据库配置文件:
修改/etc/my.cnf.d/mariadb-server.cnf,在[mariadb]下面添加如下配置(具体参数可以根据自己环境调整):
1 | datadir = /var/db/mariadbdatadir |
启动数据库:
1 | systemctl start mariadb.service |
查看数据库是否启动成功
1 | systemctl status mariadb.service |
加载测试数据:
为了简单起见,我们就用tpcc-mysql工具来加载一些测试用的tpcc数据
1 | yum install mariadb-devel |
配置一个用来让从库复制数据的用户
1 | mysql -u root |
现在一个正常运行的有一些数据的主数据库就配置好了。
接下来我们在arm机器上配置一个从库。
1 | yum install mariadb-server |
创建数据文件目录
1 | mkdir /var/db/mariadbdatadir |
配置数据库配置文件:
修改/etc/my.cnf.d/mariadb-server.cnf,在[mariadb]下面添加如下配置(具体参数可以根据自己环境调整):
1 | datadir = /var/db/mariadbdatadir |
接下来将主库上的基础数据先复制到从库。
登陆主库
1 | mysql -u root |
执行如下sql
1 | flush tables with read lock; |
记录下以上输出中的File和Position的结果
注意这个会话不能中断,直到下面主库的数据备份完成。
在主库上创建一个备份目录
1 | mkdir /var/db/mariadbbackup |
执行备份
1 | mariabackup --backup --target-dir=/var/db/mariadbbackup/ --user=root --password="" |
然后现在就可以将上面的会话解锁了,在上面那个会话中执行如下sql:
1 | unlock tables; |
将备份的数据复制到从库:
在主库上:
1 | cd /var/db |
在从库上的操作:
1 | scp root@192.168.0.196:/var/db/mariadbbackup.tar.gz /var/db/ |
配置实时复制:
1 | cd /var/db/mariadbbackup |
输出如下,记住这些值,后面从库上的操作要用
1 | primary1-bin.000011 687 0-1-437 |
从库上操作:
1 | mysql -u root |
使用如下命令查看复制状态
1 | show slave status \G |
如果下面两个项的值都是Yes
1 | Slave_IO_Running: Yes |
就是正常的
在主库上,再加载一个数据库,进行一下测试:
1 | cd tpcc-mysql/ |
在从库上查询
1 | mysql -u root |
输出如下:
1 | +--------------------+ |
可以看到tpcc-test数据库也正常生成了
可以执行如下sql进行进一步的测试:
1 | use database tpcc-test; |
如果都是正常的,代表数据都正常同步过来了
经过以上测试,基本可以证明,复制是可以在x86和arm64环境上混合部署的。
Galera集群
Galera集群是一个多主,多活集群,每一个节点都可以是主节点,数据在多个节点间同步,保证多个数据库节点的数据是一致的,和Oracle的RAC集群不同的是,RAC是共享存储的,Galera集群并不共享存储,每个数据库都是一个独立的存储。
这样有多个好处,任意一个数据库节点挂了都不会影响业务,对于读请求比较多的应用,还可以很好的分担压力,当然对于写请求,由于同步请求的存在,会比单机数据库性能下降一点。
Galera集群多个节点之间的数据同步是同步的,不是异步的,这样就能保证数据库在多个节点的一致性,多个节点之间无数据分歧,为了性能考虑,采用的并不是实时的同步技术,采用的是一种虚拟同步,虚拟同步技术的原理较复杂,可以参考如下文章:
https://blog.csdn.net/wzy0623/article/details/102522268
Galera集群部署步骤
我们计划部署一个三节点的x86 Galera集群,然后前端部署一个GLB负载均衡器。
首先在华为云上购买四个x86和一个arm的云服务器实例,规格:4vCPUs 16GB内存,CPU频率2.6GHz。OS还是采用openEuler20.03版本。
四个x86云服务器,一个用来部署GLB,另外三个用来部署MariaDB Galera集群。一个arm云服务器用来部署后来加入集群的MariaDB节点。
在三台x86集群节点上进行如下操作:
1 | yum install mariadb-server |
创建数据文件目录
1 | mkdir /var/db/mariadbdatadir |
配置数据库配置文件:
修改/etc/my.cnf.d/mariadb-server.cnf,在[mariadb]下面添加如下配置(具体参数可以根据自己环境调整):
1 | datadir = /var/db/mariadbdatadir |
然后执行systemctl start mariadb,先把数据库启动起来
每个节点再执行如下操作:
1 | yum install mariadb-server-galera |
修改/etc/my.cnf.d/galera.cnf
wsrep_cluster_address配置为如下值,其中各个IP地址的值为三个集群节点的内网IP
1 | wsrep_cluster_address="gcomm://192.168.0.159,192.168.0.78,192.168.0.23" |
在第一个节点上,把数据库停掉
1 | systemctl stop mariadb |
在第一个节点上执行如下命令初始化集群
1 | galera_new_cluster |
然后在其他两个节点上重启数据库
1 | systemctl restart mariadb |
可以登陆数据库,用如下命令查看集群状态:
1 | show status like 'wsrep%'; |
现在集群搭建成功了,我们下一步准备搭建一个GLB负载均衡器。
GLB是一个纯TCP层的负载均衡器,简单易用。
1 | yum install gcc* libtool |
编辑/etc/default/glbd
配置如下:
1 | LISTEN_ADDR="8010" |
然后启动负载均衡器
1 | cd files |
然后登陆集群节点任意一数据库,执行如下sql,建一个用户
1 | create user 'tpcc'@'192.168.0.%' identified by '123456'; |
下面开始加载一些测试数据。
在负载均衡器所在的节点上进行
1 | yum install mariadb |
加载测试数据
1 | mysqladmin -h 127.0.0.1 -P 8010 -u tpcc -p123456 create tpcc10 |
接下来把其中一个X86集群节点停掉,准备换成arm64节点。
登陆其中一个集群节点
systemctl stop mariadb
然后登陆另外两个集群节点
把/etc/my.cnf.d/galera.cnf里面的wsrep_cluster_address的值里面停掉节点的IP改为am64节点的IP
在arm64节点上进行如下操作:
1 | yum install mariadb-server |
创建数据文件目录
1 | mkdir /var/db/mariadbdatadir |
配置数据库配置文件:
修改/etc/my.cnf.d/mariadb-server.cnf,在[mariadb]下面添加如下配置(具体参数可以根据自己环境调整):
1 | datadir = /var/db/mariadbdatadir |
然后执行systemctl start mariadb,先把数据库启动起来
1 | yum install mariadb-server-galera |
修改/etc/my.cnf.d/galera.cnf
wsrep_cluster_address配置为如下值,就是和另外两个X86节点保持一致。
1 | wsrep_cluster_address="gcomm://192.168.0.159,192.168.0.78,192.168.0.173" |
然后执行systemctl restart mariadb
等待重启成功,可能会比较慢。
然后登陆数据库,输入以下命令,查看集群状态
1 | show status like 'wsrep%'; |
然后登录arm64节点上的数据库,查询数据是否都正常同步过来。
如果一切正常的话,我们登陆到负载均衡器节点,可以将之前的数据卸载了,再重新加载数据,测试一下大规模删除和新增数据场景。
1 | cd tpcc-mysql |
然后登陆各个数据库查询,数据是否一致。
经过以上测试可以证明Galera集群也是可以在x86和arm64上混合部署的。