用于 VS 代码的 MySQL Shell GUI / MySQL Shell  / 第 7 章 Python  /  7.1 MySQL Shell 控制台:使用 Python 设置 InnoDB 集群

全面上市前:2022-11-17

7.1 MySQL Shell 控制台:使用 Python 设置 InnoDB 集群

示例任务使用带有 AdminAPI 的沙箱部署来部署 InnoDB 集群。

部署和使用 MySQL 的本地沙箱实例使您能够在部署到生产服务器之前在本地测试功能。AdminAPI 具有用于创建沙盒实例的内置功能,这些实例被预先配置为在本地部署的场景中与 InnoDB Cluster、InnoDB ClusterSet 和 InnoDB ReplicaSet 一起使用。

警告

沙盒实例仅适用于出于测试目的在本地机器上部署和运行。

创建 InnoDB 集群沙盒配置

要提供对一次故障的容忍度,请创建一个具有三个实例的 InnoDB 集群。在此示例中,您使用在同一台计算机上运行的三个沙箱实例。在真实世界的设置中,这三个实例可以在网络上的不同主机上运行。

  1. 打开 MySQL Shell 控制台会话。

  2. 将活动语言更改为 Python:

    \py
  3. 要创建和启动 MySQL 沙箱实例,请使用该 dba.deploy_sandbox_instance()方法。在 MySQL Shell 中发出以下三个语句并为每个实例输入根密码:

    dba.deploy_sandbox_instance(3310)
    dba.deploy_sandbox_instance(3320)
    dba.deploy_sandbox_instance(3330)
    笔记

    对所有实例使用相同的 root 密码。

创建一个 InnoDB 集群

要创建 InnoDB 集群,请完成以下步骤:

  1. 连接到您希望成为 InnoDB 集群中主实例的 MySQL 实例。

    shell.connect('root@localhost:3310')
  2. 发出dba.create_cluster()创建名为 的 InnoDB 集群的方法devCluster,并使用分配的变量cluster来保存输出值:

    cluster = dba.create_cluster('devCluster')

    此命令输出:

    将在实例“localhost:3310”上创建一个新的 InnoDB 集群。
    
    正在 localhost:3310 验证实例配置...
    注意:实例被检测为沙盒。
    请注意,沙箱实例仅适用于部署测试集群
    在同一主机内使用。
    
    此实例将其自身地址报告为 127.0.0.1:3310
    
    实例配置合适。
    注意:组复制将使用“127.0.0.1:33101”与其他成员通信。
          使用 localAddress 选项覆盖。
    
    在“127.0.0.1:3310”上创建 InnoDB 集群“devCluster”...
    
    添加种子实例...
    集群创建成功。使用 Cluster.addInstance() 添加 MySQL 实例。
    集群至少需要3个实例才能承受高达
    一台服务器故障。
    
    <集群:devCluster>
    
  3. cluster.status()通过使用具有分配变量 的方法验证创建是否成功 cluster

    cluster.status()

    输出以下状态:

    {
    “clusterName”:“devCluster”,
    “默认副本集”:{
            “名称”:“默认”,
    “主要”:“127.0.0.1:3310”,
    “ssl”:“必需”,
    “状态”:“OK_NO_TOLERANCE”,
    "statusText": "集群不能容忍任何故障。",
    “拓扑”:{
       “127.0.0.1:3310”:{
           “地址”:“127.0.0.1:3310”,
           "memberRole": "主要",
           “模式”:“读/写”,
           “读取副本”:{},
           “复制滞后”:空,
           “角色”:“哈”,
           “状态”:“在线”,
           “版本”:“8.0.28”
       }
    },
    “topologyMode”:“单主”
    }, “groupInformationSourceMember”:
    “127.0.0.1:3310”}
    
  4. 集群已启动并正在运行,但还不能容忍故障。使用以下方法将另一个 MySQL 服务器实例添加到集群add_instance()

    {
    cluster.add_instance('root@localhost:3320')

    输出是:

              
    注意:目标实例“127.0.0.1:3320”尚未预先配置
    (GTID 集为空)。
          Shell 无法决定是否进行增量状态恢复
          可以正确配置它。最安全方便的方式
          提供新实例是通过自动克隆提供,
          这将完全覆盖“127.0.0.1:3320”的状态
          来自现有集群成员的物理快照。要使用这个
          默认情况下,将“recoveryMethod”选项设置为“clone”。
    
    如果你确定所有的增量状态恢复可以安全地使用
    在集群中执行过的更新是在启用 GTID 的情况下完成的,
    没有被清除的事务并且新实例包含
    与集群或其子集相同的 GTID 集。使用此方法
    默认情况下,将“recoveryMethod”选项设置为“增量”。
    
    请选择一种恢复方法 [C]lone/[I]incremental recovery/[A]bort (default Clone):
    )
    }
    
  5. 从提示中选择一种恢复方法。选项是:

    • Clone:克隆要添加到主集群的实例,删除实例包含的所有事务。MySQL 克隆插件会自动安装。假设您要添加一个空实例(尚未处理任何交易)或包含您不希望保留的交易的实例,请选择克隆选项。

    • Incremental recovery:使用异步复制将集群处理的所有事务恢复到加入实例。如果您确定集群曾经处理过的所有更新都是在GTID启用全局事务 ID ( ) 的情况下完成的,则增量恢复是合适的。没有清除事务,新实例包含与GTID集群相同的集合或它的子集。

    在此示例中,选择C ​​表示Clone

    选择Clone选项后,输出为:

         请选择恢复方式
         [C]lone/[I]增量恢复/[A]bort(默认克隆):C
    正在 localhost:3320 验证实例配置...
    注意:实例被检测为沙盒。
    请注意,沙箱实例仅适用于部署测试集群
    在同一主机内使用。
    
    此实例将其自身地址报告为 127.0.0.1:3320
    
    实例配置合适。
    注意:组复制将使用“127.0.0.1:33201”与其他成员通信。
          使用 localAddress 选项覆盖。
    
    一个新实例将被添加到 InnoDB 集群中。取决于数量
    集群上的数据,这可能需要几秒钟到几个小时。
    
    将实例添加到集群...
    
    监控新集群成员的恢复过程。按 ^C 停止监听
    让它在后台继续。
    基于克隆的状态恢复正在进行中。
    
    注意:作为克隆过程的一部分,预计会发生服务器重启。如果
    服务器不支持 RESTART 命令或在
    同时,您可能需要手动重新启动它。
    
    * 等待克隆完成...
    注意:127.0.0.1:3320 是从 127.0.0.1:3310 克隆而来的
    **阶段删除数据:已完成
    ** 克隆转移
    文件复制################################################ ############ 100% 完成
    页面复制 ################################################ ############ 100% 完成
    重做复制################################################ ############ 100% 完成
    
    注意:127.0.0.1:3320 正在关闭...
    
    * 等待服务器重启...准备就绪
    * 127.0.0.1:3320 已重新启动,等待克隆完成...
    **阶段重启:已完成
    * 克隆过程已完成:大约 1 秒内传输了 72.61 MB(~72.61 MB/s)
    
    “127.0.0.1:3320”的状态恢复已经完成
    
    实例“127.0.0.1:3320”已成功添加到集群中。
    
  6. 添加创建的第三个实例并再次选择 C克隆恢复方法:

    cluster.add_instance('root@localhost:3330')
  7. 通过输入以下命令检查集群的状态:

    cluster.status()

    这将输出以下内容:

    {
    "clusterName": "devCluster",
    “默认副本集”:{
       “名称”:“默认”,
       “主要”:“127.0.0.1:3310”,
       “ssl”:“必需”,
       “状态”:“好的”,
       "statusText": "集群在线并且最多可以容忍一次故障。",
           “拓扑”:{
               “127.0.0.1:3310”:{
                   “地址”:“127.0.0.1:3310”,
                   "memberRole": "主要",
                   “模式”:“读/写”,
                   “读取副本”:{},
                   “复制滞后”:空,
                   “角色”:“哈”,
                   “状态”:“在线”,
                   “版本”:“8.0.28”
               },
               “127.0.0.1:3320”:{
                   “地址”:“127.0.0.1:3320”,
                   "memberRole": "次要",
                   “模式”:“R/O”,
                   “读取副本”:{},
                   “复制滞后”:空,
                   “角色”:“哈”,
                   “状态”:“在线”,
                   “版本”:“8.0.28”
               },
               “127.0.0.1:3330”:{
                   “地址”:“127.0.0.1:3330”,
                   "memberRole": "次要",
                   “模式”:“R/O”,
                   “读取副本”:{},
                   “复制滞后”:空,
                   “角色”:“哈”,
                   “状态”:“在线”,
                   “版本”:“8.0.28”
               }
           },
           “topologyMode”:“单主”
       },
       “groupInformationSourceMember”:“127.0.0.1:3310”
    }
    InnoDB集群设置成功!
    

集群现在最多可以容忍一次故障。

停止沙盒实例

停止主实例,检查 InnoDB Cluster 的状态,最后重启实例。

  1. 使用dba.kill_sandbox_instance()方法停止 MySQL 服务器实例:

    dba.kill_sandbox_instance(3310)

    输出是:

    杀死 MySQL 实例...
    
    实例 localhost:3310 成功终止。
    
  2. 检查 InnoDB Cluster 的状态:

    cluster.status()

    输出是:

    {
       "clusterName": "devCluster",
       “默认副本集”:{
           “名称”:“默认”,
           “主要”:“127.0.0.1:3320”,
           “ssl”:“必需”,
           “状态”:“OK_NO_TOLERANCE”,
           "statusText": "集群不能容忍任何故障。
                          1 位成员不活跃。",
           “拓扑”:{
               “127.0.0.1:3310”:{
                   “地址”:“127.0.0.1:3310”,
                   "memberRole": "次要",
                   “模式”:“不适用”,
                   “读取副本”:{},
                   “角色”:“哈”,
                   “外壳连接错误”:
                   “MySQL 错误 2003:无法打开与“127.0.0.1:3310”的连接:
                    无法连接到“127.0.0.1:3310”(10061) 上的 MySQL 服务器,
                   “状态”:“(失踪)”
               },
               “127.0.0.1:3320”:{
                   “地址”:“127.0.0.1:3320”,
                   "memberRole": "主要",
                   “模式”:“读/写”,
                   “读取副本”:{},
                   “复制滞后”:空,
                   “角色”:“哈”,
                   “状态”:“在线”,
                   “版本”:“8.0.28”
               },
               “127.0.0.1:3330”:{
                   “地址”:“127.0.0.1:3330”,
                   "memberRole": "次要",
                   “模式”:“R/O”,
                   “读取副本”:{},
                   “复制滞后”:空,
                   “角色”:“哈”,
                   “状态”:“在线”,
                   “版本”:“8.0.28”
               }
           },
           “topologyMode”:“单主”
       },
       “groupInformationSourceMember”:“127.0.0.1:3320”
    }
    

    正式运行在 3310 端口的 MySQL 服务器实例是 MISSING.

  3. dba.start_sandbox_instance()通过使用端口号 发出方法来重新启动这个丢失的实例 :

    dba.start_sandbox_instance(3310)

    检查集群的状态显示该实例已在集群中恢复为活动状态,但作为次要成员:

    cluster.status()

    输出是:

    {
      "clusterName": "devCluster",
      “默认副本集”:{
          “名称”:“默认”,
          “主要”:“127.0.0.1:3320”,
          “ssl”:“必需”,
          “状态”:“好的”,
          "statusText": "集群在线并且最多可以容忍一次故障。",
          “拓扑”:{
              “127.0.0.1:3310”:{
                  “地址”:“127.0.0.1:3310”,
                  "memberRole": "次要",
                  “模式”:“R/O”,
                  “读取副本”:{},
                  “复制滞后”:空,
                  “角色”:“哈”,
                  “状态”:“在线”,
                  “版本”:“8.0.28”
              },
              “127.0.0.1:3320”:{
                  “地址”:“127.0.0.1:3320”,
                  "memberRole": "主要",
                  “模式”:“读/写”,
                  “读取副本”:{},
                  “复制滞后”:空,
                  “角色”:“哈”,
                  “状态”:“在线”,
                  “版本”:“8.0.28”
              },
              “127.0.0.1:3330”:{
                  “地址”:“127.0.0.1:3330”,
                  "memberRole": "次要",
                  “模式”:“R/O”,
                  “读取副本”:{},
                  “复制滞后”:空,
                  “角色”:“哈”,
                  “状态”:“在线”,
                  “版本”:“8.0.28”
              }
          },
          “topologyMode”:“单主”
      },
      “groupInformationSourceMember”:“127.0.0.1:3320”
    }
    

所有实例都重新上线,InnoDB Cluster 可以再次容忍一次故障。