朝花夕拾16章MySQL Shell 8.5 将MySQL Router与InnoDB ClusterSet集成

2024年 2月 20日 53.7k 0

MySQL Router 将客户端应用程序流量路由到 InnoDB ClusterSet 部署中的适当集群。您可以为与 InnoDB ClusterSet 部署一起使用的 MySQL Router 实例设置全局策略,并使用各个 MySQL Router 实例的设置覆盖此策略。

当您针对 InnoDB ClusterSet 部署引导 MySQL Router 实例时,它会了解 ClusterSet 的完整拓扑,并且可以适当地管理写入和读取流量。如果发生受控切换或紧急故障转移,与 InnoDB ClusterSet 连接的 MySQL Router 实例会意识到这一点,并将流量路由到新的主集群,但已配置为将流量发送到特定集群的任何实例除外。如果集群失效,MySQL Router 实例会停止向其发送读取和写入流量,但您已配置为在这种情况下继续发送读取流量的任何实例除外。

对于与 InnoDB ClusterSet 一起使用的每个 MySQL Router 实例,您可以选择将其配置为遵循主集群,或仅连接到特定目标 InnoDB Cluster。您可以使用 MySQL Shell 在这些模式之间在线切换。

  • 遵循初级

    在此模式下,MySQL Router 将应用程序流量(写入和读取)定向到 InnoDB ClusterSet 部署中当前作为主集群的集群。此模式是默认模式。

  • 命名目标集群

    在此模式下,MySQL Router 将应用程序流量定向到您指定的 InnoDB Cluster。这可以是 InnoDB ClusterSet 部署中的主集群,也可以是副本集群。如果目标集群当前是主集群,MySQL Router 将打开写入端口,应用程序可以写入该实例。如果目标集群当前是只读副本集群,MySQL Router 只允许读取流量,拒绝写入流量。如果这种情况由于目标集群的切换或故障转移而发生变化,MySQL Router 会相应地更改允许的请求类型。如果应用程序仅发出读取请求(可以在副本集群上发出),并且您希望将该流量路由到本地集群,则此模式非常有用。

您还可以配置 MySQL Router 以允许或禁止读取已标记为 的集群的流量 INVALIDATED。处于此状态的集群当前根本不作为 InnoDB ClusterSet 部署的一部分运行,并且无法接收写入。尽管集群不一定存在任何技术问题,但其数据正在变得陈旧。默认情况下,MySQL Router 不允许读取和写入无效的集群(设置drop_all ),但您可以选择允许读取( accept_ro设置)。

要针对 InnoDB ClusterSet 引导 MySQL Router,您需要使用 InnoDB Cluster 管理员帐户或 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。然后,MySQL Router 使用 MySQL Router 管理员帐户连接到 InnoDB ClusterSet 部署中的实例。您需要在引导操作期间指定这两个帐户的用户名和密码。有关更多信息,请参见 第 8.3 节“InnoDB ClusterSet 的用户帐户”。

重要的

如果您使用现有的 InnoDB 集群作为 InnoDB ClusterSet 部署中的主集群,并且您已经针对该集群引导了 MySQL Router,请按照此过程的相关部分,使用针对 --forceInnoDB ClusterSet 的选项再次引导它,然后停止并运行重新启动 MySQL 路由器。需要为 InnoDB ClusterSet 更新 MySQL Router 实例的静态配置文件中的设置。

要将 MySQL Router 与 InnoDB ClusterSet 部署集成,请遵循以下过程:

  1. 如果您尚未这样做,请根据您的拓扑安装 MySQL Router 实例。建议将 MySQL Router 部署在与客户端应用程序相同的主机上。使用沙箱部署时,所有内容都在单个主机上运行,因此您将 MySQL Router 部署到同一主机。使用生产部署时,我们建议将一个 MySQL Router 实例部署到用于托管客户端应用程序之一的每台计算机。还可以将 MySQL Router 部署到应用程序实例连接的公用计算机上。有关说明,请参阅 安装 MySQL 路由器。

  2. 使用 InnoDB Cluster 管理员帐户连接到 InnoDB ClusterSet 部署中的任何活动成员服务器实例。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。ClusterSet使用dba.getClusterSet()or 命令获取对象*cluster*.getClusterSet()ClusterSet当您使用适当的帐户连接到服务器实例时,获取该对象非常重要 。无论您在连接上指定的帐户是什么,对象中存储的默认用户帐户都会用于某些操作。例如:

    解释mysql-js> \connect admin2@127.0.0.1:3310
    ...
    mysql-js> myclusterset = dba.getClusterSet()

    在这个例子中:

    • *admin2*@*127.0.0.1:3310* 是集群中任何在线成员服务器实例的类似 URI 的连接字符串。

      类似 URI 的连接字符串由以下元素组成:

    • *admin2*是 InnoDB Cluster 管理员帐户的用户名。

    • *127.0.0.1:3310* 是成员服务器实例的主机和端口,如命令所示 *cluster*.status()

    • 返回的ClusterSet对象被分配给变量myclusterset

  3. *clusterSet*.status() 通过在连接到集群中的任何成员服务器时 发出 MySQL Shell 来验证 InnoDB ClusterSet 部署是否正常 。例如:

    mysql-js> myclusterset.status({extended: 1})

    选择扩展输出以查看 InnoDB ClusterSet 拓扑中集群的详细状态。这将为您提供每个成员服务器的主机和端口,因此您可以选择一个来引导 MySQL 路由器。有关更多信息 ,请参阅 第 8.6 节“InnoDB ClusterSet 状态和拓扑” 。

  4. 对于每个 MySQL Router 实例, 在安装 MySQL Router 的实例上的合适 shell 中运行mysqlrouter命令,以针对 InnoDB ClusterSet 引导 MySQL Router。在此示例中, force使用该选项是因为 MySQL Router 之前已针对主 InnoDB Cluster 进行了引导:

    解释$> mysqlrouter --bootstrap icadmin@127.0.0.1:3310 --account=myRouter1 --name='Rome1' --force
    Please enter MySQL password for icadmin:
    # Bootstrapping system MySQL Router instance...

    Please enter MySQL password for myRouter1:
    - 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
    - Creating configuration C:/Program Files/MySQL/MySQL Router 8.0/mysqlrouter.conf

    # MySQL Router configured for the ClusterSet 'testclusterset'

    After this MySQL Router has been started with the generated configuration

    > net start mysqlrouter
    or
    > C:\Program Files\MySQL\MySQL Router 8.0\bin\mysqlrouter.exe -c C:/Program Files/MySQL/MySQL Router 8.0/mysqlrouter.conf

    ClusterSet 'testclusterset' 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

    在这个例子中:

    • *icadmin*@*127.0.0.1:3310* 是 InnoDB ClusterSet 部署中任何在线成员服务器实例的类似 URI 的连接字符串。该实例可以位于主集群或副本集群中。如果该实例不是主集群中的主服务器,则 InnoDB ClusterSet 会将事务路由到该服务器,前提是 InnoDB ClusterSet 部署正常。

      类似 URI 的连接字符串由以下元素组成:

    • *icadmin*是 InnoDB 集群管理员帐户的用户名,该帐户是使用主集群上的命令设置的 *cluster*.setupAdminAccount() ,然后复制到副本集群。引导操作会提示您输入帐户的密码。 InnoDB ClusterSet 部署中的所有服务器实例上的 InnoDB Cluster 管理员帐户的密码都是相同的。

    • *127.0.0.1:3310* 是成员服务器实例的主机和端口,如命令所示 *clusterSet*.status()

    • *myRouter1*``*cluster*.setupRouterAccount() 是使用主集群上的命令设置的 MySQL Router 管理员帐户的用户名 。 InnoDB ClusterSet 部署中的所有服务器实例上的帐户都是相同的。引导操作会提示您输入帐户的密码。

    • --name可用于为 MySQL Router 实例分配一个非默认名称,以便在 InnoDB ClusterSet 状态命令的输出中轻松识别它。

    • --force如果您要为之前引导过的现有 InnoDB 集群再次引导 MySQL Router,则需要此选项。

    MySQL Router 连接到服务器实例并检索 InnoDB ClusterSet 元数据。该过程与针对单个 InnoDB 集群引导 MySQL Router 时的过程相同。有关该过程的更多详细信息,请参阅 第 6.10.3 节“部署 MySQL 路由器”。

  5. 引导每个 MySQL Router 实例后,通过在连接 *clusterSet*.listRouters() 到 InnoDB ClusterSet 中的任何成员服务器时在 MySQL Shell 中发出命令,验证它现在是否已针对 InnoDB ClusterSet 部署正确引导。该命令返回所有注册的 MySQL Router 实例或您指定的路由器实例的详细信息。例如:

    解释mysql-js> myclusterset.listRouters()
    {
    "domainName": "testclusterset",
    "routers": {
    "mymachine::Rome1": {
    "hostname": "mymachine",
    "lastCheckIn": 2021-10-15 11:58:37,
    "roPort": 6447,
    "roXPort": 6449,
    "rwPort": 6446,
    "rwXPort": 6448,
    "targetCluster": "primary",
    "version": "8.0.27"
    },
    "mymachine2::Rome2": {
    "hostname": "mymachine2",
    "lastCheckIn": 2021-10-15 11:58:37,
    "roPort": 6447,
    "roXPort": 6449,
    "rwPort": 6446,
    "rwXPort": 6448,
    "targetCluster": "primary",
    "version": "8.0.27"
    }
    }
    }

    有关详细信息, 请参阅InnoDB ClusterSet 的 MySQL 路由器状态。

  6. 要查看为每个 MySQL Router 实例设置的路由选项以及 InnoDB ClusterSet 部署的全局策略,请 *clusterSet*.routingOptions() 在连接到 InnoDB ClusterSet 部署中的任何成员服务器时在 MySQL Shell 中发出命令。例如:

    解释mysql-js> myclusterset.routingOptions()
    {
    "domainName": "testclusterset",
    "global": {
    "invalidated_cluster_policy": "drop_all",
    "target_cluster": "primary"
    },
    "routers": {
    "mymachine::Rome1": {
    "target_cluster": "primary"
    "invalidated_cluster_policy": "accept_ro"
    },
    "mymachine2::Rome2": {}
    }
    }

    默认情况下,MySQL Router 实例将流量发送到主集群,并禁止向标记为 的集群进行读取和写入流量INVALIDATED。有关详细信息和命令输出的说明, 请参阅 InnoDB ClusterSet 的 MySQL 路由器状态*clusterSet*.routingOptions()

  7. 如果要更改全局路由策略或单个 MySQL Router 实例的路由策略,请 *clusterSet*.setRoutingOption() 在连接到 InnoDB ClusterSet 部署中的任何成员服务器时在 MySQL Shell 中发出命令。您一次只能设置一个路由选项。 MySQL Router 实例需要几秒钟的时间才能获取路由策略的更改。

    例如,为 InnoDB ClusterSet 发出的此命令 myclusterset将 MySQL Router 实例的目标集群更改为 cluster clustertwo

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'clustertwo')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    在此示例中, *myclusterset*是对象的变量ClusterSet*Rome1*是 MySQL Router 实例的名称, *clustertwo*是要定位的特定集群的名称。

    要将实例的路由策略设置回跟随主实例,请发出以下命令:

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'primary')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    如需清除实例的路由策略,请使用 *clusterSet*.setRoutingOption() 命令将相关策略设置为null。例如:

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', null)
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    有关可用路由选项的更多信息, 请参阅 setRoutingOption() 。

    要设置全局路由策略,请勿指定 MySQL Router 实例,只需指定策略名称和设置。有关可用路由选项的更多信息和说明, 请参阅 InnoDB ClusterSet 的 MySQL 路由器状态。

  8. 当您准备好开始接受连接时,将应用程序配置为使用 MySQL Router 侦听 InnoDB ClusterSet 部署流量的端口。然后在安装了 MySQL Router 的服务器中使用合适的 shell 或脚本启动 MySQL Router 实例。请参阅 启动 MySQL 路由器。

设置路由选项()

路由选项如下:

  • "target_cluster": "primary"

    通过此设置,MySQL Router 将流量从客户端应用程序定向到 InnoDB ClusterSet 部署中当前作为主集群的集群。主集群可以接受读取和写入流量。遵循主要模式是全局策略和单个 MySQL Router 实例的默认模式。

  • "target_cluster": "\*clusterName\*"

    通过此设置,MySQL Router 会将来自应用程序的流量定向到 InnoDB ClusterSet 部署中的指定集群,无论该集群当前是主集群还是副本集群。如果目标集群当前是主集群,MySQL Router 将打开写入端口,应用程序可以写入该实例。如果目标集群当前是只读副本集群,MySQL Router 只允许读取流量,拒绝写入流量。如果这种情况由于目标集群的切换或故障转移而发生变化,MySQL Router 会相应地更改允许的请求类型。如果应用程序仅发出读取请求(可以在副本集群上发出),并且您希望将该流量路由到本地集群,则此模式非常有用。请注意,集群名称区分大小写。

  • "invalidated_cluster_policy": "drop_all"

    通过此设置,当集群标记为 时 INVALIDATED,MySQL Router 禁止应用程序对其进行读取和写入流量。处于此状态的集群当前根本不作为 InnoDB ClusterSet 部署的一部分运行,并且无法接收写入。它可能是在紧急故障转移过程中被标记为无效的前主集群,也可能是由于在故障转移时或受控切换期间无法访问或不可用而被标记为无效的副本集群。此设置是全局策略和各个 MySQL Router 实例的默认设置。

  • "invalidated_cluster_policy": "accept_ro"

    通过此设置,当集群标记为 时 INVALIDATED,MySQL Router 允许从应用程序向其读取流量,但会丢弃写入流量。尽管失效的集群不一定存在任何技术问题,但数据会变得陈旧,因此此设置意味着除非问题很快得到解决,否则将会发生陈旧读取。但是,在过时读取优先级不高的情况下,此设置可以提供更高的可用性。

  • "stats_updates_frequency": "\*numberOfSeconds\*"

    此选项定义 MySQL 路由器签入更新之间的间隔(以秒为单位)。如果设置为 0(默认),则不会进行定期更新。 MySQL Router 将该值向上舍入为其 TTL 的倍数。例如:如果低于 TTL,则向上舍入为 TTL。例如:如果TTL=30stats_updates_frequency=1,则有效频率为 30 秒。如果不是TTL的倍数,则向上取整,并根据TTL进行调整。例如,如果 TTL=5stats_updates_frequency=11,则有效频率为 15 秒,或者如果 TTL=5stats_updates_frequency=13,则有效频率为 15 秒。如果该值为空,则该选项值被清除,默认值生效。

  • use_replica_primary_as_rw: [true | false]

    target_cluster此选项指示 MySQL 路由器使其能够打开或关闭针对特定集群(未设置为) 的路由器上的读写 (R/W) 端口primary,从而使您能够使用 ReplicaCluster 上的 R/W 端口。 ReplicaCluster 继续仅接受 R/O 流量。如果发生切换或故障转移,R/W 端口保持不变。如果设置为true,ReplicaClusters 中的 MySQL Router R/W 端口。如果设置为 false(默认),则路由器的行为保持不变,并且 R/W 端口在 ReplicaCluster 中关闭。

您可以使用以下命令更改 InnoDB ClusterSet 部署中 MySQL Router 实例的路由选项 *clusterSet*.setRoutingOption() 。有关执行此操作的说明,请参阅 第 8.5 节,“将 MySQL Router 与 InnoDB ClusterSet 集成”。

要清除路由选项,请将其设置为null。8.5 将MySQL Router与InnoDB ClusterSet集成

MySQL Router 将客户端应用程序流量路由到 InnoDB ClusterSet 部署中的适当集群。您可以为与 InnoDB ClusterSet 部署一起使用的 MySQL Router 实例设置全局策略,并使用各个 MySQL Router 实例的设置覆盖此策略。

当您针对 InnoDB ClusterSet 部署引导 MySQL Router 实例时,它会了解 ClusterSet 的完整拓扑,并且可以适当地管理写入和读取流量。如果发生受控切换或紧急故障转移,与 InnoDB ClusterSet 连接的 MySQL Router 实例会意识到这一点,并将流量路由到新的主集群,但已配置为将流量发送到特定集群的任何实例除外。如果集群失效,MySQL Router 实例会停止向其发送读取和写入流量,但您已配置为在这种情况下继续发送读取流量的任何实例除外。

对于与 InnoDB ClusterSet 一起使用的每个 MySQL Router 实例,您可以选择将其配置为遵循主集群,或仅连接到特定目标 InnoDB Cluster。您可以使用 MySQL Shell 在这些模式之间在线切换。

  • 遵循初级

    在此模式下,MySQL Router 将应用程序流量(写入和读取)定向到 InnoDB ClusterSet 部署中当前作为主集群的集群。此模式是默认模式。

  • 命名目标集群

    在此模式下,MySQL Router 将应用程序流量定向到您指定的 InnoDB Cluster。这可以是 InnoDB ClusterSet 部署中的主集群,也可以是副本集群。如果目标集群当前是主集群,MySQL Router 将打开写入端口,应用程序可以写入该实例。如果目标集群当前是只读副本集群,MySQL Router 只允许读取流量,拒绝写入流量。如果这种情况由于目标集群的切换或故障转移而发生变化,MySQL Router 会相应地更改允许的请求类型。如果应用程序仅发出读取请求(可以在副本集群上发出),并且您希望将该流量路由到本地集群,则此模式非常有用。

您还可以配置 MySQL Router 以允许或禁止读取已标记为 的集群的流量 INVALIDATED。处于此状态的集群当前根本不作为 InnoDB ClusterSet 部署的一部分运行,并且无法接收写入。尽管集群不一定存在任何技术问题,但其数据正在变得陈旧。默认情况下,MySQL Router 不允许读取和写入无效的集群(设置drop_all ),但您可以选择允许读取( accept_ro设置)。

要针对 InnoDB ClusterSet 引导 MySQL Router,您需要使用 InnoDB Cluster 管理员帐户或 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。然后,MySQL Router 使用 MySQL Router 管理员帐户连接到 InnoDB ClusterSet 部署中的实例。您需要在引导操作期间指定这两个帐户的用户名和密码。有关更多信息,请参见 第 8.3 节“InnoDB ClusterSet 的用户帐户”。

重要的

如果您使用现有的 InnoDB 集群作为 InnoDB ClusterSet 部署中的主集群,并且您已经针对该集群引导了 MySQL Router,请按照此过程的相关部分,使用针对 --forceInnoDB ClusterSet 的选项再次引导它,然后停止并运行重新启动 MySQL 路由器。需要为 InnoDB ClusterSet 更新 MySQL Router 实例的静态配置文件中的设置。

要将 MySQL Router 与 InnoDB ClusterSet 部署集成,请遵循以下过程:

  1. 如果您尚未这样做,请根据您的拓扑安装 MySQL Router 实例。建议将 MySQL Router 部署在与客户端应用程序相同的主机上。使用沙箱部署时,所有内容都在单个主机上运行,因此您将 MySQL Router 部署到同一主机。使用生产部署时,我们建议将一个 MySQL Router 实例部署到用于托管客户端应用程序之一的每台计算机。还可以将 MySQL Router 部署到应用程序实例连接的公用计算机上。有关说明,请参阅 安装 MySQL 路由器。

  2. 使用 InnoDB Cluster 管理员帐户连接到 InnoDB ClusterSet 部署中的任何活动成员服务器实例。您还可以使用 InnoDB Cluster 服务器配置帐户,该帐户也具有所需的权限。ClusterSet使用dba.getClusterSet()or 命令获取对象*cluster*.getClusterSet()ClusterSet当您使用适当的帐户连接到服务器实例时,获取该对象非常重要 。无论您在连接上指定的帐户是什么,对象中存储的默认用户帐户都会用于某些操作。例如:

    解释mysql-js> \connect admin2@127.0.0.1:3310
    ...
    mysql-js> myclusterset = dba.getClusterSet()

    在这个例子中:

    • *admin2*@*127.0.0.1:3310* 是集群中任何在线成员服务器实例的类似 URI 的连接字符串。

      类似 URI 的连接字符串由以下元素组成:

    • *admin2*是 InnoDB Cluster 管理员帐户的用户名。

    • *127.0.0.1:3310* 是成员服务器实例的主机和端口,如命令所示 *cluster*.status()

    • 返回的ClusterSet对象被分配给变量myclusterset

  3. *clusterSet*.status() 通过在连接到集群中的任何成员服务器时 发出 MySQL Shell 来验证 InnoDB ClusterSet 部署是否正常 。例如:

    mysql-js> myclusterset.status({extended: 1})

    选择扩展输出以查看 InnoDB ClusterSet 拓扑中集群的详细状态。这将为您提供每个成员服务器的主机和端口,因此您可以选择一个来引导 MySQL 路由器。有关更多信息 ,请参阅 第 8.6 节“InnoDB ClusterSet 状态和拓扑” 。

  4. 对于每个 MySQL Router 实例, 在安装 MySQL Router 的实例上的合适 shell 中运行mysqlrouter命令,以针对 InnoDB ClusterSet 引导 MySQL Router。在此示例中, force使用该选项是因为 MySQL Router 之前已针对主 InnoDB Cluster 进行了引导:

    解释$> mysqlrouter --bootstrap icadmin@127.0.0.1:3310 --account=myRouter1 --name='Rome1' --force
    Please enter MySQL password for icadmin:
    # Bootstrapping system MySQL Router instance...

    Please enter MySQL password for myRouter1:
    - 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
    - Creating configuration C:/Program Files/MySQL/MySQL Router 8.0/mysqlrouter.conf

    # MySQL Router configured for the ClusterSet 'testclusterset'

    After this MySQL Router has been started with the generated configuration

    > net start mysqlrouter
    or
    > C:\Program Files\MySQL\MySQL Router 8.0\bin\mysqlrouter.exe -c C:/Program Files/MySQL/MySQL Router 8.0/mysqlrouter.conf

    ClusterSet 'testclusterset' 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

    在这个例子中:

    • *icadmin*@*127.0.0.1:3310* 是 InnoDB ClusterSet 部署中任何在线成员服务器实例的类似 URI 的连接字符串。该实例可以位于主集群或副本集群中。如果该实例不是主集群中的主服务器,则 InnoDB ClusterSet 会将事务路由到该服务器,前提是 InnoDB ClusterSet 部署正常。

      类似 URI 的连接字符串由以下元素组成:

    • *icadmin*是 InnoDB 集群管理员帐户的用户名,该帐户是使用主集群上的命令设置的 *cluster*.setupAdminAccount() ,然后复制到副本集群。引导操作会提示您输入帐户的密码。 InnoDB ClusterSet 部署中的所有服务器实例上的 InnoDB Cluster 管理员帐户的密码都是相同的。

    • *127.0.0.1:3310* 是成员服务器实例的主机和端口,如命令所示 *clusterSet*.status()

    • *myRouter1*``*cluster*.setupRouterAccount() 是使用主集群上的命令设置的 MySQL Router 管理员帐户的用户名 。 InnoDB ClusterSet 部署中的所有服务器实例上的帐户都是相同的。引导操作会提示您输入帐户的密码。

    • --name可用于为 MySQL Router 实例分配一个非默认名称,以便在 InnoDB ClusterSet 状态命令的输出中轻松识别它。

    • --force如果您要为之前引导过的现有 InnoDB 集群再次引导 MySQL Router,则需要此选项。

    MySQL Router 连接到服务器实例并检索 InnoDB ClusterSet 元数据。该过程与针对单个 InnoDB 集群引导 MySQL Router 时的过程相同。有关该过程的更多详细信息,请参阅 第 6.10.3 节“部署 MySQL 路由器”。

  5. 引导每个 MySQL Router 实例后,通过在连接 *clusterSet*.listRouters() 到 InnoDB ClusterSet 中的任何成员服务器时在 MySQL Shell 中发出命令,验证它现在是否已针对 InnoDB ClusterSet 部署正确引导。该命令返回所有注册的 MySQL Router 实例或您指定的路由器实例的详细信息。例如:

    解释mysql-js> myclusterset.listRouters()
    {
    "domainName": "testclusterset",
    "routers": {
    "mymachine::Rome1": {
    "hostname": "mymachine",
    "lastCheckIn": 2021-10-15 11:58:37,
    "roPort": 6447,
    "roXPort": 6449,
    "rwPort": 6446,
    "rwXPort": 6448,
    "targetCluster": "primary",
    "version": "8.0.27"
    },
    "mymachine2::Rome2": {
    "hostname": "mymachine2",
    "lastCheckIn": 2021-10-15 11:58:37,
    "roPort": 6447,
    "roXPort": 6449,
    "rwPort": 6446,
    "rwXPort": 6448,
    "targetCluster": "primary",
    "version": "8.0.27"
    }
    }
    }

    有关详细信息, 请参阅InnoDB ClusterSet 的 MySQL 路由器状态。

  6. 要查看为每个 MySQL Router 实例设置的路由选项以及 InnoDB ClusterSet 部署的全局策略,请 *clusterSet*.routingOptions() 在连接到 InnoDB ClusterSet 部署中的任何成员服务器时在 MySQL Shell 中发出命令。例如:

    解释mysql-js> myclusterset.routingOptions()
    {
    "domainName": "testclusterset",
    "global": {
    "invalidated_cluster_policy": "drop_all",
    "target_cluster": "primary"
    },
    "routers": {
    "mymachine::Rome1": {
    "target_cluster": "primary"
    "invalidated_cluster_policy": "accept_ro"
    },
    "mymachine2::Rome2": {}
    }
    }

    默认情况下,MySQL Router 实例将流量发送到主集群,并禁止向标记为 的集群进行读取和写入流量INVALIDATED。有关详细信息和命令输出的说明, 请参阅 InnoDB ClusterSet 的 MySQL 路由器状态*clusterSet*.routingOptions()

  7. 如果要更改全局路由策略或单个 MySQL Router 实例的路由策略,请 *clusterSet*.setRoutingOption() 在连接到 InnoDB ClusterSet 部署中的任何成员服务器时在 MySQL Shell 中发出命令。您一次只能设置一个路由选项。 MySQL Router 实例需要几秒钟的时间才能获取路由策略的更改。

    例如,为 InnoDB ClusterSet 发出的此命令 myclusterset将 MySQL Router 实例的目标集群更改为 cluster clustertwo

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'clustertwo')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    在此示例中, *myclusterset*是对象的变量ClusterSet*Rome1*是 MySQL Router 实例的名称, *clustertwo*是要定位的特定集群的名称。

    要将实例的路由策略设置回跟随主实例,请发出以下命令:

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', 'primary')
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    如需清除实例的路由策略,请使用 *clusterSet*.setRoutingOption() 命令将相关策略设置为null。例如:

    mysql-js> myclusterset.setRoutingOption('mymachine::Rome1', 'target_cluster', null)
    Routing option 'target_cluster' successfully updated in router 'Rome1'.

    有关可用路由选项的更多信息, 请参阅 setRoutingOption() 。

    要设置全局路由策略,请勿指定 MySQL Router 实例,只需指定策略名称和设置。有关可用路由选项的更多信息和说明, 请参阅 InnoDB ClusterSet 的 MySQL 路由器状态。

  8. 当您准备好开始接受连接时,将应用程序配置为使用 MySQL Router 侦听 InnoDB ClusterSet 部署流量的端口。然后在安装了 MySQL Router 的服务器中使用合适的 shell 或脚本启动 MySQL Router 实例。请参阅 启动 MySQL 路由器。

设置路由选项()

路由选项如下:

  • "target_cluster": "primary"

    通过此设置,MySQL Router 将流量从客户端应用程序定向到 InnoDB ClusterSet 部署中当前作为主集群的集群。主集群可以接受读取和写入流量。遵循主要模式是全局策略和单个 MySQL Router 实例的默认模式。

  • "target_cluster": "\*clusterName\*"

    通过此设置,MySQL Router 会将来自应用程序的流量定向到 InnoDB ClusterSet 部署中的指定集群,无论该集群当前是主集群还是副本集群。如果目标集群当前是主集群,MySQL Router 将打开写入端口,应用程序可以写入该实例。如果目标集群当前是只读副本集群,MySQL Router 只允许读取流量,拒绝写入流量。如果这种情况由于目标集群的切换或故障转移而发生变化,MySQL Router 会相应地更改允许的请求类型。如果应用程序仅发出读取请求(可以在副本集群上发出),并且您希望将该流量路由到本地集群,则此模式非常有用。请注意,集群名称区分大小写。

  • "invalidated_cluster_policy": "drop_all"

    通过此设置,当集群标记为 时 INVALIDATED,MySQL Router 禁止应用程序对其进行读取和写入流量。处于此状态的集群当前根本不作为 InnoDB ClusterSet 部署的一部分运行,并且无法接收写入。它可能是在紧急故障转移过程中被标记为无效的前主集群,也可能是由于在故障转移时或受控切换期间无法访问或不可用而被标记为无效的副本集群。此设置是全局策略和各个 MySQL Router 实例的默认设置。

  • "invalidated_cluster_policy": "accept_ro"

    通过此设置,当集群标记为 时 INVALIDATED,MySQL Router 允许从应用程序向其读取流量,但会丢弃写入流量。尽管失效的集群不一定存在任何技术问题,但数据会变得陈旧,因此此设置意味着除非问题很快得到解决,否则将会发生陈旧读取。但是,在过时读取优先级不高的情况下,此设置可以提供更高的可用性。

  • "stats_updates_frequency": "\*numberOfSeconds\*"

    此选项定义 MySQL 路由器签入更新之间的间隔(以秒为单位)。如果设置为 0(默认),则不会进行定期更新。 MySQL Router 将该值向上舍入为其 TTL 的倍数。例如:如果低于 TTL,则向上舍入为 TTL。例如:如果TTL=30stats_updates_frequency=1,则有效频率为 30 秒。如果不是TTL的倍数,则向上取整,并根据TTL进行调整。例如,如果 TTL=5stats_updates_frequency=11,则有效频率为 15 秒,或者如果 TTL=5stats_updates_frequency=13,则有效频率为 15 秒。如果该值为空,则该选项值被清除,默认值生效。

  • use_replica_primary_as_rw: [true | false]

    target_cluster此选项指示 MySQL 路由器使其能够打开或关闭针对特定集群(未设置为) 的路由器上的读写 (R/W) 端口primary,从而使您能够使用 ReplicaCluster 上的 R/W 端口。 ReplicaCluster 继续仅接受 R/O 流量。如果发生切换或故障转移,R/W 端口保持不变。如果设置为true,ReplicaClusters 中的 MySQL Router R/W 端口。如果设置为 false(默认),则路由器的行为保持不变,并且 R/W 端口在 ReplicaCluster 中关闭。

您可以使用以下命令更改 InnoDB ClusterSet 部署中 MySQL Router 实例的路由选项 *clusterSet*.setRoutingOption() 。有关执行此操作的说明,请参阅 第 8.5 节,“将 MySQL Router 与 InnoDB ClusterSet 集成”。

要清除路由选项,请将其设置为null

相关文章

塑造我成为 CTO 之路的“秘诀”
“人工智能教母”的公司估值达 10 亿美金
教授吐槽:985 高校成高级蓝翔!研究生基本废了,只为房子、票子……
Windows 蓝屏中断提醒开发者:Rust 比 C/C++ 更好
Claude 3.5 Sonnet 在伽利略幻觉指数中名列前茅
上海新增 11 款已完成登记生成式 AI 服务

发布评论