Mycat核心配置
Posted 算法技术猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mycat核心配置相关的知识,希望对你有一定的参考价值。
Contents
schema.xml配置
server.xml配置
rule.xml配置
mycat作为数据库中间件,在部署mycat服务之前,需要先准备mysql服务(也可以准备其他数据库服务),本文以mysql作为数据库,部署mysql服务可参考:。mycat核心配置文件包括schema.xml、server.xml以及rule.xml,下面将进行具体的介绍
schema.xml配置
schema.xml配置文件中主要包含<schema>、<dataNode>、<dataHost>三个标签:
<schema>主要用于定义数据库的组织及结构,可以指定具体表名等;
<dataNode>主要用于指定mysql的具体数据库名称,并且将<schema>和<dataHost>进行关联;
下面时schema.xml的具体配置,配置schema.xml时,标签的顺序必须先定义<schema>,然后再定义<dataNode>,最后才定义<dataHost>的内容,否则在启动mycat时会失败(也算是mycat的奇葩设计了)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="test-schema" checkSQLschema="false" sqlMaxLimit="100" dataNode="test_node">
<!--
如果不配置<table>标签,则默认test_node节点对应的数据库中所有的表,都只是普通表,即不进行分库分表操作
name:mycat中的表名称,如果配置不是单库分表,则也是mysql中的表名称,如果配置是单库分表,则mysql数据库中可能不存在 名称为test的表,而只有test0,test1等表
rule: 表分片要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性值一一对应
primaryKey: 表的主键
autoIncrement: 表是否有自增主键
subTables: 如果需要进行单库分表的话,需要指定子表名称,如subTables="test$0-4",即表示mysql数据库中有test0,test1 ... test4等5张表
dataNode:如果是单库分表,dataNode只能指定一个节点
如果是多库分表,则dataNode需要指定多个节点(dataNode="test_node1,test_node2"),并且subTables不能指定子表,即subTables不填写
-->
<table name="test" subTales="test$0-4" rule="test-rule" primaryKey="id" autoIncrement="true" dataNode="test_node"/>
</schema>
<!-- 如果还有schema的配置,则继续配置schema,待所有schema配置完成后,再开始配置dataNode -->
<!--
name:dataNode的名称
dataHost:关联的dataHost标签名称
database:mysql中数据库的名称
-->
<dataNode name="test_node" dataHost="test_host" database="mycat_test"/>
<!-- 如果还有dataNode的配置,则继续配置dataNode,待所有dataNode配置完成后,再开始配置dataHost -->
<!--
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
2. balance="1",全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
3. balance="2",所有读操作都随机的在 writeHost、readhost 上分发。
4. balance="3",所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,
注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
dbType:指定后端连接的数据库类型,mysql、mongodb、oracle、spark 等
dbDriver:指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。从 1.6 版本开始支持 postgresql 的 native 原始协议。
switchType:-1 表示不自动切换
1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换,心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)心跳语句为 show status like ‘wsrep%’
-->
<dataHost name="test_host" maxCon="1000" minCon="10" balance="3" dbType="mysql" dbDriver="native">
<!-- 心跳检测的sql语句 -->
<heartbeat>select user()</heartbeat>
<!--
可配置多个writeHost 如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用;
(1)当10.0.0.1:3306宕机后,10.0.0.2:3306也不可用,此时会将数据源切换到10.0.0.3:3306,在切换数据源的过程中,mycat服务是不可用的,切换完成后,mycat才能继续提供服务
(2)10.0.0.1:3306和10.0.0.2:3306的配置为读写分离的配置,读数据时,会从10.0.0.2:3306服务读,在10.0.0.1:3306服务进行写数据
-->
<writeHost host="hostM1" url="10.0.0.1:3306" user="root" password="testmaster" >
<readHost host="hostS1" url="10.0.0.2:3306" user="root" password="testslave" />
</writeHost>
<writeHost host="hostM2" url="10.0.0.3:3306" user="root" password="testslave" />
</dataHost>
</mycat:schema>
上述是最简单的schema.xml配置,在此基础上我们可以配置单库分表、多库分表等,后续会进行介绍。
server.xml配置
server.xml中主要配置了一些系统变量、mycat调优变量、以及访问mycat的账户信息
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<!-- 系统全局配置 -->
<system>
<property name="charset">utf8mb4</property>
<!-- 批量插入数据时,表示主键序列化方式,0 为本地文件方式(缺点:当 MyCAT 重新发布后,配置文件中的 sequence 会恢复到初始值;优点:本地加载,读取速度较快。),1 为数据库方式,2 为时间戳序列方式,3 为分布式ZK ID 生成器,4 为 zk 递增 id 生成 -->
<property name="sequnceHandlerType">0</property>
</system>
<!--
这个标签主要用于定义登录 mycat 的用户和权限
1、用户名:user标签中的name指定的值
2、密码:name="password"中配置的值
3、可访问的schema为rec_themis,可配置多个schema,如:rec_themis,rec_bi,rec_foundation等(这些scheme需得在schema.xml中配置)
4、readOnly未true表示只读
5、benchmark:连接服务降级处理,当前端的整体 connection 数达到基准值时,对来自该账户的请求开始拒绝连接,0或不设表示不限制
-->
<user name="test_user">
<property name="password">test_pwd</property>
<!-- schema.xml中<schema>标签name的值 -->
<property name="schemas">test_schema</property>
<!-- 是否只读 -->
<property name="readOnly">false</property>
<property name="benchmark">0</property>
</user>
</mycat:server>
当需要链接mycat服务时,需要知道链接mycat的用户名和密码,<user>标签中即可指定登录mycat服务的账户信息,可通过mysql命令行的方式登录,spring datasource链接时也需要知道其账户信息
#127.0.0.1为mycat服务的ip地址
mysql -h127.0.0.1 -utest_user -ptest_pwd -P8066
或者
xxx.jdbc-url=jdbc:mysql://127.0.0.1:8066/multi_node_schema
xxx.username=test_user
xxx.password=test_pwd
rule.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<!-- name的值必须和schema.xml中<table>标签中rule属性的值保持一致 -->
<tableRule name="test-rule">
<rule>
<!-- 分表的字段名称 -->
<columns>id</columns>
<!-- 分表策略函数名称,与下面的function name属性保持一致 -->
<algorithm>test_func</algorithm>
</rule>
</tableRule>
<!-- 分表算法,PartitionByMod为取模算法 -->
<function name="test_func" class="io.mycat.route.function.PartitionByMod">
<!-- 如果是多库分表,count则是dataNode的数量,如果是单库分表,count则是子表的数量 -->
<property name="count">3</property>
</function>
</mycat:rule>
mycat的核心配置即上述的schema.xml、server.xml以及rule.xml配置文件,如果需要使用批量插入功能,则需要在sequence_conf.properties配置文件中,配置相关表主键的序列号;除此之外,还有其他配置文件,如zookeeper相关的配置文件等。
后续文章规划:
1、用k8s部署mycat构建成的docker镜像
2、测试mycat单库分表、多库分表、创建表和rename表、批量插入、跨库join等功能
相关阅读:
以上是关于Mycat核心配置的主要内容,如果未能解决你的问题,请参考以下文章
MyCat学习第一天之MyCat简介,配置文件详解,分片操作,分片规则