之前也介绍过MySQL高可用相关的文章:MySQL同步复制与高可用解决方案总结mysql路由介绍什么是mysql路由应用程序客户端和dbserver一个轻量级代理,用于检测、分析查询并将查询转发到后端数据库实例,并将结果返回给客户端。是mysql-proxy的替代品。其架构图和功能如下。(1)路由器实现读写分离。程序不直接连接数据库IP,而是固定连接mysqlrouter。MySQLRouter对前端应用程序是透明的。应用程序将MySQLRouter当作一个普通的mysql实例,向MySQLRouter发送查询,MySQLRouter将查询结果返回给前端应用程序。(2)从数据库服务器故障来看,业务可以正常运行。不可用的服务器由MySQLRouter自动下线。程序配置不需要任何修改。(3)如果主库出现故障,MySQLRouter会判断主从自动切换,业务可以正常访问。程序配置不需要任何修改。读写分离原理MySQLRouter收到前端应用请求后,根据不同的端口区分读写,将所有连接到读写端口的查询发送到主数据库,发送连接到读写端口的select查询。只端口到多个从库,从而达到读写分离的目的。读写返回的结果会交给MySQLRouter,再由MySQLRouter返回给客户端应用程序。Mysqlrouter用途MySQLRouter的主要用途是读写分离,master-master自动切换,负载均衡,连接池等Mysqlrouter的master-master故障自动切换的坑Mysqlrouter的master-masterfailover功能测试过没有任何问题,但是有一个比较大的坑需要注意。具体的坑和解决方法在文末,因为如果之前没接触过Mysqlrouter估计以我的表达能力,说完会头晕。mysqlrouter实验架构介绍实验环境架构图如下:安装部署mysqlroute(一)下载地址:提供不同平台,二进制包和rpm包,选择合适的安装方式即可,我使用的是二进制包安装这里(2)解压安装[root@c7-node1~]#tarxfmysql-router-2.0.3-linux-glibc2.12-x86-64bit.tar.gz-C/usr/local/[root@c7-node1~]#cd/usr/local/[root@c7-node1local]#ln-smysql-router-2.0.3-linux-glibc2.12-x86-64bit/mysql-router[root@c7-node1local]#cdmysql-router[root@c7-node1mysql-router]#lltotal0drwxr-xr-x27161wheel24Feb232016bindrwxr-xr-x47161wheel36Feb232016includedrwxr-xr-x37161wheel150xdrlibr-xr-x37161wheel150Feb232016w27161wheel6Feb232016rundrwxr-xr-x37161wheel16Feb232016share(3)配置1.创建配置文件目录,复制模板配置文件[root@c7-node1mysql-router]#mkdir/etc/mysql-route/[root@c7-node1mysql-router]#cpshare/doc/mysqlrouter/sample_mysqlrouter.ini/etc/mysql-route/mysqlrouter.conf2.配置文件设置,日志目录需要手动创建[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#模式,读写模式=read-write#主节点地址:默认第一个主库为写主库,当第一个主库之后DOWN机器,次库提升为主库destinations=192.168.100.11:3306,192.168.100.12:3306#Slave节点负载均衡配置[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:readorwritemode=read-only[keepalive]interval=60log目录创建和授权[root@c7-node1~]#mkdir/data/log/mysql-route/[root@c7-node1~]#chownmysql:mysql/data/log/mysql-route/(4)启动:mysqlroute官方没有提供启动脚本,需要自己写[root@c7-node1~]#cat/usr/lib/systemd/system/mysqlrouter.service[Unit]Description=MySQLRouterAfter=syslog.targetAfter=network.target[Service]Type=simpleUser=mysqlGroup=mysqlExecStart=/usr/local/mysql-router/bin/mysqlrouter-c/etc/mysql-route/mysqlrouter.confPrivateTmp=true[Install]WantedBy=multi-user.target5,启动服务[root@c7-node1~]#systemctlenablemysqlrouter[root@c7-node1~]#systemctlstartmysqlrouter读写分离测试1.创建测试账号,测试数据库MariaDB[(none)]>;创建数据库mysql_route;MariaDB[(none)]>GRANTallONmysql_route.*TO'route'@'%'IDENTIFIEDBY'route';MariaDB[(none)]>冲洗特权;3、验证写入:可以看到每次写入都是写到主节点从库下机测试。下面是从库down机测试截图。可以看到当两个节点都正常的时候,就是轮训从两个从库中取数据。如果其中一个从库出现故障,mysqlrouter会自动下线故障的从库。如果从库恢复,mysqlrouter会自动使从库上线。Master-masterfailover测试验证:正常情况下数据写入总是写入主库。我们手动停止主库的mysql服务,模拟失败,重新写入。可以看到写入数据的节点是主库的备份节点。注意:1、备份从库不能开启read-only=on,否则切换后写入会报错。2、第一个master数据库DOWN后,MySQLRouter如何处理?默认情况下,第一个主库是写主库。当第一个主数据库宕机时,第二个数据库被提升为主数据库。之后,如果第一主库被修复,默认连接仍然是第一主库。第二个对主库读写,不会自动切换回第一个主库。3、第一主库修复后,想切换回第一主库怎么办?可以重启MySQLRouter的master-masterfailover坑。如果Mysqlrouter的master-masterfailover是运行在一主一从的情况下,从库作为主库的备份。在这种情况下,mysqlrouter没有master-master故障转移。问题,但是在一主多从的情况下,master-masterfailover会出现如下问题。在一主多从的情况下,如果主库宕机切换到备节点,其他从库的主库地址仍然连接到故障的主库,会造成slave_io线程连接状态,导致复制延迟。我之前的主库地址是192.168.10.11,备份主库地址是192.168.10.12,但是主库失效后mysql路由可以把写请求路由到新的主库,但是从库尝试的主库连接到仍然是192.168。在10.11,这种情况是正常的,因为mysqlrouter的master-masterfailover原理是这样的,但是生产环境不能这么玩。解决方法:1、切换时需要自己写脚本触发shell脚本或事件处理重连问题。2、不使用mysqlrouter的master-masterfailover功能,而是使用其他方式保证mysql主库的高可用。版权声明:作者:西门飞冰,90后IT男,一直在北京工作,热爱运动、探险、旅游。作者原创投稿,版权归原作者所有。除非无法确认,否则我们会注明作者和出处。如有侵权请告知,我们将立即删除并致歉,谢谢。微信关注农民工技术之路公众号对话回复关键字:1024即可获取最新技术干货:包括系统运维、数据库、redis、MogoDB、电子书、Java基础课程,Java实战项目,架构师综合教程,架构师实战项目,大数据,Docker容器,ELKStack,机器学习,BAT面试精讲视频等。
