MyCat系列二--配置文件之server.xml
csdh11 2025-05-16 12:38 4 浏览
MyCat系列二--配置文件之server.xml
从【安装与基本使用】一文中,可以看到MyCat运行,需要进行一些配置文件的相关配置,本文将重点介绍配置文件server.xml的基本元素信息,尽量了解一些标签的含义,并针对一些做示例演示,由于加深了解与掌握。
- server.xml
Server.xml存储了所有MyCat需要的基本系统配置信息。主要含有如下几个标签:
1.1 user标签
该标签主要用于定义登录 mycat 的用户和权限。
上一篇文章中的示例,此标签定义如下:
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
<property name="defaultSchema">TESTDB</property>
<privileges check="false">
<schema name="TESTDB" dml="1111" >
</schema>
</privileges>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
<property name="defaultSchema">TESTDB</property>
</user>
这里配置了两个可以来连接的用户
用户1 :root 密码:123456
用户2 :user 密码:user 给予了此用户TESTDB数据库的只读权限
注意:这里的testdb不一定是数据库上的真实库名,可以任意指定,只要和schema.xml的配置文件中的库名统一即可。
1.1.1 property子标签
具体声明的属性值定义:
1.1.1.1 password
登录的密码,也就是连接Mycat的密码
例如:
<property name="password">123456</property>
1.1.1.2 readOnly
限制用户是否只是可读的,值为true/false。
例如:
<property name="readOnly">true</property>
1.1.1.3 benchmark
连接服务降级处理基准值,当前端的整体 connection 数达到基准值是, 对来自该账户的请求开始拒绝连接,0 或不设表示不限制。
例如:
<property name="benchmark">5</property>
1.1.1.4 usingDecrypt
是否对密码加密。默认0表示不开启,1表示开启密码加密,同时使用加密程序对密码加密。
例如:
<proerty name="usingDecrypt">0</property>
1.1.1.5 schemas
和schema.xml中的配置关联,多个用逗号分开
例如:
<property name="schemas">TESTDB</property>
1.1.2 privileges子标签
该子标签用于对用户的 schema 及 下级的 table 进行精细化的 DML 权限控制,privileges 标签中的 check 属性是用于标识是否开启 DML 权限检查, 默认 false 标识不检查,由于 Mycat 一个用户的 schemas 属性可配置多个 schema ,所以 privileges 的下级标签 schema 标签同样可配置多个,对多库多表进行细粒度的 DML 权限控制。
DML 权限控制,顺序指的是insert,update,select,delete ,使用一个四位数字表示,数字的每一位值为0(禁止)或者1(允许)。如果设置了 schema的 DML权限控制 , 但只设置了个别 table 的 DML权限控制,那么,其它table会自动继承 schema 的 DML 权限控制属性;或者未设置任何table的 DML权限控制,那么,所有table会自动继承 schema 的 DML 权限控制属性。
1.1.3 示例
如无特殊说明,以下示例中仅仅列出示例相关属性或者标签需要修改的配置。
1.1.3.1 usingDecrypt
出于安全考虑,当需要对mycat用户登录密码进行加密,防止泄露,需要启用该属性。加密的密码需要执行如下命令进行获取:
java -cp Mycat-server-1.6.7.6-release.jar io.mycat.util.DecryptUtil 0:root:123456
注:
Mycat-server-1.6.7.6-release.jar在MyCat解压后的D:\mycat\lib下。
注:加密的密码显示在最后一行:
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
将server.xml中用户root的配置修改为如下,这里仅列出修改的蓝色部分:
<property name="password">GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==</property>
<property name="usingDecrypt">1</property>
之后,重启MyCat服务:
mycat restart
尝试使用原来的配置进行连接登录,正常登录,如下图所示。
如果密码仍然为设置为明文123456,但usingDecrypt设置为开启,如下:
<property name="password">123456</property>
<property name="usingDecrypt">1</property>
重启MyCat服务,会发现启动异常。
mycat restart
查看日志wrapper.log,会看到如下信息:
Caused by: io.mycat.config.util.ConfigException: user root passwrod need to decrype ,but decrype password is wrong !
1.1.3.2 benchmark
设置为如下:
<property name="benchmark">5</property>
重启MyCat服务,并进行数据库连接,发现当连接数为5的时候,报告如下信息,拒绝连接:
1.1.3.3 privileges
修改配置为如下:
<privileges check="true">
<schema name="TESTDB" dml="0000" >
<table name="t_vote" dml="0100"></table>
<table name="t_user" dml="1110"></table>
</schema>
</privileges>
针对表t_vote,赋予了Update权限,无Insert,Select,Delete权限。
针对表t_user,赋予了Insert,Select,Update权限,无Delete权限。
重启MyCat服务。然后,我们进行如下SQL语句执行验证:
insert into t_vote(id,province) values ('hn','hunan');
update t_vote set id='hn1' where province='hunan';
select * from t_vote;
delete from t_vote where id='hn1';
insert into t_user(id,name) values (7,'刘娟');
update t_user set name='刘娟娟' where id=7;
select * from t_user;
delete from t_user where id=7;
1.2 system标签
此标签内嵌套的所有 property 子标签都与系统配置有关。
1.2.1 property子标签
具体声明的属性值定义:
1.2.1.1 charset(Mysql 连接相关属性)
字符集设置。如果需要配置 utf8mb4等特殊字符集可以在
index_to_charset.properties 中配置,配置数据库短的字符集 ID=字符集
例如:224=utf8mb4
配置字符集的时候一定要坚持 mycat 的字符集与数据库端的字符集是一致的,可以通过变量来查询:
show variables like 'collation_%';
show variables like 'character_set_%';
例如:
<property name="charset">utf8</property>
1.2.1.2 defaultSqlParser
用来指定默认的解析器。目前的可用的取值有:druidparser 和 fdbparser。使用的时候可以选择其中的一种,目前一般都使用 druidparser。
注:1.3版本解析器默认为 fdbparser,1.4版本默认为 druidparser,1.4版本以后 fdbparser 作废。
例如:
<property name="defaultSqlParser ">druidparser</property>
1.2.1.3 processors
主要用于指定系统可用的线程数,默认值为机器 CPU 核心线程数。主要影响 processorBufferPool、
processorBufferLocalPercent、processorExecutor 属性。NIOProcessor 的个数也是由这个属性定义的,所以调优的时候可以适当的调高这个属性。
例如:
<property name="processors">10</property>
1.2.1.4 processorBufferChunk
指定每次分配 Socket Direct Buffer 的大小,默认是 4096 个字节。该属性也影响 buffer pool 的长度。如果一次性获取的数过大,buffer 不够用,经常出现警告,则可以适当调大。
例如:
<property name="processorBufferChunk ">6000</property>
1.2.1.5 processorBufferPool
指定 bufferPool 计算比例值。由于每次执行 NIO 读、写操作都需要使用到 buffer,系统初始化的时候,会建立一定长度的 buffer 池来加快读、写的效率,减少建立 buffer 的时间。
Mycat 中有两个主要的 buffer 池:
- BufferPool
- ThreadLocalPool
BufferPool 由 ThreadLocalPool 组合而成,每次从 BufferPool 中获取 buffer 都会优先获取ThreadLocalPool 中的 buffer,未命中之后才会去获取 BufferPool 中的 buffer。也就是说 ThreadLocalPool 是作为 BufferPool 的二级缓存,每个线程内部自己使用的。当然,这其中还有一些限制条件需要线程的名字是由$_开头。然而,BufferPool 上的 buffer 则是每个 NIOProcessor 都共享的。
默认这个属性的值为: 默认 bufferChunkSize(4096) * processors 属性 * 1000
BufferPool 的总长度 = bufferPool / bufferChunk。
若 bufferPool 不是 bufferChunk 的整数倍,则总长度为前面计算得出的商 + 1
假设系统线程数为 4,其他都为属性的默认值,则:
bufferPool = 4096 * 4 * 1000
BufferPool 的总长度 : 4000 = 16384000 / 4096
例如:
<property name="processorBufferPool">16384000</property>
1.2.1.6 processorBufferLocalPercent
用来控制分配ThreadLocalPool 的大小,但其也并不是一个准确的值,也是一个比例值。这个属性默认值为 100。
线程缓存百分比 = bufferLocalPercent / processors 属性。
例如,系统可以同时运行 4 个线程,使用默认值,则根据公式每个线程的百分比为 25。最后根据这个百分比来计算出具体的 ThreadLocalPool 的长度公式如下:
ThreadLocalPool 的长度 = 线程缓存百分比 * BufferPool 长度 / 100
假设 BufferPool 的长度为 4000,其他保持默认值。
那么最后每个线程建立上的 ThreadLocalPool 的长度为: 1000 = 25 * 4000 / 100
例如:
<property name="processorBufferLocalPercent">100</property>
1.2.1.7 processorExecutor
用于指定 NIOProcessor 上共享的 businessExecutor 固定线程池大小。mycat 在需要处理一些异步逻辑的时候会把任务提交到这个线程池中。新版本中这个连接池的使用频率不是很大了,可以设置一个较小的值。
例如:
<property name="processorExecutor">4</property>
1.2.1.8 sequnceHandlerType
指定使用 Mycat 全局序列的类型。0 为本地文件方式,1 为数据库方式,2 为时间戳序列方式,3 为分布式ZK ID 生成器,4 为 zk 递增 id 生成。
从 1.6 增加 两种 ZK 的全局 ID 生成算法。
例如:
<property name="sequnceHandlerType ">1</property>
1.2.1.9 packetHeaderSize(Mysql 连接相关属性)
指定 Mysql 协议中的报文头长度。默认 4
例如:
<property name="packetHeaderSize">8</property>
1.2.1.10 maxPacketSize(Mysql 连接相关属性)
指定 Mysql 协议可以携带的数据最大长度。默认 16M。
例如:
<property name="maxPacketSize">8388608</property>
1.2.1.11 idleTimeout(Mysql 连接相关属性)
指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认 30 分钟,单位毫秒。
例如:
<property name="idleTimeout">3600000</property>
1.2.1.12 txIsolation(Mysql 连接相关属性)
txIsolation : 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。
READ_UNCOMMITTED = 1;
READ_COMMITTED = 2;
REPEATED_READ = 3;
SERIALIZABLE = 4;
例如:
<property name="txIsolation">2</property>
1.2.1.13 sqlExecuteTimeout(Mysql 连接相关属性)
SQL 执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒。
例如:
<property name="sqlExecuteTimeout">360</property>
1.2.1.14 processorCheckPeriod(心跳属性--系统调优)
清理 NIOProcessor 上前后端空闲、超时和关闭连接的间隔时间。默认是 1 秒,单位毫秒。
例如:
<property name="processorCheckPeriod">2000</property>
1.2.1.15 dataNodeIdleCheckPeriod(心跳属性--系统调优)
对后端连接进行空闲、超时检查的时间间隔,默认是 300 秒,单位毫秒。
例如:
<property name="dataNodeIdleCheckPeriod">310000</property>
1.2.1.16 dataNodeHeartbeatPeriod(心跳属性--系统调优)
对后端所有读、写库发起心跳的间隔时间,默认是 10 秒,单位毫秒。
例如:
<property name="dataNodeHeartbeatPeriod">8000</property>
1.2.1.17 bindIp(服务相关属性)
mycat 服务监听的 IP 地址,默认值为 0.0.0.0。
例如:
<property name="bindIp">0.0.0.0</property>
1.2.1.18 serverPort(服务相关属性)
定义 mycat 的使用端口,既是连接MyCat的端口,默认值为 8066。
例如:
<property name="serverPort">8066</property>
1.2.1.19 managerPort(服务相关属性)
定义 mycat 的管理端口,既是连接mycat管理地址的端口,默认值为 9066。
例如:
<property name="managerPort">9066</property>
1.2.1.20 fakeMySQLVersion
mycat 模拟的 mysql 版本号,默认值为 5.6 版本,如非特需,不要修改这个值,目前支持设置 5.5,5.6 版本,其他版本可能会有问题。此特性从 1.6 版本开始支持。
1.2.1.22 useGlobleTableCheck
全局表一致性检测,1 为开启一致性检测、0 为关闭。
原理是通过在全局表增加_MYCAT_OP_TIME 字段来进行一致性检测,类型为 bigint,create 语句通过 mycat执行会自动加上这个字段,其他情况请自己手工添加。此特性从 1.6 版本开始支持。
例如:
<property name="useGlobleTableCheck">0</property>
1.2.1.23 useOffHeapForMerge
此特性从 1.6 版本开始支持。使用非堆内存(Direct Memory)处理跨分片结果集的 Merge/order by/group by/limit,通过 server.xml 中的 useOffHeapForMerge 参数配置是否启用非堆内存处理跨分片结果集,1 为开启, 0 为关闭。
例如:
<property name="useOffHeapForMerge">1</property>
1.2.1.24 handleDistributedTransactions
分布式事务开关,0 为不过滤分布式事务,1 为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2 为不过滤分布式事务,但是记录分布式事务日志。主要应用场景,主要为了控制是否允许跨库事务。此特性从 1.6 版本开始支持。
例如:
<property name="handleDistributedTransactions">0</property>
1.2.1.25 nonePasswordLogin
0为需要密码登陆、1为不需要密码登陆 ,默认为0。
例如:
<property name="nonePasswordLogin">0</property>
1.2.2 示例
如无特殊说明,以下示例中仅仅列出示例相关属性或者标签需要修改的配置。
1.2.2.1 serverPort
设置为如下:
<property name="serverPort">8067</property>
重启MyCat服务,并尝试使用端口8067进行数据库连接,成功。
我们查看一下日志mycat.log,可以看到如下信息:
实际上,截图所示的就是子标签的信息。可以看到serverPort现在的确是8067。
1.2.2.2 nonePasswordLogin
设置为如下:
<property name="nonePasswordLogin">0</property>
重启MyCat服务,之后使用如下命令登录数据库:
密码验证失败,导致登录失败。
再次将设置为如下:
<property name="nonePasswordLogin">1</property>
重启MyCat服务,继续使用上述相同命令登录数据库:
无需密码即可登录数据库,并可以进行正常数据库操作。
等等,这里好像有个问题,我们的数据库需要密码验证通过才能正常登录,如果这里不用密码了,就可以登录数据库,那岂不是很不安全?难道这是一个重大缺陷?
接下来,带着此疑问,让我们针对前面权限示例的相关语句再重新执行一下:
发现了什么?对表的权限设置与前面示例相同。回头看看配置中的user标签,会发现如下信息(蓝色字体):<user name="root" defaultAccount="true">
看到这里,是否就明白了呢?不是不用密码,而是跳过了你手动输入密码的环节,直接使用了缺省账号的信息了。这里就是使用的缺省账号root。
相关推荐
- 完美解决华硕主板机箱前置面板连接音箱无声音问题
-
#精品长文创作季#最近新组装了一台电脑主机,听歌时发现,音箱音频输入线插入主板自带的音频输出端口LINEOUT声音正常。但当将音箱音频输入线插入机箱自带的音频输出端口却没有声音。...
- Java 监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器
-
Java监控直播流rtsp协议转rtmp、hls、httpflv协议返回浏览器...
- 编译安装OpenCV全攻略,附本地源码包
-
本文以Ubuntu(适用于18,20,22版本,其他的未进行测试)为例,介绍了编译安装OpenCV的最佳实践。其他平台比如windows,只需要参考本文的思路做稍微调整即可。一、为什么需要编译安装Op...
- 音视频录制+RTMP直播推拉流
-
音视频录制:1,录音通过条件编译识别pc或者mac://条件编译技术识别pc或者mac#ifdefQ_OS_WIN#defineFMT_NAME"dshow"...
- Python Socket.IO 简介
-
Socket.IO是一种传输协议,支持客户端与服务器之间基于事件的实时双向通信。客户端通常但不总是web浏览器,一般情况下,客户端是采用js编写的,当然,也可以用python、Java等。...
- MyCat系列二--配置文件之server.xml
-
MyCat系列二--配置文件之server.xml从【安装与基本使用】一文中,可以看到MyCat运行,需要进行一些配置文件的相关配置,本文将重点介绍配置文件server.xml的基本元素信息,尽量了解...
- 3分钟搞懂Socket.IO:接口调试技巧
-
在数字化协作需求井喷的今天,即时通讯、协同文档、MMO游戏等场景对实时交互提出了严苛要求。传统HTTP协议"请求-响应"的离散式通信机制已难以满足需求,这正是Socket.IO这类实时...
- 「云原生」Containerd ctr,crictl 和 nerdctl 命令介绍与实战操作
-
一、概述作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使用,只是大部分时候我们因熟悉Docker,在部署集群时采用了默认的dockers...
- 搜狗开源srpc:自研高性能通用RPC框架
-
今年7月底,搜狗公司开源了内部的工业级C++服务器引擎Workflow,一路收获业内许多认可和关注。9月15日,作为Workflow最重要的生态项目——srpc,一个基于其打造的轻量级RPC框架,也在...
- socket.io 权限认证
-
socket.io是一款流行的WebSocket库,提供了实时双向通信的能力。它支持多种身份验证方式,可用于保护某些敏感信息。接下来,我们将介绍如何使用socket.io权限认证1.安装依...
- Linux高性能服务器设计
-
C10K和C10M计算机领域的很多技术都是需求推动的,上世纪90年代,由于互联网的飞速发展,网络服务器无法支撑快速增长的用户规模。1999年,DanKegel提出了著名的C10问题:一台服务器上同时...
- 19K 标星!开源局域网文件传输神器,AirDrop 跨平台替代品!
-
传统文件传输方式(如USB、蓝牙、邮件)要么速度慢,要么操作繁琐,而AirDrop仅限苹果生态。如果你还在为手机和电脑之间传文件来回折腾?还在装各种臃肿的客户端、扫码连Wi-Fi、用数据线拖来...
- WebRTC 入门教程:搭建WebRTC信令服务器
-
前言我们在学习WebRTC时,首先要把实验环境搭建好,这样我们就可以在上面做各种实验了。对于WebRTC来说,它有一整套规范,如怎样使用它的接口、使用SDP进行媒体协商、通过ICE收集地址并进...
- 在 Go 中使用 Websockets 和 Socket.IO - 教程
-
注意-本教程是使用Go1.9版和googollee/go-socket.io编写的Websockets是我觉得有趣的东西,因为它们为我们提供了应用程序之间通信的替代选项,而不是标准的R...
- 2021 年 Node.js 开发人员学习路线图
-
Node.js自发布以来,已成为业界重要破局者之一。Uber、Medium、PayPal和沃尔玛等大型企业,纷纷将技术栈转向Node.js。Node.js支持开发功能强大的应用,例如实时追踪...
- 一周热门
- 最近发表
- 标签列表
-
- mydisktest_v298 (34)
- document.appendchild (35)
- 头像打包下载 (61)
- acmecadconverter_8.52绿色版 (39)
- word文档批量处理大师破解版 (36)
- server2016安装密钥 (33)
- mysql 昨天的日期 (37)
- parsevideo (33)
- 个人网站源码 (37)
- centos7.4下载 (33)
- mysql 查询今天的数据 (34)
- intouch2014r2sp1永久授权 (36)
- 先锋影音源资2019 (35)
- jdk1.8.0_191下载 (33)
- axure9注册码 (33)
- pts/1 (33)
- spire.pdf 破解版 (35)
- shiro jwt (35)
- sklearn中文手册pdf (35)
- itextsharp使用手册 (33)
- 凯立德2012夏季版懒人包 (34)
- 冒险岛代码查询器 (34)
- 128*128png图片 (34)
- jdk1.8.0_131下载 (34)
- dos 删除目录下所有子目录及文件 (36)