官方工具|MySQL Router高可用原理与实战

数据库 MySQL
MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。

Mysql route介绍

什么是mysql route

MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品。其架构图和功能如下。

(1)Router实现读写分离,程序不是直接连接数据库IP,而是固定连接到mysql router。MySQL Router对前端应用是透明的。应用程序把MySQL Router当作是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。

(2)从数据库服务器故障,业务可以正常运行。由MySQL Router来进行自动下线不可用服务器。程序配置不需要任何修改。

(3)主数据库故障,由MySQL Router来决定主从自动切换,业务可以正常访问。程序配置不需要做任何修改。

读写分离原理

MySQL Router接受前端应用程序请求后,根据不同的端口来区分读写,把连接读写端口的所有查询发往主库,把连接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。

Mysql router用途

MySQL Router的主要用途是读写分离,主主故障自动切换,负载均衡,连接池等。

Mysql router主主故障自动切换的坑

Mysql router主主故障切换功能经过测试没有问题,但是有一个比较大的坑需要注意,具体是什么坑和解决方法在文章末尾,因为你之前要是没用接触过mysql router估计以我的表达能力,说了你就晕了。

mysql router实验架构介绍

实验环境架构图如下:

安装部署mysql route

(1)下载地址:提供不同平台,二进制包和rpm包,选择合适安装方式即可,我这里使用二进制包安装

(2)解压安装 

  1. [root@c7-node1 ~]# tar xf mysql-router-2.0.3-linux-glibc2.12-x86-64bit.tar.gz -C /usr/local/  
  2. [root@c7-node1 ~]# cd /usr/local/  
  3. [root@c7-node1 local]# ln -s mysql-router-2.0.3-linux-glibc2.12-x86-64bit/ mysql-router  
  4. [root@c7-node1 local]# cd mysql-router  
  5. [root@c7-node1 mysql-router]# ll  
  6. total 0  
  7. drwxr-xr-x 2 7161 wheel 24 Feb 23  2016 bin  
  8. drwxr-xr-x 4 7161 wheel 36 Feb 23  2016 include  
  9. drwxr-xr-x 3 7161 wheel 150 Feb 23  2016 lib  
  10. drwxrwxr-x 2 7161 wheel 6 Feb 23  2016 run  
  11. drwxr-xr-x 3 7161 wheel 16 Feb 23  2016 share 

(3) 配置

1、创建配置文件目录,复制模版配置文件 

  1. [root@c7-node1 mysql-router]# mkdir /etc/mysql-route/  
  2. [root@c7-node1 mysql-router]# cp share/doc/mysqlrouter/sample_mysqlrouter.ini /etc/mysql-route/mysqlrouter.conf 

2、配置文件设置,日志目录需要自己手动创建 

  1. [root@node1 ~]# cat /etc/mysql-route/mysqlrouter.conf  
  2. [DEFAULT]  
  3. # 日志存放目录  
  4. logging_folder = /data/log/mysql-route  
  5. # 插件存放目录  
  6. plugin_folder = /usr/local/mysql-router/lib/mysqlrouter  
  7. # 配置文件存放目录  
  8. config_folder = /etc/mysql-route  
  9. # 运行目录  
  10. runtime_folder = /var/run  
  11. [logger]  
  12. # 日志运行级别  
  13. level = INFO  
  14. # 主节点故障转移配置  
  15. [routing:basic_failover]  
  16. # 写节点地址  
  17. bind_address=192.168.100.10  
  18. # 写节点端口  
  19. bind_port = 7001  
  20. # 模式,读写  
  21. mode = read-write  
  22. # 主节点地址:默认情况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提升为主库  
  23. destinations = 192.168.100.11:3306,192.168.100.12:3306  
  24. # 从节点负载均衡配置  
  25. [routing:balancing]  
  26. # 绑定的IP地址  
  27. bind_address=192.168.100.10  
  28. # 监听的端口  
  29. bind_port = 7002  
  30. # 连接超时时间  
  31. connect_timeout = 3  
  32. # 最大连接数  
  33. max_connections = 1024  
  34. # 后端服务器地址  
  35. destinations = 192.168.100.12:3306,192.168.100.13:3306  
  36. # 模式:读还是写  
  37. mode = read-only  
  38. [keepalive]  
  39. interval = 60 

日志目录创建及授权 

  1. [root@c7-node1 ~]# mkdir /data/log/mysql-route/  
  2. [root@c7-node1 ~]# chown mysql:mysql /data/log/mysql-route/ 

(4) 启动:mysql route官方没有提供启动脚本,需要自己编写 

  1. [root@c7-node1 ~]# cat /usr/lib/systemd/system/mysqlrouter.service  
  2. [Unit]  
  3. Description=MySQL Router  
  4. After=syslog.target  
  5. After=network.target  
  6. [Service]  
  7. Type=simple  
  8. User=mysql  
  9. Group=mysql  
  10. ExecStart=/usr/local/mysql-router/bin/mysqlrouter -c /etc/mysql-route/mysqlrouter.conf  
  11. PrivateTmp=true  
  12. [Install]  
  13. WantedBy=multi-user.target 

5、启动服务 

  1. [root@c7-node1 ~]# systemctl enable mysqlrouter  
  2. [root@c7-node1 ~]# systemctl start mysqlrouter 

读写分离测试

1、创建测试帐号,测试库 

  1. MariaDB [(none)]> create database mysql_route;  
  2. MariaDB [(none)]> GRANT all ON mysql_route.* TO 'route'@'%' IDENTIFIED BY 'route';  
  3. MariaDB [(none)]> FLUSH PRIVILEGES; 

2、验证读负载均衡:从结果看到每次读都是访问不同的主机

3、验证写:可以看到每次写都是写到主节点

从库down机测试

下面是从库down机测试截图,可以看到两个节点都正常的情况下,是轮训从两个从库取数据,如果其中一个从库故障,那么mysql router会自动下线故障的从库,如果从库恢复,mysql router会自动把从库上线。

主主故障切换测试

验证:正常情况下数据写入都是写到主库

我们手动停止主库的mysql服务,模拟故障,再次写入,可以看到写入数据的节点是主库的备份节点。

注意:

1、备份从库不能打开read-only = on,不然切换之后写入会报错

2、第一台主库DOWN后,MySQL Router如何处理?

默认情况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提升为主库,稍后如果第一台主库被修复后,那么默认仍然连接第二台为主库进行读写,不会自动切回到第一台主库。

3、如果第一台主数据库被修复后,又希望切换回第一台主库,怎么办?

可以重启MySQL Router

主主故障切换的坑

Mysql router的主主故障切换如果是运行在一主一从的情况下,从库作为主库的备份,这种情况是使用mysql router主主故障切换是没有问题的,但是在一主多从的情况下使用主主故障切换就会处在如下问题。

在一主多从的情况,如果主库down机,切换到备份节点,其他从库的主库地址连接还是故障的主库,这样就会造成一个从库slave_io线程connecting状态,造成复制延迟。我之前的主库地址是192.168.10.11,备份主库地址是192.168.10.12,但是主库故障之后,mysql route可以把写请求路由到新的主库,但是从库尝试连接的主库还是192.168.10.11,这种情况是正常的,因为mysql router主主故障切换原理就是这样,但是生产环境就不能这么玩了。

解决办法:

1、在切换时需要自己编写脚本触发一个shell脚本或者event来处理重连的问题。

2、不使用mysql router主主故障转移功能,而是自己使用其他方式保证mysql主库高可用。

版权申明:作者:西门飞冰,一名90后it男,一直在北京工作,热爱运动,热爱冒险,热爱旅行。由作者原创投稿,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意,谢谢。

关注 民工哥技术之路 微信公众号对话框回复关键字:1024 可以获取一份最新整理的技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。

 

责任编辑:庞桂玉 来源: segmentfault
相关推荐

2022-05-17 11:06:44

数据库MySQL系统

2023-05-24 08:14:55

2022-06-21 07:51:06

Redis高可用哨兵进程

2013-07-02 15:23:08

MySQL MHA故障转移

2022-06-23 11:42:22

MySQL数据库

2019-08-12 10:48:24

MySQLMHA架构应用场景

2022-05-31 08:04:03

Redis高可用集群

2018-04-08 15:20:15

数据库MySQL主从复制

2015-05-12 10:22:05

MySQL

2017-09-22 10:05:48

Redis备份容灾

2021-04-20 08:31:59

应用监控高可用

2019-08-27 15:56:44

MySQL 互联网数据库

2015-10-22 10:28:45

MySQL高可用方案

2022-02-27 14:37:53

MySQL主备数据

2018-01-12 14:20:37

数据库MySQL高可用架构

2012-02-22 10:13:43

虚拟化桌面虚拟化VMware View

2015-04-23 14:48:22

MYSQL

2021-09-17 07:51:24

Keepalived服务高可用

2019-08-26 08:36:09

负载均衡高可用Nginx

2022-09-29 15:24:15

MySQL数据库高可用
点赞
收藏

51CTO技术栈公众号