架构图
介绍
- MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品。
- Router实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router。MySQL Router对前端应用是透明的。应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。
- 从数据库服务器故障,业务可以正常运行。由MySQL Router来进行自动下线不可用服务器。程序配置不需要任何修改。
- 主数据库故障,由MySQL Router来决定主从自动切换,业务可以正常访问。程序配置不需要做任何修改。
读写分离原理
MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有查询发往主库,把连接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。
配置方法
基于 Docker
环境描述:
- 操作系统:Ubuntu 14.04
- router_master 主服务器(读写):172.17.0.8
- router_slave01 从服务器(读,热备份):172.17.0.9
- router_slave02 从服务器(读):172.17.0.10
- mysql-router 路由服务器:172.17.0.2
1. MySQL 主从复制
2. MySQL-Router 配置
-
安装部署 MySQL Router
- 下载:MySQL Router
- 解压到指定目录
tar -zxvf mysql-router-2.1.4-linux-glibc2.12-x86-64bit.tar.gz -C /usr/local/ cd /usr/local/ ln -s mysql-router-2.0.3-linux-glibc2.12-x86-64bit/ mysql-router
-
配置 MySQL Router
- 创建配置文件目录,复制配置文件模板
mkdir /etc/mysql-route/ cp share/doc/mysqlrouter/sample_mysqlrouter.conf /etc/mysql-route/mysqlrouter.conf
- 配置文件
[DEFAULT] # 日志存放目录 logging_folder = /data/log/mysql-route # 插件存放目录 plugin_folder = /usr/local/mysql-router/lib/mysqlrouter # 配置文件存放目录 config_folder = /etc/mysql-route # 运行目录 runtime_folder = /var/run [logger] # 日志运行级别 level = INFO # 主节点故障转移配置 [routing:basic_failover] # 写节点地址 bind_address=172.17.0.2 # 写节点端口 bind_port = 7001 # 模式,读写 mode = read-write # 主节点地址:默认情况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提升为主库 destinations = 172.17.0.8:3306,172.17.0.9:3306 # 从节点负载均衡配置 [routing:balancing] # 绑定的IP地址 bind_address=172.17.0.2 # 监听的端口 bind_port = 7002 # 连接超时时间 connect_timeout = 3 # 最大连接数 max_connections = 1024 # 后端服务器地址 destinations = 172.17.0.9:3306,172.17.0.10:3306 # 模式:读还是写 mode = read-only [keepalive] interval = 60
- 创建日志目录
mkdir /data/log/mysql-route chown root:root /data/log/mysql-route/
启动 MySQL Router
root@mysql-router:/usr/local/mysql-router/bin# ./mysqlrouter -c /etc/mysql-route/mysqlrouter.conf &
-
测试读写分离
- 先暂时停掉主从复制
- 在 master 节点插入数据,然后通过 mysql-proxy 查询
- 在 slave 节点插入数据,然后通过 mysql-proxy 查询
-
验证负载均衡
- 读操作
mysql -h 172.17.0.2 -uroot -P7002 -proot -e "show variables like 'hostname';"
- 写操作
mysql -h 172.17.0.2 -uroot -P7001 -proot -e "show variables like 'hostname';"
-
测试主主故障切换
- 从库 down 机
- 主库 sown 机
缺陷
在一主多从的情况,如果主库down机,切换到备份节点,其他从库的主库地址连接还是故障的
主库,这样就会造成一个从库slave_io线程connecting状态,造成复制延迟
- 解决方案:
1、在切换时需要自己编写脚本触发一个shell脚本或者event来处理重连的问题。
2、不使用mysql router主主故障转移功能,而是自己使用其他方式保证mysql主库高可用。