MySQL Shell 8.4  /  MySQL InnoDB ReplicaSet  /  创建 InnoDB ReplicaSet

9.3 创建 InnoDB ReplicaSet

配置完实例后,通过完成以下步骤来创建 InnoDB ReplicaSet。

  1. 连接到实例并使用 dba.createReplicaSet() 创建一个使用 MySQL 异步复制的托管 ReplicaSet,而不是 InnoDB 集群使用的 MySQL 组复制。MySQL Shell 连接到的 MySQL 实例用作 ReplicaSet 的初始主实例。

    dba.createReplicaSet() 操作执行一些检查,以确保实例状态和配置与托管 ReplicaSet 兼容,如果兼容,则会在实例上初始化元数据模式。

    如果 ReplicaSet 成功创建,则会返回一个 ReplicaSet 对象。因此,最佳做法是将返回的 ReplicaSet 分配给一个变量。这使您能够使用 ReplicaSet,例如通过调用 <ReplicaSet>status() 操作。要在一个名为 example 的实例 rs-1 上创建一个 ReplicaSet 并将其分配给 rs 变量,请输入

    mysql-js> \connect root@rs-1:3306
    ...
    mysql-js> var rs = dba.createReplicaSet("example")
    A new replicaset with instance 'rs-1:3306' will be created.
    
    * Checking MySQL instance at rs-1:3306
    
    This instance reports its own address as rs-1:3306
    rs-1:3306: Instance configuration is suitable.
    
    * Updating metadata...
    
    ReplicaSet object successfully created for rs-1:3306.
    Use rs.addInstance() to add more asynchronously replicated instances to this replicaset
    and rs.status() to check its status.
    注意

    ReplicaSet 的名称不能为空,且长度不超过 63 个字符。它只能以字母数字字符或 _(下划线)开头,并且只能包含字母数字字符、_(下划线)、.(句点)或 -(连字符)。

  2. 使用返回的 ReplicaSet 对象验证操作是否成功。例如,这提供 ReplicaSet.status() 操作,该操作显示有关 ReplicaSet 的信息。返回的 ReplicaSet 已经分配给了变量 rs,因此请输入

    mysql-js> rs.status()
    {
        "replicaSet": {
            "name": "example",
            "primary": "rs-1:3306",
            "status": "AVAILABLE",
            "statusText": "All instances available.",
            "topology": {
                "rs-1:3306": {
                    "address": "rs-1:3306",
                    "instanceRole": "PRIMARY",
                    "mode": "R/W",
                    "status": "ONLINE"
                }
            },
            "type": "ASYNC"
        }
    }

    此输出显示已创建名为 example 的 ReplicaSet,并且主实例是 rs-1。目前只有一个实例,下一步是将更多实例添加到 ReplicaSet。

ReplicaSet 加密和身份验证

副本可以验证源的身份并使用客户端 SSL 证书进行身份验证。已将以下选项添加到 dba.createReplicaSet

  • memberAuthType:定义用于内部复制帐户的身份验证类型。此选项采用以下值之一

    • PASSWORD:帐户仅使用密码进行身份验证。

    • CERT_ISSUER:帐户使用客户端证书进行身份验证,该证书必须与预期颁发者匹配。此值等效于 VERIFY_CA

    • CERT_SUBJECT:帐户使用客户端证书进行身份验证,该证书必须与预期颁发者和主题匹配。此值等效于 VERIFY_IDENTITY

    • CERT_ISSUER_PASSWORD:帐户使用 PASSWORDCERT_ISSUER 值的组合进行身份验证。

    • CERT_SUBJECT_PASSWORD:帐户使用 PASSWORDCERT_SUBJECT 值的组合进行身份验证。

  • certIssuer:定义身份验证所需的证书颁发者(如果 memberAuthType 包含 CERT_ISSUERCERT_SUBJECT)。

  • certSubject:定义实例的证书主题。如果 memberAuthType 包含 CERT_SUBJECT,则需要此参数。

  • replicationSslMode:定义 replicaSet 中复制通道的身份验证类型。此选项采用以下值之一

    • DISABLED:复制通道禁用 TLS 加密。

    • REQUIRED:复制通道启用 TLS 加密。

    • VERIFY_CA:与 REQUIRED 相同,但还会针对配置的证书颁发机构 (CA) 证书验证对等服务器 TLS 证书。

    • VERIFY_IDENTITY:与 VERIFY_CA 相同,但还会验证对等服务器证书是否与尝试连接到的主机匹配。

    • AUTO:如果实例支持,则启用 TLS 加密。如果实例不支持 TLS,则禁用。

例如

mysql-js> myreplicaset = dba.createReplicaSet("replicaSet1", 
  { "replicationSslMode": "VERIFY_IDENTITY", "memberAuthType":"CERT_SUBJECT", 
  "certIssuer":"/CN=MyCertAuthority", "certSubject": "/CN=mysql-5.local"});
注意

所有新的复制通道都是启用 SSL 创建的。

InnoDB ReplicaSet replicationAllowedHost

创建 InnoDB ReplicaSet 时,如果您有安全要求,需要将 AdminAPI 自动创建的所有帐户设置为严格的身份验证要求,您可以为 ReplicaSet 的 replicationAllowedHost 配置选项设置一个值。 replicationAllowedHost MySQL Shell 选项允许您将 ReplicaSet 的内部管理复制帐户设置为严格的基于子网的过滤器,而不是默认的通配符值 %replicationAllowedHost 选项可以取字符串值。例如,要将 replicationAllowedHost 设置为 192.0.2.0/24,请输入

mysql-js> var rs = dba.createReplicaSet('example', {replicationAllowedHost:'192.0.2.0/24'})
        A new replicaset with instance 'rs-1:3306' will be created.

* Checking MySQL instance at rs-1:3306

This instance reports its own address as rs-1:3306
rs-1:3306: Instance configuration is suitable.

* Updating metadata...

ReplicaSet object successfully created for rs-1:3306.
Use rs.addInstance() to add more asynchronously replicated instances to this replicaset 
and rs.status() to check its status.

创建 InnoDB ReplicaSet 后,可以通过 setOption 配置选项修改它以设置 replicationAllowedHost 变量,方法是发出以下命令

mysql-js> rs.setOption('replicationAllowedHost', '192.0.2.0/24')