DBA数据库学习

DBA数据库笔记之(十一)MySQL高可用方案之InnoDB C

2024-01-25  本文已影响0人  Mr培

详解InnoDB Cluster

  1. 单主模式

自动选出一个主,每次只能接受一个节点的更新。生成环境建议使用单主模式

  1. 多主模式

所有节点都可以更新,并且可以并发更新

  1. 弹性复制
  2. 多写能力
  3. 自动故障转移
  1. 仅支持InnoDB存储引擎
  2. 要求表具有主键或唯一非空字段
  3. 必须启用GTID
  4. 多主模式下不支持SERIALIZABLE隔离级别
  5. 节点数量上限9个
  6. 网络延迟影响性能

InnoDB Cluster部署

在生产环境建议每台机器都不熟MySQL shell,MySQL router 单独搭一套高可用环境

准备阶段

# 在三台机器
vim /etc/hosts
# 新增配置
192.168.12.165 martin-05
192.168.12.166 martin-06
192.168.12.167 martin-07
# 安装好三台MySQL后,修改配置文件server-id 不一样
vim /data/mysql/conf/my.cnf
server-id = 12165
# 确认gtid开启,Binlog开启

# 新增参数

# LOGICAL_CLOCK 表示基于事务间的冲突关系来决定哪些事务可以并行执行,在MGR中建议设置为 LOGICAL_CLOCK
slave_parallel_type=LOGICAL_CLOCK
# 表示用于生成事务写集的哈希算法,XXHASH64 一种高新能的哈希算法
transaction_write_set_extraction=XXHASH64
# 表示二进制日志事务依赖跟踪的模式,WRITESET表示基于写集来跟踪
binlog_transaction_dependency_tracking=WRITESET

# 表示确保从服务上的事务与主服务器上的相同顺序来提交,在MGR中建议设置为1
slave_preserve_commit_order=l
# 表示要禁用哪些存储引擎,禁用一些不支持事务的存储引擎
disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
# 表示是否对有super权限的用户也禁止执行写操作,off不禁止,在MGR中建议设置为off
super-read-only=off

#组复制相关参数

# 服务器启动时是否自动启动组复制
group_replication_start_on_boot=off
# 当前实例用于组通信的本地地址,此配置三台机器要不一样
group_replication_local_address="martin-05:33061"
# 所有成员的地址
group_replication_group_seeds="martin-05:33061,martin-06:33061,martin-07:33061"
# on 表示以这台服务器来引导这个组,只能在一台服务器设置为on,一般建议设置为off
group_replication_bootstrap_group=off

#Plugin

# 表示增加插件
plugin-load-add="mysql_clone.so;group_replication.so"
clone=FORCE_PLUS_PERMANENT

# 重启
/etc/init.d/mysql.server start

选择版本和系统
MySQL Shell的官网下载链接

# 在第三台机器安装MySQL Shell,可以安装和管理MGR
cd /usr/src/
wget xxxxxxxx
yum install mysql-shell-8.0.25-1.el7.x86_64.rpm -y

# 测试是否安装成功
mysqlsh --version

安装阶段

# 在每台机器的mysql内创建用户和权限
create user 'mgr_user'@'%' identified by '123456';

GRANT CLONE_ADMIN, CONNECTION_ADMIN, CREATE USER, EXECUTE, FILE, GROUP_REPLICATION_ADMIN, PERSIST_RO_VARIABLES_ADMIN, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, REPLICATION_APPLIER, REPLICATION_SLAVE_ADMIN, ROLE_ADMIN, SELECT, SHUTDOWN, SYSTEM_VARIABLES_ADMIN ON *.* TO 'mgr_user'@'%' WITH GRANT OPTION;

GRANT DELETE, INSERT, UPDATE ON mysql.* TO 'mgr_user'@'%' WITH GRANT OPTION;

GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata.* TO 'mgr_user'@'%' WITH GRANT OPTION;

GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_bkp.* TO 'mgr_user'@'%' WITH GRANT OPTION;

GRANT ALTER, ALTER ROUTINE, CREATE, CREATE ROUTINE, CREATE TEMPORARY TABLES, CREATE VIEW, DELETE, DROP, EVENT, EXECUTE, INDEX, INSERT, LOCK TABLES, REFERENCES, SHOW VIEW, TRIGGER, UPDATE ON mysql_innodb_cluster_metadata_previous.* TO 'mgr_user'@'%' WITH GRANT OPTION;
# 在第一台机器
# -h192.168.12.165 这一台机器的ip地址
mysqlsh -umgr_user -p'123456' -h192.168.12.165

# 创建集群, Cluster01集群名字
dba.createCluster('Cluster01')
# 退出重新登陆
mysqlsh -umgr_user -p'123456' -h192.168.12.165
# 执行
var cluster = dba.getCluster('Cluster01');
cluster.addInstance('mgr_user@192.168.12.166:3306')
# 输入C

# 更新集群内元数据信息
cluster.rescan()
# 输入y

# 查看集群信息
cluster.status()


# 加入第二台MySQL
cluster.addInstance('mgr_user@192.168.12.167:3306')
# 输入C

# 更新集群内元数据信息
cluster.rescan()
# 输入y

# 查看集群信息
cluster.status()

测试阶段

选择版本和系统
MySQL Router的官网下载链接

 wget xxx
 yum install mysql-router-ccommunity-8.0.25-l.el.x86_64.rpm -y
mkdir /data/mysqlroute
mysqlrouter -B mgr_user@192.168.12.165:3306 --directory=/data/mysqlroute -u root --force
/data/mysqlroute/start.sh

# 测试 ,-P6446 读写端口,-P6447读端口
mysql -umgr_user -p'123456' -P6446 -h192.168.12.165 -e "select @@hostname"
mysql -umgr_user -p'123456' -P6447 -h192.168.12.165 -e "select @@hostname"

InnoDB Cluster管理命令

mysqlsh -umgr_user -p'123456' -h192.168.12.165
# 定义集群变量
var cluster = dba.getCluster('Cluster01')
cluster.status()
cluster.describe();
cluster.options()
cluster.status()
cluster.removeInstance('mgr_user@martin-07:3306')
cluster.status()
# 增加成员
cluster.addInstance('mgr_user@martin-07:3306')
cluster.status()
cluster.setPrimaryInstance('martin-07:3306')
cluster.status()
# 在随便每个MySQL实例执行
select * from performance_schema.replication_group_member_stats;
# 登录到具体的节点上
stop group_replication;

# 再回到MySQL Shell查看集群状态
cluster.status()
start group_replication;
# 再回到MySQL Shell查看集群状态
cluster.status()
cluster.switchToMultiPrimaryMode()
cluster.switchToSinglePrimaryMode('martin-05:3306')
cluster.status()
# 在随便一个MySQL实例执行
select * from performance_schema.replication_group_members;
cluster.listRouters()

InnoDB Cluster高可用测试

  1. 编辑并允许数据写入脚本
  2. 查看集群状态
  3. 停掉primary节点
  4. 启动关闭的节点
  5. 关闭primary节点所在的机器
  6. 启动关闭的机器

MGR事务同步原理

  1. 事务执行
  2. 提交和二进制日志写入
  3. 事务打包和发送
  4. 全局排序和冲突检测
  5. 各节点确认
  6. 异步应用
  7. 完成事务
  1. write set计算与冲突检测
  2. 检查事务执行过程中的GTID
  3. GTID集合比较
  4. 提交事务
group_replication_consistency的配置 对应的一致性级别
EVENTUAL 事务提交后会广播到集群的多数节点,然后节点检查是否有冲突,如果没有冲突,则事务在本地提交,其他节点异步处理,可能导致读取到稍旧的数据
BEFORE_ON_PRIMARY_FAILOVER 在主节点故障时,必须等待新主处理完待处理的事务,才能开始响应业务的读写请求,这样可以保证业务读写请求不会读取到旧数据
BEFORE 一个事务会等待之前的事务执行完后再开始执行,确保读取到的数据是最新的。
AFTER 写事务会等待其更改在所有其他节点应用后才提交,保证后续事务读取已写入或其他节点上最新值。对只读事务没有影响
BEFORE_AND_AFTER 会等待之前的事务执行完后才开始执行新事物,并等到事务在所有节点应用后才提交,确保读取和提交都具有强一致性。
  1. 在通常情况下,不建议设置为AFTER模式
  2. 选择BEFOR模式的场景
  3. 选择BEFORE_AND_AFTER模式的场景
  1. 查看当前会话的一致性级别
mysql -uroot -p
select @@session.group_replication_consistency;
  1. 修改当前会话的一致性级别
set @@session.group_replication_consistency='BEFORE';
  1. 修改全局的一致性级别
set @@global.group_replication_consistency='BEFORE';

MGR故障检测和选主算法

  1. 哪个节点运行的是最低的MySQL版本
  2. 哪个节点的权重最高
# 0 ~ 100
show global variables like "group_replication_member_weight"
  1. 哪个节点的UUID排序最靠前
  1. 可靠性优先
  2. 可用性优先
  3. 如何设置可靠性优先
show global variables like "group_replication_consistency";

MGR流控

  1. 平衡节点处理速度差异
  2. 维持数据一致性和避免冲突
  3. 避免节点超载和维持整体稳定性
  1. group_replication_flow_control_mode值设置为QUOTA
show global variables like "group_replication_flow_control_mode";
  1. 认证队列中等待的事务数超过group_replication_flow_control_certifier_threshold参数配置的值时
# 查看认证队列中等待的事务数
select member_id,count_transactions_in_queue from performance_schema.replication_group_member_stats;

show global variables like "group_replication_flow_control_certifier_threshold";
  1. 应用程序队列中等待的事务数超过group_replication_flow_control_applier_threshold参数配置的值时
# 查看应用程序队列中等待的事务数
select member_id,count_transactions_in_applier_queue from performance_schema.replication_group_member_stats;

show global variables like "group_replication_flow_control_applier_threshold";
上一篇 下一篇

猜你喜欢

热点阅读