MyCat(1.3)Mycat读写分离简单实践(含高可用及HA参考文档)

【1】关键配置文件

  (1)schema.xml 用于配置逻辑库表及数据节点

  (2)rule.xml 用于配置表的分片规则

  (3)server.xml 用于配置服务器权限

【2】schema.xml 用于配置逻辑库表及数据节点

(1)<schema><table></table></schema>

<schema>:定义逻辑库

<table>:定义逻辑表

要是不需要分库分表,只需要读写分离,那么只配置<schema>即可

(2)<dataNode></dataNode>定义分片数据节点(一个节点代表一个数据分片)

在这个标签中定义内容包括了:节点的名字、数据源的真实的物理库的名字

(3)<dataHost></dataHost>定义数据节点的物理数据源

定义一组主机几点,真实的物理数据库实例,一个dataHost指定的数据源就是一组真实的mysql集群。

除此之外好包括定义,读写分离配置、心跳语句配置等等

【3】rule.xml 用于配置表的分片规则

(1)<tableRule name=""></tableRule> 

  定义表所使用的分片规则

(2)<function name=""></function>

  定义分片算法

【4】server.xml文件

(1)<system><proerty name=""></property></system>

  定义系统配置:比如 端口号、内存大小、timeout时间等等

(2)<user></user>

  用于定义连接 Mycat 的用户,与 mysql中的用户是不一样的,可以相同也可以不同。

  只有在本文件中定义的用户才可以连接到mycat

【5】基本实践之读写分离配置

【5.1】环境准备

3台机器:其中1台Mycat,2台mysql

  Mycat:192.168.135.173

  Mysql Master:192.168.135.174

  Mysql Slave  :192.168.135.175

    实现功能:读写分离

【5.2】修改配置文件 schema.xml

<?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="node1" database="test" />
<dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="192.168.135.174" url="192.168.135.174:3306" user="root" password="123456" >
                <readHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456"/> <!-- 读写分离; 写走174 ,读走 175; 174 宕机了, 175 也不可用 -->
     </writeHost> 
     <writeHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456" /> <!-- 高可用,如果当192.168.135.174写库挂了,那么会自动把这台机器切换成写库顶上,最终变成读写都是它 -->

</dataHost>
</mycat:schema>

 如果是多个库,参考:

  

 记得:server.xml文件也要改鸭

  

解析:

(1)<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode='dn1'></schema>
  name:逻辑库名  sqlMaxLimit:返回的最大结果集 dataNode:包含的数据集群节点,多个可以"dn1,dn2,dn3"

(2)<dataNode name="dn1" dataHost="node1" database="test" />
  name:集群逻辑名称  dataHost:包含的主机节点,多个可以"node1,node2"  daabase:实际操作主机节点的实例下的具体数据库名

(3)<dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  name:主机节点逻辑名称  maxCon:最大连接数  minCon:最小连接数  dbType:主机节点对应的数据库类型  dbDriver:驱动方式

  (3.1)<heartbeat>select user()</heartbeat>
    心跳监控方式,运行 select user(),无响应超过阀值则认为已经宕机

  (3.2)<writeHost host="192.168.135.174" url="192.168.135.174:3306" user="root" password="123456" >
<readHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456"/>
</writeHost>
<writeHost host="192.168.135.175" url="192.168.135.175:3306" user="root" password="123456" />

     <writeHost>:写入主机为 host  url:url访问地址  user:数据库账户  password:数据库密码

    <readHost>:只读主机   url:url访问地址  user:数据库账户  password:数据库密码

    第4行的<writeHost>:在第1行的<writeHost>失效后,才会使用这个备用的<writehost>,也就是前面所说的所谓的高可用,预定一个从作为预备写库。

  datahost重要参数 

balance指的负载均衡类型,目前的取值有4种: 
1. balance=0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。 
2. balance=1”,全部的readHost与stand bywriteHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。 
3. balance=2”,所有读操作都随机的在writeHost、readhost上分发。 
4. balance=3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力 
注意:balance=3只在1.4及其以后版本有,1.3没有。

writeType属性: 
1.writeType=0”,所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties. 
2.writeType=1”,所有写操作都随机地发送到配置的writeHost,1.5以后废弃不推荐。

switchType指的是切换的模式,目前的取值也有4种: 
1. switchType=-1’ 表示不自动切换 
2. switchType=1’ 默认值,表示自动切换 
3. switchType=2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status 
4. switchType=3’基于MySQLgalary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。

注意:估计Mycat1.4才开始支持switchType。1.3版本配置该属性的话
日志里会报错:org.xml.sax.SAXParseException;lineNumber: 61; columnNumber: 86; Attribute “switchType” must bedeclared for element type “dataHost”。 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时则表示主仅同步,可安全切换,否则不会切换。

【5.3】修改配置文件 server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>>
        <property name="sequnceHandlerType">2</property>
        <property name="subqueryRelationshipCheck">false</property>
        <property name="useOffHeapForMerge">1</property>
        <property name="memoryPageSize">64k</property>
        <property name="spillsFileBufferSize">1k</property>
        <property name="useStreamOutput">0</property>
        <property name="systemReserveMemorySize">384m</property>
        <property name="useZKSwitch">false</property>
        <property name="serverPort">3306</property>
        <property name="managerPort">9066</property>
        <user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <property name="schemas">TESTDB</property>
        </user>
        <user name="my_user">
                <property name="password">123456</property>
                <property name="schemas">TESTDB</property>
                <property name="readOnly">true</property>
        </user>
</mycat:server>

  我把serverPort从8066改成了3306,当mysql端口来访问。

  建立了2个Mycat用户,这个只是用来连接Mycat的,真正连接数据库的是我们5.2中配置的。

【5.4】测试读写分离

【5.4.0】修改日志配置文件

  vim /usr/local/mycat/conf/log4j2.xml

    

   info =>改为 debug ,这样日志级别就比较详细

【5.4.1】重启mycat

(1)经过上述步骤配置好之后,这个时候,需要重启生效;

  /usr/local/mycat/bin/mycat stop

  /usr/local/mycat/bin/mycat start

(2)查看日志是否成功启动

  tail -f -n 100 /usr/local/mycat/logs/wrapper.log

    

【5.4.2】连接 Mycat

(1)登录Mycat

mysql -uroot -p123456 -h192.168.135.173 -P3306

为什么是这么登,为什么端口是3306?见【5.3】中的server.xml修改。

注意,如果该机器上有其他程序占用3306端口,则需要手动处理空闲出来(比如mysql),所以一般还是不要乱改端口为佳。

  

 登录进来后,发现确实只有一个逻辑库

(2)查询

    

  我们可以发现,db5正是我们的从库机器。

    

 (3)读测试

  在登录上 mycat (192.168.135.173)机器上,执行 select * from score,果然捕获,且发现它运行host 为从库(192.168.135.175)

     

   核验成功

(4)写测试

在登录上 mycat (192.168.135.173)机器上,执行insert into score values(333,'aaa','100','6');

如下图:

    

 查看日志:

 果然,是插入在主库(192.168.135.174)上面了。

(5)去mysql上查看写操作是否主从同步

  左边主库,右边从库,可见已经同步好了。至此,读写分离已经实现

  

 参考文档

  Mycat - 实现数据库的读写分离与高可用https://www.cnblogs.com/youzhibing/p/9553766.html

       Mycat - 高可用与负载均衡实现,满满的干货!https://www.cnblogs.com/youzhibing/p/10263557.html

    

     

 
原文地址:https://www.cnblogs.com/gered/p/12092027.html