Mycat-分表分库的使用

什么是Mycat

  • 分布式数据库中间件

  • Mycat相当于Mysql Server层

  • Mysql相当于Mycat的存储层

  • Mycat中不存储数据,所有的数据存储在Mysql中

  • Mysql是一个数据库中间层

  • Mysql可以实现对后端数据库的分库分表和读写分离

  • Mycat对前端应用隐藏了后端数据库的存储逻辑

什么是数据库中间层

  • 1.中间件

  • 2.可以作为分布式数据库中间层使用

  • 可以实现后端数据库的读写分离负载均衡

  • 3.可以对业务的数据库进行垂直切分

  • 4.对业务进行水平切分

  • 5.控制数据库连接的数量

Mycat的基本元素

  • 逻辑库
    • 后端切分后的多个数据库的视图

    • 对应用来说相当于Mysql中的数据库

    • 逻辑库可对应后端多个物理数据库

    • 逻辑库中并不保存数据

  • 逻辑表
    • 对于应用来说相当于Mysql中的数据表

    • 逻辑表可对应后端多个物理数据库中的表

    • 逻辑表中并不会保存数据

  • 逻辑表的类别
    • 分片表与非分片表按是否被分片划分

    • 全局表在的所有分别片中都存在的表

    • ER关系表,按ER关系进行分片的表(子表关联父表来存储)

安装Mycat

1.Mycat的下载地址

http://dl.mycat.io/

2.安装解压Mycat

mv mycat/ /usr/bin
chown -R mycat:mycat /usr/bin/mycat
#mycat的两种启动方式:脚本、mycat命令

使用mycat命令启动

修改相关的配置文件
vim /usr/bin/mycat/conf/wrapper.conf
    31 wrapper.java.additional.5=-XX:MaxDirectMemorySize=1G     #根据系统最大内存设置大小

3.安装openjdk

4.配置环境变量

如果使用的是源码编译openjdk请自动配置环境变量
vim /etc/profile
    export MyCat_HOME=/usr/local/mycat
    export PATH=$PATH:/home/mysql/bin:/usr/bin/mycat/bin

Mycat主要配置配置解析

常见的配置文件之间的关系

server.xml

  • 文件用途
    • 配置系统相关参数

    • 配置用户访问权限

    • 配置SQL防火墙及其SQL拦截功能

配置Mycat系统参数

<system>
<property name="serverPort">3306</property> #定义mycat对外提供服务的端口
<property name="serverPort">8066</property> <property name="managerPort">9066</property>    #mycat的管理端口
<property name="nonePasswordLogin">0</property> #0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户
<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>   #mycat在那些地方进行监听
<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property>  #前端写参数的大小默认2048
<property name="charset">utf8</property>    #字符编码
<property name="txIsoation">2</property>    #mysql隔离级别,1读未提交,2读已提交,3可重复读,4序列化读,mysql默认为3
<property name="processors">1</property>    #MYSQL的进程数量,通常为服务器CPU的核数量
<property name="idleTimeout">300000</property>  #代表前端应用和mycat进行连接后多长时间后无使用,主动断开连接。毫秒值
<property name="sqlExecuteTimeout">300</property>   #sql执行时间超过多少秒后断开连接,秒值
<property name="useSqlstat">0</property>
<property name="useGlobeTableCheck">0</property>
<property name="defaultMaxLimit">100</property> #Mycat是分布式数据库的中间件,默认Mycat会返回的数据集做一个限制默认最大100行
<property name="maxPacketSize">104857600</property> #mysql所允许的最大包的大小
</system>

配置登入mycat的用户

<user>配置Mycat的访问用户及权限
<user name="test">
<property name="password">123456</porperty>
<property name="schemas">库名字,库名字</porperty>
<property name="readOnly">false</porperty>
</user>

配置用户访问用户及其权限

dml的顺序=insert,update,select,delete,0表示没有权限1为开启权限

<user name="test">  #test用户
  <privileges  check="true">
  <schema name="库名称" dml="0110">
    <table name="表名" dml='0000'></table>    #没权限
    <table name="表名" dml='1111'></table>    #什么权限都有
  </schema>
  </privileges>
</user>

对Mycat用户进行加密

java -cp Mycat-server-1.6.5-release.jar io。mycat.util.DecryptUtil 0:root:123456 #调用Mycat的包,和java的类,0代表前端应用对密码的加密,root:123456账号和密码

log4j2.xml

  • 文件用途
    • 配置输出日志的格式
    • 配置输出日志的级别

配置方式

<pattern>配置MyCat日志格式

<PatternLayout>
  <Pattern>
   %d{yyyy-MM-dd HH:mm:ss.SSS}%5p [%t] -%m%n
  </Pattern>
</PatternLayout>

解释:
-> %d{yyyy-MM-dd HH:mm:ss.SSS} 表示日志的时间格式24小时制
-> %5p 表示输出的日志级别
-> %t日志中记录线程名称
-> %m 输出代码中提定的消息
-> %n 输出一个回车换行符,Windows平台为"/r/n",linux平台为"/n"

level属性配置Mycat日志级别

<asyncRoot level="info" includeLocation="true"/>
由低到高:
ALL < Trace < Debug < Info <Warn <Error < Fatal < OFF

rule.xml

文件用途

  • 配置水平分片的分片规则

  • 配置分片规则所对应的分片函数

rule.xml配置详情

<tableRule>标签配置表的分片规则

<tableRule name="hash-mod-4_id">
  <rule>
    <columns>id</columns>
    <algorithm>hash-mod-4</algorithm>
  </rule>
</tableRule>

解释:
-> <tableRule name=" ">,name属性指定分片表规则的名字,这个命名要唯一
-> <columns>指定分片列,mycat会对指定的分片列进行运算,通常用业务主键或关键链来进行分片
-> <algorithm>指定表的分片算法,区<function>的name属性

<function>配置表的分片算法
1.<function name="hash-mod-4">
2.<class="io.mycat.route.function.PartitionByHashMod">
3.<property name="count">4</property>
4.</function>

解释:
-> <class="">实现分片算法的一个Java类的全名,上面是实现hash取模的算法
-> <property name=""></property>指定了分片算法的参数名和值

schema.xml

  • 文件用途
    • 配置逻辑库以及逻辑表

    • 配置逻辑表所存储的数据节点

    • 配置数据节点所对应的物理数据库的服务器信息

<schema>定义逻辑库

  • 逻辑库和逻辑表相当于关系行数据库中的视图,是不会实际存储数据的,数据实际上是存储在真实机器的数据库中
<schema name="testdb" checkSQLschema="false"
sqlMaxLimit="1000"></schema>

解释:
-> 逻辑库的库名称不能重名字
-> name 属性定义逻辑库的名字
-> checkSQLschema 属性判断是否检查发送给MyCat的SQL是否包含库名称
-> sqlMaxLimit 限制返回结果集的行数,-1表示关闭Limit限制

table标签

<table>定义逻辑表

<table name="customer_login" primaryKey="customer_id" dataNode="logindb01,logindb02" rule="customer_login"/>

解释:
-> name 属性定义逻辑表的名字,逻辑表名要和后端物理表必须一致
-> primaryKey 定义了逻辑表的主键
-> dataNode 定义了表数据所存储的数据节点
-> rule定义了逻辑表分片规则,对应rule.xml中的<tableRule>

dataNode标签

<dataNode>定义逻辑表存储的物理数据库

<dataNode name="imooc" dataHost="mysql0113" database="imooc_db" />

解释:
-> name 属性定义数据节点的名称,唯一
-> dataHost 属性定义分片所在的真实物理机器的位置
-> database 定义后端物理数据库的名字

dataHost标签

<dataHost>定义后端数据库主机信息

<dataHost name="mysql001" maxCon="1000" minCon="10" balance="1" write Type="0" dbTpye="mysql dbDriver="native" switchType="1">
  <heartbeat>select user()</heartbeat>
  <writeHost host="IP地址" url="IP地址:mysql端口" user="用户名" password="密码">
  <readHost host="IP地址" url="IP地址:mysql端口" user="用户名" password="密码">
  </writeHost>
</dataHost>

解释:
-> name="" 定义真实服务器连接的数据池
-> MaxCon 定义最大连接数
-> minCon 定义最大连接
-> balance 定义读写分离负载均衡的工作方式
    -> 0 不开启读写分离机制,适合只有一台数据库的情况,读写敏感的服务可以取消
    -> 1 全部的readHost与stand by writeHost(配置的第二个或以上的写服务器标签)参与select语句的负载均衡
    -> 2 所有的readHost与writeHost都参与select语句的负载均衡,压力不大的时候可以使用
    -> 3 所有readHost参与select语句的负载均衡,适合一主多从的类型
-> writeType 定义后端数据的写操作类型
    -> 0 所有的写操作全由标签配置的第一个写主机来执行,只有当第一个写主机宕机才会让第二个写主机开始写
    -> 1 所有的写请求将会随机的发送到任意的写主机上执行,PXC集群时候使用该选项
-> dbType 定义mycat后端所连接的数据库的类型
-> dbDriver 定义mycat后端所使用的驱动程序
    -> native mysql原生的通讯协议
    -> jdbc 连接其他的关系型数据的时候使用这个
-> switchType 定义写数据库怎么使用高可用的切换
    -> 1 表示当每一个writeHost不可访问的时候都会自动切换到第二个writeHost
    -> -1 关闭自动切换的功能,MMM、MHA都建议关闭该功能
-> <heartbeat> 表示如何检查后端数据库是否可用,select user() 返回当前的mysql用户
-> <writeHost> 
    -> host 定义数据库名称
    -> url 定义IP和端口号
    -> user,passwd 后端真实数据库的用户和密码
-> <readHost> 设置读的真实数据库,不解释

常用的分片算法

  • 简单取模-PartitionByMod
    • 可以用于分片列为整数类型的表

    • 分片列Mod分片基数

    • 类全名:io.mycat.route.funcation.PartitionByMod

配置简单的取模-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>
  • 哈希取模-PartitionByHashMod
    • 额可以用于多种数据类型如字符串,日期等

    • hash(分片列)mod分片基数

    • 类全名:io.mycat.route.function.PartitionByMod

<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>
  • 枚举分片-PartitionByFileMap
    • 可以根据可能的枚举值指定数据存储的位置

    • $MYCAT/conf 目录下增加MapFile配置枚举值同节点的对应关系

    • 类全名:io.mycat.route.funcation.PartitionByFileMap

<funcation name="hash-int"
class="io.mycat.route.funcation.PartitionByFileMap">
  <property name="mapFile">partition-hash-int.txt</property>
  <property name="type">0</property>
  <property name="defaultNode">0</property>
</function>

解释:
-> 第三列,partition-hash-int
-> 第四列,0表示inter(整数),非0表示string(字符串)
-> 第五列,>=0启动默认节点,<0不启动默认节点
  • 字符串范围取模分片-PartitionByPrefixPattern
    • 可以根据指定字符串的前N个字符确定存储的位置

    • $MYCAT/conf 增加MapFile配置取模范围同节点的对应关系

    • 类全名:io.mycat.route.funcation.PartitionByPrefixPattern

<funcation name="sharding-by-prefix-pattern"
class="io.mycat.route.funcation.PartitionByPrefixPattern">
  <property name="patternValue">128</property>
  <property name="prefixLength">2</property>
  <property name="mapFile">prefix-partition-pattern.txt</property>
</function>

解释:
-> 第三列,patternValue,取模的基数
-> 第四列,prefixLength​,表示取头几个参数进行取模的依据
-> 第五列,配置文件的文件名取模范围和相关的数据节点索引对应的关系,每行数据对应的存放位置

数据库架构升级垂直分库

  • 1.为了节约成本

  • 2.提高负载能力

  • 3.满足业务的需要

垂直分库的步骤

  • 1.收集分析业务模块之间的关系

  • 2.复制数据库到其他的实例中
    • 2.1 备份源数据库并且记录相关事务点

    • 2.2 在原数据库中建立复制用户

    • 2.3 在新的实例上恢复备份数据库

    • 2.4 在新的实例上配置复制链路

    • 2.5 在新的实例上启动复制

  • 3.配置Mycat垂直分库

  • 4.通过Mycat来访问DB

  • 5.删除原库中已迁移的表

配置环境步骤

Mycat-分表分库的使用》有3个想法

  1. I would like to get across my admiration for your generosity giving support to all those that must have assistance with this particular concern. Your real dedication to getting the message up and down has been really valuable and have consistently encouraged somebody like me to reach their ambitions. Your personal useful help and advice denotes this much to me and still more to my office colleagues. Thanks a ton; from each one of us.

发表评论