数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。
从数据库的角度来说,对于大多数应用来说,从集中到分布,最基本的一个需求不是数据存储的瓶颈,而是在于计算的瓶颈,即SQL查询的瓶颈,我们知道,正常情况下,Insert SQL就是几十个毫秒的时间内写入完成,而系统中的大多数Select SQL则要几秒到几分钟才能有结果,很多复杂的SQL,其消耗服务器CPU的能力超强,不亚于死循环的威力。在没有读写分离的系统上,很可能高峰时段的一些复杂SQL查询就导致数据库服务器CPU爆表,系统陷入瘫痪,严重情况下可能导致数据库崩溃。因此,从保护数据库的角度来说,我们应该尽量避免没有主从复制机制的单节点数据库。
环境
最低环境需求
应用 | 版本 |
---|---|
MySQL | 5.5及以上 |
Java JDK | 7及以上 |
主服务器环境
应用 | 版本 |
---|---|
MySQL | 5.6.40 |
Java JDK | 10.0.1 |
Mycat | 1.6 |
CentOS | 7.4.1708 |
从服务器环境
应用 | 版本 |
---|---|
MySQL | 5.6.35 |
CentOs | 7.2.1511 |
安装
主服务器安装
安装MySQL
本人使用的环境为自动部署上去的,其中已包含Mysql,所以关于MySQL 的单独安装请大家参考网上的教程。
安装Java JDK
下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
点击 DOWNLOAD
同意协议,点击下载。
登录服务器,创建 Java JDK 安装目录
1 | mkdir /usr/local/java |
上传 JDK 至目录
解压 JDK 至当前目录
1 | tar -zxvf jdk-10.0.1_linux-x64_bin.tar.gz |
编辑配置文件,配置环境变量
1 | vim /etc/profile |
重启机器
1 | sudo shutdown -r now |
查看安装情况
1 | java -version |
安装Mycat
MyCAT有提供编译好的安装包,支持windows、Linux、Mac、Solaris等系统上安装与运行。
下载地址:http://dl.mycat.io/
这里我选择下载1.6版本:Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
上传 Mycat 至服务器 /usr/local
解压 Mycat 至当前目录
1 | tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz |
移动安装包至 mycat 文件夹
1 | mv Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz /usr/local/mycat/ |
创建用户并设置
1 | useradd Mycat |
mycat 文件夹目录说明
1 | /usr/local/mycat |
目录解释如下:
bin程序目录,存放了window版本和linux版本,除了提供封装成服务的版本之外,也提供了nowrap的shell脚本命令,方便大家选择和修改,进入到bin目录:
Linux下运行:./mycat console,首先要chmod +x *
注:mycat支持的命令{ console | start | stop | restart | status | dump }
conf目录下存放配置文件,server.xml是Mycat服务器参数调整和用户授权的配置文件,schema.xml是逻辑库定义和表以及分片定义的配置文件,rule.xml是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启Mycat或者通过9066端口reload。
lib目录下主要存放mycat依赖的一些jar文件。
日志存放在logs/mycat.log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要,可以调整输出级别为debug,debug级别下,会输出更多的信息,方便排查问题。
注意:Linux下部署安装MySQL,默认不忽略表名大小写,需要手动到/etc/my.cnf 下配置 lower_case_table_names=1 使Linux环境下MySQL忽略表名大小写,否则使用MyCAT的时候会提示找不到表的错误!
增加环境变量
MyCAT在Linux中部署启动时,首先需要在Linux系统的环境变量中配置MYCAT_HOME,操作方式如下:
1 | vi /etc/profile |
刷新环境变量
1 | source /etc/profile |
Mycat 集群配置
如果是在多台Linux系统中组建的MyCAT集群,那需要在MyCAT Server所在的服务器上配置对其他ip和主机名的映射,配置方式如下:
1 | vi /etc/hosts |
编辑完后,保存文件。
启动 Mycat
经过以上两个步骤的配置,就可以到 /usr/local/Mycat/bin 目录下执行:(先不要动配置文件)
1 | ./mycat start |
即可启动mycat服务!
注:mycat支持的命令{ console | start | stop | restart | status | dump }
初次执行可以使用 ./mycat console 命令执行,这样有失败信息直接就能显示出来。
检验执行是否成功可以使用 ./mycat status
开放端口
如果开启防火墙需要开放8066/9066端口,9066和8066分别侦听管理员和应用程序的连接请求。
1 | vim /etc/sysconfig/iptables |
从服务器安装
从服务器主要用到的是 MySQL,环境为自动部署上去的,其中已包含Mysql,所以关于MySQL 的单独安装请大家参考网上的教程。
配置MySQL主从复制
配置mysql端主从的数据自动同步,mycat不负责任何的数据同步问题。
关于 MySQL 主从复制的介绍我不多赘述,其中优缺点有兴趣的可以查阅相关资料。主要复制方式:
- 基于SQL语句的复制 (statement-based replication, SBR)。
- 基于行的复制 (row-based replication, RBR)。
- 混合模式复制 (mixed-based replication, MBR)。
基于SQL语句的方式最古老的方式,也是目前默认的复制方式,后来的两种是MySQL 5以后才出现的复制方式。
主服务器配置
登录MySQL,创建一个同步账号,并分配用户权限
1 | CREATE USER 'AiMasterSlave'@'%' IDENTIFIED BY '123456'; |
修改/etc/my.cnf
1 | server-id = 2 # 每台服务器标识要唯一,不要设置为0,为0会拒绝所有链接 |
重启Mysql
1 | service mysqld restart |
登录MySQL,查看二进制日志
1 | show master status; |
记录下来,一会要用到。
检查3306端口是否开放,如果没开放,开放端口,参考上面打开8066端口方法
从服务器配置
先别着急配置,尝试远程链接主服务器,检验一下
1 | mysql -h192.168.1.45 -uAiMasterSlave -p123456 |
如果不能链接,请检验主服务器用户配置
修改/etc/my.cnf
1 | server-id = 1 |
重启Mysql
1 | service mysqld restart |
\登录MySQL**
1 | stop slave; |
查看状态
1 | show slave status \G; |
如果上面两处都为 Yes 说明配置就没问题。为 NO 或者 connecting 请检查配置和防火墙设置是否准确。
测试主从复制
我在主服务器写的数据,从服务器会自动同步,说明配置生效。
配置Mycat读写分离
关于 Mycat 的详细配置说明,请到官网去查阅文档,太多了我就不搬过来了。资料下载:百度云
server.xml
1 |
|
schema.xml
1 |
|
测试读写分离
开启debug级别日志(生产环境不要一直设置日志级别为debug)
1 | vi /usr/local/mycat/conf/log4j2.xml |
重启Mycat
使用本地 Shell 测试
检验物理数据库
数据已同步,说明没问题!
查看Mycat日志
可以看到读和写分别走两个服务器。至此,读写分离和主从配置完毕!
Mycat高可用方案
Mycat作为一个代理层中间件,Mycat系统的高可用涉及到Mycat本身的高可用以及后端MySQL的高可用。在大多数情况下,建议采用标准的MySQL主从复制高可用性配置并交付给Mycat来完成后端MySQL节点的主从自动切换。
应用强制走写/从
一个查询SQL语句以/balance/注解来确定其是走读节点还是写节点。 1.6以后添加了强制走读走写处理:
1 | 强制走从: |
根据主从延时切换
1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
MyCAT心跳检查语句配置为 show slave status ,dataHost 上定义两个新属性: switchType=”2” 与 slaveThreshold=”100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat心跳机制通过检测 show slave status 中的 “Seconds_Behind_Master”, “Slave_IO_Running”, “Slave_SQL_Running” 三个字段来确定当前主从同步的状态以及Seconds_Behind_Master主从复制时延, 当Seconds_Behind_Master>slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点宕机后,切换逻辑会检查Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。
1 | <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" |
主从数据监控
关于主从监控(数据一致性,延迟监测),我使用的是 percona-toolkit
关于 percona-toolkit 的配置与使用,可以参考:http://www.cnblogs.com/kevingrace/p/6261091.html