在InnoDB集群中使用MySQL路由器
在InnoDB集群中使用MySQL Router实现高可用性。不管你部署的是沙盒还是生产集群,MySQL路由器都可以根据InnoDB集群的元数据使用——bootstrap选项来配置自己。这将自动配置MySQL路由器,将连接路由到集群的服务器实例。客户端应用程序连接到MySQL路由器提供的端口,而不需要知道InnoDB集群的拓扑结构。在发生意外故障时,InnoDB集群会自动调整,MySQL路由器会检测到变化。
不要尝试手动配置MySQL路由器来重定向到InnoDB集群的端口。始终使用–bootstrap选项,因为这确保MySQL路由器从InnoDB集群的元数据中获取配置。
MySQL Router推荐和应用部署在同一个主机上。当使用沙盒部署时,所有东西都运行在单个主机上,因此你将MySQL路由器部署到同一个主机上。当使用生产部署时,我们建议在每台主机上部署一个MySQL路由器实例。也可以将MySQL Router部署到应用实例连接的普通机器上。你需要InnoDB集群的主密钥来自动配置MySQL路由器。
假设已经安装了MySQL路由器(参见安装MySQL路由器),使用–bootstrap选项来提供属于InnoDB集群的服务器实例的位置。MySQL路由器使用包含的元数据缓存插件来获取InnoDB集群的元数据,该元数据由组成InnoDB集群的服务器实例地址列表及其在集群中的角色组成。你传入了服务器的URI类型字符串,MySQL路由器应该从该服务器获取InnoDB集群的元数据。例如:
[root@my239 ~]# mysqlrouter --bootstrap root@my239:3310 --user=mysqlrouter Please enter MySQL password for root: WARNING: The MySQL server does not have SSL configured and metadata used by the router may be transmitted unencrypted. # Bootstrapping system MySQL Router 8.0.41 (MySQL Community - GPL) instance... - Creating account(s) (only those that are needed, if any) Failed changing the authentication plugin for account 'mysql_router1_t79nbm0'@'%': mysql_native_password which is deprecated is the default authentication plugin on this server. - Verifying account (using it to run SQL queries that would be run by Router) - Storing account in keyring - Adjusting permissions of generated files - Creating configuration /etc/mysqlrouter/mysqlrouter.conf Existing configuration backed up to '/etc/mysqlrouter/mysqlrouter.conf.bak' # MySQL Router configured for the InnoDB Cluster 'testCluster' After this MySQL Router has been started with the generated configuration $ /etc/init.d/mysqlrouter restart or $ systemctl start mysqlrouter or $ mysqlrouter -c /etc/mysqlrouter/mysqlrouter.conf InnoDB Cluster 'testCluster' 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
系统提示您输入MySQL Router使用的实例密码和加密密钥。此加密密钥用于加密MySQL路由器连接到集群时使用的实例密码。可以连接到InnoDB集群的端口也会显示出来。MySQL路由器引导过程创建了一个mysqlrouter.conf文件,该文件的设置基于从传递给–bootstrap选项的地址中检索到的集群元数据,在上面的例子中ic@mic1:3306。根据检索到的InnoDB集群元数据,MySQL Router自动创建了一个配置文件,其中包含一个metadata_cache部分,例如:
[root@my239 ~]# more /etc/mysqlrouter/mysqlrouter.conf # File automatically generated during MySQL Router bootstrap [DEFAULT] name=system user=mysqlrouter keyring_path=/var/lib/mysqlrouter/keyring master_key_path=/etc/mysqlrouter/mysqlrouter.key connect_timeout=5 read_timeout=30 dynamic_state=/var/lib/mysqlrouter/state.json client_ssl_cert=/var/lib/mysqlrouter/router-cert.pem client_ssl_key=/var/lib/mysqlrouter/router-key.pem client_ssl_mode=PREFERRED server_ssl_mode=AS_CLIENT server_ssl_verify=DISABLED unknown_config_option=error [logger] level=INFO [metadata_cache:bootstrap] cluster_type=gr router_id=1 user=mysql_router1_t79nbm0 metadata_cluster=testCluster ttl=0.5 auth_cache_ttl=-1 auth_cache_refresh_interval=2 use_gr_notifications=0 [routing:bootstrap_rw] bind_address=0.0.0.0 bind_port=6446 destinations=metadata-cache://testCluster/?role=PRIMARY routing_strategy=first-available protocol=classic [routing:bootstrap_ro] bind_address=0.0.0.0 bind_port=6447 destinations=metadata-cache://testCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=classic [routing:bootstrap_x_rw] bind_address=0.0.0.0 bind_port=6448 destinations=metadata-cache://testCluster/?role=PRIMARY routing_strategy=first-available protocol=x [routing:bootstrap_x_ro] bind_address=0.0.0.0 bind_port=6449 destinations=metadata-cache://testCluster/?role=SECONDARY routing_strategy=round-robin-with-fallback protocol=x [http_server] port=8443 ssl=1 ssl_cert=/var/lib/mysqlrouter/router-cert.pem ssl_key=/var/lib/mysqlrouter/router-key.pem [http_auth_realm:default_auth_realm] backend=default_auth_backend method=basic name=default_realm [rest_router] require_realm=default_auth_realm [rest_api] [http_auth_backend:default_auth_backend] backend=metadata_cache [rest_routing] require_realm=default_auth_realm [rest_metadata_cache] require_realm=default_auth_realm
生成的MySQL路由器配置创建了用于连接到集群的TCP端口。创建了使用经典MySQL协议和X协议与集群通信的端口。要使用X协议,服务器实例必须安装和配置X插件。对于沙盒部署,实例会自动设置X Plugin。对于生产部署,如果你想使用X协议,你需要在每个实例上安装和配置X插件
.6446用于经典的MySQL协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。
.6447对于经典的MySQL协议只读会话,MySQL路由器将传入的连接重定向到一个辅助服务器实例。
.6448对于X协议读写会话,MySQL路由器将传入的连接重定向到主服务器实例。
.6449对于X Protocol只读会话,MySQL路由器将传入的连接重定向到一个辅助服务器实例。
根据你的MySQL路由器配置,端口号可能与上面不同。例如,如果您使用–conf-base-port选项,或group_replication_single_primary_mode变量。当你启动MySQL路由器时,会列出确切的端口。
传入的连接被重定向的方式取决于所使用的集群类型。当使用单主集群时,读写会话被重定向到单主集群,而在多主集群中,读写会话被重定向到其中一个主集群实例。对于进入的只读连接,MySQL路由器以轮询方式将连接重定向到一个辅助实例。
一旦启动并配置后,启动MySQL路由器:
[root@my239 ~]# mysqlrouter & [1] 9670 [root@my239 ~]# netstat -ltnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:33101 0.0.0.0:* LISTEN 24656/mysqld tcp 0 0 0.0.0.0:6446 0.0.0.0:* LISTEN 9670/mysqlrouter tcp 0 0 0.0.0.0:6447 0.0.0.0:* LISTEN 9670/mysqlrouter tcp 0 0 0.0.0.0:6448 0.0.0.0:* LISTEN 9670/mysqlrouter tcp 0 0 0.0.0.0:6449 0.0.0.0:* LISTEN 9670/mysqlrouter tcp 0 0 0.0.0.0:33201 0.0.0.0:* LISTEN 27539/mysqld tcp 0 0 0.0.0.0:33301 0.0.0.0:* LISTEN 27495/mysqld tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1625/sshd tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2854/cupsd tcp 0 0 0.0.0.0:8443 0.0.0.0:* LISTEN 9670/mysqlrouter tcp6 0 0 :::3306 :::* LISTEN 2566/mysqld tcp6 0 0 :::33100 :::* LISTEN 24656/mysqld tcp6 0 0 :::3310 :::* LISTEN 24656/mysqld tcp6 0 0 :::33200 :::* LISTEN 27539/mysqld tcp6 0 0 :::33300 :::* LISTEN 27495/mysqld tcp6 0 0 :::22 :::* LISTEN 1625/sshd tcp6 0 0 ::1:631 :::* LISTEN 2854/cupsd tcp6 0 0 :::3320 :::* LISTEN 27539/mysqld tcp6 0 0 :::3330 :::* LISTEN 27495/mysqld tcp6 0 0 :::33060 :::* LISTEN 2566/mysqld
或者设置一个服务,在系统启动时自动启动MySQL Router,参见启动MySQL Router。你现在可以连接一个MySQL客户端,例如MySQL Shell到一个MySQL路由器端口,如上所述,并看到客户端是如何透明地连接到一个InnoDB集群实例的。
[root@my239 ~]# mysqlsh --log-level=DEBUG3 --uri root@localhost:6446 Please provide the password for 'root@localhost:6446': ****** Save password for 'root@localhost:6446'? [Y]es/[N]o/Ne[v]er (default No): MySQL Shell 8.0.41 Copyright (c) 2016, 2025, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type '\help' or '\?' for help; '\quit' to exit. Creating a session to 'root@localhost:6446' Fetching schema names for auto-completion... Press ^C to stop. Your MySQL connection id is 196 Server version: 5.7.26-log Source distribution No default schema selected; type \useto set one. MySQL localhost:6446 JS >
要验证您实际连接到的实例,只需对主机名和端口状态变量发出一个SQL查询。
MySQL localhost:6446 SQL > SELECT @@hostname AS 'Host Name', @@port AS 'Port'; +-----------------------+------+ | Host Name | Port | +-----------------------+------+ | localhost.localdomain | 3310 | +-----------------------+------+ 1 row in set (0.0008 sec)