二十三、Mysql8.0高可用集群架构实战

文章目录

  • 一、MySQL InnoDB Cluster
    • 1、基本概述
    • 2、集群架构
    • 3、搭建一主两从InnoDB集群
      • 3.1、 安装3个数据库实例
      • 3.2、安装mysqlrouter和安装mysqlshell
        • 3.2.1、安装mysql-router
        • 3.2.2、安装mysql-shell
      • 3.3、InnoDB Cluster 初始化
        • 3.1 参数及权限配置预需求检测
        • 3.2 初始化InnoDB Cluster相关配置
      • 3.4、创建一主两从InnoDB集群
        • 3.4.1、集群常用命令
        • 3.4.2、进入主节点创建集群
        • 3.4.3、添加副本实例
        • 小结:完整的集群创建步骤
        • 3.4.4、测试数据是否同步
        • 3.4.5、测试主从切换
        • 3.4.6、更多的常见操作
          • 3.4.6.1、参数配置
          • 3.4.6.2、配置节点权重
          • 3.4.6.3、将节点重新加入集群
          • 3.4.6.4、集群多数节点异常,恢复
          • 3.4.6.5、集群节点角色切换
          • 3.4.6.6、单主模式-指定主节点切换
          • 3.4.6.7、单主模式和多主模式相互切换
          • 3.4.6.8、销毁集群
          • 3.4.6.9、创建集群管理用户
      • 3.4.7、使用MySQL Router连接集群
        • 3.4.7.1、配置路由器
        • 3.4.7.2、启动路由器
        • 3.4.7.3、测试
  • 二、MySQL InnoDB ReplicaSet
    • 1、基本概述
    • 2、搭建一主一从的复制集
      • 2.1、安装2个数据库实例
      • 2.2、配置复制集
      • 2.3、配置 MySQL Router 路由器
      • 2.4、测试

一、MySQL InnoDB Cluster

官方文档:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-innodb-cluster.html

1、基本概述

InnoDB Cluster是MySQL官方实现高可用+读写分离的架构方案,其中包含以下组件

  • MySQL Group Replication:简称MGR,是MySQL的主从同步高可用方案,包括数据同步及角色选举。

  • Mysql Shell:是InnoDB Cluster的管理工具,用来创建和管理集群。

  • Mysql Router:是业务流量入口,支持对MGR的主从角色判断,可以配置不同的端口分别对外提供读写服务,实现读写分离。

MySQL Router与组复制和MySQL Shell高度整合,只有将其与组复制和MySQL Shell共同使用,才能够称为InnoDB Cluster。

2、集群架构

在这里插入图片描述

InnoDB Cluster将三个MySQL数据库实例构成一个高可用集群。其中一个实例是具有读/写能力的主要成员,其他两个实例是具有只读能力的次要成员。组复制将数据从主要成员复制到次要成员。MySQL Router将客户端应用程序连接到集群的主要成员。

3、搭建一主两从InnoDB集群

3.1、 安装3个数据库实例

参考:Docker安装MySQL8.0

可以利用docker快速部署3个MySQL实例

主机名(角色)server_id宿主机IP容器固定IPDB Port
mgr-node1(primary)1192.168.65.223172.19.0.103321>3306
mgr-node2(Secondary)2192.168.65.223172.19.0.113322>3306
mgr-node3(Secondary)3192.168.65.223172.19.0.123323>3306
# 创建组复制的网络  保证三个mysql容器之间可以通过容器名访问
docker network create --driver bridge --subnet 172.19.0.0/24 --gateway 172.19.0.1 mgr-networkmkdir -p /mysql/mgr/node1/data /mysql/mgr/node1/conf /mysql/mgr/node1/log
mkdir -p /mysql/mgr/node2/data /mysql/mgr/node2/conf /mysql/mgr/node2/log
mkdir -p /mysql/mgr/node3/data /mysql/mgr/node3/conf /mysql/mgr/node3/log#以mgr-node1配置为例,创建/mysql/mgr/node1/conf/custom.cnf,添加以下配置:
vim /mysql/mgr/node1/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
#指定sever_id,三个Mysql实例需要分别改为对应的sever_id
server_id=1
# 必须开启GTID支持
gtid_mode=ON
enforce_gtid_consistency=ON
# 启用二进制日志
log-bin=mysql-bin
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64
#对于Group Replication,数据必须存储在InnoDB事务存储引擎中
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"# mgr-node2和mgr-node3同上,注意配置文件路径和修改server_id
vim /mysql/mgr/node2/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
#指定sever_id,三个Mysql实例需要分别改为对应的sever_id
server_id=2
# 必须开启GTID支持
gtid_mode=ON
enforce_gtid_consistency=ON
# 启用二进制日志
log-bin=mysql-bin
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64
#对于Group Replication,数据必须存储在InnoDB事务存储引擎中
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"vim /mysql/mgr/node3/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
#指定sever_id,三个Mysql实例需要分别改为对应的sever_id
server_id=3
# 必须开启GTID支持
gtid_mode=ON
enforce_gtid_consistency=ON
# 启用二进制日志
log-bin=mysql-bin
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64
#对于Group Replication,数据必须存储在InnoDB事务存储引擎中
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"#运行mysql容器
# 为了便于测试,启动容器时指定好IP、hostname
docker run  -d  \
--name mgr-node1 \
--privileged=true \
--restart=always \
--ip 172.19.0.10 \
--hostname mgr-node1 \
--add-host  mgr-node2:172.19.0.11 \
--add-host  mgr-node3:172.19.0.12 \
--network  mgr-network \
-p 3321:3306 \
-v /mysql/mgr/node1/data:/var/lib/mysql \
-v /mysql/mgr/node1/conf:/etc/mysql/conf.d  \
-v /mysql/mgr/node1/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1docker run  -d  \
--name mgr-node2 \
--privileged=true \
--restart=always \
--ip 172.19.0.11 \
--hostname mgr-node2 \
--add-host  mgr-node1:172.19.0.10 \
--add-host  mgr-node3:172.19.0.12 \
--network  mgr-network \
-p 3322:3306 \
-v /mysql/mgr/node2/data:/var/lib/mysql \
-v /mysql/mgr/node2/conf:/etc/mysql/conf.d  \
-v /mysql/mgr/node2/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1docker run  -d  \
--name mgr-node3 \
--privileged=true \
--restart=always \
--ip 172.19.0.12 \
--hostname mgr-node3 \
--add-host  mgr-node1:172.19.0.10 \
--add-host  mgr-node2:172.19.0.11 \
--network  mgr-network \
-p 3323:3306 \
-v /mysql/mgr/node3/data:/var/lib/mysql \
-v /mysql/mgr/node3/conf:/etc/mysql/conf.d  \
-v /mysql/mgr/node3/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1# 在宿主机上配置mysql容器的ip和host映射
vim /etc/hosts
172.19.0.10  mgr-node1
172.19.0.11  mgr-node2
172.19.0.12  mgr-node3

所有实例分别配置远程访问

# 以node1为例
docker exec -it mgr-node1 /bin/bash
mysql -u root -p123456
#进入mysql执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

3.2、安装mysqlrouter和安装mysqlshell

MySQL Router是MySQL Proxy的后继产品,它提供了MySQL协议的路由器功能,可以用来实现读写分离、负载均衡和高可用性解决方案。

3.2.1、安装mysql-router

下载地址:https://downloads.mysql.com/archives/router/

# 以centos7为例
wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.0.27-1.el7.x86_64.rpm
rpm -ivh mysql-router-community-8.0.27-1.el7.x86_64.rpm
3.2.2、安装mysql-shell

下载地址:https://downloads.mysql.com/archives/shell/

# 以centos7为例
wget https://downloads.mysql.com/archives/get/p/43/file/mysql-shell-8.0.27-1.el7.x86_64.rpm
rpm -ivh mysql-shell-8.0.27-1.el7.x86_64.rpm
# 远程连接mysql
mysqlsh root@192.168.65.223:3321 --js
mysqlsh root@mgr-node1:3306 --js

MySQL Shell 教程: https://downloads.mysql.com/archives/router/

在这里插入图片描述

3.3、InnoDB Cluster 初始化

3.1 参数及权限配置预需求检测

在添加实例到集群中前,使用该方法检查实例配置是否满足InnoDB 集群要求。

mysqlsh root@192.168.65.223:3321 --js
// 检查实例是否符合InnoDB Cluster的参数及权限配置要求
dba.checkInstanceConfiguration('root@mgr-node1:3306')
dba.checkInstanceConfiguration('root@mgr-node2:3306')
dba.checkInstanceConfiguration('root@mgr-node3:3306')

如果验证通过返回ok。

在这里插入图片描述

如果验证没通过,比如出现下面的日志提示,需要mysql实例开启gtid和指定server_id

在这里插入图片描述

搭建InnoDB Cluster需要满足的要求如下:

InnoDB集群使用了Group Replication,因此必须满足使用组复制的要求。
具体可以参考https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements.html。
其中比较重要的几点有:

  • 必须开启二进制日志,并且日志格式为ROW,即–log-bin和binlog_format=row(默认)。

  • 必须开启副本更新日志,即log_replica_updates=ON(默认)。

  • 必须开启GTID,即gtid_mode=ON和enforce_gtid_consistency=ON。

  • 存储引擎只 能使用InnoDB。最好禁用其他存储引擎:

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
  • 从 8.0.23开始,集群中的实例要启用并行复制。需要配置以下系统变量:
binlog_transaction_dependency_tracking=WRITESET
slave_preserve_commit_order=ON
slave_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64
3.2 初始化InnoDB Cluster相关配置
// 对实例配置InnoDB Cluster相关参数
dba.configureInstance('root@mgr-node1:3306')
dba.configureInstance('root@mgr-node2:3306')
dba.configureInstance('root@mgr-node3:3306')

在这里插入图片描述

3.4、创建一主两从InnoDB集群

3.4.1、集群常用命令
#会列出dba相关指令
dba.help();
#列出详细指令的用法
dba.help('deploySandboxInstance');
#检查节点配置实例,用于加入cluster之前
dba.checkInstanceConfiguration("root@hostname:3306");  
#节点初始化
dba.configureInstance('root@hostname:3306'); 
#重启集群
dba.rebootClusterFromCompleteOutage('myCluster');  
#会列出集群相关指令
cluster.help();       
#创建集群
var cluster = dba.createCluster('myCluster');                              
#获取当前集群实例
var cluster = dba.getCluster('myCluster');   
查看集群状态
cluster.status();             
#检查cluster节点状态 
cluster.checkInstanceState("root@hostname:3306") ;                             
#增加节点 
cluster.addInstance("root@hostname:3306") ;               
#删除节点 
cluster.removeInstance("root@hostname:3306") ;            
#强制删除节点
cluster.removeInstance('root@hostname:3306',{force:true});    
#  状态为missing的节点可以重新加入集群 
cluster.rejoinInstance("root@hostname:3306")
#解散集群 
cluster.dissolve({force:true}) ;                          
#集群描述 
cluster.describe();                                      
3.4.2、进入主节点创建集群

初始化完第一个实例后,就可以创建集群了。

# 进入主节点创建集群
mysqlsh root@192.168.65.223:3321 --js
# 创建一个 cluster,命名为 'myCluster'	
var cluster = dba.createCluster('myCluster');
# 创建成功后,查看cluster状态
cluster.status();	

在这里插入图片描述

当前集群的状态如下

在这里插入图片描述

3.4.3、添加副本实例

添加副本实例到创建好的集群。

#初始化第二个和第三个实例:
cluster.addInstance('root@mgr-node2:3306');
cluster.addInstance('root@mgr-node3:3306');
#查看cluster状态
cluster.status();

在这里插入图片描述

如果提示副本实例的GTID与集群不一致,选择通过Clone方式覆盖副本实例上的数据即可。

在这里插入图片描述

小结:完整的集群创建步骤
#进入主节点
mysqlsh root@mgr-node1:3306 --js#mgr-node1 
# 参数权限检查
dba.checkInstanceConfiguration('root@mgr-node1:3306');
# 初始化
dba.configureInstance('root@mgr-node1:3306');
# 创建集群
var cluster = dba.createCluster('myCluster');
#查看cluster状态
cluster.status();#mgr-node2
# 参数权限检查
dba.checkInstanceConfiguration('root@mgr-node2:3306');
# 初始化
dba.configureInstance('root@mgr-node2:3306');
# 添加副本
cluster.addInstance('root@mgr-node2:3306');#mgr-node3
# 参数权限检查
dba.checkInstanceConfiguration('root@mgr-node3:3306');
# 初始化
dba.configureInstance('root@mgr-node3:3306');
# 添加副本
cluster.addInstance('root@mgr-node3:3306');#查看cluster状态
cluster.status();

搭建一主两从集群架构最终效果如下:

在这里插入图片描述

注意到集群状态已变为"status": “OK"和"statusText”: “Cluster is ONLINE and can tolerate up to ONE failure.”。

集群节点状态:

  • ONLINE - 节点状态正常。

  • OFFLINE - 实例在运行,但没有加入任何Cluster。

  • RECOVERING - 实例已加入Cluster,正在同步数据。

  • ERROR - 同步数据发生异常。

  • UNREACHABLE - 与其他节点通讯中断,可能是网络问题,可能是节点crash。

  • MISSING - 节点已加入集群,但未启动group replication

3.4.4、测试数据是否同步
#主节点 mgr-node1
[root@192-168-65-223 ~]# docker exec -it mgr-node1 bash
root@mgr-node1:/# mysql -uroot -p123456
mysql>
create database test;
use test;
create table t(x int primary key auto_increment,y int);
insert into t(x,y) value(1,1);

注意:如果创建表没有设置主键,会抛出错误:ERROR 3098 (HY000): The table does not comply with the requirements by an external plugin.

# 查看其他节点,数据是否同步
[root@192-168-65-223 ~]# docker exec -it mgr-node2 bash
root@mgr-node2:/# mysql -uroot -p123456
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t;
+---+------+
| x | y    |
+---+------+
| 1 |    1 |
+---+------+
1 row in set (0.00 sec)
3.4.5、测试主从切换
#停掉主节点
[root@192-168-65-223 ~]# docker stop mgr-node1# 连接到mgr-node2
MySQL  mgr-node1:3306 ssl  JS > \connect root@mgr-node2:3306
# 获取集群实例MySQL  mgr-node2:3306 ssl  JS > var cluster=dba.getCluster();
# 查看集群状态
MySQL  mgr-node2:3306 ssl  JS > cluster.status()
{"clusterName": "myCluster", "defaultReplicaSet": {"name": "default", "primary": "mgr-node2:3306", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active.", "topology": {"mgr-node1:3306": {"address": "mgr-node1:3306", "memberRole": "SECONDARY", "mode": "n/a", "readReplicas": {}, "role": "HA", "shellConnectError": "MySQL Error 2003: Could not open connection to 'mgr-node1:3306': Can't connect to MySQL server on 'mgr-node1:3306' (113)", "status": "(MISSING)"}, "mgr-node2:3306": {"address": "mgr-node2:3306", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}, "mgr-node3:3306": {"address": "mgr-node3:3306", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}}, "topologyMode": "Single-Primary"}, "groupInformationSourceMember": "mgr-node2:3306"

可以看到mgr-node2升级为主节点

在这里插入图片描述

# 启动mgr-node1节点
[root@192-168-65-223 ~]# docker start mgr-node1
# 查看集群状态,发现mgr-node1正在恢复,最终正常MySQL  mgr-node2:3306 ssl  JS > cluster.status()
{"clusterName": "myCluster", "defaultReplicaSet": {"name": "default", "primary": "mgr-node2:3306", "ssl": "REQUIRED", "status": "OK_NO_TOLERANCE", "statusText": "Cluster is NOT tolerant to any failures. 1 member is not active.", "topology": {"mgr-node1:3306": {"address": "mgr-node1:3306", "instanceErrors": ["NOTE: group_replication is stopped."], "memberRole": "SECONDARY", "memberState": "OFFLINE", "mode": "R/O", "readReplicas": {}, "role": "HA", "status": "(MISSING)", "version": "8.0.27"}, "mgr-node2:3306": {"address": "mgr-node2:3306", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}, "mgr-node3:3306": {"address": "mgr-node3:3306", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}}, "topologyMode": "Single-Primary"}, "groupInformationSourceMember": "mgr-node2:3306"
}
MySQL  mgr-node2:3306 ssl  JS > cluster.status()
{"clusterName": "myCluster", "defaultReplicaSet": {"name": "default", "primary": "mgr-node2:3306", "ssl": "REQUIRED", "status": "OK", "statusText": "Cluster is ONLINE and can tolerate up to ONE failure.", "topology": {"mgr-node1:3306": {"address": "mgr-node1:3306", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}, "mgr-node2:3306": {"address": "mgr-node2:3306", "memberRole": "PRIMARY", "mode": "R/W", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}, "mgr-node3:3306": {"address": "mgr-node3:3306", "memberRole": "SECONDARY", "mode": "R/O", "readReplicas": {}, "replicationLag": null, "role": "HA", "status": "ONLINE", "version": "8.0.27"}}, "topologyMode": "Single-Primary"}, "groupInformationSourceMember": "mgr-node2:3306"
}
3.4.6、更多的常见操作
3.4.6.1、参数配置

可以用cluster.options()查看当前集群的配置属性,集群参数配置分为两种方式:

  • cluster.setOption() 用来设置所有节点的参数

  • cluster.setInstanceOption() 用来对指定节点配置属性

# 将所有节点的权重都改为50
var cluster = dba.getCluster()
cluster.setOption("memberWeight",50)
# 重新加入集群重试次数改为5次
cluster.setOption("autoRejoinTries",5)# 将其中一个节点的权重改为75
cluster.setInstanceOption("mgr-node2:3306","memberWeight",75)
# 重新加入集群重试次数改为10次
cluster.setInstanceOption("mgr-node2:3306","autoRejoinTries",10)
3.4.6.2、配置节点权重

memberWeight选项的值域为0到100之间的整数,缺省值为50。该值是故障转移时自动选举主节点的百分比权重,具有较高memberWeight值的实例更有可能在单主群集中被选为主节点

// 查看集群的参数配置(包括memberWeight优先级配置)
cluster.options()// 在集群创建时配置
dba.createCluster('myCluster', {memberWeight:75}) // 第一个节点配置方式
var cluster = dba.getCluster() 
cluster.addInstance('mgr-node2:3306',{memberWeight:50})
cluster.addInstance('mgr-node3:3306',{memberWeight:25})// 在集群创建完成后修改权重
var cluster = dba.getCluster()
cluster.setInstanceOption('mgr-node1:3306','memberWeight',100)
cluster.setInstanceOption('mgr-node2:3306','memberWeight',50)
cluster.setInstanceOption('mgr-node3:3306','memberWeight',25)
3.4.6.3、将节点重新加入集群

状态为mssing的节点,通常是组复制关闭或中断状态,可以用cluster.rejoinInstance()重新加入集群,会重新对该节点设置MGR相关参数(持久化到mysqld-auto.conf中)

cluster.removeInstance('root@hostname:3306',{force:true});    

如果一些参数做了修改,如server_uuid变更,导致rejoin失败,则需要将节点从集群中删除后重新加入

cluster.removeInstance("root@hostname:3306",{force:true})
cluster.rescan()
cluster.addInstance("root@hostname:3306")
3.4.6.4、集群多数节点异常,恢复

当集群多个节点异常,则失去了仲裁机制,剩下的一个节点

// 将集群剥离为单节点运行
JS > cluster.forceQuorumUsingPartitionOf("root@hostname:3306")// 重新加另外2个节点加入
JS > cluster.rejoinInstance("root@hostname2:3306")
JS > cluster.rejoinInstance("root@hostname3:3306")
3.4.6.5、集群节点角色切换

在MGR的管理下提供了一下3种方式进行角色切换,mysqlsh对其进行了封装调用

  • group_replication_set_as_primary(member_uuid);

    • cluster.setPrimaryInstance(“homename:3306”)
  • group_replication_switch_to_single_primary_mode()

    • cluster.switchToSinglePrimaryMode(“homename:3306”)
  • group_replication_switch_to_multi_primary_mode()

    • cluster.switchToMultiPrimaryMode()
3.4.6.6、单主模式-指定主节点切换
var cluster = dba.getCluster()
cluster.setPrimaryInstance('homename:3306')
cluster.status()
3.4.6.7、单主模式和多主模式相互切换
// 切换为多主模式
var cluster = dba.getCluster()
cluster.switchToMultiPrimaryMode()// 指定明确的主节点将多主模式切换为单主模式
cluster.switchToSinglePrimaryMode("homename:3306")

将单主模式切换为多主模式的效果

在这里插入图片描述

3.4.6.8、销毁集群

删除与群集关联的所有元数据和配置,并禁用实例上的组复制,但不会删除在实例之间复制的任何数据。要再次创建集群,使用dba.createCluster()

var cluster = dba.getCluster()
cluster.dissolve()
3.4.6.9、创建集群管理用户
cluster.setupAdminAccount('fox')

在这里插入图片描述

# 经典MySQL协议连接
mysqlsh --mysql -hmgr-node1 -ufox
# X协议连接
mysqlsh --mysqlx -hmgr-node1 -ufox

在这里插入图片描述

3.4.7、使用MySQL Router连接集群

3.4.7.1、配置路由器
mysqlrouter --bootstrap root@mgr-node2:3306 --force --user=root
#或者指定host
mysqlrouter --bootstrap root@mgr-node2:3306 --force --user=root --report-host mgr

注意,如果用户之前为该实例配置过路由,则可以通过指定force选项强制引导启动。

在这里插入图片描述

上面的内容是引导启动路由器时输出的信息,信息提示,MySQL经典协议使用6446端口和6447端口,X协议使用6448端口和6449端口,每种协议使用的两个端口分别用于读写和只读。

在一个运行的集群中,AdminAPI 可以引导多个路由器。用户可以使用cluster.listRouters()方法显示所有注册的路由器列表。

在这里插入图片描述

3.4.7.2、启动路由器
mysqlrouter &

路由器已经成功启动。现在,使用MySQL Shell连接路由器进行验证。

#连接mysqlrouter
[root@192-168-65-223 ~]# mysqlsh root@localhost:6446 --sql
MySQL  localhost:6446 ssl  SQL > use test;
MySQL  localhost:6446 ssl  test  SQL > select * from t;

查看集群成员信息

MySQL  localhost:6446 ssl  test  SQL > select * from performance_schema.replication_group_members;

在这里插入图片描述

3.4.7.3、测试

测试读写端口6446

用户可以通过连接本机的6446端口连接到MySQL实例

在这里插入图片描述

6446为读写端口,也可以插入数据

在这里插入图片描述

测试只读端口6647:插入数据报错

在这里插入图片描述

二、MySQL InnoDB ReplicaSet

1、基本概述

MySQL Innodb Cluster = MySQL Shell + MySQL Router + MySQL Group Replication(MGR),全程由 MySQL Shell 来管理操作 MGR 的聚合套件。MySQL 8.0.19 发布后,这种组合延伸到 MySQL Replication(主从复制),也就是 MySQL Shell + MySQL Router + MySQL Replication。

InnoDB ReplicaSet至少由两个MySQL服务器实例组成,并提供用户熟知的主从复制功能,例如读取横向扩展和数据安全性。InnoDB ReplicaSet使用以下MySQL技术。

  • MySQL Shell:MySQL的高级客户端、管理工具,可以用来管理复制集。

  • MySQL复制:一组MySQL实例,通过复制能够提供可用性和异步读取的横向扩展。

  • MySQL Router:一种轻量级的中间件,可在应用程序和InnoDB ReplicaSet之间提供透明的路由。InnoDB ReplicaSet的接口类似于InnoDB Cluster,用户可以利用MySQL Shell使用MySQL实例和MySQL Router。

与InnoDB集群相比,InnoDB ReplicaSet具有多个限制,因此,官方建议尽可能部署InnoDB群集。通常,InnoDB ReplicaSet本身不能提供高可用性。InnoDB ReplicaSet的限制包括:

  • 没有自动故障转移。如果主服务器不可用,则需要使用AdminAPI手动触发故障转移,然后才能再次进行任何更改。但是,辅助实例仍然可用于读取。

  • **无法防止因意外停止或不可用而导致部分数据丢失。**暂停之前尚未应用的事务可能会丢失。

  • **无法防止崩溃或不可用后出现不一致情况。**如果故障转移在辅助节点仍可用的情况下提升了辅助节点(例如,由于网络分区),则可能会因脑裂而引起不一致。

2、搭建一主一从的复制集

2.1、安装2个数据库实例

参考:Docker安装MySQL8.0

可以利用docker快速部署2个MySQL实例

主机名(角色)server_id宿主机IP容器固定IPDB Port
rs-node1(primary)21192.168.65.223172.20.0.203331>3306
rs-node2(Secondary)22192.168.65.223172.20.0.213332>3306
# 创建组复制的网络  保证三个mysql容器之间可以通过容器名访问
docker network create --driver bridge --subnet 172.20.0.0/24 --gateway 172.20.0.1 rs-networkmkdir -p /mysql/rs/node1/data /mysql/rs/node1/conf /mysql/rs/node1/log
mkdir -p /mysql/rs/node2/data /mysql/rs/node2/conf /mysql/rs/node2/log#以rs-node1配置为例,创建/mysql/rs/node1/conf/custom.cnf,添加以下配置:
vim /mysql/rs/node1/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
#指定sever_id,多个Mysql实例需要分别改为对应的sever_id
server_id=21
# 必须开启GTID支持
gtid_mode=ON
enforce_gtid_consistency=ON
# 启用二进制日志
log-bin=mysql-bin
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64# rs-node2同上,注意配置文件路径和修改server_id
vim /mysql/rs/node2/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8
[mysqld]
#指定sever_id,多个Mysql实例需要分别改为对应的sever_id
server_id=22
# 必须开启GTID支持
gtid_mode=ON
enforce_gtid_consistency=ON
# 启用二进制日志
log-bin=mysql-bin
#启用并行复制
binlog_transaction_dependency_tracking=WRITESET
replica_preserve_commit_order=ON
replica_parallel_type=LOGICAL_CLOCK
transaction_write_set_extraction=XXHASH64#运行mysql容器
# 为了便于测试,启动容器时指定好IP、hostname
docker run  -d  \
--name rs-node1 \
--privileged=true \
--restart=always \
--ip 172.20.0.20 \
--hostname rs-node1 \
--add-host  rs-node2:172.20.0.21 \
--network  rs-network \
-p 3331:3306 \
-v /mysql/rs/node1/data:/var/lib/mysql \
-v /mysql/rs/node1/conf:/etc/mysql/conf.d  \
-v /mysql/rs/node1/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1docker run  -d  \
--name rs-node2 \
--privileged=true \
--restart=always \
--ip 172.20.0.21 \
--hostname rs-node2 \
--add-host  rs-node1:172.20.0.20 \
--network  rs-network \
-p 3332:3306 \
-v /mysql/rs/node2/data:/var/lib/mysql \
-v /mysql/rs/node2/conf:/etc/mysql/conf.d  \
-v /mysql/rs/node2/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1# 在宿主机上配置mysql容器的ip和host映射
vim /etc/hosts
172.20.0.20  rs-node1
172.20.0.21  rs-node2

所有实例分别配置远程访问

# 以node1为例
docker exec -it rs-node1 /bin/bash
mysql -u root -p123456
#进入mysql执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

在这里插入图片描述

2.2、配置复制集

1)初始化主节点,创建复制集

#进入主节点
mysqlsh root@rs-node1:3306 --js
# 初始化
dba.configureReplicaSetInstance('root@rs-node1:3306')
# 创建复制集,使用异步复制
var rs = dba.createReplicaSet("myrs")
#查看状态
rs.status()

在这里插入图片描述

2)添加副本节点

#将实例添加到复制集
rs.addInstance('root@rs-node2:3306')

在这里插入图片描述

测试数据是否同步

#主节点 rs-node1
[root@192-168-65-223 ~]# docker exec -it rs-node1 bash
root@mgr-node1:/# mysql -uroot -p123456
mysql>
create datebase test;
use test;
create table t(x int primary key auto_increment,y int);
insert into t(x,y) value(1,1);
select * from t;# 进入从节点rs-node2,查看数据是否同步过来
[root@192-168-65-223 ~]# docker exec -it rs-node2 bash
root@rs-node2:/# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1596
Server version: 8.0.27 MySQL Community Server - GPLCopyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t;
+---+------+
| x | y    |
+---+------+
| 1 |    1 |
+---+------+
1 row in set (0.00 sec)

2.3、配置 MySQL Router 路由器

[root@192-168-65-223 ~]# mysqlrouter --bootstrap root@rs-node1:3306 --force --user=root

在这里插入图片描述

重启Mysql Router

[root@192-168-65-223 ~]# ps -ef|grep mysqlrouter
root     16993 14238  6 11:30 pts/1    00:18:01 mysqlrouter
root     21637 14178  0 16:22 pts/0    00:00:00 grep --color=auto mysqlrouter
[root@192-168-65-223 ~]# kill -9 16993
# 启动Mysql Router
[root@192-168-65-223 ~]# mysqlrouter &

2.4、测试

用户可以通过连接本机的6446端口连接到MySQL实例

[root@192-168-65-223 ~]# mysqlsh root@localhost:6446 --sql
# 可以查询到插入的测试数据MySQL  localhost:6446 ssl  SQL > select * from test.t;
+---+---+
| x | y |
+---+---+
| 1 | 1 |
+---+---+

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/2629.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[OS] mmap() 函数的参数及其作用

参数说明: addr:映射区域的起始地址。如果设置为 0,则由内核自动选择页对齐的地址。length:需要映射的字节数,决定映射的区域大小。prot:映射区域的内存保护属性,如只读、可读写等。这个属性不…

meta-learning based FD论文阅读笔记

[1]Semi-Supervised Temporal Meta-Learning Framework for Wind Turbine Bearing Fault Diagnosis Under Limited Annotation Data 问题背景 the fault data are so scarce that it is time-consuming to acquire a well behaved deep learning modelmuch unlabeled data ca…

web渗透——小白入狱

目录 理论知识总结一、Web渗透核心知识点二、Web渗透实操案例三、Web渗透学习建议实操案例一、信息收集实操步骤: 二、SQL注入实操步骤: 三、跨站脚本攻击(XSS)实操步骤: 四、CSRF攻击实操步骤: 五、本地文…

一个完整的产品级物联网系统在农业领域的应用,通过传感器、通信、云计算和控制设备的协同工作,实现了智能化的农业灌溉管理

以下为您详细介绍一个智能农业灌溉系统作为产品级的物联网实际案例: **一、项目背景** 随着农业现代化的发展,精准灌溉对于提高农作物产量、节约水资源具有重要意义。传统的灌溉方式往往依赖人工经验,效率低下且浪费水资源。因此&#xff0c…

JeecgBoot入门

最近在了解低代码平台,其中关注到gitee上开源项目JeecgBoot,JeecgBoot官方也有比较完整的入门教学文档,这里我们将耕者官方教程学习,并将其记录下来。 一、项目简介 JeecgBoot 是一款基于代码生成器的低代码开发平台拥有零代码能力…

qt QEvent详解

1、概述 QEvent是Qt框架中事件机制的基础类。在Qt中,事件是由底层窗口系统(如Windows、Linux的X11、macOS的Cocoa等)生成的,Qt的主事件循环(QCoreApplication::exec())负责从事件队列中获取这些事件&#…

#Jest进阶知识:整合 webpack 综合练习

这一小节,我们来做一个综合的练习,该练习会整合: typescriptwebpackjest 准备工作 首先创建项目目录,通过 npm init -y 进行初始化。 整个项目我们打算使用 typescript 进行开发,因此需要安装 typescript npm i t…

【安卓13 源码】Input子系统(4)- InputReader 数据处理

1. 多指触控协议 多指触控协议有 2 种: > A类: 处理无关联的接触: 用于直接发送原始数据; > B类: 处理跟踪识别类的接触: 通过事件slot发送相关联的独立接触更新。 B协议可以使用一个ID来标识触点&…

VMware 虚拟机使用教程及 Kali Linux 安装指南

VMware 虚拟机使用教程及 Kali Linux 安装指南 在现代计算机科学与网络安全领域,虚拟化技术的应用越来越广泛。VMware 是一款功能强大的虚拟化软件,可以帮助用户在同一台物理机上运行多个操作系统。本文将详细介绍如何使用 VMware 虚拟机,并…

工业通信网关的各项功能解析-天拓四方

在工业自动化和智能制造的浪潮中,工业通信网关作为连接工业现场与互联网的重要桥梁,发挥着至关重要的作用。它不仅实现了不同网络协议之间的转换,还在数据采集、设备控制、网络管理等方面展现出强大的功能。 一、协议转换功能 工业通信网关…

用Python打造媒体管理播放器:从零到全功能GUI应用

背景 在日常生活中,我们经常需要管理和播放大量媒体文件。市面上的音频播放器可能功能单一,或者界面复杂。作为一名程序员,我决定使用Python自己打造一个简单yet强大的媒体管理播放器。 C:\pythoncode\new\playsong.py 全部代码 import os…

ubuntu 20.04 安装使用 nvidia gdrcopy

1,预备环境 首先安装 nvidia display driver ,cuda toolkit 其次安装依赖工具 sudo apt install build-essential devscripts debhelper fakeroot pkg-config dkms 2,下载源码 git clone --recursive https://github.com/NVIDIA/gdrcopy.…

MongoDB简介

一.MongoDB相关概念 1.1.简介 MongoDB是一个开源,高性能,无模式的文档性数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种。是最像关系型数据库(MySQL)的非关系数据库。 它支持的…

Socket篇(学习前言)

目录 一、计算机网络 二、网络编程 三、网络编程三要素 1. IP地址 1.1. 简介 1.2. IP地址分为两大类 IPv4 IPv6 1.3. IP地址形式 1.4. DOS常用命令 1.5. 特殊IP地址 2. 端口 2.1. 简介 2.2. 端口号 2.3. 端口类型 周知端口 注册端口 动态端口 3. 协议 3.1. …

【专题】基于服务的体系结构

对于面向服务的体系结构(Service-Oriented Architecture,SOA)的几种定义: W3C:SOA是一种应用程序体系结构,在这种体系结构中,所有功能都定义为独立的服务,这些服务带有定义明确的可…

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

问题 折磨的开始是天下苦黄狗久矣,为了不再被讨乞丐的显存恶心,一怒之下购入了AMD显卡(20GB显存确实爽 头一天就跑了3dmark验机,完美通过,玩游戏也没毛病 但是呢这厮是一点不省心,玩游戏没问题&#xff0c…

小容器拉动大市场 全面云原生化刻不容缓

毋庸置疑,容器技术的发展推动了云原生计算革命。当前,在云原生已经成为企业用云新常态的情况下,作为一项核心能力,容器管理与服务也成了检验云服务商的试金石。Omdia最新发布的《Omdia Universe: Cloud Container Management &…

一招帮你搞懂数据结构的插入、删除

目录 一、尾部插入(添加) 1.初始化 2.一个打印数组的函数 3.尾插 4.完整版 二、任意位置插入 1.流程图 2.任意插 3.完整版 三、指定数据删除 1.流程图 2. 删除(首位查找到的元素) 四、删除所有 思想 代码 五、有序…

二叉树相关算法

满二叉树:每层都是满的 完全二叉树:特殊的满二叉树,可以有一个子节点,但最后一层必须是从左到右排列,中间不能有空隙,强调除了最后一层外,其他层都是满的 一、dfs深度搜索 例题:求…

Sigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导

SSigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导 Sigrity Power SI的VR noise Metrics check模式本质上是用来评估和观测器件的电源网络的耦合对于信号的影响,输出S参数以及列出具体的贡献值。 以下图为例