以前也介绍MySQL高可用相关的文章:前端
什么是mysql route mysql
MySQL Router是处于应用client和dbserver之间的轻量级代理程序,它能检测,分析和转发查询到后端数据库实例,并把结果返回给client。是mysql-proxy的一个替代品。其架构图和功能以下。linux
(1)Router实现读写分离,程序不是直接链接数据库IP,而是固定链接到mysql router。MySQL Router对前端应用是透明的。应用程序把MySQL Router看成是普通的mysql实例,把查询发给MySQL Router,而MySQL Router会把查询结果返回给前端的应用程序。面试
(2)从数据库服务器故障,业务能够正常运行。由MySQL Router来进行自动下线不可用服务器。程序配置不须要任何修改。redis
(3)主数据库故障,由MySQL Router来决定主从自动切换,业务能够正常访问。程序配置不须要作任何修改。sql
读写分离原理shell
MySQL Router接受前端应用程序请求后,根据不一样的端口来区分读写,把链接读写端口的全部查询发往主库,把链接只读端口的select查询以轮询方式发往多个从库,从而实现读写分离的目的。读写返回的结果会交给MySQL Router,由MySQL Router返回给客户端的应用程序。数据库
Mysql router用途segmentfault
MySQL Router的主要用途是读写分离,主主故障自动切换,负载均衡,链接池等。
Mysql router主主故障自动切换的坑
Mysql router主主故障切换功能通过测试没有问题,可是有一个比较大的坑须要注意,具体是什么坑和解决方法在文章末尾,由于你以前要是没用接触过mysql router估计以个人表达能力,说了你就晕了。
实验环境架构图以下:
(1)下载地址:提供不一样平台,二进制包和rpm包,选择合适安装方式便可,我这里使用二进制包安装
(2)解压安装
[root@c7-node1 ~]# tar xf mysql-router-2.0.3-linux-glibc2.12-x86-64bit.tar.gz -C /usr/local/ [root@c7-node1 ~]# cd /usr/local/ [root@c7-node1 local]# ln -s mysql-router-2.0.3-linux-glibc2.12-x86-64bit/ mysql-router [root@c7-node1 local]# cd mysql-router [root@c7-node1 mysql-router]# ll total 0 drwxr-xr-x 2 7161 wheel 24 Feb 23 2016 bin drwxr-xr-x 4 7161 wheel 36 Feb 23 2016 include drwxr-xr-x 3 7161 wheel 150 Feb 23 2016 lib drwxrwxr-x 2 7161 wheel 6 Feb 23 2016 run drwxr-xr-x 3 7161 wheel 16 Feb 23 2016 share
(3) 配置
一、建立配置文件目录,复制模版配置文件
[root@c7-node1 mysql-router]# mkdir /etc/mysql-route/ [root@c7-node1 mysql-router]# cp share/doc/mysqlrouter/sample_mysqlrouter.ini /etc/mysql-route/mysqlrouter.conf
二、配置文件设置,日志目录须要本身手动建立
[root@node1 ~]# cat /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=192.168.100.10 # 写节点端口 bind_port = 7001 # 模式,读写 mode = read-write # 主节点地址:默认状况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提高为主库 destinations = 192.168.100.11:3306,192.168.100.12:3306 # 从节点负载均衡配置 [routing:balancing] # 绑定的IP地址 bind_address=192.168.100.10 # 监听的端口 bind_port = 7002 # 链接超时时间 connect_timeout = 3 # 最大链接数 max_connections = 1024 # 后端服务器地址 destinations = 192.168.100.12:3306,192.168.100.13:3306 # 模式:读仍是写 mode = read-only [keepalive] interval = 60
日志目录建立及受权
[root@c7-node1 ~]# mkdir /data/log/mysql-route/ [root@c7-node1 ~]# chown mysql:mysql /data/log/mysql-route/
(4) 启动:mysql route官方没有提供启动脚本,须要本身编写
[root@c7-node1 ~]# cat /usr/lib/systemd/system/mysqlrouter.service [Unit] Description=MySQL Router After=syslog.target After=network.target [Service] Type=simple User=mysql Group=mysql ExecStart=/usr/local/mysql-router/bin/mysqlrouter -c /etc/mysql-route/mysqlrouter.conf PrivateTmp=true [Install] WantedBy=multi-user.target
五、启动服务
[root@c7-node1 ~]# systemctl enable mysqlrouter [root@c7-node1 ~]# systemctl start mysqlrouter
一、建立测试账号,测试库
MariaDB [(none)]> create database mysql_route; MariaDB [(none)]> GRANT all ON mysql_route.* TO 'route'@'%' IDENTIFIED BY 'route'; MariaDB [(none)]> FLUSH PRIVILEGES;
二、验证读负载均衡:从结果看到每次读都是访问不一样的主机
三、验证写:能够看到每次写都是写到主节点
下面是从库down机测试截图,能够看到两个节点都正常的状况下,是轮训从两个从库取数据,若是其中一个从库故障,那么mysql router会自动下线故障的从库,若是从库恢复,mysql router会自动把从库上线。
验证:正常状况下数据写入都是写到主库
咱们手动中止主库的mysql服务,模拟故障,再次写入,能够看到写入数据的节点是主库的备份节点。
注意:
一、备份从库不能打开read-only = on,否则切换以后写入会报错
二、第一台主库DOWN后,MySQL Router如何处理?
默认状况下第一台主数据库为写主库,当第一台主数据库DOWN机后,第二台数据库被提高为主库,稍后若是第一台主库被修复后,那么默认仍然链接第二台为主库进行读写,不会自动切回到第一台主库。
三、若是第一台主数据库被修复后,又但愿切换回第一台主库,怎么办?
能够重启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主主故障切换原理就是这样,可是生产环境就不能这么玩了。
解决办法:
一、在切换时须要本身编写脚本触发一个shell脚本或者event来处理重连的问题。
二、不使用mysql router主主故障转移功能,而是本身使用其余方式保证mysql主库高可用。
版权申明:做者:西门飞冰,一名90后it男,一直在北京工做,热爱运动,热爱冒险,热爱旅行。由做者原创投稿,版权归原创者全部。除非没法确认,咱们都会标明做者及出处,若有侵权烦请告知,咱们会当即删除并表示歉意,谢谢。
关注 民工哥技术之路 微信公众号对话框回复关键字:1024 能够获取一份最新整理的技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程、Java实战项目、架构师综合教程、架构师实战项目、大数据、Docker容器、ELK Stack、机器学习、BAT面试精讲视频等。