Mycat核心概念以及核心配置项(server.xml、schema.xml、rule.xml内部标签详细分析)

一、Mycat描述

Mycat 是一个实现了MySQL协议的Server,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原生协议或JDBC协议与多个MySQL服务器通信,其核心功能是分表分库,即将一个大表水平分割为N个小表,存储在后端MySQL服务器里或者其他数据库里。

  • 对于DBA来说,可以这么理解 Mycat
    Mycat 就是MySQL Server,但是Mycat 本身并不存储数据,数据是在后端的MySQL上存储的,因此数据可靠性以及事务等都是MySQL保证的。
  • 对于软件工程师来说,可以这么理解 Mycat
    Mycat 就是一个近似等于MySQL的数据库服务器,你可以用连接MySQL的方式去连接Mycat(除了端口不同,默认的Mycat 端口是8066而非MySQL的3306,因此需要在连接字符串上增加端口信息),大多数情况下,可以用你熟悉的对象映射框架使用Mycat,但建议对于分片表,尽量使用基础的SQL语句,因为这样能达到最佳性能,特别是几千万甚至几百亿条记录的情况下。
  • 对于架构师来说,可以这么理解Mycat
    Mycat是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的Mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

二、Mycat核心概念

1、逻辑库

对数据进行分片处理之后,从原有的一个库,被切分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储。Mycat在操作时,使用逻辑库来代表这个完整的数据库集群,便于对整个集群操作。

2、逻辑表

既然有逻辑库,那么就会有逻辑表,分布式数据库中,对应用来说,读写数据的表就是逻辑表。

3、分片表

分片表,是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。例如在mycat 配置中的t_node就属于分片表,数据按照规则被分到dn1,dn2两个分片节点上。

<table name="t_node" primarykey="vid" autoIncrement="true" dataNode="dn1,dn2" rule="rule1"/>

4、非分片表

一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片是相对分片表来说的,就是那些不需要进行数据切分的表。如下配置中t_node,只存在于分片节点dn1上。

<table name="t_node" primarykey="vid"  autoIncrement="true" dataNode="dn1"/>

5、ER表

Mycat提出了靠于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖于父表,通过表分组(Table Group)保证数据join不会跨库操作。表分组(Table Group)是解决跨分片数据join的一种很好的思路,也是数据切分规划的重要一条规则。

6、全局表

一个真实的业务系统中,往往存在大量的类似字典表的表,这些表基本上很少变动,字典表具有以下几个特性:

  • 变动不频繁;
  • 数据量总体变化不大;
  • 数据规模不大,很少有超过数十万条记录。

对于这类的表,在分片的情况下,当业务表因为规模而进行分片以后,业务表与这些附属的字典表之间的关联,就成了比较棘手的问题,所以Mycat 中通过数据冗余来解决这类表的join,即所有的分片都有一份数据的拷贝,所有将字典表或者符合字典表特性的一些表定义为全局表。数据冗余是解决跨分片数据join的一种很好的思路,也是数据切分规划的另外一条重要规则。

7、分片节点

数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点dataNode。

8、节点主机

数据切分后,每个分片节点不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点所在的机器就是节点主机,为了规避单节点主机并发数限制,尽量将读写压力高的分片节点均衡的放在不同的节点主机dataHost。

9、分片规则

一个大表被分成若干个分片表,就需要一定的规则rule,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据切分选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。

三、server.xml配置

server.xml几乎保存了所有mycat 需要的系统配置信息。

1、user标签

这个标签主要用于定义登录mycat的用户和权限。例如下面的例子中,我们定义了一个用户,用户名为user、密码也为user,可访问的schema为mycat1。

<user name="user">
<property name="password">user</property>
<property name="schemas ">mycat1</property>
<property name="readonly">true</property>
<property name="defaultschema">mycat1</property>
</user>

2、firewall标签

<firewall>
<!--ip白名单用户对应的可以访问的ip地址-->
<whitehost>
<host host="127.0.0.*" user="root"/>
<host host="127.0.*" user="root"/>
<host host="127.*" user="root"/>
<host host="1*7.*" user="root"/>
</whitehost>
<!--黑名单允许的权限后面为默认-><blacklist check="true">
<property name="selelctA1low">false</property>
<property name="selelctIntoA1low">false</property>
<property name="updateA11ow">false</property>
<property name="insertA1low">false</property>
<property name="deletetA11ow">false</property>
<property name="dropA1low">false</property>
</blacklist>
</firewall>

3、全局序号

在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,Mycat提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。

<system>
<property name="sequnceHandlerType">0</property>
</system>

0表示使用本地文件方式;1表示使用数据库方式生成;2表示使用本地时间戳方式;3表示基于Zk与本地配置的分布式ID生成器;4表示使用zookeeper递增方式生成。

  1. 本地文件
    此方式Mycat将sequence配置到文件中,当使用到sequence中的配置后,Mycat会更下slasspath中的sequence conf.properties文件中sequence当前的值。
#default global sequence 
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000
#self define sequence 
COMPANY.HISIDS=
COMPANY.MINID=1001
COMPANY.MAXID=2000
COMPANY.CURID=1000

ORDER.HISIDS=
ORDER.MINID=1001
ORDER.MAXID=2000
ORDER.CURID=1000
  1. 数据库方式
    在数据库中建立一张表,存放 sequence名称(name),sequence当前值(current value),步长(increment)等信息。
CREATE TABLE MYCAT_SEQUENCE
( 
name VARCHAR(64)NOT NULL, 
current_value BIGINT(20)NOT NULL,
increment INT NOT NULL DEFAULT 1, 
PRIMARY KEY(name)
)ENGINE=InnoDB;
  1. 本地时间戳方式
    ID为64位二进制,42(毫秒)+5(机器ID)+5(业务编码)+12(重复累加)
    换算成十进制为18位数的long类型,每毫秒可以并发12位二进制的累加。
    在Mycat 下配置sequence_time conf.properties文件
WORKID=0-31任意整数
DATAACENTERID=0-31任意整数

每个Mycat 配置的WORKID、DATAACENTERID不同,组成唯一标识,总共支持32*32=1024种组合。

  1. 分布式Zk ID生成器
    zk的连接信息统一在mvid.properties的zkURL属性中配置。基于Zk与本地配置的分布式ID生成器,InstancelD可以通过zk自动获取,也可以通过配置文件配置。在sequence_distributed conf.properties,只要配置INSTANCEID=ZK就表示从ZK上获取InstancelD。

ID最大为63位bit,可以承受单机房单机器单线程1000*(2/6)=640000的并发。结构如下

  • current time millis(微秒时间戳38位,可以使用17年)
  • slusterld(机房或者Zkid,通过配置文件配置,5位)
  • instanceld(实例ID,可以通过Zk或者配置文件获取,5位)
  • threadld(线程ID,9位)
  • increment(自增,6位)
  1. Zk递增方式
    zk的连接信息统一在myid.properties的kURL属性中配置。需要配置sequence_conf.properties文件
  • TABLE.MINID某线程当前区间内最小值
  • TABLE.MAXID某线程当前区间内最大值
  • TABLE.CURID某线程当前区间内当前值

四、schema.xml配置

schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片节点等信息。

1、schema标签

schema 标签用于定义Mycat实例中的逻辑库,Mycat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库。

<!--逻辑库-->
<schema name="mycat" checksQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>

在这里插入图片描述

2、table标签

table标签定义了Mycat中的逻辑表,所有需要拆分的表都需要在这个标签中定义

<table name="b_order" dataNode="dn1,dn2"  rule="b_order_rule" primarykey="ID" autoIncrement="true"/>

在这里插入图片描述

3、dataNode标签

dataNode标签定义了MyCat中的分片节点,也就是我们通常说所的数据分片。

<!--数据节点-->
<dataNode name="dn1" dataHost="b_order_1" database="b_order_1"/>

name:定义数据节点的名字,这个名字需要是唯一的,我们需要在table标签上应用这个名字,来建立表与分片对应的关系。
dataHost:用于定义该分片属于哪个分片主机,属性值是引用dataHost标签上定义的name属性。
database:用于定义该分片节点属于哪个具体的库。

4、dataHost标签

dataHost标签在Mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句

<dataHost name="b_order_1" maxcon="100" mincon="10" balance="0"  writeType="0" dbType="mysq1" dbDriver="native" switchType="1" slaveThreshold="100">
</dataHost>

在这里插入图片描述

5、heartbeat标签

heartbeat标签内指明用于和后端数据库进行心跳检查的语句。例如:MySQL可以使用select user()、Oracle可以使用select 1 from dual等

<dataHost>
<heartbeat>select user()</heartbeat>
</dataHost>

6、writeHost和readHost标签

writeHost和readHost标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。在一个dataHost 内可以定义多个writeHost和readHost。但是,如果writeHost 指定的后端数据库宕机,那么这个writeHost 绑定的所有 readHost都将不可用。另一方面,由于这个writeHost 宕机系统会自动的检测到,并切换到备用的writeHost上去。

balance参数:

  • 0:所有读操作都发送到当前可用的writeHost
  • 1:所有读操作都发送到readHost和stand by writelost。
  • 2:所有读操作都随机发送到writeHost和readHost
  • 3:所有读操作都随机发送到writeHost对应的readHost上,但是writeHost不负担读压力

writeType参数:

  • 0:所有写操作都发送到可用的writeHost
  • 1:所有写操作都随机发送到readHost
  • 2:所有写操作都随机发送到writeHost,readHost

switchType参数(是否主从延时切换):

  • 0:表示不自动切换
  • 1:表示自动切换
  • 2:基于MySQL主从同步状态决定是否切换
  • 3:基于MySQL cluster集群切换机制
<dataHost name="b_order_2" maxcon="100" mincon="10" balance="0" writeType="0" dbType="mysql" dbpriver="native" switchrype="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="M1" url="192.168.0.0:3306" user="root" password="1234">
</writeHost>
</dataHost>

在这里插入图片描述
主从延时切换:
1.4开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
MyCAT 心跳检查语句配置为show slave status,datahost 上定义两个新属性:switchType=“2"与slaveThreshold=“100”,此时意味着开启MySQL主从复制状态绑定的读写分离与切换机制,Mycat 心跳机制通过检测 show slave status 中的"Seconds_Behind_Master",“Slave_lO_Running”,"Slave_SQL_Running"三个字段来确定当前主从同步的状态以及Seconds_Behind_Master 主从缆制时延,当Seconds_Behind_Master>
slaveThreshold 时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据,而当主节点右机后,切换逻辑会检查 Slave上的Seconds_Behind_Master是否为0,为0时则表示主从同步,可以安全切换,否则不会切换。

在这里插入图片描述

1.4.1开始支持MySQL 集群模式,让读更加安全可靠,配置如下:MyCAT心跳检查语句配置为show status like wsrep%’,dataHost 上定义两个新属性:switchType=“3”
此时意味着开启MySQL 集群复制状态状态绑定的读写分离与切换机制,Mycat心跳机制通过检测集群复制时延时,如果延时过大或者集群出现节点问题不会负载改节点。

在这里插入图片描述

五、rule.xml配置

rule.xml用于定义Mycat的分片规则。

1、tableRule标签

<tableRule name="c_order_rule">
<rule>
<columns>user_id</columns>
<algorithm>partitionByorderFunc</algorithm>
</rule>
</tableRule>

name:指定唯一的名字,用于标识不同的表规则。
columns:指定要拆分的列名字。
algorithm:使用function标签中的name属性,连接表规则和具体路由算法。

2、function标签

<function name="partitionByorderFunc" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>

name:指定算法的名字。
class:制定路由算法具体的类名字。
property:为具体算法需要用到的一些属性。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值