十五MIC真正的高可用

博观而约取,厚积而薄发。这篇文章主要讲述十五MIC真正的高可用相关的知识,希望能为你提供帮助。
一、介绍
MGR方案本身并不具备故障转移和负载均衡的能力,只有搭配其他第三方中间件后,才可以实现故障转移及负载均衡。
MIC(MySQL InnoDB Cluster) 是MySQL官方在2017年4月推出了一套完整的、高可用的解决方案,。
MIC主要由三部分组成,分别是:MySQL Shell、MySQL Router、MySQL Group Replication(MGR)。
MySQL Shell:通过内置的管理API创建及管理Innodb集群。
MySQL Router:路由转发中间件,提供透明切换与读写分离能力。
MySQL Group Replication:底层的数据同步集群(MGR),提供容错、故障恢复与弹性扩展。

十五MIC真正的高可用

文章图片

这里需要说明的是mysql Router的读写分离并非对应用透明,而是通过划分读写端口(6446)与 只读端口(6447)来转发不同的请求实现读写分离,本质还是需要程序端根据业务类型重新定义数据源才可以实现。
MIC是MySQL官方尝试在不依赖于第三方中间件的情况下,推出的一个功能比较完整的高可用方案
二、mysql搭建
###拿mysql8版本做实验,别用7
db1:192.168.10.128
db2:192.168.10.129
db3:192.168.10.130
修改主机名 
192.168.10.128   hostnamectl set-hostname db1
192.168.10.129   hostnamectl set-hostname db2
192.168.10.130   hostnamectl set-hostname db3
在/etc/hosts添加
192.168.10.128   db1
192.168.10.129   db2
192.168.10.130   db3
配置各节点免密登录
192.168.10.128
ssh-keygen ##一路回车就好
cd /root/.ssh
mv id_rsa.pub authorized_keys    
scp   -r   /root/.ssh   192.168.10.129:/root
scp   -r   /root/.ssh   192.168.10.130:/root
各节点验证
db1:
ssh 192.168.10.128 date
ssh 192.168.10.129 date
ssh 192.168.10.130 date
db2:
ssh 192.168.10.128 date
ssh 192.168.10.129 date
ssh 192.168.10.130 date
db3:
ssh 192.168.10.128 date
ssh 192.168.10.129 date
ssh 192.168.10.130 date
1. 创建用户
useradd mysql
2. 上传软件并解压
tar -xvf mysql-8.0.19-linux-glibc2.12-x86_64.tar.xz -C /data/
cd /data
mv mysql-8.0.19-linux-glibc2.12-x86_64/ mysql
3. 环境变量
vi /etc/profile
export PATH=$PATH:/data/mysql/bin
source /etc/profile
rm -rf /data/3306/
mkdir -p /data/3306/data
chown -R mysql.mysql /data
4. 配置文件说明
配置示例:
++++++++++db1++++++
vi /data/3306/my.cnf
[mysqld]
user=mysql
datadir=/data/3306/data
basedir=/data/mysql
port=3306
socket=/data/3306/mysql.sock
server_id=28
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_ip_whitelist = "127.0.0.1/24,192.168.10.0/24"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.10.128:33061"
loose-group_replication_group_seeds="192.168.10.128:33061,192.168.10.129:33061,192.168.10.130:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks= false
++++++++++db2++++++
vi /data/3306/my.cnf
[mysqld]
user=mysql
datadir=/data/3306/data
basedir=/data/mysql
port=3306
socket=/data/3306/mysql.sock
server_id=29
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_ip_whitelist = "127.0.0.1/24,192.168.10.0/24"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.10.129:33061"
loose-group_replication_group_seeds="192.168.10.128:33061,192.168.10.129:33061,192.168.10.130:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks= false
++++++++++db3++++++
vi /data/3306/my.cnf
[mysqld]
user=mysql
datadir=/data/3306/data
basedir=/data/mysql
port=3306
socket=/data/3306/mysql.sock
server_id=30
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="22d56f7c-dfe5-4eb1-a21a-cf9c27e8d625"
loose-group_replication_ip_whitelist = "127.0.0.1/24,192.168.10.0/24"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address="192.168.10.130:33061"
loose-group_replication_group_seeds="192.168.10.128:33061,192.168.10.129:33061,192.168.10.130:33061"
loose-group_replication_bootstrap_group=off
loose-group_replication_single_primary_mode=true
loose-group_replication_enforce_update_everywhere_checks= false
组复制部分,配置文件介绍:
group_replication变量使用的loose-前缀是指示Server启用时尚未加载复制插件也将继续启动
transaction_write_set_extraction = XXHASH64
##指示Server必须为每个事务收集写集合,并使用XXHASH64哈希算法将其编码为散列
loose-group_replication_group_name="01e5fb97-be64-41f7-bafd-3afc7a6ab555"
##表示将加入或者创建的复制组命名为01e5fb97-be64-41f7-bafd-3afc7a6ab555
##可自定义(通过cat /proc/sys/kernel/random/uuid)
loose-group_replication_start_on_boot=off 
##设置为Server启动时不自动启动组复制
loose-group_replication_local_address="192.168.10.128:33061" 
##绑定本地的192.168.10.128及33061端口接受其他组成员的连接,IP地址必须为其他组成员可正常访问
loose-group_replication_group_seeds="192.168.10.128:33061,192.168.10.128:33062,192.168.10.128:33063"
##本行为告诉服务器当服务器加入组时,应当连接到192.168.10.128:33061,192.168.10.128:33062,192.168.10.128:33063
##这些种子服务器进行配置。本设置可以不是全部的组成员服务地址。
loose-group_replication_bootstrap_group = off 
##配置是否自动引导组
loose-group_replication_ip_whitelist="10.30.0.0/16,10.31.0..0/16,10.27.0.0/16"
##配置白名单,默认情况下只允许192.168.10.128,192.168.10.129,192.168.10.130连接到复制组,如果是其他IP则需要配置。
5. 三个节点初始化数据,并启动数据库节点
mysqld --initialize-insecure --user=mysql --basedir=/data/mysql --datadir=/data/3306/data
mysqld_safe --defaults-file=/data/3306/my.cnf &
6. 三个节点创建用户
mysql -S /data/3306/mysql.sock
create user \'root\'@\'%\' identified with mysql_native_password by \'123\';
grant all privileges on *.* to \'root\'@\'%\' with grant option;
flush privileges;
加载GR插件
install plugin group_replication soname \'group_replication.so\';
show plugins;
三、安装mysqlsh
##下载
https://downloads.mysql.com/archives/shell/
##安装
tar -xvf mysql-shell-8.0.20-linux-glibc2.12-x86-64bit.tar.gz -C /data/
cd /data
mv mysql-shell-8.0.20-linux-glibc2.12-x86-64bit/ mysqlsh
##添加环境变量
vi /etc/profile
export PATH=$PATH:/data/mysqlsh/bin
source /etc/profile
##连接测试
 
十五MIC真正的高可用

文章图片

##退出
  MySQL   localhost:3306 ssl   JS > \\quit
四、搭建集群
db1执行如下操作
mysqlsh
MySQL   db1:3306 ssl   JS > \\c root@db1:3306
MySQL   db1:3306 ssl   JS > dba.configureInstance();
MySQL   db1:3306 ssl   JS > dba.checkInstanceConfiguration("root@db1:3306");
MySQL   db1:3306 ssl   JS > \\c root@db2:3306
MySQL   db2:3306 ssl   JS > dba.configureInstance();
MySQL   db2:3306 ssl   JS > dba.checkInstanceConfiguration("root@db2:3306");
MySQL   db2:3306 ssl   JS > \\c root@db3:3306
MySQL   db3:3306 ssl   JS > dba.configureInstance();
MySQL   db3:3306 ssl   JS > dba.checkInstanceConfiguration("root@db3:3306");
db1创建集群
MySQL   db3:3306 ssl   JS > \\c root@db1:3306
MySQL   db1:3306 ssl   JS > var cluster = dba.createCluster(\'myCluster\');
十五MIC真正的高可用

文章图片

添加db2节点
MySQL   db1:3306 ssl   JS > cluster.addInstance(\'root@db2:3306\');
添加db3节点
MySQL   db1:3306 ssl   JS > cluster.addInstance(\'root@db3:3306\');
十五MIC真正的高可用

文章图片

十五MIC真正的高可用

文章图片

查看集群状态
MySQL   db1:3306 ssl   JS > cluster.status()
十五MIC真正的高可用

文章图片

查询节点信息(随便登录一个节点)
db2
mysql -S /data/3306/mysql.sock
select * from performance_schema.replication_group_members;
十五MIC真正的高可用

文章图片

五、安装MySQL-router(选择db3作为安装)
此时的集群的高可用性还不完整,需要MySQL-router来完成集群与外部的对接,实现自动切换,故障转移等功能。
MySQL-router的作用类似keepalived 类的中间件。当主机发生故障后,自动将应用切换到其他实例。
下载:https://downloads.mysql.com/archives/router/
安装:
tar -xvf mysql-router-8.0.20-linux-glibc2.12-x86_64.tar.xz -C /data/
cd /data/
mv mysql-router-8.0.20-linux-glibc2.12-x86_64/ mysql-router
添加环境变量
vi /etc/profile
export PATH=$PATH:/data/mysql-router/bin
source /etc/profile
简单配置模板位置:可以参考
/data/mysql-router/share/doc/mysqlrouter/sample_mysqlrouter.conf
mysqlrouter --bootstrap root@db1:3306 --user=root ###必须用主节点的登陆才行(root/123)
十五MIC真正的高可用

文章图片

输完密码后,mysql-router会自动获取cluster信息,并生成mysqlrouter.conf在安装目录,##不需要手动配置配置文件
mysql_route目录在/data/mysql-router下面,新生成的配置文件/data/mysql-router/mysqlrouter.conf
启动服务
mysqlrouter -c /data/mysql-router/mysqlrouter.conf &
十五MIC真正的高可用

文章图片

测试:
可写端口6446
十五MIC真正的高可用

文章图片

可读端口6447
十五MIC真正的高可用

文章图片

故障测试
关闭db1节点
mysqladmin -S /data/3306/mysql.sock shutdown
十五MIC真正的高可用

文章图片

十五MIC真正的高可用

文章图片

恢复节点
db1
mysqld_safe --defaults-file=/data/3306/my.cnf &
十五MIC真正的高可用

文章图片

六、停电重启
模拟关闭三个节点
mysqladmin -S /data/3306/mysql.sock shutdown
重新启动
mysqld_safe --defaults-file=/data/3306/my.cnf &
mysql -S /data/3306/mysql.sock
select * from performance_schema.replication_group_members;
十五MIC真正的高可用

文章图片

###发现此时各个实例并没有自动组成集群
十五MIC真正的高可用

文章图片

使用 dba.dropmetadataschema ()删除模式,或使用 dba.rebootstraclusterfromcomplete宕机()从完全宕机中重新启动集群
十五MIC真正的高可用

文章图片

###报错db2比较新一些
切换到db2
十五MIC真正的高可用

文章图片

成功启动起来
十五MIC真正的高可用

文章图片

十五MIC真正的高可用

文章图片

【十五MIC真正的高可用】
十五MIC真正的高可用

文章图片


    推荐阅读