网站首页 > 精选教程 正文
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。
猜你喜欢
- 2025-05-08 redis应用的几种序列化策略(redis应用的几种序列化策略是什么)
- 2025-05-08 你对网络IO了解多少?别被面试官打败到一个问烂了的知识点上
- 2025-05-08 8、char为什么能存贮一个汉字?(char为什么是一个字节)
- 2025-05-08 一文让你彻底弄懂HTTP和Web底层结构
- 2025-05-08 java文件字节流和字节缓冲流(java的字节流和字符流)
- 2025-05-08 Java NIO:从 Buffer、Channel、Selector 到 Zero-copy、I/O 多路复用
- 2025-05-08 Java 17 的 I/O 基础 OutputStream 篇
- 2025-05-08 MySQL/MariaDB中如何支持全部的Unicode?
- 2025-05-08 揭秘:一条SQL语句的执行过程是怎么样的?
- 2025-05-08 Java 近期新闻 JDK 18 发版计划、Spring Data 2021_1_0、苹果开源 GCGC
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)