Documentation Home
MySQL 外壳 8.0  / 第 8 章 MySQL InnoDB ClusterSet  /  8.5 将 MySQL Router 与 InnoDB ClusterSet 集成

8.5 将 MySQL Router 与 InnoDB ClusterSet 集成

MySQL 路由器将客户端应用程序流量路由到 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 Cluster 作为 InnoDB ClusterSet 部署中的主集群,并且您已经针对该集群引导了 MySQL Router,请按照此过程的相关部分使用 --force针对 InnoDB 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()
    <ClusterSet:testclusterset>

    在这个例子中:

    • 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 Router。有关更多信息,请参阅 第 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 管理员帐户的用户名 cluster.setupAdminAccount() ,然后复制到副本集群。引导操作会提示您输入该帐户的密码。InnoDB Cluster 管理员帐户的密码在 InnoDB ClusterSet 部署中的所有服务器实例上都是相同的。

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

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

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

    • --force如果您要为先前已引导的现有 InnoDB 集群再次引导 MySQL Router,则需要。

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

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

    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 实例的目标集群更改为集群 clustertwo

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

    在此示例中, myclustersetClusterSet对象的变量, 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'.

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

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