读写分离架构图
Mycat可以实现mysql读写分离,但是没有Mycat就不可以了吗?不是的,单纯Java程序可是可以的
如下图
你可以在Java程序中写判断逻辑,select的请求发到读数据库,update等发到写数据库,然后java程序连接两个数据源
但是你发现问题没有,这样读写分离和代码就紧紧的耦合在一起了,如果你要改变一些东西(比如增加库,修改库),就要改变很多配置
如果增加一个mycat,mysql做主从复制,然后java程序只要连接一个mycat就可以了,不需要管mycat连接了几个数据库,请求又如何分发,这样就实现了解耦
如何配置读写分离
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <dataNode name="dn1" dataHost="host1" database="testdb" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- can have multi write hosts --> <writeHost host="hostM1" url="192.168.25.146:3306" user="root" password="123456"> <!-- can have multi read hosts --> <readHost host="hostS2" url="192.168.25.148:3306" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
配置文件属性解释
修改的balance属性,通过此属性配置读写分离的类型
负载均衡类型,目前的取值有4 种:
balance=“0”, 不开启读写分离机制, 所有读操作都发送到当前可用的 writeHost 上。
balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1, M2->S2,并且 M1 与 M2 互为主备),正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
( balance=“2”,所有读操作都随机的在 writeHost、 readhost 上分发。
balance=“3”,所有读请求随机的分发到 readhost 执行, writerHost 不负担读压力
如果mysql是一主一从那么设置为3,如果是双主双从设置为1
写策略:
writeType=“0”: 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
writeType=“1”,所有写操作都随机的发送到配置的 writeHost, 1.5 以后废弃不推荐
writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。
数据库主备切换策略
switchType=“1”:
1 默认值,自动切换。
-1 表示不自动切换
2 基于 MySQL 主从同步的状态决定是否切换。
配置文件标签解释
Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。
Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则。
DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上
DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上