暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 高可用方案--MGR 第02期:部署

1428

在前面的内容 MySQL 高可用方案--MGR 第01期:初探 中,我们聊了 MGR 与传统复制的区别、限制、应用场景等,这一节内容我们来聊聊 MGR 的部署。

1 架构介绍

首先来介绍一下本节内容的大致架构:
其中 MGR 三个节点分别在下面三台机器上(操作系统均为:CentOS 7.4):
  • node1:192.168.150.232。
  • node2:192.168.150.253。
  • node3:192.168.150.123。
MySQL Shell 和 MySQL Router 都部署在 node1 上。当然,如果是生产环境,官方建议 MySQL Router 和应用程序部署在相同机器上(详情可参考:https://dev.mysql.com/doc/mysql-shell/8.0/en/admin-api-deploy-router.html)。
MySQL Shell 用于部署和管理 MGR;MySQL Router 进行路由,当 MGR 内部发生切换时,MySQL Router 会自动识别。

2 基础环境准备

在 etc/hosts 文件中加入:
    192.168.150.232 node1
    192.168.150.253 node2
    192.168.150.123 node3
    三个节点安装 MySQL,MySQL 安装参考 Linux 安装 MySQL 8.0.25
    需要调整部分参数:
      [mysql]
      disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"
      server_id=1
      gtid_mode=ON
      enforce_gtid_consistency=ON
      log_bin=binlog
      log_slave_updates=ON
      binlog_format=ROW
      master_info_repository=TABLE
      relay_log_info_repository=TABLE
      transaction_write_set_extraction=XXHASH64
      binlog_transaction_dependency_tracking=WRITESET
      slave_parallel_type=LOGICAL_CLOCK
      slave_preserve_commit_order=1
      #组复制相关参数


      group_replication_start_on_boot=off
      group_replication_local_address= "node1:33061"
      group_replication_group_seeds= "node1:33061,node2:33061,node3:33061"
      group_replication_bootstrap_group=off


      #Plugin
      plugin-load-add="mysql_clone.so;group_replication.so"
      clone=FORCE_PLUS_PERMANENT
      这里解释一下上面部分参数的含义:
      • disabled_storage_engines,MGR 只支持 InnoDB 存储引擎,所以可以通过增加这个参数来禁用其他引擎。
      • server_id,三台机器配置不同的 server_id。
      • gtid_mode,必须启用 GTID。
      • enforce_gtid_consistency,服务器只允许执行安全的 GTID 语句来保证一致性。
      • binlog_transaction_dependency_tracking,控制事务依赖模式,MGR 中,需要设置为 WRITESET。
      • slave_parallel_type,需要设置为 LOGICAL_CLOCK。
      • slave_preserve_commit_order,需要设置为 1,表示并行事务的最终提交顺序与 Primary 提交的顺序保持一致,以保证数据一致性。
      • plugin_load_add,启动时加载插件。这里配置的是组复制的插件。
      • group_replication_group_name,告诉插件它要加入或创建的组名。group_replication_group_name 必须是合法的 UUID,可以使用 select UUID() 生成一个,这个 UUID 构成了 GTID 的一部分,当组成员从客户端接收事务时,以及组成员内部生成的视图更改事件被写入二进制日志时,使用 GTID。
      • group_replication_start_on_boot,设置为 off 会指示插件在服务器启动时不会自动启动操作。这在设置 Group Replication 时非常重要,因为它确保您可以在手动启动插件之前配置服务器。一旦配置了成员,就可以将 group_replication_start_on_boot 设置为 on,以便组复制在服务器启动时自动启动。 
      • group_replication_local_address,可以设置成员与组内其他成员进行内部通信时使用的网络地址和端口。Group Replication 将此地址用于涉及组通信引擎(XCom, Paxos的一种变体)的远程实例内部成员到成员之间的连接。group_replication_local_address 配置的网络地址必须是所有组成员都可以解析的。
      • group_replication_group_seeds,设置组成员的主机名和端口,新成员将使用这些成员建立到组的连接。
      • group_replication_bootstrap_group,指示插件是否引导该组,在本例中,即使s1是组的第一个成员,我们也在选项文件中将这个变量设置为 off。相反,我们在实例运行时配置 group_replication_bootstrap_group,以确保实际上只有一个成员引导组。
      • plugin-load-add,增加了 Clone Plugin,如果 MySQL 版本是 8.0.17 或更高的版本,则 MGR 在新增节点时,可以使用 Clone Plugin 来传输集群中已有的数据给新增节点。

      3 MySQL Shell 安装

      登录 https://downloads.mysql.com/archives/shell/,选择与 MySQL 对应的版本进行下载:


      安装 MySQL Shell:
        yum install mysql-shell-8.0.25-1.el7.x86_64.rpm -y

        4 创建集群用户

        在三个节点创建集群用户,语句如下:
          CREATE USER 'mgr_user'@'%' IDENTIFIED BY 'BgIka^123';


          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;


          5 用 MySQL Shell 创建 MGR

          通过 MySQL Shell 连接 node1 上的 MySQL:
            mysqlsh -umgr_user -p'BgIka^123' -h192.168.150.232

            进入MySQL Shell 之后,执行下面命令创建集群:
              var cluster = dba.createCluster('Cluster01')

              如果后续退出了 MySQL Shell,则可以用下面语句重新定义 cluster:
                var cluster = dba.getCluster('Cluster01')

                如果显示如下信息,则表示第一个节点配置成功:
                  A new InnoDB cluster will be created on instance '192.168.150.232:3306'.


                  Disabling super_read_only mode on instance 'node1:3306'.
                  Validating instance configuration at 192.168.150.232:3306...


                  This instance reports its own address as node1:3306


                  Instance configuration is suitable.
                  NOTE: Group Replication will communicate with other members using 'node1:33061'. Use the localAddress option to override.


                  Creating InnoDB cluster 'Cluster01' on 'node1:3306'...


                  Adding Seed Instance...
                  Cluster successfully created. Use Cluster.addInstance() to add MySQL instances.
                  At least 3 instances are needed for the cluster to be able to withstand up to
                  one server failure.

                  将第二个节点加入集群:
                    cluster.addInstance('mgr_user@192.168.150.253:3306')

                    最后一行表示新加入节点的数据同步方法,选择 C,表示使用 MySQL 的 Clone Plugin。可看到如下界面:


                    查看集群状态,执行:
                      cluster.status();


                      有时会在 instanceErrors 有一些提示,可按提示进行操作,比如:

                      则直接执行 cluster.rescan() 即可。该命令和更新集群元数据。

                      将第三个集群加入节点:
                        cluster.addInstance('mgr_user@192.168.150.123:3306')

                        执行 cluster.status() 查看集群状态:


                        6 MySQL Router 安装

                        https://downloads.mysql.com/archives/router/ 中选择与 MySQL 版本相同的 MySQL Router:


                        如果是用本节中“基础环境准备”的 MySQL 版本和操作系统,则直接执行下面命令下载 MySQL Router:
                          wget https://downloads.mysql.com/archives/get/p/41/file/mysql-router-community-8.0.25-1.el7.x86_64.rpm
                          yum install mysql-router-community-8.0.25-1.el7.x86_64.rpm -y

                          生成配置文件
                            mkdir /data/mysqlroute
                            mysqlrouter -B mgr_user@192.168.150.232:3306 --directory=/data/mysqlroute -u root --force

                            会有如下显示:
                              Please enter MySQL password for mgr_user: 
                              # Bootstrapping MySQL Router instance at '/data/mysqlroute'...


                              - Creating account(s) (only those that are needed, if any)
                              - Verifying account (using it to run SQL queries that would be run by Router)
                              - Storing account in keyring
                              - Adjusting permissions of generated files
                              - Creating configuration data/mysqlroute/mysqlrouter.conf


                              # MySQL Router configured for the InnoDB Cluster 'Cluster01'


                              After this MySQL Router has been started with the generated configuration


                              $ mysqlrouter -c data/mysqlroute/mysqlrouter.conf


                              the cluster 'Cluster01' can be reached by connecting to:


                              ## MySQL Classic protocol


                              - Read/Write Connections: localhost:6446
                              - Read/Only Connections: localhost:6447


                              ## MySQL X protocol


                              - Read/Write Connections: localhost:6448
                              - Read/Only Connections: localhost:6449

                              其中:
                              • 6446 为读写端口
                              • 6447 为只读端口
                              启动 MySQL Router:
                                /data/mysqlroute/start.sh

                                我们再来测试一下。
                                通过读写端口登录 MySQL Router,执行 select @@hostname:
                                  mysql -umgr_user -p'BgIka^123' -P6446 -h192.168.150.232 -e "select @@hostname"
                                  结果如下:
                                    mysql> select @@hostname;
                                    +------------+
                                    | @@hostname |
                                    +------------+
                                    | node1 |
                                    +------------+
                                    1 row in set (0.00 sec)
                                    发现是路由到 node1。

                                    多次通过只读端口登录 MySQL Router:

                                    发现新建的连接会在 node2 和 node3 两个 SECONDARY 节点之间轮询。当然,另外还需要测试数据写入和查询是否正常,这个就自行完成拉。
                                    到这里,整个 InnoDB Cluster 部署完成。

                                    7 参考文档

                                    Installing MySQL Shell on Linux:https://dev.mysql.com/doc/mysql-shell/8.0/en/mysql-shell-install-linux-quick.html
                                    Deploying a Production InnoDB Cluster:https://dev.mysql.com/doc/mysql-shell/8.0/en/deploying-production-innodb-cluster.html
                                    Group Replication Requirements:https://dev.mysql.com/doc/refman/8.0/en/group-replication-requirements.html
                                    Installing MySQL Router on Linux:https://dev.mysql.com/doc/mysql-router/8.0/en/mysql-router-installation-linux.html
                                    Deploying MySQL Router:https://dev.mysql.com/doc/mysql-shell/8.0/en/admin-api-deploy-router.html

                                    在后续的文章中,会聊一聊 MGR 的原理、常用操作、监控、遇到的一些问题等。也欢迎各位朋友在留言区分享自己使用 MGR 过程遇到的问题,或者希望这个系列后续的文章讲解 MGR 哪个知识点。


                                    文章推荐
                                    MySQL 高可用方案--MGR 第01期:初探
                                    MySQL 常用高可用方案
                                    MySQL 常见面试题
                                    MySQL 删库到恢复
                                    Linux 安装 MySQL 最新版本 8.0.25
                                    Binlog分析利器-binlog_summary.py
                                    MySQL 频频出现慢日志,你该怎么办?
                                    如何设计一个高可用、高并发的 MySQL 架构
                                    推荐几个不错的 MySQL 提升资料




                                    我们创建了一个 MySQL 交流社群,围绕开发、运维、DBA、架构师和其他需要用到 MySQL 的群体,群内会分享一些读书笔记、面试技巧等,同时也用于大家交流使用 MySQL 过程中遇到的问题!

                                     

                                    入群请加下方群秘二维码,回复 MySQL,等待群秘邀你入群。


                                    文章转载自MySQL数据库联盟,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                    评论