MyCat 笔记-2017年12月22日

来源:互联网 发布:如何做网络舆情监测员 编辑:程序博客网 时间:2024/06/07 03:25

MyCat 笔记

标签(空格分隔): 数据库 mycat


  • MyCat 笔记
    • 一些概念
    • 配置文件说明
    • 全局主键及自增长主键
      • 全局主键
      • 自增长主键
    • 分片规则中需要注意的点
      • 自然月分片
    • 下面是一些总结的知识点
    • mycat管理命令
    • mycat读写分离
      • 基于mysql master-slave架构的读写分离
    • mycat故障切换
    • mycat优化
    • mysql优化
    • mycat源码解析
      • 路由判断

本文写作用的mycat版本为1.6,mysql 5.7

一些概念

  • 逻辑库(schema):
  • 逻辑表(table):
    • 分片表:
    • 非分片表:
    • ER表:分片时子表依赖父表,避免夸库关联查询。
    • 全局表:
  • 分片节点(dataNode):每个表分片所在的数据库就是一个分片节点
  • 节点主机(dataHost):每个分片节点不一定独占一台机器,每个机器就是一个节点主机。尽量将读写压力高的分片节点均匀地放在不同的节点主机上。

配置文件说明

mycat注意配置文件是conf目录下的server.xml、schema.xml和rule.xml。每个文件中都给的有默认的例子,官方的pdf文档也介绍的很详细。用到什么功能时直接收索官方pdf文档就行。

  • server.xml,配置的是mycat服务器的属性,mycat对应用程序而言就是一个数据库,这个文件就是配置的这个数据库的数据。对应源码中的SystemConfig.java.
  • schema.xml,设置的就是mycat与真实库的联系。里面有schema、dataNode、dataHost三个属性。schema相当于mysql中的databases,里边的每个table属性对应一张表。dataNode对应分片数据库的节点,即mysql实例。dataHost对应真实数据库,配置读写分离就是在这里配置,详情看官方pdf例子。
  • rule.xml,设置的是分片的规则,就是各表对应的具体的分片的规则。里边的例子很全,看官方pdf文档模仿就行。
  • sequence是全局序列的配置文件
  • log4j.xml,是日志输出配置文件

全局主键及自增长主键

全局主键

设置全局主键有两种方式,本地xml配置和数据库配置。
详情可参考该网站:http://www.cnblogs.com/ivictor/p/5235147.html
其中需要注意:sequence_*.properties里面的参数要求大写

自增长主键

自增长主键是在全局主键基础上设置的。方法如下:
1. mysql中的表主键要设置为自增
2. mycat中的table标签中设置 autoIncrement=”true”
3. mycat对应的sequence_db_conf.properties增加相应的数据:TABLE1=dn1.需要注意:
* TABLE1为表名,且为大写
* dn1为全局主键表所在的节点
5.mycat_sequence表中添加数据,其中name为表名,不区分大小写。

分片规则中需要注意的点

自然月分片

    <function name="month_fun" class="io.mycat.route.function.PartitionByMonth">        <property name="dateFormat">yyyy-MM-dd hh:mm:ss</property>        <property name="sBeginDate">2017-11-01 00:00:00</property>        <property name="sEndDate">2017-12-01 00:00:00</property>    </function>

自然月分片会根据字段中的月份,从sBeginDate算起,按照schema.xml中设置的节点的顺序,依次插入对应节点。比如上面的例子,2017-11月的数据会插入第一个节点,2017-12的数据会插入第二个节点,2018-01月的数据会插入第三个节点,依次类推。需要注意的是,要提前设置好所有的节点。比如你节点只设置到了2018-01月,这时插入2018-02月的数据就会报错:Can’t find a valid data node for specified node index :TABLE2 -> LOGINDATE -> 2018-03-02 12:12:12 -> Index : 4。其中index是这条数据应该插入的节点序号,序号是从0开始排的。
自然月分片是有循环的,以sEndDate与sBeginDate之间相差几个月,就以几为循环个数,超过sEndDate的月份重新从第一个节点开始,具体代码见:

io.mycat.route.function.PartitionByMonth.reCalculatePartition(int targetPartition)

下面是一些总结的知识点:

  • mycat会把全局表在每个节点存储一份,当全局表有修改时,会对所有节点的表进行修改,以保持数据一致性。
  • mycat支持zookeeper和本地xml 两种配置方式,默认本地xml配置。如果想配置成以zookeeper方式启动,则应把conf目录下的zk.conf文件中的loadfromzk参数设置为true.启动zookeeper后,需要执行bin目录下的初始化zookeeper脚本。
  • 如果使用zookeeper配置方式,则所有的配置参数都在zk-create.yaml文件中,该文件涵盖了conf目录下的schema、server等文件中的所有配置项。
  • mycat 1.4/1.5版本,schema标签里的dataNode属性是配置默认的分片节点,没有分片的节点就会默认在这个属性设置的节点查询。需要注意的是,用navicat查询不到未分片的表,但程序可以正常运行。
  • sql语句中最后不要带库名,比如“select * from db1.table1;”,最好不要带“db1.”。原因可查询schema标签checkSQLschema属性说明
  • sql语句中不要用>、<做比较,要用between……and……。
  • mycat支持DDL命令。
  • mycat每一种分片规则都有一个类处理,这些类在io.mycat.route.function包下。

mycat管理命令

  • mycat有两个端口,8066数据端口和9066管理端口,可以在server.xml中设置serverPort和managerPort属性修改。
  • 登录管理端口命令:mysql -uroot -h127.0.0.1 -p123456 -P9066
  • mycat的管理命令是在命令前+@@,比如查询帮助命令:show @@help;
  • reload @@config:更新配置文件,此命令执行期间mycat不可用!
  • show @@database:查看数据库
  • show @@datanode:查看数据节点列表,可以用 show @@datanode where schema=dn1; 来查询具体节点概况。
  • show @@heartbeat:查询心跳状态
  • show @@version:查询版本
  • show @@connection:查询前端连接状态
  • kill @@connection id,id,id:关闭连接
  • show @@backend:查询后端连接状态
  • show @@cache:查看缓存
  • show @@datasource:查看数据源状态
  • switch @@datasource name:index:切换数据源,注意:切换数据源时会将原数据源所有连接池中的连接关闭,并从新数据源创建新的连接,此时mycat不用用。
  • show @@syslog limit=100:显示100条系统日志
  • reload @@user_stat:清除缓存
  • show @@sql:显示在mycat中执行过的sql;
  • show @@sql.slow:显示慢sql语句
  • show @@sql.sum:显示sql语句的整体执行情况、读写比例等。
  • reload @@sqlstat=open/close:开启或关闭sql监控分析的指令
  • reload @@sqlslow=1000:设置慢sql时间阀值为1000毫秒
  • reload @@user_stat:重置sql监控分析的数据

mycat读写分离

mycat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。

基于mysql master-slave架构的读写分离

balance=”0”时,不开启读写分离,所有读操作都发送到当前的writeHost上。
balance=”1”时,所有读操作都发送到当前的writeHost对应的readhost和备用的writehost。
balance=”2”时,所有读操作都发送到所有的writeHost和readhost上,即当前datahost内的所有服务器都参与分担读操作。
balance=”3”时,所有读操作只发送到当前writeHost对应的readhosts上,比较适合双主热备、多个slave的情况。

mycat故障切换

例子可以看:https://www.cnblogs.com/kaye0110/p/5138568.html
一个dataHost里配置了两个或多个writeHost的情况下,如果第一个writeHost宕(dang)机了,则mycat会在默认的3次心跳检查失败后,自动切换到下一个writeHost执行DML SQL语句,并在conf/dnindex.properties文件中记录当前所用的writeHost的index(第1个为0,第2个为1,以此类推)。注意:此文件不能删除和擅自变更。
当原来配置的mysql写节点宕机回复后,保持现有状态不变,将恢复后的mysql节点作为从节点,跟随新的主节点,重新配置主从同步,原先跟随该节点做同步的其他节点同样重新配置同步源,这些节点的数据手工完成同步后,再加入mycat.

mysql主从同步设置:http://blog.51cto.com/369369/790921

mycat优化

mysql优化

mycat源码解析

路由判断

io.mycat.route.impl.DruidMycatRouteStrategy.routeNormalSqlWithAST()是判断路由规则的方法。