zoukankan      html  css  js  c++  java
  • 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

        

         

     
  • 相关阅读:
    VMWare虚拟机非正常关机后无法启动
    curl: (1) Protocol "'https" not supported or disabled in libcurl的解决方法
    spring security入门
    oracle中可以使用drop、delete和truncate三个命令来删除数据库中的表
    com.github.pagehelper:pagehelper:jar:3.4.2-fix.jar
    oracle jdbc驱动 ojdbc14-10.2.0.4.0.jar 网盘下载
    PDF复制SQL语句没有换行符的解决办法
    rpm -qa | grep mysql查询不到MySQL
    新文预览 | IoU-aware Single-stage Object Detector for Accurate Localization
    目标检测 | RetinaNet:Focal Loss for Dense Object Detection
  • 原文地址:https://www.cnblogs.com/gered/p/12092027.html
Copyright © 2011-2022 走看看