MyCat系列二--配置文件之server.xml
yuyutoo 2025-04-30 20:55 2 浏览 0 评论
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。
相关推荐
- ETCD 故障恢复(etc常见故障)
-
概述Kubernetes集群外部ETCD节点故障,导致kube-apiserver无法启动。...
- 在Ubuntu 16.04 LTS服务器上安装FreeRADIUS和Daloradius的方法
-
FreeRADIUS为AAARadiusLinux下开源解决方案,DaloRadius为图形化web管理工具。...
- 如何排查服务器被黑客入侵的迹象(黑客 抓取服务器数据)
-
---排查服务器是否被黑客入侵需要系统性地检查多个关键点,以下是一份详细的排查指南,包含具体命令、工具和应对策略:---###**一、快速初步检查**####1.**检查异常登录记录**...
- 使用 Fail Ban 日志分析 SSH 攻击行为
-
通过分析`fail2ban`日志可以识别和应对SSH暴力破解等攻击行为。以下是详细的操作流程和关键分析方法:---###**一、Fail2ban日志位置**Fail2ban的日志路径因系统配置...
- 《5 个实用技巧,提升你的服务器安全性,避免被黑客盯上!》
-
服务器的安全性至关重要,特别是在如今网络攻击频繁的情况下。如果你的服务器存在漏洞,黑客可能会利用这些漏洞进行攻击,甚至窃取数据。今天我们就来聊聊5个实用技巧,帮助你提升服务器的安全性,让你的系统更...
- 聊聊Spring AI Alibaba的YuQueDocumentReader
-
序本文主要研究一下SpringAIAlibaba的YuQueDocumentReaderYuQueDocumentReader...
- Mac Docker环境,利用Canal实现MySQL同步ES
-
Canal的使用使用docker环境安装mysql、canal、elasticsearch,基于binlog利用canal实现mysql的数据同步到elasticsearch中,并在springboo...
- RustDesk:开源远程控制工具的技术架构与全场景部署实战
-
一、开源远程控制领域的革新者1.1行业痛点与解决方案...
- 长安汽车一代CS75Plus2020款安装高德地图7.5
-
不用破解原车机,一代CS75Plus2020款,安装车机版高德地图7.5,有红绿灯读秒!废话不多讲,安装步骤如下:一、在拨号状态输入:在电话拨号界面,输入:*#518200#*(进入安卓设置界面,...
- Zookeeper使用详解之常见操作篇(zookeeper ui)
-
一、Zookeeper的数据结构对于ZooKeeper而言,其存储结构类似于文件系统,也是一个树形目录服务,并通过Key-Value键值对的形式进行数据存储。其中,Key由斜线间隔的路径元素构成。对...
- zk源码—4.会话的实现原理一(会话层的基本功能是什么)
-
大纲1.创建会话...
- Zookeeper 可观测性最佳实践(zookeeper能够确保)
-
Zookeeper介绍ZooKeeper是一个开源的分布式协调服务,用于管理和协调分布式系统中的节点。它提供了一种高效、可靠的方式来解决分布式系统中的常见问题,如数据同步、配置管理、命名服务和集群...
- 服务器密码错误被锁定怎么解决(服务器密码错几次锁)
-
#服务器密码错误被锁定解决方案当服务器因多次密码错误导致账户被锁定时,可以按照以下步骤进行排查和解决:##一、确认锁定状态###1.检查账户锁定状态(Linux)```bash#查看账户锁定...
- zk基础—4.zk实现分布式功能(分布式zk的使用)
-
大纲1.zk实现数据发布订阅...
- 《死神魂魄觉醒》卡死问题终极解决方案:从原理到实战的深度解析
-
在《死神魂魄觉醒》的斩魄刀交锋中,游戏卡死犹如突现的虚圈屏障,阻断玩家与尸魂界的连接。本文将从技术架构、解决方案、预防策略三个维度,深度剖析卡死问题的成因与应对之策,助力玩家突破次元壁障,畅享灵魂共鸣...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
推荐7个模板代码和其他游戏源码下载的网址
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
-
- ETCD 故障恢复(etc常见故障)
- 在Ubuntu 16.04 LTS服务器上安装FreeRADIUS和Daloradius的方法
- 如何排查服务器被黑客入侵的迹象(黑客 抓取服务器数据)
- 使用 Fail Ban 日志分析 SSH 攻击行为
- 《5 个实用技巧,提升你的服务器安全性,避免被黑客盯上!》
- 聊聊Spring AI Alibaba的YuQueDocumentReader
- Mac Docker环境,利用Canal实现MySQL同步ES
- RustDesk:开源远程控制工具的技术架构与全场景部署实战
- 长安汽车一代CS75Plus2020款安装高德地图7.5
- Zookeeper使用详解之常见操作篇(zookeeper ui)
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)