当前位置: 首页 > 科技观察

冰河,你能告诉我Mycat是如何实现MySQL读写分离的吗?

时间:2023-03-21 14:27:33 科技观察

作者个人研发在高并发场景下提供了一个简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。开源半年多以来,已成功为十几家中小企业提供精准定时调度解决方案,经受住了生产环境的考验。为了造福更多的童鞋,这里提供一个开源的框架地址:https://github.com/sunshinelyz/mykit-delay写在前面随着系统业务的不断发展,MySQL数据库的数据量是也在不断上升,当数据量达到一定程度时,MySQL的主从复制、读写分离、分库分表成为必然的架构趋势。这不,有朋友问我能不能说说Mycat是如何实现MySQL的读写分离的。所以整理了这篇文章。注:文章已收录于:GitHub:https://github.com/sunshinelyz/technology-bingheGitee:https://gitee.com/binghe001/technology-binghe环境说明这里需要高手关注MySQL的从复制是依赖于MySQL自身的主从复制机制。Mycat不负责MySQL的主从复制。MySQL的主从复制配置,可以参考博文《MySQL之——主从复制的配置》。好了,我们进入今天的主题。搭建环境操作系统:CentOS-6.5-x86_64-bin-DVD1.isoJDK版本:jdk1.8Mycat版本:Mycat-server-1.6.1-RELEASE-20201208215510-linux.tar.gz(下载自己编译的源码)Mycat节点IP:192.168.209.133主机名:liuyzhuang133主机配置:4核CPU,4G内存节点IP:192.168.209.132主机名:liuyzhuang132主机配置:4核CPU,4G内存Mycat部署架构Mycat的读写分离是基于后端MySQL集群的主从同步,Mycat提供语句分发。MyCat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读取更加安全可靠。下面来看一下Mycat的整体部署架构图。Mycat的安装设置主机名和IP与主机名的映射#vim/etc/sysconfig/networkNETWORKING=yesHOSTNAME=liuyazhuang133#vim/etc/hosts127.0.0.1liuyazhuang133192.168.209.131liuyazhuang131192.168.209.132liuyazhuang132192.168.209.133liuyazhuang133配置Java环境变量因为Mycat是用Java开发的,所以Mycat需要安装JDK(准确的说JRE就够了),需要JDK1.7以上版本#vim/etc/profile##javaenvexportJAVA_HOME=/usr/local/java/jdk1.8exportJRE_HOME=$JAVA_HOME/jreexportCLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jarexportPATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin#source/etc/profile#java-version上传Mycat安装包上传Mycat-server-1.6.1-RELEASE-20201208215510-linux.tar.gz到MyCat服务器的/home/mycat目录下,解压并移动到/usr/local/mycatdirectory$tar-zxvfMycat-server-1.6.1-RELEASE-20201208215510-linux.tar.gz#mv/home/mycat/mycat/usr/local/#cd/usr/local/mycat/#ll设置Mycat的环境变量#vim/etc/profile##mycatenvexportMYCAT_HOME=/usr/local/mycatexportPATH=$PATH:$MYCAT_HOME/bin#source/etc/profile配置Mycat确认MySQL主从复制正常在配置Mycat之前,请确认MySQL的主从复制设置配置完成并运行。MySQL主从数据同步配置在MySQL中,Mycat不负责数据同步问题。补充:在MySQL主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf中的[mysqld]段添加配置log_bin_trust_function_creators=true或者setgloballog_bin_trust_function_creators=in客户1;如果要在读写分离下切换主从,那么从节点也有可能成为写节点,所以不能将从节点设置为只读。read_only=1Linux版本的MySQL需要设置为MySQLcase-insensitive,否则可能会出现找不到表的问题。您可以在/etc/my.cnf的[mysqld]部分添加lower_case_table_names=1。配置schema.xmlschema.xml是Mycat最重要的配置文件之一,用于设置Mycat的逻辑库、表、数据节点、dataHost等。[root@liuyzhuang133conf]$cd/usr/local/root/conf/[root@liuyzhuang133conf]$vischema.xml文件内容如下。showslavestatusMycat1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读取更加安全可靠。配置如下:Mycat心跳检查语句配置为showslavestatus,在dataHost上定义两个新属性:switchType="2"和slaveThreshold="100",表示MySQL的读写分离和切换机制master-slavereplicationstatusbinding开启,MyCat心跳机制在showslavestatus中检测状态。“Seconds_Behind_Master”、“Slave_IO_Running”、“Slave_SQL_Running”三个字段判断当前主从同步状态和Seconds_Behind_Master主从复制延时。当Seconds_Behind_Master大于slaveThreshold时,读写分离过滤器会过滤掉这台Slave机器,防止读取到很久以前的旧数据,当master节点宕机时,切换逻辑会检查Slave上的Seconds_Behind_Master是否存在为0。当为0时,表示主从同步可以安全切换,否则不会切换配置server.xmlserver.xmlMain用于设置系统变量,管理用户,设置用户权限等[root@liuyzhuang133conf]$vimserver.xml文件内容如下。druidparserutf8mb4lyz.123lyz_schema1,lyz_schema2lyz.123lyz_schema1,lyz_schema2true在防火墙中开放8066和9066端口。Mycat默认的数据端口是8066,Mycat通过这个端口接收数据库客户端的访问请求。管理端口为9066,用于接收Mycat监控命令、查询Mycat运行状态、重新加载配置文件等。[root@liuyzhuang133mycat]#vim/etc/sysconfig/iptables添加:##MyCat-AINPUT-mstate--stateNEW-mtcp-ptcp--dport8066-jACCEPT-AINPUT-mstate--stateNEW-mtcp-ptcp--dport9066-jACCEPT重启防火墙:[root@liuyzhuang133mycat]#serviceiptablesrestart修改log日志级别为debug修改log日志级别为debug,通过日志确认基于Mycat的MySQL数据库集群的数据运行状态(可改为正式生产前的信息)[root@liuyzhuang133conf]$vim/usr/local/mycat/conf/log4j.xmlstartMycat[root@liuyzhuang133bin]$cd/usr/local/root/bin/(1)consolestart,这种启动关闭控制台后,Nycat服务也会关闭,适合调试:[root@liuyzhuang133bin]$./mycatconsole(2)可以使用如下后台启动方式:[root@liuyzhuang133bin]$./mycatstartStartingroot-server...Mycat连接测试(1)如果Windows本地安装了MySQL,可以使用已有的mysql客户端to远程操作Mycat(2)Nativecat连接Mycat进行读写分离测试(1)监控Mycat日志[root@liuyzhuang133~]$cd/usr/local/mycat/logs/[root@liuyzhuang133logs]$tail-fmycat.日志(2)读取测试$mysql-uuserlyz-plyz.123-h192.168.209.233-P8066mysql>showdatabases;mysql>uselyz_schema2;mysql>showtables;mysql>select*fromlyz_user_02;执行上面的查询语句,对应的Mycat日志信息如下:Executeselemultipletimesct*fromlyz_user_02语句,Mycat打印的日志信息显示读操作请求路由到Slave节点(192.168.209.132)writetestmysql>insertintolyz_user_02(userName,pwd)values('liuyazhuang','lyz123');执行上面新增的插入语句后,此时对应的Mycat日志信息如下:多次执行上面的插入语句,发现新数据是从Master节点(192.168.209.131)插入的,并且Slave节点通过.binlog中的Binlog数据同步Master节点。综上,基于Mycat的读写分离集群配置成功。本文转载自微信公众号“银禾科技”,可通过以下二维码关注。转载本文请联系冰川科技公众号。