IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    《叶问》38期,MGR整个集群挂掉后,如何才能自动选主,不用手动干预

    叶金荣发表于 2021-11-28 10:10:45
    love 0

    当集群中所有节点都宕机后,集群再次启动后,能否自动选主

    1、MGR集群所有节点都宕机后,集群重启,能否自动选主和启动MGR服务 这是个来自群友的问题。

    首先,MySQL服务利用 systemd 即可实现故障后自启动,注意下面这个配置即可:

    [root@GreatSQL ~]# cat /usr/lib/systemd/system/greatsql.service
    ...
    Restart=on-failure
    

    其次,mysqld进程启动后,想要实现MGR的自动选主及自启动也是可以的,利用MySQL Shell即可,例如:

    [root@GreatSQL ~]# mysqlsh --uri greatsql@yejr-mgr3:3306
    ...
    -- 不管干啥,都先看 help,这是玩转Linux的必备素养,啥事不清楚都先找男人(man)
    -- 注意到有这样的一个方法 rebootClusterFromCompleteOutage(),看起来没跑了
    
    
    
    MySQL  yejr-mgr3:3306 ssl  JS > \help dba
          rebootClusterFromCompleteOutage([clusterName][, options])
                Brings a cluster back ONLINE when all members are OFFLINE.
    
    -- 跑一个试试看
    MySQL  yejr-mgr3:3306 ssl  JS > dba.rebootClusterFromCompleteOutage()
    Restoring the default cluster from complete outage...
    
    The instance 'yejr-mgr4:3306' was part of the cluster configuration.
    Would you like to rejoin it to the cluster? [y/N]: y
    
    The instance 'yejr-mgr2:3306' was part of the cluster configuration.
    Would you like to rejoin it to the cluster? [y/N]: y
    
    Dba.rebootClusterFromCompleteOutage: The active session instance (yejr-mgr3:3306) isn't the most updated in comparison with the ONLINE instances of the Cluster's metadata. Please use the most up to date instance: 'yejr-mgr4:3306'. (RuntimeError)
    

    可以看到错误信息提示我们当前节点上没有最新的数据,不能直接启动MGR,错误信息中还提供了该去哪个节点启动的建议,所以我们改成在 yejr-mgr4 节点上执行拉起MGR:

    [root@GreatSQL ~]# mysqlsh --uri greatsql@yejr-mgr3:3306
    ...
    MySQL  yejr-mgr4:3306 ssl  JS > dba.rebootClusterFromCompleteOutage()
    Restoring the default cluster from complete outage...
    
    The instance 'yejr-mgr3:3306' was part of the cluster configuration.
    Would you like to rejoin it to the cluster? [y/N]: y
    
    The instance 'yejr-mgr2:3306' was part of the cluster configuration.
    Would you like to rejoin it to the cluster? [y/N]: y
    
    yejr-mgr4:3306 was restored.
    Rejoining 'yejr-mgr3:3306' to the cluster.
    Rejoining instance 'yejr-mgr3:3306' to cluster 'GreatSQLMGR'...
    The instance 'yejr-mgr3:3306' was successfully rejoined to the cluster.
    
    Rejoining 'yejr-mgr2:3306' to the cluster.
    Rejoining instance 'yejr-mgr2:3306' to cluster 'GreatSQLMGR'...
    The instance 'yejr-mgr2:3306' was successfully rejoined to the cluster.
    
    The cluster was successfully rebooted.
    

    可以看到,MGR集群已经被正常启动了。

    上面是利用MySQL Shell启动一个发生过故障的MGR集群,如果是手动的话该怎么办呢?

    首先,在各个节点执行下面的SQL,确认各节点当前的事务执行情况:

    -- yejr-mgr2节点
    root@GreatSQL [none]> select RECEIVED_TRANSACTION_SET from performance_schema.replication_connection_status where 
    channel_name = 'group_replication_applier' union all 
    select variable_value from performance_schema.global_variables where 
    variable_name = 'gtid_executed'\G
    *************************** 1. row ***************************
    RECEIVED_TRANSACTION_SET:
    *************************** 2. row ***************************
    RECEIVED_TRANSACTION_SET: 1c293e90-3bdc-11ec-bca1-525400e2078a:1-4537605,
    4b7b3b88-3b13-11ec-86e9-525400e2078a:1
    
    -- yejr-mgr3节点
    ...
    *************************** 1. row ***************************
    RECEIVED_TRANSACTION_SET:
    *************************** 2. row ***************************
    RECEIVED_TRANSACTION_SET: 1c293e90-3bdc-11ec-bca1-525400e2078a:1-4542304,
    4b7b3b88-3b13-11ec-86e9-525400e2078a:1
    
    -- yejr-mgr4节点
    ...
    *************************** 1. row ***************************
    RECEIVED_TRANSACTION_SET:
    *************************** 2. row ***************************
    RECEIVED_TRANSACTION_SET: 1c293e90-3bdc-11ec-bca1-525400e2078a:1-4652391,
    4b7b3b88-3b13-11ec-86e9-525400e2078a:1
    

    从上面的结果可以看到,yejr-mgr4 节点上已执行完的事务GTID值最大:4652391 > 4542304 > 4537605,因此应该选择 yejr-mgr4 节点作为 Primary 节点。

    将该节点设置为引导模式,然后启动MGR服务:

    [root@GreatSQL ~]# mysql -hyejr-mgr4 -P3306 -ugreatsql -p
    ...
    greatsql@mgr4:3306 [(none)]>set global group_replication_bootstrap_group=ON;
    
    greatsql@mgr4:3306 [(none)]>start group_replication;
    
    -- 启动完MGR后,记得立即将其设置为OFF
    greatsql@mgr4:3306 [(none)]>set global group_replication_bootstrap_group=OFF;
    

    在其他节点上,则直接启动MGR服务即可,切记无需再次设置引导模式,否则它就会变成一个全新的MGR集群的Primary节点了。

    好了,自动、手动两种方式拉起一个故障MGR集群方法都介绍完毕了。

    2、MySQL Router可以在同一个系统环境下跑多实例吗 答案是确定的,可以。

    MySQL Router的手册中其实也已经有提到了:

    --directory dir_path, -d dir_path
    
    Specifies that a self-contained MySQL Router installation will be created at the defined directory instead of configuring the system-wide router instance. This also allows multiple router instances to be created on the same system.
    

    也就是说,如果想要让MySQL Router以多实例方式运行,可以通过指定 –directory 选项将其安装在各自不同目录下。

    例如下面这样:

    -- 针对4306端口的服务,初始化一个router实例
    -- 可自行指定目录、实例名、端口号等多个选项
    mysqlrouter --bootstrap mymgr@172.16.16.16:4306 --name=MyMGR --directory=/etc/mysqlrouter/MyMGR  --user=mysqlrouter --conf-base-port=7446 --https-port=9443
    

    初始化完成后,在每个实例相应的目录下,会有下列的文件:

    $path/start.sh
    $path/stop.sh
    $path/mysqlrouter.pid
    $path/mysqlrouter.conf
    $path/mysqlrouter.key
    $path/run
    $path/run/keyring
    $path/data
    $path/log
    $path/log/mysqlrouter.log
    

    可以看到还有 start.sh / stop.sh 这样的脚本,感觉有点土味啊,哈哈。

    接下来,我们要自行编辑systemd服务文件,把多个router实例管理起来,每个router实例对应一个文件:

    [root@yejr-mgr4 ~]# ls -l /usr/lib/systemd/system/mysqlrouter@*
    -rw-r--r-- 1 root root 312 Nov 11 14:13 /usr/lib/systemd/system/mysqlrouter@GrMGR.service
    -rw-r--r-- 1 root root 312 Nov 11 14:12 /usr/lib/systemd/system/mysqlrouter@MyMGR.service
    
    -- 查看其中一个文件的内容
    [root@yejr-mgr2 ~]# cat /usr/lib/systemd/system/mysqlrouter@GrMGR.service
    [Unit]
    Description=MySQL Router
    After=network.target
    After=syslog.target
    [Service]
    Type=notify
    User=mysqlrouter
    Group=mysqlrouter
    ExecStart=/usr/bin/mysqlrouter -c /etc/mysqlrouter/GrMGR/mysqlrouter.conf
    LimitNOFILE = 10000
    #Restart=on-failure
    Restart=always
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target
    

    在 ExecStart 这里自行指定每个实例对应的配置文件即可。

    这样就可以实现MySQL Router的单机多实例了。

    3、MySQL客户端pager怎么只显示”TRANSACTIONS”和”FILE I/O”中间的内容? 用下面这个就行了:

    pager cat - | sed -n "/^TRANSACTIONS$/,/^FILE I\/O$/p"
    是不是很简单?
    

    此外,可以再看下这两篇文章:

    MySQL使用tips, https://imysql.com/node/69

    秀下我的mysql客户端配置, https://imysql.com/2008_07_09_show_mysql_client_settings

    从dump文件中抽取部分库表, https://imysql.com/2010/06/01/mysql-faq-how-to-extract-data-from-dumpfile.html

    Enjoy GreatSQL :)

    您可能对下面这些文章也感兴趣:

    1. 在Ubuntu下编译安装GreatSQL 本次介绍如何利用Docker构建Ubuntu环境,并将GreatSQL源码编译成二进制文件。 1、准备工作 先 […]...
    2. 技术分享 | 利用GreatSQL部署MGR集群,并完成添加新节点 、滚动升级、切主(超详细) 一文快速掌握MGR集群的部署和运维。 本文详细介绍如何在单机环境下,利用GreatSQL构建一个3节点的MGR […]...
    3. 《叶问》34期,延迟从库加上MASTER_DELAY,主库宕机后如何快速恢复服务 当主库宕机后,延迟从库如何才能”取消”​主动延迟,以便恢复服务? 问题描述 本问题来自 […]...

    Powered by YARPP.



沪ICP备19023445号-2号
友情链接