MySQL Shell 9.0  /  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 的 ReplicaSet,并在实例 rs-1 上将其分配给变量 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,则禁用 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 配置选项设置一个值。MySQL Shell 选项 replicationAllowedHost 允许您将 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')