MariaDB集群在x86和arm64上的混合部署

作者: 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
2
3
4
5
6
7
8
9
datadir = /var/db/mariadbdatadir
innodb_buffer_pool_size = 6G
innodb_log_file_size = 1G
innodb_flush_method = O_DIRECT
bind-address = 0.0.0.0
log-bin
server_id = 1
log-basename = primary1
binlog-format = mixed

启动数据库:

1
systemctl start mariadb.service

查看数据库是否启动成功

1
systemctl status mariadb.service

加载测试数据:
为了简单起见,我们就用tpcc-mysql工具来加载一些测试用的tpcc数据

1
2
3
4
5
6
7
8
yum install mariadb-devel
git clone https://github.com/Percona-Lab/tpcc-mysql
cd tpcc-mysql/src
make
cd ..
mysqladmin create tpcc10
mysql tpcc10 < create_table.sql
./tpcc_load -h127.0.0.1 -d tpcc10 -u root -p "" -w 10

配置一个用来让从库复制数据的用户

1
2
3
mysql -u root
Create user 'replication_user'@'%' identified by 'bigs3cret';
grant replication slave on *.* to 'replication_user'@'%';

现在一个正常运行的有一些数据的主数据库就配置好了。

接下来我们在arm机器上配置一个从库。

1
yum install mariadb-server

创建数据文件目录

1
mkdir /var/db/mariadbdatadir

配置数据库配置文件:
修改/etc/my.cnf.d/mariadb-server.cnf,在[mariadb]下面添加如下配置(具体参数可以根据自己环境调整):

1
2
3
4
5
datadir = /var/db/mariadbdatadir
innodb_buffer_pool_size = 6G
innodb_log_file_size = 1G
innodb_flush_method = O_DIRECT
server_id = 2

接下来将主库上的基础数据先复制到从库。
登陆主库

1
mysql -u root

执行如下sql

1
2
3
4
5
6
7
flush tables with read lock;
show master status;
+---------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| primary1-bin.000011 | 687 | | |
+---------------------+----------+--------------+------------------+

记录下以上输出中的File和Position的结果
注意这个会话不能中断,直到下面主库的数据备份完成。
在主库上创建一个备份目录

1
mkdir /var/db/mariadbbackup

执行备份

1
2
mariabackup --backup --target-dir=/var/db/mariadbbackup/ --user=root --password=""
mariabackup --prepare --target-dir=/var/db/mariadbbackup/

然后现在就可以将上面的会话解锁了,在上面那个会话中执行如下sql:

1
unlock tables;

将备份的数据复制到从库:
在主库上:

1
2
cd /var/db
tar -czvf mariadbbackup.tar.gz mariadbbackup

在从库上的操作:

1
2
3
4
5
6
7
scp root@192.168.0.196:/var/db/mariadbbackup.tar.gz /var/db/
cd /var/db/
tar -zxvf mariadbbackup.tar.gz
mariabackup --copy-back --target-dir=/var/db/mariadbbackup/ --datadir=/var/db/mariadbdatadir/
cd mariadbdatadir
chown -R mysql:mysql ./*
systemctl start mariadb.service

配置实时复制:

1
2
cd /var/db/mariadbbackup
cat xtrabackup_binlog_info

输出如下,记住这些值,后面从库上的操作要用

1
primary1-bin.000011     687     0-1-437

从库上操作:

1
2
3
4
5
6
7
8
9
10
11
12
mysql -u root
set global gtid_slave_pos = '0-1-437';
CHANGE MASTER TO
MASTER_HOST='192.168.0.196',
MASTER_USER='replication_user',
MASTER_PASSWORD='bigs3cret',
MASTER_PORT=3306,
MASTER_LOG_FILE='primary1-bin.000011 ',
MASTER_LOG_POS=687,
MASTER_CONNECT_RETRY=10,
MASTER_USE_GTID = slave_pos;
START SLAVE;

使用如下命令查看复制状态

1
show slave status \G

如果下面两个项的值都是Yes

1
2
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

就是正常的

在主库上,再加载一个数据库,进行一下测试:

1
2
3
cd tpcc-mysql/
mysql tpcc-test < create_table.sql
./tpcc_load -h127.0.0.1 -d tpcc-test -u root -p "" -w 10

在从库上查询

1
2
mysql -u root
show databases;

输出如下:

1
2
3
4
5
6
7
8
9
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| tpcc-test |
| tpcc10 |
+--------------------+

可以看到tpcc-test数据库也正常生成了
可以执行如下sql进行进一步的测试:

1
2
3
use database tpcc-test;
show tables;
select count(*) from customer;

如果都是正常的,代表数据都正常同步过来了

经过以上测试,基本可以证明,复制是可以在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
2
3
4
5
datadir = /var/db/mariadbdatadir
innodb_buffer_pool_size = 6G
innodb_log_file_size = 1G
innodb_flush_method = O_DIRECT
bind-address = 0.0.0.0

然后执行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
2
3
4
5
6
7
8
yum install gcc* libtool
git clone https://github.com/codership/glb
cd glb/
./bootstrap.sh
./configure
make
make install
cp files/glbd.cfg /etc/default/glbd

编辑/etc/default/glbd
配置如下:

1
2
3
4
5
6
LISTEN_ADDR="8010"
CONTROL_ADDR="127.0.0.1:8011"
CONTROL_FIFO="/var/run/glbd.fifo"
THREADS="16"
MAX_CONN=256
DEFAULT_TARGETS="192.168.0.159:3306 192.168.0.78:3306 192.168.0.23:3306"

然后启动负载均衡器

1
2
cd files
./glbd.sh

然后登陆集群节点任意一数据库,执行如下sql,建一个用户

1
2
create user 'tpcc'@'192.168.0.%' identified by '123456';
grant all privileges on *.* to 'tpcc'@'192.168.0.%' with grant option;

下面开始加载一些测试数据。
在负载均衡器所在的节点上进行

1
2
3
4
5
6
yum install mariadb
yum install mariadb-devel
git clone https://github.com/Percona-Lab/tpcc-mysql
cd tpcc-mysql/src
make
cd ..

加载测试数据

1
2
3
4
mysqladmin -h 127.0.0.1 -P 8010 -u tpcc -p123456 create tpcc10
mysql -h 127.0.0.1 -P 8010 -u tpcc -p123456 tpcc10 < create_table.sql
./tpcc_load -h127.0.0.1 -P8010 -d tpcc10 -u tpcc -p "123456" -w 10
mysql -h 127.0.0.1 -P 8010 -u tpcc -p123456 tpcc10 < add_fkey_idx.sql

接下来把其中一个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
2
3
4
5
datadir = /var/db/mariadbdatadir
innodb_buffer_pool_size = 6G
innodb_log_file_size = 1G
innodb_flush_method = O_DIRECT
bind-address = 0.0.0.0

然后执行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
2
3
4
5
6
cd tpcc-mysql
mysqladmin -h 127.0.0.1 -P 8010 -u tpcc -p123456 drop tpcc10
mysqladmin -h 127.0.0.1 -P 8010 -u tpcc -p123456 create tpcc10
mysql -h 127.0.0.1 -P 8010 -u tpcc -p123456 tpcc10 < create_table.sql
./tpcc_load -h127.0.0.1 -P8010 -d tpcc10 -u tpcc -p "123456" -w 10
mysql -h 127.0.0.1 -P 8010 -u tpcc -p123456 tpcc10 < add_fkey_idx.sql

然后登陆各个数据库查询,数据是否一致。
经过以上测试可以证明Galera集群也是可以在x86和arm64上混合部署的。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×