# Mycat配置


<!--more-->


## 1. server.xml配置

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

### 1.1 user标签

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

```xml
<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标签

```xml
<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，并且提供了包含本地配置和数据库配置等多种实现方式。

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

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

- 本地文件

  此方式 Mycat 将 sequence 配置到文件中，当使用到 sequence 中的配置后，Mycat 会更新 classpath中的 sequence_conf.properties 文件中 sequence 当前的值。

  ```properties
  #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） 等信息。

  ```mysql
  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文件

  ```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标签来划分这些不同的逻辑库。

```xml
<!-- 逻辑库 --> 
<schema name="lg_edu_order" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"></schema>
```

![img_89](https://img.zhaojq.top/20260727091820997.png "img_89")

### 2.2 table标签

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

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

![img_90](https://img.zhaojq.top/20260727091821255.png "img_90")

### 2.3 dataNode标签

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

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

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

### 2.4 dataHost标签

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

```xml
<dataHost name="lg_edu_order_1" maxCon="100" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> </dataHost>
```

![img_91](https://img.zhaojq.top/20260727091821547.png "img_91")

### 2.5 heartbeat标签

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

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

### 2.6 writeHost和readHost标签

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

```xml
<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>
```

![img_92](https://img.zhaojq.top/20260727091821966.png "img_92")

## 3. rule.xml

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

### 3.1 tableRule标签

```xml
<tableRule name="c_order_rule"> 
  <rule>
    <columns>user_id</columns> 
    <algorithm>partitionByOrderFunc</algorithm> 
  </rule> 
</tableRule>
```

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

### 3.2 function标签

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

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

