mysql读写分离之mycat


Mycat 是一个强大的数据库中间件,是一个实现了 MySQL 协议的的Server

前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,
也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库,即将一个大表水平分割为 N 个小表,存储在后端 MySQL 服务器里或者其他数据库里

Mycat 几个典型的应用场景:

1:单纯的读写分离,此时配置最为简单,支持读写分离,主从切换
2:分表分库,对于超过 1000 万的表进行分片,最大支持 1000 亿的单表分片
3:多租户应用,每个应用一个库,但应用程序只连接 Mycat,从而不改造程序本身,实现多租户化
4:报表系统,借助于 Mycat 的分表能力,处理大规模报表的统计
5:替代 Hbase,分析大数据
6:作为海量数据实时查询的一种简单有效方案,比如 100 亿条频繁查询的记录需要在 3 秒内查询出来结果,
除了基于主键的查询,还可能存在范围查询或其他属性查询,此时 Mycat 可能是最简单有效的选择

mycat的安装,注意mycat是用java写的,所以必须先安装jdk环境,必须jdk1.7及以上的

安装jdk环境

(去oracle官网下载二进制的发行版,这里我选择的是jdk-8u91-linux-x64.tar.gz)

解压至/data/jdk目录(这个随便,注意规划),会出现一个名为jdk-8u91的目录

tar zxf jdk-8u91-linux-x64.tar.gz -C /data/jdk

在/etc/profile.d目录下创建java.sh,并编辑它

vim /etc/profile.d/java.sh

JAVA_HOME=/data/jdk
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME PATH

重载/etc/profile.d目录下的文件
source /etc/profile

验证jdk环境是否正常加载

echo $JAVA_HOME

也可以在终端下任意位置执行

java -version

安装mycat

,去官网下载mycat的发行版

tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /data/mycat

vim /etc/profile.d/mycat.sh

MYCAT_HOME=/data/mycat
PATH=$MYCAT_HOME/bin:$PATH
export MYCAT_HOME

重载/etc/profile.d目录下的文件
source /etc/profile

这里我们只需要单纯的实现mysql的读写分离,分库分表都不需要,读写分离涉及到的配置文件:

1.conf/server.xml
主要配置的是mycat的用户名和密码,mycat的用户名和密码和mysql的用户名密码是分开的,应用连接mycat就用这个用户名和密码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        </system>
        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">虚拟数据库</property>
        </user>
</mycat:server>

2.conf/schema.xml
主要配置主从库的数据库连接地址信息,schema里面不能配置table的定义,如果配置了就会检查sql的语法

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="虚拟数据库" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="localhost1" database="后端真实数据库名" />
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="6-mysql57-M" url="192.168.1.204:3306" user="真实数据库用户"
                                   password="真实用户密码">
                        <readHost host="7-mysql57-S1" url="192.168.1.206:3306" user="真实数据库用户" password="真实用户密码" />
                        <readHost host="7-mysql57-S2" url="192.168.1.207:3306" user="真实数据库用户" password="真实用户密码" />
                </writeHost>
        </dataHost>
</mycat:schema>

启动mycat,可用参数有,start,stop,restart,console前台运行,status

mycat start

MyCAT的读写分离机制如下:
• 事务内的SQL,全部走写节点,除非某个select语句以注释/*balance*/开头
• 自动提交的select语句会走读节点,并在所有可用读节点中间随机负载均衡
• 当某个主节点宕机,则其全部读节点都不再被使用,因为此时,同步失败,数据已经不是最新的,MYCAT会采用另外一个主节点所对应的全部读节点来实现select负载均衡。
• 当所有主节点都失败,则为了系统高可用性,自动提交的所有select语句仍将提交到全部存活的读节点上执行,此时系统的很多页面还是能出来数据,只是用户修改或提交会失败。

dataHost的balance属性设置为:
• 0,不开启读写分离机制
• 1,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
• 2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡。
一个dataHost元素,表明进行了数据同步的一组数据库,DBA需要保证这一组数据库服务器是进行了数据同步复制的。writeHost相当于Master DB Server,而旗下的readHost则是与从数据库同步的Slave DB Server。当dataHost配置了多个writeHost的时候,任何一个writeHost宕机,Mycat 都会自动检测出来,并尝试切换到下一个可用的writeHost。

MyCAT支持高可用性的企业级特性,根据您的应用特性,可以配置如下几种策略:
• 后端数据库配置为一主多从,并开启读写分离机制。
• 后端数据库配置为双主双从(多从),并开启读写分离机制
• 后端数据库配置为多主多从,并开启读写分离机制
后面两种配置,具有更高的系统可用性,当其中一个写节点(主节点)失败后,Mycat会侦测出来(心跳机制)并自动切换到下一个写节点,MyCAT在任何时候,只会往一个写节点写数据。

注意:mycat启动后,数据端口是8066,管理端口是9066
注意:我在做读写分离时,安装wordpress时总会少4张表,用mysql-proxy0.8.5时总会少两张表,不知道什么原因

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/51.html

最后编辑于:2017/3/9作者: 辣条①号

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注