---
title: MySQL Router原理
description: "MySQL MGR实现多个数据库之间的数据复制，在多主模式下，保证数据的一致性；而在单主模式下，当主库不可用时，MGR会自动选择一个新的主库，新主库的IP地址和端口可能都会发生变化，但是对于前端应用，无法识别到MGR角色转换，应用还是会连接到原来的主库，导致连接失败。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengdbsmysqlrouter_03_0003.html
sourcePath: /source/zh/kunpengdbs/ecosystemEnable/MySQL/kunpengdbsmysqlrouter_03_0003.html
indexId: 21718e58aefa769df5514f80acfb6e44e83a9c386fb831cdfdbc15c00355a0a278
---
# MySQL Router原理

MySQL MGR实现多个数据库之间的数据复制，在多主模式下，保证数据的一致性；而在单主模式下，当主库不可用时，MGR会自动选择一个新的主库，新主库的IP地址和端口可能都会发生变化，但是对于前端应用，无法识别到MGR角色转换，应用还是会连接到原来的主库，导致连接失败。

MySQL InnoDB Cluster是基于MySQL MGR（MySQL Group Replication）复制方案，和MySQL Router、MySQL Shell提供MySQL数据库完整的高可用解决方案。MySQL Router是InnoDB Cluster的一部分，在应用和后端MySQL Server之间提供透明路由的轻量级中间件。

MySQL Shell是MySQL数据库管理工具，通过MySQL Shell获取MySQL InnoDB Cluster集群信息，生成Json文件，MySQL Router根据MySQL Shell提供的Json文件，获取到MySQL InnoDB Cluster的集群信息，根据这些集群信息，MySQL Router连接到MySQL InnoDB Cluster中一台服务器，实时读取集群信息，当集群状态发生改变，例如角色切换，节点被剔除集群等情况，MySQL Router可以实时获取最新的状态信息，这些状态信息，都缓存在MySQL Router的服务器内存中，MySQL Router可以根据这些信息，将应用连接路由到可用的MySQL数据库服务器。使用MySQL Router，应用不需要关心目前可用的MySQL服务器运行在哪些IP或者端口，对应用而言，它们只需要连接到MySQL Router即可。

在MySQL高可用方案中，如果只有一台MySQL Router ，那么MySQL Router就有可能成为单点故障，所以MySQL Router也需要部署高可用架构，MySQL Router的高可用架构可通过keepalived实现，这里主要介绍MySQL的高可用方案，MySQL Router的高可用就不再过多介绍了。除了高可用，MySQL Router集群节点可实现读写分离方案，将写操作都路由到Primary节点，而读操作路由到Replica节点。如果存在多个备库，MySQL Router可以将读操作路由到不同的Replica节点执行，实现简单的load balancing操作。

对于非MGR的主从方案，MySQL Router也提供load balancing功能，但是MySQL Router目前不能实时获取角色切换信息，MySQL Router会将应用连接路由到配置文件里指定的可用服务器，如果发现路由的MySQL服务器不可用，MySQL Router会返回连接失败等信息给应用端。对于新的连接，MySQL Router会将连接直接路由到可用的MySQL服务器。
