mycat配置看这一篇就懂了(代码片段)

沸羊羊_ 沸羊羊_     2022-12-17     499

关键词:

前言

本文将对 Mycat 配置文件进行详细介绍,搞清楚配置文件的信息,才是正确使用 Mycat 的前提。

【图片来源网络】

应用连接Mycat服务时,Mycat首先会通过server.xml中的配置信息进行用户认证。用户通过验证后,所看到的逻辑库、逻辑表都是schema.xml中所配置的。当使用了水平切分时,Mycat会通过rule.xml里配置的规则来定位具体的物理数据库位置,从而完成写入/读取数据。


server.xml 配置

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


system 标签

用于配置 Mycat 的系统参数,其格式如下:

<system> 
    <!-- $key表示配置属性的名称,$value表示该配置属性的值 --> 
    <property name="$key">$value</property> 
</system>

常见的系统参数举例:

<system> 
    <!-- mycat 服务连接端口 --> 
    <property name="serverPort">8066</property> 
    <!-- mycat 服务管理端口 --> 
    <property name="managerPort">9066</property> 
    <!-- mycat 服务监听的ip --> 
    <property name="bindIp">0.0.0.0</property> 
    <!-- 0为需要密码登陆、1为不需要密码登陆;默认为0,设置为1则需要指定默认账户--> 
    <property name="nonePasswordLogin">0</property> 
    <!-- 前端连接的写队列大小 --> 
    <property name="frontWriteQueueSize">2048</property> 
    <!-- 设置字符集编码 --> 
    <property name="charset">utf8</property> 
    <!-- mycat 的进程数量 --> 
    <property name="processors">8</property> 
    <!-- 闲置连接超时时间,单位:毫秒 --> 
    <property name="idleTimeout">1800000</property>
    <!-- 默认最大返回的数据集大小 --> 
    <property name="defaultMaxLimit">100</property> 
    <!-- 允许的最大包大小 --> 
    <property name="maxPacketSize">104857600</property> 
    <!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。 
    在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误--> 
    <property name="ignoreUnknownCommand">0</property> 
    <!-- 1表示发送握手数据包-->
    <property name="useHandshakeV10">1</property> 
    <!-- 禁止移除SQL中对关键字转义的 `` 符号-->
    <property name="removeGraveAccent">1</property> 
    <!-- 1为开启实时统计、0为关闭 --> 
    <property name="useSqlStat">0</property> 
    <!-- 1为开启全加班一致性检测、0为关闭 --> 
    <property name="useGlobleTableCheck">0</property> 
    <!-- SQL 执行超时 单位:秒--> 
    <property name="sqlExecuteTimeout">300</property> <property name="sequnceHandlerType">1</property> 
    <!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况--> 
    <property name="sequnceHandlerPattern">(?:(\\s*next\\s+value\\s+for\\s*MYCATSEQ_(\\w+))(,|\\)|\\s)*)+</property> 
    <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false --> 
    <property name="subqueryRelationshipCheck">false</property> 
    <!-- 指定自定义全局序列号加载类 --> 
    <property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property> 
    <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --> 
    <property name="processorBufferPoolType">0</property> 
    <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),
    2为不过滤分布式事务,但是记录分布式事务日志--> 
    <property name="handleDistributedTransactions">0</property>
    <!-- off heap for merge/order/group/limit 1开启;0关闭 --> 
    <property name="useOffHeapForMerge">0</property> 
    <!--是否采用zookeeper协调切换 --> 
    <property name="useZKSwitch">false</property> 
    <!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--> 
    <property name="strictTxIsolation">false</property> 
    <!-- Mycat连接数据库时使用的隔离级别 1 - 读未提交 2 - 读已提交 3 - 可重复读 4 - 串行化 --> 
    <property name="txIsolation">2</property>
    <!-- 是否采用zookeeper协调切换 --> 
    <property name="useZKSwitch">true</property> 
    <!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行--> 
    <property name="parallExecute">0</property> 
</system>

user 标签

用于配置Mycat的访问用户及权限,其格式如下:

<user name="root" defaultAccount="true">
    <property name="password">123456</property>
    <property name="schemas">TESTDB</property>
    <property name="defaultSchema">TESTDB</property>
    <!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->

    <!-- 表级 DML 权限设置 -->
    <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                    <table name="tb01" dml="0000"></table>
                    <table name="tb02" dml="1111"></table>
            </schema>
    </privileges>
</user>
  • name 指定用户名
  • defaultAccount 设置当前账号是否为默认账号

property 标签

  • password 指定账号密码
  • schemas 给当前账户设置可访问的 schema,可指定多个,用逗号隔开
  • readOnly true 代表为只读,false 代表可读写
  • banchmark 限制前端整体连接数量,如果值为0或不设置,则表示不限制连接数量
  • usingDecrypt 0 代表不对密码加密,1 代表对密码进行加密

privileges 标签

对用户的 schema以及表进行精细化的DML权限控制。

check 属性表示是否开启DML权限检查,默认是关闭。

dml顺序说明:insert,update,select,delete

schema标签中属性:

  • name 指定逻辑库名称
  • dml 当前用户对此逻辑库的权限控制

table标签中属性:

  • name 指定逻辑表名称
  • dml 当前用户对此逻辑表的权限控制,其中,逻辑表 tb01 没有权限,tb02有四种权限

firewall 标签

全局防火墙设置,从安全角度保证 Mycat 不被匿名 IP 访问。

<firewall>
    <whitehost>
        <host host="127.0.0.1" user="root"/>
        <host host="127.0.0.2" user="root"/>
    </whitehost>
    <blacklist check="false"></blacklist>
</firewall>
  • writehost 设置白名单,可以使用通配符 %进行设置,白名单代表可以访问的IP
  • blacklist 标签的 check属性为 false 代表不开启黑名单检查,如设置为 true,可以指定 DML权限。

schema.xml 配置

  • 配置逻辑库及逻辑表
  • 配置逻辑表所存储的数据节点
  • 配置数据节点所对应的物理数据库服务器信息

schema 标签

schema 标签用于定义逻辑库,示例:

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
...
</schema>
  • name:指定 schema 名称
  • checkSQLschema:是否检查SQL中的schema名称,例如:执行select * from TESTDB.db1,若此属性设置为 true,Mycat 会把语句修改为 select * from db1
  • sqlMaxLimit:当设置该值时,每条执行的 SQL语句,如果没有加上 limit,Mycat 会自动加上对应的值;如果不设置,默认会把查询的信息全部展示出来。
  • dataNode:用于绑定逻辑库到某个具体的数据库上,如果定义此属性,那么这个逻辑库就不能工作在分库分表模式下了(schema标签内部不得配置任何逻辑表信息),也就是说对这个逻辑库的所有操作会直接作用到绑定的 dataNode 上,这个 schema 就可以用作读写分离和主从切换。

table 标签

使用了schema 标签定义逻辑库之后,还需要使用table 标签定义逻辑表。示例:

<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100"> 
    <!-- 多表定义 --> 
    <table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/> 
    <!-- 单表定义 --> 
    <table name="oc_call" primaryKey="id" dataNode="dn1$0-743" rule="latest-month-calldate"/> 
</schema>
  • name 属性定义逻辑表的名字,必须唯一不能重复且需要与数据库中的物理表名一致。使用逗号分割配置多个表,即多个表使用这个配置
  • primaryKey 属性指定逻辑表中的主键,也是需要与物理表的主键一致
  • dataNode 属性指定物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔,或指定一个索引范围:dn1$0-743。注意数据节点定义之后,顺序不能再发生改变,否则会导致数据混乱
  • rule 属性用于指定分片规则名称,对应rule.xml中的<tableRule>标签的name属性,如无需分片可以不指定
  • splitTableNames 属性定义是否允许多个表的定义

dataNode 标签

dataNode 标签用于定义数据节点,数据节点指向的是存储逻辑表的物理数据库。示例:

<dataNode name="dn1" dataHost="host1" database="test" />

dataNode也就是通常说的数据分片。一个 dataNode 是一个独立的数据分片。用 数据库实例+具体库来定义一个数据分片。

  • name:定义数据节点名称,名称是唯一的
  • dataHost:定义该分片属于哪个数据库实例,属性值是引用在 dataHost 标签上的name属性
  • database:定义该分片属于哪个具体数据库实例上的具体库,

dataHost 标签

dataHost 标签用于定义后端物理数据库主机信息,该标签内有两个子标签,可以定义一组数据库主机信息。例如,定义一组主从集群结构的数据库主机信息:

【图片来自网络】

<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.96.187:3306" user="root" password="123456">
        <readHost host="hostS1" url="192.168.96.187:3306" user="root" password="123456" />
    </writeHost>
</dataHost>

dataHost标签定义了具体的数据库实例,读写分离配置和心跳语句。

  • name:定义 dataHost 唯一标识,与 dataNodedataHost属性一致
  • maxCon:指定每个读写实例连接池的最大连接数,标签内嵌套的 writeHostreadHost标签都会使用此属性值实例化出连接池的最大连接数
  • minCon:指定每个读写实例连接池的最小连接,初始化连接池的大小
  • balance:负载均衡类型。0:所有读操作发送到当前可用的 writeHost上;1:所有读操作随机发送到 readHost上;2:所有读操作随机在 writeHostreadHost上分发
  • writeType:负载均衡类型。0:所有写操作发送到当前可用的 writeHost上;1:所有写操作随机发送到 readHost上;2:所有写操作随机在 writeHostreadHost上分发
  • dbType:指定后端连接的数据库类型,目前支持二进制的Mysql协议,还有其他使用 JDBC 连接的数据库,例如:mongodb,oracle,spark
  • dbDriver:指定连接后端数据库使用的Driver,目前可选的值有nativeJDBC;使用 native执行的是二进制的mysql协议,所以可以使用 Mysql 和 maridb ;其他类型数据库则需要使用 jdbc 驱动来支持
  • switchType:当MySQL服务器宕机时,转换主从关系的类型,如配置一台master,一台slave,如果主节点宕机时,-1:不自动切换,从节点不会自动切换为主节点;1:(默认值)自动切换,从节点切换为主节点,2:基于 MySQL 主从同步的状态决定是否切换,心跳检测语句为:show slave status 3:基于 MySQL galary cluster 的切换机制(适合集群),心跳检测语句为show status like 'wsrep%'
  • slaveThreshold:定义主从复制延时阈值,当Seconds_Behind_Master > slaveThreshold时,读写分离筛选器会过滤掉此Slave机器,防止读到很久之前的旧数据

heartbeat 标签

<heartbeat>select user()</heartbeat>

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

writeHost & readHost 标签

这两个标签都用于配置一组主从数据库的相关信息,Mycat用这两个标签配置的连接信息实例化后端连接池。唯一不同的是,writeHost 配置写实例(master)、readHost 配置读实例(salve),并且readHost 为writeHost 的子标签。通过这两个标签可以组合读/写实例以满足系统的要求。

在一个dataHost内可以定义多个writeHostreadHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,当一个writeHost宕机时系统会自动检测到,并切换到备用的writeHost 上去。

writehost 标签及readHost标签的属性

这两个标签的属性相同,这里就一起介绍:

  • host 属性用于标识不同实例名称,一般writeHost名称使用M1作为后缀,readHost则使用S1作为后缀
  • url 属性用于配置数据库的连接地址,如果是使用nativedbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。例如,当使用JDBC 时则可以这么写:jdbc:mysql://localhost:3306/
  • user 属性配置数据库用户名
  • password 属性配置数据库密码
  • weight 属性配置某个数据库在 readhost 中作为读节点的权重
  • usingDecrypt 属性指定是否对密码加密,默认为0, 若需要开启则配置为1

小结

本文对 Mycat 两个重要的配置文件 server.xmlschema.xml 进行了详细描述,如果 Mycat 感兴趣请关注本专栏其他文章。

论文解读singan全面解读,看这一篇就懂了

(给机器学习算法与Python学习加星标,提升AI技能)本文转自AI新媒体量子位(公众号 ID: QbitAI)SinGAN:LearningaGenerativeModelfromaSingleNaturalImage,作者来自以色列理工学院(Technion)和谷歌(Googleÿ... 查看详情

elasticsearch入门,看这一篇就够了(代码片段)

...xff0c;看这一篇就够了前言可视化工具kibanakibana的安装kibana配置kibana的启动Elasticsearch入门操作操作index创建index索引别名有什么用删除索引查询索引exist索引操作document插入document查询document删除document更新document使用脚本更新documentre... 查看详情

handler看这一篇就够了(代码片段)

Handler使用首先来熟悉一下Handler的四种使用方式,如果比较熟悉可以直接跳过:通过sendMessage消息机制来发送sendEmptyMessage(int);//发送一个空的消息sendMessage(Message);//发送消息,消息中可以携带参数sendMessageAtTime(Message,long... 查看详情

最全排序算法及优化,看这一篇就够了(代码片段)

最全排序算法总结看这一篇就够了没有经过总结的知识是沉重的,无用的瞧一瞧~博健的LeetCode题解:Gitbook版本传送门博健的LeetCode题解:CSDN传送门有趣的CSS:Gitbook传送门前端进阶笔记:Gitbook传送门目录... 查看详情

什么是forkjoin?看这一篇就能掌握!(代码片段)

...本文分享自华为云社区《【高并发】什么是ForkJoin?看这一篇就够了!》,作者:冰河。在JDK中,提供了这样一种功能:它能够将复杂的逻辑拆分成一个个简单的逻辑来并行执行,待每个并行执行的逻... 查看详情

☀️javanio?看这一篇就够了!!☀️(代码片段)

文章目录一、NIO简介1.1NIO概述1.2NIO&IO分析1.2.1IO操作流程1.2.2面向流与面向缓冲区1.2.3阻塞与非阻塞1.2.4.同步与异步二、Buffer基本应用2.1Buffer概述2.2Buffer基本应用三、Channel基本应用3.1Channel概述3.2FileChannel基本应用3.3SocketChanel基... 查看详情

☀️javanio?看这一篇就够了!!☀️(代码片段)

文章目录一、NIO简介1.1NIO概述1.2NIO&IO分析1.2.1IO操作流程1.2.2面向流与面向缓冲区1.2.3阻塞与非阻塞1.2.4.同步与异步二、Buffer基本应用2.1Buffer概述2.2Buffer基本应用三、Channel基本应用3.1Channel概述3.2FileChannel基本应用3.3SocketChanel基... 查看详情

css渐变背景看这一篇就够了(代码片段)

CSS渐变背景看这一篇就够了在我们自己设计网页的时候,为了好看美观,颜色可谓是最让人头疼的一部分。尤其是在配色上又找不到一些好看的网站。今天我就来记录一些好看的渐变式背景,和一些常用的颜色网站。... 查看详情

想要弄懂groupby看这一篇就够了(代码片段)

一、前言groupby关键字,不管是工作中还是面试都会经常被用到,所以弄懂它是非常有必要的。要弄懂groupby那我们就得联合着:聚合函数、groupby、having一块讲解。讲之前我们先准备一张表:二、聚合函数为了讲好groupby我们必须... 查看详情

react中使用typescript的常用注意点(看这一篇就够啦~)(代码片段)

声明类组件interfacePropssex:stringinterfaceStatename:string;classstudentextendsReact.Component<Props,State>constructor(props:Props)super(props);this.state=name:"不写作文的李华";render()return(&l 查看详情

逆转单向链表看这一篇就够了java(代码片段)

逆转单向链表逆转前:1->2->3->4->5->null逆转后:5->4->3->2->1->null个人博客地址:逆转单向链表方法一、循环迭代publicNodereverse(Nodehead)if(head==null||head.next==null)returnhead;//取前面节点Nodepre=head;//取后面 查看详情

系统性的学会pandas看这一篇就够了(代码片段)

作者:MaSizhou https://blog.csdn.net/weixin_45901519/article/details/1129808221、Pandas数据结构2008年WesMcKinney开发出的库专门用于数据挖掘的开源python库以Numpy为基础,借力Numpy模块在计算方面性能高的优势基于matplotlib,能够简便的... 查看详情

jquery框架超详细dom操作看这一篇就够了!(代码片段)

目录写在前面一、内容操作1.html()2.text()3.val()二、属性操作(1)通用属性操作1.attr():2.removeAttr()3.prop()4.removeProp()5.attr和prop区别(2)对class属性操作1.addClass()2.removeClass()3.toggleClass()4.css()三、 查看详情

redux从入门到进阶,看这一篇就够了!(代码片段)

Redux,带你从入门到进阶🌂序言☂️一、基础知识1、Redux概念简述2、Redux的工作流程🎃二、使用Antd实现TodoList页面布局1、在项目中使用Antd2、使用Antd实现TodoList的基本布局3、创建redux中的store(1)创建storeÿ... 查看详情

redux从入门到进阶,看这一篇就够了!(代码片段)

Redux,带你从入门到进阶🌂序言☂️一、基础知识1、Redux概念简述2、Redux的工作流程🎃二、使用Antd实现TodoList页面布局1、在项目中使用Antd2、使用Antd实现TodoList的基本布局3、创建redux中的store(1)创建storeÿ... 查看详情

架构整洁之道,看这一篇就够了!(代码片段)

阿里妹导读:程序的世界飞速发展,今天所掌握的技能可能明年就过时了,但有些知识历久弥新,掌握了它们,你在程序的海洋中就不会迷路,架构思想就是这样的知识。本文是《架构整洁之道》的读书心得,作者将书中内容拆... 查看详情

快速学会springboot的秘诀,看这篇就懂了

...f0c;每个事例先讲解pom.xml中的重要依赖,其次application配置文件,最后是代码实现。让你知其所以,逐步让掌握SpringBoot框架的自动配置,starter起步依赖等特性。相关视频资源:https://www.bilibili.com/video/BV1XQ4y1m7ex1... 查看详情

关于el-upload看这一篇就够了(代码片段)

下述源码分析基于Elementv2.15.9版本前提在解析源码之前,先阐述其重点使用的两个基础内容:<inputtype="file">使用type=“file”的元素使得用户可以选择一个或多个元素以提交表单的方式上传到服务器上,... 查看详情