Mycat配置
1. server.xml配置
server.xml几乎保存了所有mycat需要的系统配置信息
1.1 user标签
这个标签主要用于定义登录mycat的用户和权限。例如下面的例子中,我们定义了一个用户,用户名为user、密码也为user,可访问的schema为lg_edu_order
<user name="user">
<property name="password">user</property>
<property name="schemas">lg_edu_order</property>
<property name="readOnly">true</property> <
property name="defaultSchema">lg_edu_order</property>
</user>
1.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="selelctAllow">false</property>
<property name="selelctIntoAllow">false</property>
<property name="updateAllow">false</property>
<property name="insertAllow">false</property>
<property name="deletetAllow">false</property>
<property name="dropAllow">false</property>
</blacklist>
</firewall>
1.3 全局序列号
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,Mycat 提供了全局sequence,并且提供了包含本地配置和数据库配置等多种实现方式。
<system>
<property name="sequnceHandlerType">0</property>
</system>
0表示使用本地文件方式;
1表示使用数据库方式生成;
2表示使用本地时间戳方式;
3表示基于ZK与本地配置的分布式ID生成器;
4表示使用zookeeper递增方式生成
-
本地文件
此方式 Mycat 将 sequence 配置到文件中,当使用到 sequence 中的配置后,Mycat 会更新 classpath中的 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
-
数据库方式
在数据库中建立一张表,存放 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;
-
本地时间戳
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种组合
-
分布式zk Id生成器
Zk的连接信息统一在myid.properties的zkURL属性中配置。基于ZK与本地配置的分布式ID生成器,InstanceID可以通过ZK自动获取,也可以通过配置文件配置。 在sequence_distributed_conf.properties,只要配置INSTANCEID=ZK就表示从ZK上获取InstanceID。ID最大为63位二进制,可以承受单机房单机器单线程1000*(2^6)=640000的并发。结构如下
- currenttimemillis(微秒时间戳38位,可以使用17年)
- clusterId(机房或者ZKid,通过配置文件配置,5位)
- instanceId(实例ID,可以通过ZK或者配置文件获取,5位)threadId(线程ID,9位)
- increment(自增,6位)
-
zk递增方式
Zk的连接信息统一在myid.properties的zkURL属性中配置。需要配置sequence_conf.properties文件
- TABLE.MINID某线程当前区间内最小值
- TABLE.MAXID某线程当前区间内最大值
- TABLE.CURID某线程当前区间内当前值
2. schma.xml
schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片节点、主机等信息
2.1 schema标签
schema标签用于定义Mycat实例中的逻辑库,Mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库。
<!-- 逻辑库 -->
<schema name="lg_edu_order" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
2.2 table标签
table标签定义了 Mycat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义
<table name="b_order" dataNode="dn1,dn2" rule="b_order_rule" primaryKey="ID" autoIncrement="true"/>
2.3 dataNode标签
dataNode标签定义了 MyCat 中的分片节点,也就是我们通常说所的数据分片。
<!-- 数据节点 --> <dataNode name="dn1" dataHost="lg_edu_order_1" database="lg_edu_order_1" />
- name: 定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用这个名字,来建立表与分片对应的关系。
- dataHost : 用于定义该分片属于哪个分片主机,属性值是引用 dataHost 标签上定义的 name 属性。
- database: 用于定义该分片节点属于哪个具体的库。
2.4 dataHost标签
dataHost标签在 Mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句
<dataHost name="lg_edu_order_1" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> </dataHost>
2.5 heartbeat标签
heartbeat标签内指明用于和后端数据库进行心跳检查的语句。例如:MySQL 可以使用 select user()、Oracle 可以 使用 select 1 from dual 等
<dataHost>
<heartbeat>select user()</heartbeat>
</dataHost>
2.6 writeHost和readHost标签
writeHost和readHost标签都指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例。在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost 都将不可用。另一方面,由于这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost 上去。
<dataHost name="lg_edu_order_2" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="M1" url="192.168.95.133:3306" user="root" password="1234"> </writeHost>
</dataHost>
3. rule.xml
rule.xml用于定义Mycat的分片规则。
3.1 tableRule标签
<tableRule name="c_order_rule">
<rule>
<columns>user_id</columns>
<algorithm>partitionByOrderFunc</algorithm>
</rule>
</tableRule>
- name:指定唯一的名字,用于标识不同的表规则。
- columns:指定要拆分的列名字。
- algorithm:使用 function 标签中的 name 属性,连接表规则和具体路由算法。
3.2 function标签
<function name="partitionByOrderFunc" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property>
</function>
- name:指定算法的名字。
- class:制定路由算法具体的类名字。
- property: 为具体算法需要用到的一些属性。