一.Mycat基本元素

  • 1.逻辑库,mycat中存在,对应用来说相当于mysql数据库,后端可能对应了多个物理数据库,逻辑库中不保存数据
  • 2.逻辑表,逻辑库中的表,对应用来说相当于mysql的数据表,后端可能对应多个物理数据库中的表,也不保存数据
逻辑表分类
  • 1.分片表,进行了水平切分的表,具有相同表结构但存储在不同数据库中的表,所有分片表的集合才是一张完整的表
  • 2.非分片表,垂直切分的表,一个数据库中就保存了一张完整的表
  • 3.全局表,所有分片数据库中都存在的表,如字典表,数量少,由mycat来进行维护更新
  • 4.ER关系表,mycat独有,子表依赖父表,保证在同一个数据库中

二.安装mycat

  • 1.配置环境变量
export JAVA_HOME=/usr/lib/jdk1.8.0_20
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JER_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JER_HOME/bin:$PATH:/usr/local/mycat/bin
export MYCAT_HOME=/usr/local/mycat
export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.12/
export PATH=$PATH:$ZOOKEEPER_HOME/bin
  • 2.mycat内存分配大小
#wrapper.conf
wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G
wrapper.java.additional.6=-Dcom.sun.management.jmxremote
  • 3.启动关闭
[root@mycat01 conf]# mycat --help
Usage: /usr/local/mycat/bin/mycat { console | start | stop | restart | status | dump }

三.mycat配置文件

3.1 server.xml
  • 配置系统相关参数,如连接数
  • 配置用户访问权限
  • 配置逻辑库信息
  • 配置SQL防火墙、SQL拦截功能
1.系统参数标签
<system>
<property name="${key}">${value}</property>
</system>
2.系统常用标签含义
    <property name="serverPort">8066</property>
<!-- mycat服务端口,转发mysql服务的端口 -->
<property name="managerPort">9066</property>
<!-- mycat管理端口,转发mysql服务的端口 -->
<property name="nonePassWordLogin">0</property>
<!-- 登录mycat是否需要密码验证,0-需要,1不需要 -->
<property name="bindIp">0.0.0.0</property>
<!-- mycat监听地址,默认全部监听,可以指定网卡IP -->
<property name="frontWriteQueueSize">4096</property>
<!-- 前端应用写队列大小 -->
<property name="charset">utf8</property>
<!-- 前端应用,后端DB需要保持一致避免乱码 -->
<property name="txlsolation">2</property>
<!-- 与mysql一致,0-读未提交,1-读已提交,2-可重复读,3-顺序读 -->
<property name="processors">8</property>
<!-- mycat线程数=CPU核数 -->
<property name="idleTimeout">1800000</property>
<!-- 前端应用不访问的超时断开时间,和mysql的idletime一致,单位毫秒,默认30分钟 -->
<property name="sqlExecuteTimeout">300</property>
<!-- SQL执行超时时间,单位秒,默认10分钟 -->
<property name="defaultMaxLimit">100</property>
<!-- mycat默认返回数据集大小,默认100行 -->
<property name="maxPacketSize">10485700</property>
<!-- mycat默认返回包大小,与mysql保持一致 -->
3. mycat访问用户权限参数标签
	<user name="readonly">
<!-- 逻辑库用户账号 -->
<property name="password">readonly1</property>
<!-- 逻辑库用户密码 -->
<property name="schemas">test</property>
<!-- 逻辑库用户能访问的逻辑库schema,多个schema用分号隔开
<property name="schemas">test,db1,db2</property> -->
<property name="readOnly">true</property>
<!-- 对逻辑库是否只读 -->
</user>
  • 1.对单个表特殊授权
	<user name="root" defaultAccount="true">
<property name="password">readonly1</property>
<property name="schemas">test</property> <privileges check="true">
<!-- 对需要控制权限的schema包裹权限privileges标签 -->
<schema name="db01" dml="0110">
<!-- 指定整个逻辑库schema的权限,权限分别是insert,update,select,delete,1为真,0为假 -->
<table name="table1" dml="0000"></table>
<!-- 指定单个逻辑表的权限,这里的权限会覆盖上面的权限是 -->
<table name="table2" dml="1111"></table>
</schema>
</privileges> </user>
  • 2.密码加密
java -cp /usr/local/mycat/lib/Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456
# 启用并更改密码为密文,0表示前端加密
<property name="usingDecrypt">1</property>
<property name="password">xasdfasdxSFA23</property>
# 1.5.1如下
[root@mycat01 lib]# java -cp /usr/local/mycat/lib/Mycat-server-1.5.1-RELEASE.jar org.opencloudb.util.DecryptUtil 0:root:password
a2SY+TZczkA9Fz9+QA3DoY7W7+Vp62782bp/qR1BNN8XjDXfiImfArARJyWdIcm8RMIU29p5FijneWPoHUyZgw==
# 重启mycat生效
3.2 mycat日志log4j2.xml
  • 1.配置输出日志的格式
  • 2.配置输出日志的级别
<PatternLayout>
<Pattern>
%d{yyy-MM-dd HH:mm:ss.SSS} %5p [%t] - %m%n
</Pattern>
<PatternLayout>
# %d{yyy-MM-dd HH:mm:ss.SSS} 时间格式
# %5p 日志输出级别,5代表具体的5个字符级别
# %t 日志中纪录线程名称
# %m 输出代码中指定的消息
# %n 换行符
07/28 15:27:15.985 DEBUG [Timer1] (SQLJob.java:85) -con query sql:show slave status to con:MySQLConnection [id=25, lastTime=1532762835985, user=root, schema=sqltest, old shema=sqltest, borrowed=true, fromSlaveDB=true, threadId=17, charset=utf8, txIsolation=0, autocommit=true, attachment=null, respHandler=null, host=172.16.10.153, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
  • 3.级别分类
<level value="debug" />
ALL Trace Debug Info Warn Error Fatal OFF
3.3 rule.xml规则
  • 水平分表的时候才需要配置
  • 指定分片规则和分片规则对应的分片函数
<tableRule name="hash-mod-4_id">
<!-- 分片规则名称,整个配置文件唯一,分片算法-分片节点数_分片列名 -->
<rule>
<columns>id</columns>
<!-- 分片使用的列字段,必须是实际存在的列 -->
<algorithm>hash-mod-4</algorithm>
<!-- 分片的算法,取自<function>的name属性 -->
</rule>
</tableRule> <function name="hash-mod-4" class="org.opencloudb.route.function.PartitionByHashMod">
<!-- 分片算法,唯一;JAVA类路径,1.6是"io.mycat.route.function.PartitionByHashMod"-->
<property name="count">4</property>
<!-- 不同分片算法属性不一样,这里是将数据分成4份 -->
</function>
1.常用分片算法
  • 1.简单取模-PartitionByMod,适用于整数类型的列,简单取模存储到后端节点-分片基数,数据分布比较均匀

<tableRule name="customer_login">
<rule>
<columns>customer_id</columns>
<!-- 这个列整形 -->
<algorithm>mod-long</algorithm>
</rule>
</tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
  • 2.hash取模-PartitionByHashMod,适用非整形类型的列,如字符串、日期,经过hash后再进行取模,数据分布可能不均匀

<tableRule name="customer_login">
<rule>
<columns>login_name</columns>
<!-- 这个列是字符串 -->
<algorithm>mod-long</algorithm>
</rule>
</tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByHashMod">
<!-- 分片算法不一样 -->
<property name="count">2</property>
</function>

前面两个算法是利用mycat本身算法分片,后面两算法可以人为控制

  • 3.枚举分片-PartitionByFileMap,根据可能的枚举值指定数据存储的节点位置,需要额外增加mapfile文件,适用按地区来分片业务场景



    mapFile记录可能出现的值,及分片值对应的节点索引
<tableRule name="customer_login">
<rule>
<columns>login_name</columns>
<!-- 这个列是字符串 -->
<algorithm>filemap-int</algorithm>
</rule>
</tableRule> <function name="filemap-int" class="io.mycat.route.function.PartitionByFileMap">
<!-- 分片算法不一样 -->
<property name="mapFile">partition-hash-int.txt</property>
<!--
partition-hash-int.txt,存在conf目录
10000=0
10001=1
DEFAULT_NODE=0
-->
<property name="type">0</property>
<!-- mapfile中枚举key的类型,0代表整形,非0代表string -->
<property name="DefaultNode">0</property>
<!-- 大于等于0启用默认节点,小于0不启用默认节点 -->
</function>
  • 4.字符串范围取模-PartitionByPrefixPattern,截取固定长度字符串进行ascii码求和,然后除以求模基数(配置文件指定),确定数据存储节点

<tableRule name="customer_login">
<rule>
<columns>login_name</columns>
<!-- 这个列是字符串 -->
<algorithm>filemap-int</algorithm>
</rule>
</tableRule> <function name="filemap-int" class="io.mycat.route.function.PartitionByPrefixPattern">
<!-- 分片算法不一样 -->
<property name="patternValue">128/property>
<!-- 求模基数 -->
<property name="mapFile">prefix-partition-pattern.txt</property>
<!--
partition-hash-int.txt,存在conf目录
0-63=0
64-127=1
-->
<property name="PrefixLength">2</property>
<!-- 截取的字符串长度 -->
</function>
3.4 schema.xml逻辑库-物理库信息
  • 配置逻辑库及逻辑表信息
  • 配置逻辑表所存储的数据节点
  • 配置数据节点所对应的物理数据库服务器信息
1.定义逻辑库
<schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn_test"> </schema>
<!-- 定义逻辑库的名称,可以和物理库不一样,checkSQLschema-判断是否检查发给mycat的sql是否含有库名,sqlMaxLimit-限制前端应用的默认返回行数,如果这里没有配置,将使用server.xml中的参数值,-1表示不限制返回函数 -->
2.定义逻辑表
<table name="customer_login" primaryKey="customer_id" dataNode="logindb01,logindb02" rule="customer_login"/>
<!-- 定义逻辑表的名称,必须和物理表名一致;定义逻辑表主键,和物理表主键一致,可以缓存主键信息,提高查询性能;指定物理表存储的物理节点;物理节点顺序和rule.xml节点顺序必须一致; 指定分片规则,这里的customer_login分配规则名称对应rule.xml的tableRule名称-->
3.定义物理数据库
<dataNode name="dn_test" dataHost="dh_10.151" database="test" />
<!-- 物理节点名称,唯一;mysql集群的名称;集群中物理数据库名称 -->
4.定义mysql集群信息
<dataHost name="dh_10.151" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
<!-- mysql集群的名称,唯一;mycat与后端数据库的最大、初始化连接数; -->
<heartbeat>show slave status</heartbeat>
<!-- <heartbeat>select user()</heartbeat> -->
<!-- can have multi write hosts -->
<writeHost host="Master_vip" url="172.16.10.151:3306" user="root" password="123456">
<!-- can have multi read hosts -->
<readHost host="S1_10.153" url="172.16.10.153:3306" user="root" password="123456" />
<readHost host="S2_10.154" url="172.16.10.154:3306" user="root" password="123456" />
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3306" user="root" password="123456"/> -->
</dataHost> # balance
# "0" 不开启读写分离机制,适用只有一个mysql数据库实例,或者读写敏刚应用
# "1" 全部的readhost和stand by writehost参与select语句负载均衡,适用双主双从实例
# "2" 所有的readhost和writehost都参与select语句负载均衡,适用写压力不大的应用场景
# "3" 所有readhost参与select语句的负载均衡,适用一主多从实例架构 # writeType
# "0" 默认值,所有的写请求落在第一个writehost上,当第一个writehost宕机后,才会选择第二个writehost主机
# "1" 随机将write请求分发到writehost主机上,有风险,适用PXC多写集群 # dbType
# 可以用于mongodb,用jdbc驱动 # switchType 写数据库如何进行切换
# "1" 当写主机不可用,自动切换到下一个可用写节点
# "-1" 关闭自动切换写主机功能,适用MHA管理的集群 switchType="-1,1,2,3"
--是否启用主从切换
-1:表示不启用主从切换;
1:为默认值,自动切换;
2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应; <heartbeat>show slave status</heartbeat>
--心跳检测语句,一般为select user();
如果是switchType=2,基于主从同步状态决定是否切换,则心跳设为show slave status;
如果是switchType=3,则心跳设为show status like 'wsrep%';
5.关于balance补充
  • 1.一主一从情况下,为1有可能无法select 从库,读写均落在主库
  • 2.一主情况下,主库宕机,所有从库无法通过mycat连接
  • 3.一主多从,balance设为1,select均在从库
  • 4.一主一从,balance设为3,select在从库 通常使用该项
  • 5.一主一从,balance设为2,select会落在从库

MyCat基本知识的更多相关文章

  1. 二、mycat基础知识、基本配置

    官网 http://www.mycat.io/ Mycat 概要介绍 https://github.com/MyCATApache/Mycat-Server 入门指南 https://github.c ...

  2. MyCat安装与测试教程 超详细!

    MyCat安装与测试教程 超详细! MyCat基础知识 一.什么是MYCAT? 1. 一个彻底开源的,面向企业应用开发的大数据库集群 2. 支持事务.ACID.可以替代MySQL的加强版数据库 3. ...

  3. myCat知识笔记

    数据字典做成全局表(在各个分库中都有备份) ER表, 关联表都放在同一个分库上, 有利于数据关联查询 一致性hash ,/hash slot 主要为了解决分布式节点扩容时, 迁移数据的问题. mySq ...

  4. linux 运维知识体系

    这里将会介绍一下,LINUX运维工程师的知识体系. 只能说是个人理解吧.并不是必要或者充分的,仅供网友参考. 大部分本博客都有涉及,并不完整. 1.LINUX运维基础 1.1.LINUX系统的简介,分 ...

  5. 运维知识体系v0.5

    http://www.90qj.com/?post=318http://ixdba.blog.51cto.com/2895551/1751377   运维知识体系v0.5-(运维社区-赵班长出品,欢迎 ...

  6. 关于js的一些基本知识(类,闭包,变量)

    这里写的都是些杂知识,包括私有,类,闭包这些js不可避免的东西,感觉自己有可能会误人子弟.所以有觉得写错了的读者,希望可以及时评论告诉我.我可以及时更正.多谢大家了 1.关于类的创建 类的创建大致可以 ...

  7. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  8. 一篇文章让你成为 NIO 大师 - MyCAT通信模型

    这篇文章没有详细介绍 NIO 的概念,对于 NIO 不了解的同学,可根据自己需要,阅读这篇介绍 NIO 的博客    io.mycat.net.NIOAcceptor NIOAcceptor负责处理客 ...

  9. 快速掌握JavaScript面试基础知识(二)

    译者按: 总结了大量JavaScript基本知识点,很有用! 原文: The Definitive JavaScript Handbook for your next developer interv ...

随机推荐

  1. Debugging Under Unix: gdb Tutorial (https://www.cs.cmu.edu/~gilpin/tutorial/)

    //注释掉 #include <iostream.h> //替换为 #include <iostream> using namespace std; Contents Intr ...

  2. apollo 项目配置中心开源框架部署

    apollo 于我带来的好处 1. 项目之前的配置信息全部都在 resources 目录下,当然这里我使用的是 Spring Boot 搭建的项目.使用 apollo 后,配置信息全部转移到 apol ...

  3. 【Linux常见命令】cd命令

    BASH_BUILTINS(1) cd命令用于切换当前工作目录至 dirName(目录参数). 其中 dirName 表示法可为绝对路径或相对路径.若目录名称省略,则变换至使用者的 home 目录 ( ...

  4. Django中search fields报错:related Field has invalid lookup: icontains

    models.py 文件 # coding:utf8from django.db import models class Book(models.Model):        name = model ...

  5. Git 常见问题汇总

    git reabse 合并多个commit git rebase -i HEAD~{NUM} git rebase -i start end 会进入一个指定区间的commit列表 根据提示进行文本编辑 ...

  6. 浅谈 Objective-C Associated Objects

    简介 Associated Objects 是 Objective-C 2.0 中 Runtime 的特性之一. 在 <objc/runtime.h> 中定义的三个方法, void obj ...

  7. Yii项目Security加密解密类提取

    <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * ...

  8. Cobbler自动装机试验

    Cobbler自动装机简介:Cobbler是一个使用Python开发的开源项目,通过将部署系统所涉及的所有服务集中在一起,来提供一个全自动的批量快速建立Linux系统的网络安装环境.Cobbler提供 ...

  9. pv(PageView)的解释

    http://blog.sina.com.cn/s/blog_5007d1b10100moka.html 本文转自hblxp32151CTO博客,原文链接:http://blog.51cto.com/ ...

  10. GCD-Euclidean Algorithm

    求解两个正整数的最大公约数(Greatest Common Devisor),可以采用循环进行遍历,不过效率很低.所以引入欧几里得算法(Euclid's algorithm). 欧几里得算法基于GCD ...