提示:将对应的mysql的jar放入mycat/lib
server.xml配置
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>
firewall标签
< firewall>
< 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>
全局序列号
在实现分库分表的情况下,数据库自增主键已无法保证自增主键的全局唯一。为此,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 当前的值。
GLOBAL.HISIDS=
GLOBAL.MINID=10001
GLOBAL.MAXID=20000
GLOBAL.CURID=10000
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 的并发。结构如下
current time millis(微秒时间戳 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 某线程当前区间内当前值
schema.xml配置
schema.xml 作为 Mycat 中重要的配置文件之一,管理着 Mycat 的逻辑库、表、分片节点、主机等信息。
schema标签
schema 标签用于定义 Mycat 实例中的逻辑库,Mycat 可以有多个逻辑库,每个逻辑库都有自己的相关配 置。可以使用 schema 标签来划分这些不同的逻辑库。
< schema name = " lg_edu_order" checkSQLschema = " true" sqlMaxLimit = " 100" dataNode = " dn1" > </ schema>
属性名 值 数量限制 说明 dataNode 任意String (0…1) 分片节点 sqlMaxLimit Integer (1) 查询返回的记录数限制limit checkSQLschema Boolean (1) 是否去表库名
table标签
table标签定义了 Mycat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义
< table name = " b_order" dataNode = " dn1,dn2" rule = " b_order_rule" primaryKey = " ID" autoIncrement = " true" />
属性 值 数量限制 说明 name String (1) 逻辑表名 dataNode String (1…*) 分片节点 rule String (0…1) 分片规则 ruleRequired Boolean (0…1) 是否强制绑定分片规则 primaryKey String (1) 主键 type String (0…1) 逻辑表类型,全局表、普通表 autoIncrement Boolean (0…1) 自增长主键 subTables String (1) 分表 needAddLimit Boolean (0…1) 是否为查询SQL自动加limit限制
dataNode标签
dataNode标签定义了 MyCat 中的分片节点,也就是我们通常说所的数据分片。
< dataNode name = " dn1" dataHost = " lg_edu_order_1" database = " lg_edu_order_1" />
name: 定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用这个名字,来建立表与分片对应的关系。
dataHost : 用于定义该分片属于哪个分片主机,属性值是引用 dataHost 标签上定义的 name 属性。
database: 用于定义该分片节点属于哪个具体的库。
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>
属性 值 数量限制 说明 name String (1) 节点主机名 maxCon Integer (1) 最大连接数 minCon Integer (1) 最小连接数 balance Integer (1) 读操作负载均衡类型 writeType Integer (1) 写操作负载均衡类型 dbType String (1) 数据库类型 dbDriver String (1) 数据库驱动 switchType String (1) 主从切换类型
heartbeat标签
heartbeat标签内指明用于和后端数据库进行心跳检查的语句。例如:MySQL 可以使用 select user()、Oracle 可以 使用 select 1 from dual 等
< dataHost>
< heartbeat> select user()</ heartbeat>
</ dataHost>
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>
属性 值 数量限制 说明 host String (1) 主机名 url String (1) 连接字符串 password String (1) 密码 user String (1) 用户名 weight String (1) 权重 usingDecrypt String (1) 是否对密码加密,默认0
rule.xml配置
rule.xml用于定义Mycat的分片规则。
tableRule标签
< tableRule name = " c_order_rule" >
< rule>
< columns> user_id</ columns>
< algorithm> partitionByOrderFunc</ algorithm>
</ rule>
</ tableRule>
name:指定唯一的名字,用于标识不同的表规则。
columns:指定要拆分的列名字。
algorithm:使用 function 标签中的 name 属性,连接表规则和具体路由算法。
function标签
< function name = " partitionByOrderFunc" class = " io.mycat.route.function.PartitionByMod" >
< property name = " count" > 2</ property>
</ function>
name:指定算法的名字。
class:制定路由算法具体的类名字。
property: 为具体算法需要用到的一些属性。
安装Mycat
1、下载mycat
wget http://dl.mycat.org.cn/1.6.7.6/20210730131311/Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz
2、解压
tar -xzvf Mycat-server-1.6.7.6-release-20210730131311-linux.tar.gz
3、启动Mycat
进入mycat/bin
启动命令:./mycat start
停止命令:./mycat stop
重启命令:./mycat restart
查看状态:./mycat status
4、访问Mycat
mysql -uroot -proot -h127.0.0.1 -P8066