站保站

服务市场
  • 网站市场
  • 单机游戏
  • 平台大厅
  • 转让市场
  • 发卡市场
  • 广告市场
  • 下载市场
  • 收录市场
  • 本站平台
    平台客服
    微信Q群



    平台微博/weibo    平台微信/公众号    平台抖音/快手   
    曝光台    保障    地图   
    上传资源 快速赚钱
    站保站    登录      |  注册  |  

    只需一步,快速开始!

     找回密码   |   协议
    热门搜索: 网站开发 App报毒 挖矿源码 代办资质

    PXC、MGR、MGC集群之新建、备份、恢复操作步骤

    • 时间:2019-09-09 17:00 编辑:老叶茶馆_ 来源: 阅读:2729
    • 扫一扫,手机访问
    摘要:

    导读
    作者:沃趣-罗小波
    概要:原文包含PXC、MGR、MGC集群之新建、备份、恢复操作步骤详解,因篇幅较长,本文仅节取MGR部分内容。
    若想了解完整文章,可至文末获取

    对于PXC、MGC、MGR三种MySQL的集群复制架构技术,其实在更早之前,我做过一个视频版的 "PXC、MGC & MGR 原理与实践对比" 系列课程,但有部分同学觉得里边的内容缺少详细操作步骤。所以,今天我就将PXC、MGR、MGC集群之新建、备份、恢复操作的详细步骤整理出来分享给大家,希望能帮助大家更好地玩耍PXC、MGC、MGR


    一、原文目录

    1、PXC1.1. 集群初始化1.1.1. 第一个节点(init)1.1.2. 第二个节点(sst)1.1.3. 第三个节点(backup recovery)1.2. 集群新增节点1.2.1. 使用备份集恢复1.2.2. 全量SST加入集群1.3. 单节点crash的恢复1.4. 多数节点crash的恢复1.4.1. crash节点数据未丢失且可以原地恢复1.4.2. crash节点数据丢失1.5. 整个集群crash的恢复1.5.1. 使用备份恢复1.5.2. 使用crash节点的datadir数据卷进行恢复2、MGC3、MGR   3.1. 集群初始化     3.1.1. 第一个节点(init)3.1.2. 第二个节点(全量复制)3.1.3. 第三个节点(backup recovery)   3.2. 集群新增节点3.2.1. 使用备份集恢复3.2.2. 全量复制加入集群   3.3. 单节点crash的恢复   3.4. 多数节点crash的恢复3.4.1. crash节点数据未丢失且可以原地恢复3.4.2. crash节点数据丢失   3.5. 整个集群crash的恢复3.5.1. 使用备份恢复3.5.2. 使用crash节点的datadir数据卷进行恢复


    二、背景说明
    服务器环境
    • kvm ip:10.10.30.162/163/164
    • CPU:8 vcpus
    • 内存:16G
    • 磁盘:data 100G flash卡,binlog 100G flash卡

    数据库版本
    • MGC:MariaDB 10.2.12
    • MGR:MySQL 5.7.21
    • PXC:Percona-Xtradb-Cluster 5.7.21

    sysbench版本
    • sysbench 1.0.7
    • 造数量:8个表,单表500W数据量

    PS
    • PXC:为Percona Xtradb Cluster的缩写
    • MGR:为MySQL Group Replication的缩写
    • MGC:为MariaDB Galera Cluster的缩写



    三、原文节选:

    3、MGR

    3.1. 集群初始化

    3.1.1. 第一个节点(init)
    • 数据库初始化(略)

    • 关键配置

    1. server_id=3306162
    2. sync_binlog=10000
    3. innodb_flush_log_at_trx_commit = 2
    4. binlog-checksum=NONE
    5. innodb_support_xa=OFF
    6. auto_increment_increment=3
    7. auto_increment_offset=1
    8. binlog_row_image=full
    9. transaction-write-set-extraction=XXHASH64
    10. loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    11. loose-group_replication_single_primary_mode=OFF
    12. loose-group_replication_enforce_update_everywhere_checks=ON
    13. loose-group_replication_start_on_boot=on
    14. loose-group_replication_ip_whitelist='0.0.0.0/0'
    15. loose-group_replication_local_address='10.10.30.162:24901'
    16. loose-group_replication_group_seeds='10.10.30.162:24901,10.10.30.163:24901,10.10.30.164:24901'
    17. loose-group_replication_bootstrap_group=OFF
    18. report_host='node1'
    • 配置hosts解析记录(有DNS即系服务的环境无需配置)

    1. [root@localhost ~]# cat /etc/hosts                                                                                                                                                                                            
    2. ......
    3. 10.10.30.162 node1 mysql1
    4. 10.10.30.163 node2 mysql2
    5. 10.10.30.164 node3 mysql3
    • 启动节点(非集群方式)

    mysqld_safe --defaults-file=/etc/my.cnf &
    
    • 创建复制和备份用户

    1. SET SQL_LOG_BIN=0;
    2. CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'xtrabackuppass';
    3. GRANT SELECT, LOCK TABLES, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD, CREATE TABLESPACE, PROCESS ON *.* TO 'xtrabackup'@'localhost';
    4. grant DROP, CREATE, INSERT on mysql.ibbackup_binlog_marker to  'xtrabackup'@'localhost';
    5. CREATE USER repl@'%' IDENTIFIED BY 'password';
    6. GRANT REPLICATION SLAVE ON *.* TO repl@'%' ;
    7. SET SQL_LOG_BIN=1;
    8. FLUSH PRIVILEGES; 
    • 安装插件并配置group replication

    1. INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    2. CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
    3. FLUSH PRIVILEGES ;
    • 启动集群组复制插件

    1. set global group_replication_bootstrap_group=ON;
    2. start group_replication;
    3. set global group_replication_bootstrap_group=OFF;
    • 检查集群组复制节点状态

    1. #查看状态是否为online
    2. root@localhost : (none) 03:39:20> SELECT * FROM performance_schema.replication_group_members;
    3. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    4. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    5. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    6. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | ONLINE      |
    7. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    8. 1 row in set (0.00 sec)

    PS:MGR更多的配置参数参考模板链接如下:

    https://github.com/Percona-Lab/percona-docker/blob/master/pgr-57/node.cnf

    3.1.2. 第二个节点(全量复制)
    • 数据库初始化(略)

    • 关键配置

    1. server_id=3306163
    2. sync_binlog=10000
    3. innodb_flush_log_at_trx_commit = 2
    4. innodb_support_xa=OFF
    5. binlog-checksum=NONE
    6. auto_increment_increment=3
    7. auto_increment_offset=2
    8. binlog_row_image=full
    9. transaction-write-set-extraction=XXHASH64
    10. loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    11. loose-group_replication_single_primary_mode=OFF
    12. loose-group_replication_enforce_update_everywhere_checks=ON
    13. loose-group_replication_start_on_boot=on
    14. loose-group_replication_ip_whitelist='0.0.0.0/0'
    15. loose-group_replication_local_address='10.10.30.163:24901'
    16. loose-group_replication_group_seeds='10.10.30.162:24901,10.10.30.163:24901,10.10.30.164:24901'
    17. loose-group_replication_bootstrap_group=OFF
    18. report_host='node2'
    • 配置hosts解析记录(有DNS即系服务的环境无需配置)

    1. [root@localhost ~]# cat /etc/hosts                                                                                                                                                                                            
    2. ......
    3. 10.10.30.162 node1 mysql1
    4. 10.10.30.163 node2 mysql2
    5. 10.10.30.164 node3 mysql3
    • 启动节点(非集群方式)

    mysqld_safe --defaults-file=/etc/my.cnf &
    
    • 创建复制和备份用户

    1. SET SQL_LOG_BIN=0;
    2. CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'xtrabackuppass';
    3. GRANT SELECT, LOCK TABLES, SUPER, REPLICATION CLIENT, REPLICATION SLAVE, RELOAD, CREATE TABLESPACE, PROCESS ON *.* TO 'xtrabackup'@'localhost';
    4. grant DROP, CREATE, INSERT on mysql.ibbackup_binlog_marker to  'xtrabackup'@'localhost';
    5. CREATE USER repl@'%' IDENTIFIED BY 'password';
    6. GRANT REPLICATION SLAVE ON *.* TO repl@'%' ;
    7. SET SQL_LOG_BIN=1;
    8. FLUSH PRIVILEGES; 
    • 安装插件并配置group replication

    1. INSTALL PLUGIN group_replication SONAME 'group_replication.so';
    2. CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
    3. FLUSH PRIVILEGES ;
    • 启动集群组复制插件

    1. reset master;
    2. start group_replication;
    • 检查集群组复制节点状态

    1. #查看状态是否为online
    2. root@localhost : (none) 03:45:24> SELECT * FROM performance_schema.replication_group_members;
    3. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    4. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    5. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    6. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | ONLINE      |
    7. | group_replication_applier | f64f9fb6-2da4-11e8-96bd-525400c33752 | node2      |        3306 | ONLINE      |
    8. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    9. 2 rows in set (0.00 sec)
    • 查看节点复制延迟与应用情况

    1. root@localhost : (none) 06:48:32> select * from performance_schema.replication_group_member_stats where MEMBER_ID=@@server_uuid\G;
    2. *************************** 1. row ***************************
    3.                       CHANNEL_NAME: group_replication_applier
    4.                           VIEW_ID15218000786938271:11
    5.                         MEMBER_ID0a1e8349-2e87-11e8-8c9f-525400bdd1f2
    6.       COUNT_TRANSACTIONS_IN_QUEUE287640 # 该字段显示当前接收到的relay log与当前应用到的relay log之间的事务差异
    7.         COUNT_TRANSACTIONS_CHECKED0
    8.           COUNT_CONFLICTS_DETECTED0
    9. COUNT_TRANSACTIONS_ROWS_VALIDATING0
    10. TRANSACTIONS_COMMITTED_ALL_MEMBERS2d623f55-2111-11e8-9cc3-0025905b06da:1-2,
    11. aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-13779 # 该字段显示当前节点应用到的日志对应的GTID
    12.     LAST_CONFLICT_FREE_TRANSACTION
    13. 1 row in set (0.02 sec)
    • PS:该方式必须保证集群中已有节点的binlog未执行过清理,一旦有清理,新加节点无法通过全量binlog复制来加入集群

    3.1.3. 第三个节点(backup recovery)
    • 首先,使用sysbench制造一些测试数据,然后,使用sysbench持续对集群发起oltp压力

    1. # 创建数据库
    2. root@localhost : (none) 01:44:33> create database sbtest;
    3. Query OK, 1 row affected (0.00 sec)
    4. # 使用sysbench造数
    5. sysbench --db-driver=mysql --time=180 --threads=8 --report-interval=1 --mysql-socket=/home/mysql/data/mysqldata1/sock/mysql.sock --mysql-port=3306 --mysql-user=qbench --mysql-password=qbench --mysql-db=sbtest --tables=8 --table-size=5000000 oltp_read_write --db-ps-mode=disable prepare
    6. # 使用sysbench加压
    7. sysbench --db-driver=mysql --time=99999 --threads=8 --report-interval=1 --mysql-socket=/home/mysql/data/mysqldata1/sock/mysql.sock --mysql-port=3306 --mysql-user=qbench --mysql-password=qbench --mysql-db=sbtest --tables=8 --table-size=5000000 oltp_read_write --db-ps-mode=disable run
    • 关键配置

    1. server_id=3306164
    2. sync_binlog=10000
    3. innodb_flush_log_at_trx_commit = 2
    4. innodb_support_xa=OFF
    5. binlog-checksum=NONE
    6. auto_increment_increment=3
    7. auto_increment_offset=3
    8. binlog_row_image=full
    9. transaction-write-set-extraction=XXHASH64
    10. loose-group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
    11. loose-group_replication_single_primary_mode=OFF
    12. loose-group_replication_enforce_update_everywhere_checks=ON
    13. loose-group_replication_start_on_boot=on
    14. loose-group_replication_ip_whitelist='0.0.0.0/0'
    15. loose-group_replication_local_address='10.10.30.164:24901'
    16. loose-group_replication_group_seeds='10.10.30.162:24901,10.10.30.163:24901,10.10.30.164:24901'
    17. loose-group_replication_bootstrap_group=OFF
    18. report_host='node3'
    • 配置hosts解析记录(有DNS即系服务的环境无需配置)

    1. [root@localhost ~]# cat /etc/hosts                                                                                                                                                                                            
    2. ......
    3. 10.10.30.162 node1 mysql1
    4. 10.10.30.163 node2 mysql2
    5. 10.10.30.164 node3 mysql3
    • 在第二个节点上进行备份,并把备份传输到第三个节点上

    1. innobackupex --defaults-file=/etc/my.cnf --slave-info  \
    2. --user=xtrabackup --password=xtrabackuppass --no-timestamp \
    3. --stream=tar ./ | ssh root@10.10.30.164 "cat - > /archive/backup/backup_`date +%Y%m%d`.tar"
    • 使用备份进行恢复

    1. # innobackupex执行apply-log并move-back备份数据到datadir下
    2. [root@localhost backup]# tar xvf backup_20180322.tar
    3. [root@localhost backup]# innobackupex --apply-log ./
    4. [root@localhost backup]# rm -rf /data/mysqldata1/{undo,innodb_ts,innodb_log,mydata,binlog,relaylog,binlog,slowlog,tmpdir}/*
    5. [root@localhost backup]# innobackupex --defaults-file=/etc/my.cnf --move-back ./
    6. ......
    • 正常启动节点

    1. chown mysql.mysql /data -R
    2. mysqld_safe --defaults-file=/etc/my.cnf --loose-group_replication_start_on_boot=off &
    • 查看备份文件中GTID位置

    1. [root@localhost backup]# cat xtrabackup_binlog_info 
    2. mysql-bin.000147        103011527      2d623f55-2111-11e8-9cc3-0025905b06da:1-3,
    3. aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-87512845
    • 登录数据库,执行重设gtid,并重新拉起group replication

    1. root@localhost : (none) 01:38:35> reset master;
    2. Query OK, 0 rows affected (0.02 sec)
    3. root@localhost : (none) 01:39:25> set global gtid_purged='2d623f55-2111-11e8-9cc3-0025905b06da:1-3,aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-87512845';
    4. Query OK, 0 rows affected (0.00 sec)
    5. root@localhost : (none) 01:39:53> set global group_replication_start_on_boot=on;
    6. Query OK, 0 rows affected (0.00 sec)
    7. root@localhost : (none) 01:40:59> start group_replication;
    8. Query OK, 0 rows affected (2.66 sec)
    • 检查集群组复制节点状态

    1. #查看状态是否为online,
    2. root@localhost : (none) 11:16:52> SELECT * FROM performance_schema.replication_group_members;
    3. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    4. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    5. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    6. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | ONLINE      |
    7. | group_replication_applier | 859b114c-2e48-11e8-9eac-525400bdd1f2 | node3      |        3306 | RECOVERING  |
    8. | group_replication_applier | f64f9fb6-2da4-11e8-96bd-525400c33752 | node2      |        3306 | ONLINE      |
    9. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    10. 3 rows in set (0.00 sec)
    11. ......
    12. root@localhost : (none) 01:43:23> select * from performance_schema.replication_group_members;
    13. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    14. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    15. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    16. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | ONLINE      |
    17. | group_replication_applier | 62392979-2e5c-11e8-a389-525400bdd1f2 | node3      |        3306 | ONLINE      |
    18. | group_replication_applier | f64f9fb6-2da4-11e8-96bd-525400c33752 | node2      |        3306 | ONLINE      |
    19. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    20. 3 rows in set (0.00 sec)

    PS:如果是快照拷贝的数据,需要删除datadir/auto.cnf文件

    3.2. 集群新增节点

    3.2.1. 使用备份集恢复
    • 无备份时的qps曲线图
    640?wx_fmt=jpeg

    • 有备份时的qps曲线图
    640?wx_fmt=jpeg

    PS:
    由于在多线程复制下,使用xtrabackup备份读节点高概率会导致发生锁死现象(sysbench 128线程insert操作百分百重现),所以在MGR架构上的备份只能考虑在写节点上备份(备选方案1:在集群上挂一个主从架构的备库,使用xtrabackup的--safe-slave-backup选项在加锁前停止SQL线程来避免锁死现象。备选方案2:假定半夜写压力不高,轮询线程信息,发现备份线程锁请求被锁死时,主动登录数据库kill掉加锁线程并尝试重新备份),锁死现象如下
    640?wx_fmt=jpeg

    3.2.2. 全量复制加入集群
    • 参考3.1.2小节
    • 无新节点全量复制加入集群时的qps曲线图
    640?wx_fmt=jpeg

    • 有新节点全量复制加入集群时的qps曲线图
    640?wx_fmt=jpeg

    PS: 全量复制新加节点会触发流控,导致性能陡降,关闭流控性能可恢复到正常状态,但需要所有节点同时关闭才生效
    1. root@localhost : (none) 06:52:16> set global group_replication_flow_control_mode=DISABLED;
    2. Query OK, 0 rows affected (0.01 sec)

    3.3. 单节点crash的恢复

    做一些必要的检查之后,尝试直接以常规方式拉起节点,如果不能正常拉起或者crash节点数据丢失,则通过备份进行恢复(详细步骤参考3.1.3小节)。

    3.4. 多数节点crash的恢复

    两种方式(针对至少有一个节点的实例可登陆,且集群不可用的情况)
    • 如果crash节点能够原地恢复(带着crash之前的数据直接拉起实例),则集群可以正常恢复到可读写状态(即存活节点恢复到>=N/2+1个,且都正确重新加入到集群中)
    • 如果所有crash节点数据丢失,则无法重新加入集群,此时如果要恢复集群,需要在存活的节点上停止集群复制插件,使其脱离集群变为可读写状态,然后再恢复其他节点(使用xtrabackup备份存活节点数据做恢复)

    3.4.1. crash节点数据未丢失且可以原地恢复
    • 集群存活节点数<=N/2

    • 模拟多数节点crash(这里通过强杀第一和第二节点模拟)

    [root@localhost ~]# ssh 10.10.30.162 "killall -9 mysqld mysqld_safe 2> /dev/null &";ssh 10.10.30.163 "killall -9 mysqld mysqld_safe &> /dev/null &";
    
    • 登录第三节点查看集群状态

    1. # 查看集群成员状态
    2. root@localhost : (none) 10:15:09> select * from performance_schema.replication_group_members;
    3. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    4. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    5. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    6. | group_replication_applier | 0a1e8349-2e87-11e8-8c9f-525400bdd1f2 | node3      |        3306 | ONLINE      |
    7. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | UNREACHABLE  |
    8. | group_replication_applier | 506759a9-2e83-11e8-b454-525400c33752 | node2      |        3306 | UNREACHABLE  |
    9. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    10. 3 rows in set (0.00 sec)
    11. # 尝试读写操作
    12. ## 读操作
    13. root@localhost : (none) 10:15:10> use sbtest
    14. Database changed
    15. root@localhost : sbtest 10:15:52> select * from sbtest1 limit 1;
    16. +----+---------+----------------------------------------------------------------------+-------------------------------------------------------------+
    17. | id | k      | c                                                                                                                      | pad                                                        |
    18. +----+---------+-----------------------------------------------------------------------+-------------------------------------------------------------+
    19. |  1 | 2507307 | 68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441 | 22195207048-70116052123-74140395089-76317954521-98694025897 |
    20. +----+---------+------------------------------------------------------------------------+-------------------------------------------------------------+
    21. 1 row in set (0.01 sec)
    22. ## 写操作
    23. root@localhost : sbtest 10:25:43delete from sbtest1 where id=1;  # 写操作被阻塞!!不是报错
    24. ......
    • 另起一个mysql客户端,登录第三个节点实例中停止组复制插件

    1. # 存活节点停止组复制插件
    2. root@localhost : (none) 11:51:15> stop group_replication;
    3. Query OK, 0 rows affected (1 min 27.08 sec)
    4. root@localhost : sbtest 11:52:10> set global read_only=1;set global super_read_only=1;
    5. Query OK, 0 rows affected (0.00 sec)
    6. Query OK, 0 rows affected (0.00 sec)
    7. # 可以看到未提交事务被回滚
    8. root@localhost : sbtest 11:29:02delete from sbtest1 where id=1;
    9. ......
    10. ERROR 3101 (HY000): Plugin instructed the server to rollback the current transaction.
    • 第三个节点(存活节点)重新启动组复制插件

    1. root@localhost : (none) 12:30:20> set global group_replication_bootstrap_group=ON;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@localhost : (none) 12:33:25> start group_replication;
    4. Query OK, 0 rows affected (2.04 sec)
    5. root@localhost : (none) 12:33:29> set global group_replication_bootstrap_group=ON;
    6. Query OK, 0 rows affected (0.00 sec)
    7. root@localhost : sbtest 12:28:31> set global read_only=0;set global super_read_only=0
    8. Query OK, 0 rows affected (0.00 sec)
    9. Query OK, 0 rows affected (0.00 sec)
    • 现在,直接拉起被强杀的两个节点

    mysqld_safe --defaults-file=/etc/my.cnf &
    
    • 查看集群状态

    1. # 其他两个节点的状态已经转为online
    2. root@localhost : (none) 12:35:07> SELECT * FROM performance_schema.replication_group_members;
    3. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    4. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    5. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    6. | group_replication_applier | 0a1e8349-2e87-11e8-8c9f-525400bdd1f2 | node3      |        3306 | ONLINE      |
    7. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | ONLINE      |
    8. | group_replication_applier | 506759a9-2e83-11e8-b454-525400c33752 | node2      |        3306 | ONLINE      |
    9. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    10. 3 rows in set (0.00 sec)

    PS:MGR中一旦出现多数节点crash,即使在datadir中数据未丢失也不能直接拉起crash节点(集群节点内的残留事务造成的数据冲突可能导致整个集群中所有节点的组复制插件异常停止),需要登录到存活节点先把集群复制插件停止,然后重新启动集群复制插件之后,再拉起crash节点

    3.4.2. crash节点数据丢失
    • 集群存活节点数<=N/2

    • 模拟多数节点crash且丢失数据(这里通过强杀第一和第二节点模拟)

    [root@localhost ~]# ssh 10.10.30.162 "killall -9 mysqld mysqld_safe 2> /dev/null &";ssh 10.10.30.163 "killall -9 mysqld mysqld_safe &> /dev/null &";
    
    • 登录第一和第二节点清空数据目录

    1. rm -rf /data/mysqldata1/{undo,innodb_ts,innodb_log,mydata,binlog,relaylog,binlog,slowlog,tmpdir}/*
    • 登录第三节点查看集群状态

    1. # 查看集群成员状态
    2. root@localhost : (none) 10:15:09> select * from performance_schema.replication_group_members;
    3. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    4. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    5. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    6. | group_replication_applier | 0a1e8349-2e87-11e8-8c9f-525400bdd1f2 | node3      |        3306 | ONLINE      |
    7. | group_replication_applier | 2d623f55-2111-11e8-9cc3-0025905b06da | node1      |        3306 | UNREACHABLE  |
    8. | group_replication_applier | 506759a9-2e83-11e8-b454-525400c33752 | node2      |        3306 | UNREACHABLE  |
    9. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    10. 3 rows in set (0.00 sec)
    11. # 尝试读写操作
    12. ## 读操作
    13. root@localhost : (none) 10:15:10> use sbtest
    14. Database changed
    15. root@localhost : sbtest 10:15:52> select * from sbtest1 limit 1;
    16. +----+---------+--------------------------------------------------------------------------------------------+-------------------------------------------------------------+
    17. | id | k      | c                                                                                                                      | pad                                                        |
    18. +----+---------+---------------------------------------------------------------------------------------------+-------------------------------------------------------------+
    19. |  1 | 2507307 | 68487932199-96439406143-93774651418-41631865787-96406072701-20604855487-25459966574-28203206787-41238978918-19503783441 | 22195207048-70116052123-74140395089-76317954521-98694025897 |
    20. +----+---------+-----------------------------------------------------------------------------------------------+-------------------------------------------------------------+
    21. 1 row in set (0.01 sec)
    22. ## 写操作
    23. root@localhost : sbtest 10:25:43delete from sbtest1 where id=1;  # 写操作被阻塞!!不是报错
    24. ......
    • 另起一个mysql客户端,登录第三个节点实例中停止组复制插件

    1. # 存活节点停止组复制插件
    2. root@localhost : (none) 11:51:15> stop group_replication;
    3. Query OK, 0 rows affected (1 min 27.08 sec)
    4. root@localhost : sbtest 11:52:10> set global read_only=1;set global super_read_only=1;
    5. Query OK, 0 rows affected (0.00 sec)
    6. Query OK, 0 rows affected (0.00 sec)
    • 第三个节点(存活节点)重新启动组复制插件

    1. root@localhost : (none) 12:30:20> set global group_replication_bootstrap_group=ON;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@localhost : (none) 12:33:25> start group_replication;
    4. Query OK, 0 rows affected (2.04 sec)
    5. root@localhost : (none) 12:33:29> set global group_replication_bootstrap_group=ON;
    6. Query OK, 0 rows affected (0.00 sec)
    7. root@localhost : sbtest 12:28:31> set global read_only=0;set global super_read_only=0
    8. Query OK, 0 rows affected (0.00 sec)
    9. Query OK, 0 rows affected (0.00 sec)
    • 现在,如果数据量不大,则可以在配置好my.cnf之后直接拉起实例,通过全量binlog复制加入集群(详细步骤可参考3.1.2小节),如果数据量较大,则使用xtrabackup备份方式恢复(详细步骤可参考3.1.3小节)

    PS:

    • MGR集群多数节点crash之后,剩下的节点可以对外提供读服务,但不可提供写服务,这与MGC、PXC不同(这两种集群多数节点crash之后,读写服务都不能提供)

    • MGR集群多数节点crash之后,剩下的节点如果接受到写请求,直接阻塞,而不是报错返回,需要客户端自行断开连接,且断开连接之后,在数据库中对应的事务处于COMMIT状态,不能跟随客户端断开而自行回滚,需要人工干预

    • 停止复制插件的方式使得节点脱离集群时,节点当前所有未提交事务会被强制回滚(MGR组复制插件可以stop xxx;start xxx;的方式重启,所以不需要像MGC、PXC那样必须重启实例来重启集群,也就不需要额外的备份操作了)

    3.5. 整个集群crash的恢复

    • 两种方式

    • 使用备份恢复

    • 使用crash节点的datadir数据卷进行恢复

    3.5.1. 使用备份恢复
    • 详细步骤参考3.1.3小节,第一个节点以集群方式启动,其他节点使用备份恢复数据之后直接拉起

    3.5.2. 使用crash节点的datadir数据卷进行恢复
    • 使用crash节点的datadir数据卷进行恢复需要保证至少有一个crash节点的物理机或kvm可访问(容器环境需要保证至少有一个crash节点对应的node可访问)

    • 下面使用sysbench对任意一个节点加压

    sysbench --db-driver=mysql --time=3600 --threads=128 --report-interval=1 --mysql-socket=/home/mysql/data/mysqldata1/sock/mysql.sock --mysql-port=3306 --mysql-user=qbench --mysql-password=qbench --mysql-db=sbtest --tables=8 --table-size=5000000 oltp_insert --db-ps-mode=disable run
    
    • 同时强杀所有节点的数据库进程(模拟所有节点同时crash)

    [root@localhost ~]# ssh 10.10.30.162 "killall -9 mysqld mysqld_safe 2> /dev/null &";ssh 10.10.30.163 "killall -9 mysqld mysqld_safe &> /dev/null &";ssh 10.10.30.164 "killall -9 mysqld mysqld_safe &> /dev/null &" 
    
    • 以非集群方式启动所有节点,并查看所有节点的GTID

    1. # 第一个节点
    2. [root@localhost binlog]# mysqld_safe --defaults-file=/etc/my.cnf --loose-group_replication_start_on_boot=off --super-read-only --read-only &
    3. root@localhost : (none) 05:18:00> show master status\G;
    4. *************************** 1. row ***************************
    5.             File: mysql-bin.000124
    6.         Position270
    7.     Binlog_Do_DB
    8. Binlog_Ignore_DB: 
    9. Executed_Gtid_Set: 0a1e8349-2e87-11e8-8c9f-525400bdd1f2:1-148826,
    10. 2d623f55-2111-11e8-9cc3-0025905b06da:1-2,
    11. aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-64879507
    12. 1 row in set (0.00 sec)
    13. # 第二个节点
    14. mysqld_safe --defaults-file=/etc/my.cnf --loose-group_replication_start_on_boot=off --super-read-only --read-only &
    15. root@localhost : (none) 05:21:04> show master status\G;
    16. *************************** 1. row ***************************
    17.             File: mysql-bin.000002
    18.         Position190
    19.     Binlog_Do_DB
    20. Binlog_Ignore_DB: 
    21. Executed_Gtid_Set: 0a1e8349-2e87-11e8-8c9f-525400bdd1f2:1-148826,
    22. 2d623f55-2111-11e8-9cc3-0025905b06da:1-2,
    23. aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-64864065
    24. 1 row in set (0.00 sec)
    25. ......
    26. # 第三个节点
    27. mysqld_safe --defaults-file=/etc/my.cnf --loose-group_replication_start_on_boot=off --super-read-only --read-only &
    28. root@localhost : (none) 05:21:43> show master status\G;
    29. *************************** 1. row ***************************
    30.             File: mysql-bin.000004
    31.         Position190
    32.     Binlog_Do_DB
    33. Binlog_Ignore_DB: 
    34. Executed_Gtid_Set: 0a1e8349-2e87-11e8-8c9f-525400bdd1f2:1-148826,
    35. 2d623f55-2111-11e8-9cc3-0025905b06da:1-2,
    36. aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa:1-64869915
    37. 1 row in set (0.00 sec)
    38. ......
    • 从上述信息中,可以看到第一个节点的GTID最大(注意这里主要看集群的UUID对应的GTID,而不是节点的UUID对应的GTID号),事务号为64879507,下面在第一个节点中,拉起组复制集群,并开放对外提供读写服务

    1. root@localhost : (none) 12:30:20> set global group_replication_bootstrap_group=ON;
    2. Query OK, 0 rows affected (0.00 sec)
    3. root@localhost : (none) 12:33:25> start group_replication;
    4. Query OK, 0 rows affected (2.04 sec)
    5. root@localhost : (none) 12:33:29> set global group_replication_bootstrap_group=ON;
    6. Query OK, 0 rows affected (0.00 sec)
    7. root@localhost : (none) 05:27:03> select * from performance_schema.replication_group_members where MEMBER_ID=@@server_uuid;
    8. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    9. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    10. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    11. | group_replication_applier | 0a1e8349-2e87-11e8-8c9f-525400bdd1f2 | node1       |        3306 | ONLINE      |
    12. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    13. 1 row in set (0.00 sec)
    14. root@localhost : sbtest 12:28:31> set global read_only=0;set global super_read_only=0
    15. Query OK, 0 rows affected (0.00 sec)
    • 其他节点加入集群,并对外提供读写服务

    1. root@localhost : (none) 12:33:25> start group_replication;
    2. Query OK, 0 rows affected (2.04 sec)
    3. root@localhost : (none) 05:29:06> select * from performance_schema.replication_group_members where MEMBER_ID=@@server_uuid;
    4. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    5. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    6. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    7. | group_replication_applier | 5d78a458-30d2-11e8-a66f-5254002a54f2 | node2       |        3306 | RECOVERING  |
    8. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    9. 1 row in set (0.00 sec)
    10. ......
    11. root@localhost : (none) 05:30:12> select * from performance_schema.replication_group_members where MEMBER_ID=@@server_uuid;
    12. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    13. | CHANNEL_NAME              | MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |
    14. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    15. | group_replication_applier | 19f71b6a-30d3-11e8-a724-525400c33752 | node2      |        3306 | ONLINE      |
    16. +---------------------------+--------------------------------------+-------------+-------------+--------------+
    17. 1 row in set (0.00 sec)
    18. # 等待集群状态为online之后,开放对外读写服务
    19. root@localhost : sbtest 12:28:31> set global read_only=0;set global super_read_only=0
    20. Query OK, 0 rows affected (0.00 sec)

    写在最后,小编已经把本文完整版与波老师上一篇《MariaDB Galera Cluster(MGC/PXC)重要参数、状态解读大全》两本电子书整理到一起,有兴趣的同学可以扫下方二维码联系助教获取

    640?wx_fmt=png

    扫码添加助教
    640?wx_fmt=png

    END


    640?wx_fmt=png
    640?wx_fmt=png

    640?wx_fmt=gif

    640?wx_fmt=gif

    扫码加入MySQL技术Q群
    (群号:529671799)
       
    640?wx_fmt=jpeg



    640?wx_fmt=png
    戳“阅读原文”了解MGR精品课

    • 全部评论(0)
    • 最新

    信息加载中,请等待

    微信客服(速回)

    微信客服(慢回)



    企业微信客服二维码
    联系我们
    平台客服: 平台QQ客服

    平台电话:400电话迁移中!

    平台邮箱:28292383@qq.com

    工作时间:周一至周五:早10:00 晚:18:00

    营业执照     网站ICP备案:鲁ICP备20027607号-1     鲁公网安备:37068702000078号     增值电信业务经营许可证、在线数据与交易处理业务许可证:鲁B2-20200681      © 2016-2024 站保站  https://www.zhanbaozhan.com/ 版权所有!      平台规范:   关于我们   广告合作   隐私条款   免责声明   法律声明   服务条款   网站地图   平台工单!