MySQL读写分离的概述
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。因此,一般来说都是通过 主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy/Amoeba)来提升数据库的并发负载能力 这样的方案来进行部署与实施的。
读写分离工作原理
基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
数据内部交换过程
为什么要读写分离:
1.面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
2.主从只负责各自的写和读,极大程度的缓解X锁和S锁争用
3.从库可配置myisam引擎,提升查询性能以及节约系统开销
4.增加冗余,提高可用性
实现读写分离的方式
一般有两种方式实现。
应用程序层实现
优点:
A:应用程序内部实现读写分离,安装既可以使用
B:减少一定部署难度
C:访问压力在一定级别以下,性能很好
缺点:
A:架构一旦调整,代码要跟着变
B:难以实现高级应用,如自动分库,分表
C:无法适用大型应用场景
中间件层实现
中间件层实现是指在外部中间件程序实现读写分离
常见的中间件程序:
MyCAT
社区爱好者在阿里cobar基础上进行二次开发,解决了cobar当时存 在的一些问题,并且加入了许多新的功能在其中。目前MyCAT社区活 跃度很高,目前已经有一些公司在使用MyCAT。总体来说支持度比 较高,也会一直维护下去,
什么是MYCAT
1.一个彻底开源的,面向企业应用开发的大数据库集群
2.支持事务、ACID、可以替代MySQL的加强版数据库
3.一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
4.一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
5.结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
6.一个新颖的数据库中间件产品
服务安装与配置
linux下可以下载Mycat-server-xxxxx.linux.tar.gz 解压在某个目录下,注意目录不能有空格,在Linux(Unix)下,建议放在usr/local/Mycat目录下,如下:
修改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 需要安装JDK 1.7 或者以上版本
服务启动与启动设置
MyCAT在Linux中部署启动时,首先需要在Linux系统的环境变量中配置MYCAT_HOME
vi /etc/profile
MYCAT_HOME=/usr/local/mycat PATH=$MYCAT_HOME/bin:$PATH #在系统环境变量文件中增加
source /etc/profile #使环境变量生效
如果是在多台Linux系统中组建的MyCAT集群,那需要在MyCAT Server所在的服务器上配置对其他ip和主机名的映射,配置方式如下:
vi /etc/hosts
10.10.10.67 test67.cn #中间键mycat
10.10.10.68 test68.cn #主
10.10.10.70 test70.cn #从
mycat的用户账号和授权信息
Vim /usr/local/mycat/conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<system>
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="root"> #用户账号,用于给前端APP登录mycat使用
<property name="password">123456</property> #对应账号密码
<property name="schemas">ha</property> #操作库名称
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">ha</property>
<property name="readOnly">true</property> #对应只读权限
</user>
</mycat:server>
MyCAT配置文件schema.xml
关于dataHost的配置信息如下
Vim /usr/local/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
<schema name="ha" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'> #同步数据库名
</schema>
<dataNode name="dn1" dataHost="dthost" database="ha"/>
<dataHost name="dthost" maxCon="500" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="test68.cn" url="localhost:3306" user="root" password="123456"> #对应数据库及数据库用户名及密码(与hosts文件中内容匹配)
</writeHost>
<writeHost host="test68.cn" url="10.10.10.68:3306" user="root" password="123456" />
</dataHost>
</mycat:schema>
其中,balance指的负载均衡类型,目前的取值有4种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType指的是切换的模式,目前的取值也有4种
1. switchType='-1' 表示不自动切换
2. switchType='1' 默认值,表示自动切换
3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
到/usr/local/mycat/bin 目录下执行
./mycat start #启动mycat服务
配置Mysql主从
test68上创建数据库和表,用于实现写操作
[root@test68 ~]# mysql -uroot -p123456
mysql> create database ha;
授权给mycat登陆数据库使用的帐号
mysql> GRANT ALL PRIVILEGES ON *.* TO 'mycat'@"%" IDENTIFIED BY "123456";
mysql> grant replication slave on *.* to slave@"10.10.10.%" identified by "123456";
mysql>flush privileges;
mysqldump –uroot –p123456 -B ha>ha.sql #导出给从库
关闭密码强度审计,在my.cnf添加validate-password=off
test70上导入数据库和表,用于实现读操作
[root@test70 ~]# mysql -uroot -p123456<ha.sql
授权给mycat登陆数据库使用的帐号
mysql> grant all on db.* to mycat@'%' identified by '123456';
mysql>flush privileges;
mysql>stop slave; #停止slave
mysql> change master to master_host='10.10.10.68',master_user='slave',master_password='123456';
mysql> start slave; #启动slave
mysql> show slave status\G 查看状态 ,有两个yes主从同步成功!
[root@test67 ~]# /usr/local/mycat/bin/mycat start #启动服务mycat服务
使用客户端登录mycat中间键(用户名与密码为/usr/local/mycat/conf/server.xml配置),登录后有明显的mycat标识。
mysql -uroot -p123456 -h 10.10.10.67 -P8066
测试读写分离,需要在/usr/local/mycat/conf/log4j.xml文件中将等级修改为debug
然后实时查看/usr/local/mycat/logs/mycat.log即可