felo
作者felo·2022-03-27 09:17
技术支持·IPS

在 PowerLinux 上配置和测试 MySQL InnoDB Cluster

字数 8089阅读 1891评论 0赞 0

MySQL InnoDB Cluster 提供一套完整的 MySQL 高可用解决方案, 8.0.27 版本之后,可以创建 InnoDB ClusterSet 方案,提供多数据中心的 MySQL 高可用解决方案。它不同于 MySQL NDB Cluster ,不需要基于 NDB 存储引擎。

MySQL Shell 通过 AdminAPI 工具可以轻松配置和管理一套最小 3 节点 MySQL 实例的 InnoDB Cluster 。该方案基于 MySQL Group Replication 机制提供的数据复制和故障转移。

MySQL Router 可以控制客户端 APP 连接到 Cluster 中的实例,比如在一个默认 3 实例的 InnoDB Cluster 中,主实例失败后被第二个实例接管, MySQL Router 会发现并转移客户端 APP 连接到新的主实例上。

InnoDB Cluster 需要满足的要求和限制( https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster-requirements.html ):

  • InnoDB Cluster 基于 Group Replication 的机制,所需要满足 Group Replication 的要求和限制;
  • InnoDB Cluster 不管理手动配置的异步复制通道,只能支持 AdminAPI 管理的复制通道,建议部署在网络环境较好的局域网内;
  • 非 InnoDB 引擎的表需要转换,才能使用; 配置中不会修改系统事务隔离级别( transaction_isolation )参数,需要手动管理;
  • MySQL Shell 需要 Python3 , AdminAPI 只支持 TCPIP 协议访问集群内的实例,可以支持 5.7 版本但存在一些限制;
  • 8.0.27 后可使用 ClusterSet 管理多个 InnoDB Cluster ;

来部署一个简单的 InnoDB Cluster 测试一下:

一、 下载源码编译软件

官方并未提供 ppc64le 的安装包,需要自己编译。 下载 MySQL 软件包:

wget https://cdn.mysql.com//Downloads/MySQL-Cluster-8.0/mysql-cluster-gpl-8.0.28.tar.gz
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-boost-8.0.28.tar.gz

准备编译环境:

[root@h27 ~]# lscpu
Architecture: ppc64le
Byte Order: Little Endian
CPU(s): 32
On-line CPU(s) list: 0-31
Thread(s) per core: 8
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Model: 2.0 (pvr 004d 0200)
Model name: POWER8 (architected), altivec supported
Hypervisor vendor: pHyp
Virtualization type: para
L1d cache: 64K
L1i cache: 32K
NUMA node3 CPU(s): 0-31
Physical sockets: 8
Physical chips: 1
Physical cores/chip: 8
[root@h27 ~]# uname -a
Linux h27 4.18.0-305.3.1.el8.ppc64le #1 SMP Tue Jun 1 16:36:00 UTC 2021 ppc64le ppc64le ppc64le GNU/Linux

/* 安装一些编译工具 */

yum groupinstall "Development Tools"
yum install numactl-devel openssl-devel ncurses-devel libtirpc-devel rpcgen

/* 解压软件包 */
[root@h27 home]# tar -xf mysql-boost-8.0.28.tar.gz
[root@h27 home]# tar -xf mysql-cluster-gpl-8.0.28.tar.gz

编译 MySQL-Cluster 包:

/* 开始编译安装 */

mkdir -p /home/mysql-cluster-gpl-8.0.28/bld
cd /home/mysql-cluster-gpl-8.0.28/bld
rm -rf /home/mysql-cluster-gpl-8.0.28/bld/*
cmake .. \\
-DBUILD_CONFIG=mysql_release \\
-DCMAKE_BUILD_TYPE=RelWithDebInfo \\
-DCMAKE_C_COMPILER=`which gcc` \\
-DCMAKE_C_FLAGS="-O3 -mcpu=native -mtune=native -mcmodel=large" \\
-DCMAKE_CXX_COMPILER=`which g++` \\
-DCMAKE_CXX_FLAGS="-O3 -mcpu=native -mtune=native -mcmodel=large" \\
-DCMAKE_INSTALL_PREFIX=/home/mysql_bins/8.0.28-cluster \\
-DCMAKE_LINKER=`which gcc` \\
-DCMAKE_AR=`which gcc-ar` \\
-DCMAKE_NM=`which gcc-nm` \\
-DCMAKE_RANLIB=`which gcc-ranlib` \\
-DWITH_BOOST=/home/mysql-8.0.28/boost/boost_1_73_0 \\ # 也可以使用单独下载 boost 包
-DWITH_NUMA=ON \\
&& make -j16 \\
&& make install

二、配置 InnoDB Cluster

InnoDB Cluster 要求最少使用三个实例,我们在一个服务器上配置 3 个实例,来测试一下 InnoDB Cluster 的可用性。

启动三个实例:

准备 3 个配置文件,只验证功能,所以只用了少量参数
[root@h27 mysql_data]# cat my-3301.cnf
[mysqld]
basedir=/home/mysql_bins/8.0.28-cluster/
datadir=/home/mysql_data/3301/
log-error=/home/mysql_data/3301/mysqld_error.log
pid-file=/home/mysql_data/3301/mysqld.pid
mysqlx_socket=/home/mysql_data/3301/mysqlx.sock
socket=/home/mysql_data/3301/mysql.sock
port=3301
bind-address=0.0.0.0
binlog_transaction_dependency_tracking=WRITESET
enforce_gtid_consistency=ON
gtid_mode=ON
server_id=3301 # 要求 server_id 不一致
[root@h27 mysql_data]# sed -e 's#3301#3302#g' my-3301.cnf > my-3302.cnf
[root@h27 mysql_data]# sed -e 's#3301#3303#g' my-3301.cnf > my-3303.cnf
相同的方法初始化并启动三个实例:
mysqld --defaults-file=./my-3301.cnf --user=mysql --initialize
mysqld --defaults-file=./my-3301.cnf --user=mysql &
mysqld --defaults-file=./my-3302.cnf --user=mysql --initialize
mysqld --defaults-file=./my-3302.cnf --user=mysql &
mysqld --defaults-file=./my-3303.cnf --user=mysql --initialize
mysqld --defaults-file=./my-3303.cnf --user=mysql &
相同的方法修改 root 用户初始密码和基本配置:
cat 3301/mysqld_error.log |grep password
mysql_secure_installation -S 3301/mysql.sock
cat 3302/mysqld_error.log |grep password
mysql_secure_installation -S 3302/mysql.sock
cat 3303/mysqld_error.log |grep password
mysql_secure_installation -S 3303/mysql.sock
创建管理用户 icadmin :
create user 'icadmin'@'%' identified by 'rootroot';
GRANT all PRIVILEGES ON *.* TO 'icadmin'@'%';
FLUSH PRIVILEGES;

下载一个 MySQL Shell 工具,可以安装在笔记本上,来管理远程的 MySQL InnoDB Cluster ( https://dev.mysql.com/downloads/shell/ )。 MySQL Shell 可以支持 JavaScript, Python 和 SQL ,非常强大而且好用,从 8.0.18 开始需要使用 Python3 。使用 AdminAPI 可实现部署配置和管理 InnoDB Cluster 、 InnoDB ClusterSet 以及 InnoDB ReplicaSet 。

下载直接就可以使用:

bin>mysqlsh.exe
MySQL Shell 8.0.28
...

Type '\\help' or '\\?' for help; '\\quit' to exit.
MySQL JS >
检查三个实例的配置:
依次检查,直到均显示 status : ok
MySQL JS > dba.checkInstanceConfiguration('icadmin@h27:3301')
MySQL JS > dba.checkInstanceConfiguration('icadmin@h27:3302')
MySQL JS > dba.checkInstanceConfiguration('icadmin@h27:3303')
可能需要修改 icadmin 用户的权限,根据检查的结果调整即可
配置实例:
# 使用 configureInstance 依次配置三个实例,确保实例的可用性
# dba.configureInstance([instance][, options]) 命令格式
MySQL JS > dba.configureInstance('icadmin@h27:3301')
MySQL JS > dba.configureInstance('icadmin@h27:3302')
MySQL JS > dba.configureInstance('icadmin@h27:3303')
创建 InnoDB Cluster 并添加其他实例
连接一个实例,以当前连接的实例作为集群创建的种子实例:
MySQL JS > \\c icadmin@h27:3301
MySQL h27:3301 ssl JS > var c = dba.createCluster('clusterone')
# 如果有安全要求  可以使用 dba.createCluster('clusterone', {replicationAllowedHost:'IP 地址 /24'}) 来限制集群节点的 IP
增加 2 个实例,期间实例会重启,可能需要手动启动
MySQL h27:3301 ssl JS > c.addInstance('icadmin@h27:3302')
MySQL h27:3301 ssl JS > c.addInstance('icadmin@h27:3303')
查看集群的状态:
MySQL h27:3301 ssl JS > c.status()

{

"clusterName": "clusterone", # 集群名称

"defaultReplicaSet": {

"name": "default",

"primary": "h27:3301", # 当前主实例,默认第一个加入集群的实例

"ssl": "REQUIRED",

"status": "OK",

"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", # 可以支持 1 个实例失败

"topology": {

"h27:3301": {

"address": "h27:3301",

"memberRole": "PRIMARY", # 主

"mode": "R/W", # 读写,其他实例均为只读

"readReplicas": {},

"replicationLag": null,

"role": "HA",

"status": "ONLINE",

"version": "8.0.28"

},

"h27:3302": {

"address": "h27:3302",

"memberRole": "SECONDARY",

"mode": "R/O",

"readReplicas": {},

"replicationLag": null,

"role": "HA",

"status": "ONLINE",

"version": "8.0.28"

},

"h27:3303": {

"address": "h27:3303",

"memberRole": "SECONDARY",

"mode": "R/O",

"readReplicas": {},

"replicationLag": null,

"role": "HA",

"status": "ONLINE",

"version": "8.0.28"

}

},

"topologyMode": "Single-Primary"

},

"groupInformationSourceMember": "h27:3301"

}

测试一下集群的可用性:

关闭 3301 实例

MySQL h27:3301 ssl JS > \\sql

Switching to SQL mode... Commands end with ;

MySQL h27:3301 ssl SQL >

MySQL h27:3301 ssl SQL > shutdown;

Query OK, 0 rows affected (0.0057 sec)

连接到另外一个实例,查看集群状态

MySQL SQL > \\js

Switching to JavaScript mode...

MySQL JS > \\c icadmin@h27:3302

MySQL h27:3302 ssl JS > var c = dba.getCluster()

MySQL h27:3302 ssl JS > c.status()

{

"clusterName": "clusterone",

"defaultReplicaSet": {

"name": "default",

"primary": "h27:3302", # 主实例已经切换到 3302

"ssl": "REQUIRED",

"status": "OK_NO_TOLERANCE",

"statusText": "Cluster is NOT tolerant to any failures. 1 member is not active.", # 不允许再有实例失败,当前已有一个实例失败了

"topology": {

"h27:3301": {

"address": "h27:3301",

"memberRole": "SECONDARY",

"mode": "n/a",

"readReplicas": {},

"role": "HA",

"shellConnectError": "MySQL Error 2003: Could not open connection to 'h27:3301': Can't connect to MySQL server on 'h27:3301' (10061)",

"status": "(MISSING)" # 无法连接

},

"h27:3302": {

"address": "h27:3302",

"memberRole": "PRIMARY", # 主示例

"mode": "R/W",

"readReplicas": {},

"replicationLag": null,

"role": "HA",

"status": "ONLINE",

"version": "8.0.28"

},

"h27:3303": {

"address": "h27:3303",

"memberRole": "SECONDARY",

"mode": "R/O",

"readReplicas": {},

"replicationLag": null,

"role": "HA",

"status": "ONLINE",

"version": "8.0.28"

}

},

"topologyMode": "Single-Primary"

},

"groupInformationSourceMember": "h27:3302" # 提供组信息的成员 3302

}

主实例已经成功进行了切换,如果再次启动 3301 实例,集群又会恢复 3 个节点的状态。

三、参考链接

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广