十五MIC真正的高可用

Posted 哭泣的馒头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十五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\'

这里需要说明的是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_02\'

##退出

 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真正的高可用_mysql_03\'

添加db2节点

MySQL  db1:3306 ssl  JS > cluster.addInstance(\'root@db2:3306\');

添加db3节点

MySQL  db1:3306 ssl  JS > cluster.addInstance(\'root@db3:3306\');

\'十五、MIC真正的高可用_mysql_04\'

\'十五、MIC真正的高可用_mysql_05\'

查看集群状态

MySQL  db1:3306 ssl  JS > cluster.status()

\'十五、MIC真正的高可用_mysql_06\'

查询节点信息(随便登录一个节点)

db2

mysql -S /data/3306/mysql.sock

select * from performance_schema.replication_group_members;

\'十五、MIC真正的高可用_mysql_07\'

五、安装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_08\'

输完密码后,mysql-router会自动获取cluster信息,并生成mysqlrouter.conf在安装目录,##不需要手动配置配置文件

mysql_route目录在/data/mysql-router下面,新生成的配置文件/data/mysql-router/mysqlrouter.conf

启动服务

mysqlrouter -c /data/mysql-router/mysqlrouter.conf &

\'十五、MIC真正的高可用_mysql_09\'

测试:

可写端口6446

\'十五、MIC真正的高可用_mysql_10\'

可读端口6447

\'十五、MIC真正的高可用_mysql_11\'

故障测试

关闭db1节点

mysqladmin -S /data/3306/mysql.sock shutdown

\'十五、MIC真正的高可用_mysql_12\'

\'十五、MIC真正的高可用_mysql_13\'

恢复节点

db1

mysqld_safe --defaults-file=/data/3306/my.cnf &

\'十五、MIC真正的高可用_mysql_14\'

六、停电重启

模拟关闭三个节点

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真正的高可用_mysql_15\'

###发现此时各个实例并没有自动组成集群

\'十五、MIC真正的高可用_mysql_16\'

使用 dba.dropmetadataschema ()删除模式,或使用 dba.rebootstraclusterfromcomplete宕机()从完全宕机中重新启动集群

\'十五、MIC真正的高可用_mysql_17\'

###报错db2比较新一些

切换到db2

\'十五、MIC真正的高可用_mysql_18\'

成功启动起来

\'十五、MIC真正的高可用_mysql_19\'

\'十五、MIC真正的高可用_mysql_20\'

\'十五、MIC真正的高可用_mysql_21\'

以上是关于十五MIC真正的高可用的主要内容,如果未能解决你的问题,请参考以下文章

HBase主备双服务高可用之路的探索

面试90%都会翻车的高可用+高并发+负载均衡架构设计 !

MySQL高可用MHA集群

mysql进阶MHA高可用集群

面试90%都会翻车的高可用+高并发+负载均衡架构设计 !

面试90%都会翻车的高可用+高并发+负载均衡架构设计 !