美文网首页DBA数据库学习
DBA数据库笔记之(十一)MySQL高可用方案之InnoDB C

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

作者: Mr培 | 来源:发表于2024-01-25 14:50 被阅读0次

    详解InnoDB Cluster

    • InnoDB Cluster组件介绍


      InnoDB Cluster组件介绍.jpg
    • MGR的两种模式

    1. 单主模式

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

    1. 多主模式

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

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


      MGR与传统复制的区别.jpg

    InnoDB Cluster部署

    • 部署的架构介绍


      部署的架构介绍.jpg

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

    准备阶段

    • 修改hosts
    # 在三台机器
    vim /etc/hosts
    # 新增配置
    192.168.12.165 martin-05
    192.168.12.166 martin-06
    192.168.12.167 martin-07
    
    • 安装MySQL并修改配置
    # 安装好三台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的官网下载链接

    # 在第三台机器安装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;
    
    • 用MySQL Shell创建MGR集群
    # 在第一台机器
    # -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安装

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

     wget xxx
     yum install mysql-router-ccommunity-8.0.25-l.el.x86_64.rpm -y
    
    • 生成Router配置文件
    mkdir /data/mysqlroute
    mysqlrouter -B mgr_user@192.168.12.165:3306 --directory=/data/mysqlroute -u root --force
    
    • 启动MySQL Router并测试
    /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;
    
    • 列出和集群相关的Router实例
    cluster.listRouters()
    

    InnoDB Cluster高可用测试

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

    MGR事务同步原理

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

    MGR故障检测和选主算法

    • MGR故障检测


      MGR故障检测.jpg
    • MGR选主算法

    1. 哪个节点运行的是最低的MySQL版本
    2. 哪个节点的权重最高
    # 0 ~ 100
    show global variables like "group_replication_member_weight"
    
    1. 哪个节点的UUID排序最靠前
    • MGR故障转移
    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";
    

    相关文章

      网友评论

        本文标题:DBA数据库笔记之(十一)MySQL高可用方案之InnoDB C

        本文链接:https://www.haomeiwen.com/subject/mqdvodtx.html