简介
MySQL Router是MySQL官方提供的一个轻量级中间件,是InnoDB Cluster的一部分,可在应用程序和后端MySQL服务器之间提供透明路由。主要用以解决MySQL主从库集群的高可用、负载均衡、易扩展等问题。
为什么要用MySQL Router?
安装好MySQL InnoDB 集群后,当主节点宕机离开集群,剩余的其他节点会基于paxos协议选举一个新的主节点。这里有一个问题,应用程序端如果连接到了主节点,这时主节点宕机离开集群,可用的数据库IP地址发生变化,客户端应用程序这个时候还是会向失败的节点尝试连接,只能手动修改客户端应用程序的连接配置,比较麻烦。
MySQL Router推荐安装在应用程序所在的机器上,原因包括:
– 通过本地Unix套接字连接,而不是TCP/IP,提升性能
– 降低网络延迟
– 可以配置指定的账户来访问数据库,例如myapp@'host'
而不是类似myapp@'%'
这种全网段的账号,有利于提升安全性
– 提升应用程序服务器的可扩展性
安装MySQL Router
wget https://repo.mysql.com//mysql-apt-config_0.8.23-1_all.deb
dpkg -i mysql-apt-config_0.8.23-1_all.deb
apt-get update
apt-get install mysql-router
检验安装结果
mysqlrouter --version
正确输出版本号则代表安装成功。
配置MySQL Router
MySQL Router有两种部署模式:
bootstrap模式:支持故障转移,必须结合InnoDB Cluster使用,在–directory指定的路径下自动生成安装目录,配置文件里的端口为6446和6447。
简单模式:不支持故障转移,无需结合InnoDB Cluster使用,一般在主从复制或者主主复制等模式下使用。
使用bootstrap的方式安装MySQL Router的前提条件已搭建好InnoDB Cluster。
初始化MySQL Router
mysqlrouter --bootstrap root@localhost:3306 --directory /www/server/myrouter --conf-use-sockets --account myrouter --account-create always --user=root
–bootstrap:引导并配置Router以便与MySQL InnoDB集群一起运行。
启动MySQL Router
cd /www/server/mysqlrouter/
sh start.sh
测试连接MySQL Router
默认情况下,使用6446作为RW端口,使用6447作为RO端口
mysql -uroot -p123456 -h172.27.8.1 -P6446
mysql -uroot -p123456 -h172.27.8.1 -P6447
netstat -ntlp | grep mysqlrouter
也可以使用navicat等客户端来连接,账号密码与之前的一致,唯一不同的是端口号需要改成6446或6447。
在连接MySQL Router前,可以先直接连接mysql数据库,通过执行以下语句来查看集群所有的节点情况
select MEMBER_ID,MEMBER_HOST,MEMBER_ROLE from performance_schema.replication_group_members;
连接MySQL Router的6446端口,执行以下命令:
select @@hostname;
可以看到6446端口实际连接的是主节点。
连接MySQL Router的6447端口,执行相同的命令,可以看到连接的是三个从节点中的一个。不关闭当前窗口,新开一个窗口,也执行select @@hostname;
命令,可以看到连接的节点会更换为三个从节点中的另外一个。
也可以使用select @@server_uuid;
查看server的uuid来判断。
多主模式
mysql innodb cluster通过cluster.switchToMultiPrimaryMode()
命令切换至多主模式,然后使用程序连接至6447端口即可实现数据库的负载均衡。
总结
MySQL Router使用的是一个IP地址(可以理解为VIP)加一个RW端口和一个RO端口实现读写分离,Router自身不能判断应用程序的请求是读还是写,因此做读写分离时,必须指定两个端口,如果应用程序不便指定两个端口,也可以全部指定RW端口,这样的话从节点就只作高可用,不做读写分离。
MySQL Router自身存在单点故障隐患,官方推荐在每个应用程序所在机器上部署Router,本机器连接本机器的Router。
MySQL Router的后端MySQL实例挂掉之后,无需人工干预,MySQL Router会自动剔除挂了的MySQL实例,当挂了的MySQL实例恢复后会自动加入MySQL Router的后端服务器,也无需人工干预。
MySQL Router非常轻量级,性能损耗小于1%,官方建议每台应用上部署一个mysqlrouter节点,优点是节省网络带宽。缺点是mysqlrouter太轻量级了,只能提供简单的基于端口的读写路由(Port based routing)和基于权重轮询的负载均衡(Weighted Balance),不支持基于SQL的读写分离(Query based routing)和空闲优先的负载均衡(Application Layer balancer)