前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据库中间件DBLE学习(三) 学习配置server.xml

数据库中间件DBLE学习(三) 学习配置server.xml

原创
作者头像
BuddyYuan
修改2020-01-17 09:52:50
1.7K0
修改2020-01-17 09:52:50
举报
文章被收录于专栏:数据库中间件数据库中间件
前言

一周以前遇到一个的故障,我靠着过去的经验去分析问题,这次栽的挺深的,查错了方向,陷进了错误的方向苦思不得其解。本来是一个很简单的问题,明眼人一下就能看出来的,结果硬是分析了好几天。

所以,一句话送给大家成功有个副作用,就是以为过去的做法,同样适用于未来。

SERVER.XML介绍

前面我们主要介绍了schema.xml配置和rule.xml中的分片算法。那么还有一个很重要的配置文件叫server.xml。该文件提供了系统配置用户和权限配置黑白名单配置。它主要有以下几个标签组成。

  • system标签,这个标签主要是系统层面的配置,这个配置的模块很多。比如可以控制最大连接数、慢查询日志、load data相关配置、Session预留内存、XA事务等等。
  • user标签,这个标签主要是用户方面的配置,包括管理用户和业务用户的配置,还有权限的配置。
  • firewall标签,这个标签主要是黑白名单的配置。
实战SERVER.XML配置

接下来我们来实战一下,首先我们来配置个慢查询功能。

配置项

配置内容

默认值

enableSlowLog

慢查询日志开关

默认为0,关闭

slowLogBaseDir

慢查询日志存储文件夹

dble根目录/slowlogs

slowLogBaseName

慢查询日志存储文件名前缀

slow-query

flushSlowLogPeriod

日志写盘周期,每隔这个周期,会强制将内存数据写入磁盘

1秒

flushSlowLogSize

日志写盘的阈值数,内存中一旦慢SQL条数达到这个阈值,就会强制写盘

1000

sqlSlowTime

慢日志时间阈值,单位毫秒,一旦查询时间超过这个阈值就会被记录

100

测试慢查询功能

修改server.xml中的下列内容。然后重启dble软件。这里需要注意的一点就是SERVER.XML中的system标签相关的配置修改之后,无法使用reload @@config进行在线重置。

代码语言:txt
复制
<property name="enableSlowLog">1</property>
<property name="slowLogBaseDir">./slowlogs</property>
<property name="slowLogBaseName">slow-query</property>
<property name="flushSlowLogPeriod">1</property>
<property name="flushSlowLogSize">1000</property>
<property name="sqlSlowTime">100</property>

然后使用shell造100万数据量。

代码语言:txt
复制
for i in  {1..1000000}
do
echo  $i'|name'$[i]'' >>a1.txt 
done

使用load data将数据导入。

代码语言:txt
复制
create table hash_test(
id int not null,
name varchar(250),
primary key(id)
) engine=innodb charset=utf8;

load data local infile '/root/a1.txt' ignore into table hash_test character set 'utf8' fields terminated by '|' lines terminated by '\n';

执行查询,整个查询耗时0.20秒。由于大于100毫秒,该SQL将会被慢查询记录下来

代码语言:txt
复制
mysql> select * from hash_test where name='name58';
----+--------+
| id | name   |
+----+--------+
| 58 | name58 |
+----+--------+
1 row in set (0.20 sec)

然后我们就可以检查slowlogs文件夹下的slow-query.log文件,文件内容就和我们MySQL的慢查询日志差不多。

代码语言:txt
复制
[root@mycat slowlogs]# tail -200f slow-query.log 
/FAKE_PATH/mysqld, Version: FAKE_VERSION. started with:
Tcp port: 3320  Unix socket: FAKE_SOCK
Time                 Id Command    Argument
# Time: 2020-01-15T17:46:14.912000Z
# User@Host: root[root] @  [192.168.56.181]  Id:   1
# Query_time: 0.204225  Lock_time: 0.000000 Rows_sent: 0  Rows_examined: 0  Read_SQL: 0.000109  Prepare_Push: 0.085666  dn3_First_Result_Fetch: 0.015016  dn4_First_Result_Fetch: 0.012640  dn1_First_Result_Fetch: 0.007918  dn2_First_Result_Fetch: 0.007671  dn5_First_Result_Fetch: 0.025433  dn3_Last_Result_Fetch: 0.055441  dn4_Last_Result_Fetch: 0.055493  dn1_Last_Result_Fetch: 0.110465  dn2_Last_Result_Fetch: 0.084747  dn5_Last_Result_Fetch: 0.027631  Write_Client: 0.110779
SET timestamp=1579081574912;
select * from hash_test where name='name58';

以上就是慢查询的功能,要进一步的分析,我们还可以使用pt-query-digest工具。

system还有很多配置项。例如我们的服务端口serverPort:8066,管理端口managerPort:9066,最大连接数maxCon,配置为0表示连接数不做限制,当设置不为0,创建的连接数大于maxCon就会报连接失败。processors:NIO前端处理器的数量,默认为java虚拟机核数。backendProcessors:NIO后端处理器的数量,默认java虚拟机核数。还有一系列的参数这里不一一介绍,大家可以查看官方文档对这些参数的解释。

代码语言:txt
复制
<property name="bindIp">0.0.0.0</property>
<property name="serverPort">8066</property> 
<property name="managerPort">9066</property> 
<property name="maxCon">0</property> 
<property name="processors">4</property>
<property name="backendProcessors">12</property>
<property name="processorExecutor">4</property> 
<property name="backendProcessorExecutor">12</property> 
<property name="complexExecutor">8</property> 
<property name="writeToBackendExecutor">4</property> 
黑白名单配置

黑白名单在firewall标签中配置。whitehost代表着白名单,而blacklist代表着黑名单。白名单的配置较为简单,只有两个选项。一个是可以连接的主机,另外一个就是可以连接的用户。如果配置了黑名单,设置了blacklist check=true,就开启了黑名单校验规则。它会针对白名单连接上来的用户在做进一步的权限限制。这里有很多property属性可以配置。例如这个demo中的规则selelctAllow就是是否允许select语句,这里是false,就代表不允许。还有insertAllow、updateAllow、

deleteAllow等等。

代码语言:txt
复制
<firewall>
<whitehost>
      <host host="127.0.0.1" user="root"/>
      <host host="0:0:0:0:0:0:0:1" user="root"/>
   </whitehost>
   <blacklist check="true">
   <property name="selelctAllow">false</property>
   </blacklist>
</firewall>

我们来配置一下,让192.168.56.181上连接的root用户不能执行查询。在白名单中增加

代码语言:txt
复制
<host host="192.168.56.181" user="root"/>

然后在181上登录执行SQL,会提示The statement is unsafe SQL, reject for user 'root'。直接就拒绝我们执行select。

代码语言:txt
复制
[root@mysql5 ~]# mysql -uroot -p123456 -h192.168.56.185 -P8066   
mysql> select * from hash_test where id=10000;
ERROR 3012 (HY000): The statement is unsafe SQL, reject for user 'root'

通过黑名单,我们可以做更进一步的权限控制。这样做的好处是把权限的粒度分的更细。例如:针对个人账号,就只允许它做查询操作,其他的DML和DDL操作权限一律不给。针对业务账号就放开DML和DDL的权限。

用户配置

最后一块是用户的配置。首先需要配置的是一个管理账号,用于通过管理端口9066登录。管理账号可以执行一些管理端命令。例如reload @@config

代码语言:txt
复制
<user name="man1">
    <property name="password">654321</property>
    <property name="manager">true</property>
</user>

然后是业务用户的配置。业务用户是可以配置多个的。例如当前我们配置的业务用户是root和buddy,他们都能够访问testdb这个逻辑库。同时对整个逻辑库具有的权限是0110。这四个数字的顺序分别代表INSERT UPDATE SELECT DELETE。当是0的时候就代表没有权限,如果是1就代表这有这个权限。因此0110代表了对这个逻辑库下所有的表拥有update和select的权限,而没有insert和delete的权限。虽然在schema级别设置了通用的权限,但是我们仍然可以在<table>标签针对具体的表设置具体的权限,实现覆盖。例如tb02这个表的权限是1111,就代表能对该表做所有的增删改查。

需要注意的一点是,虽然这里我们设置了可以增删改查,但是drop,truncate这样的权限是设置不了的。而这些权限只能通过黑名单来控制。

代码语言:txt
复制
<user name="root">
    <property name="password">123456</property>
    <property name="schemas">testdb</property>
    <!-- table's DML privileges  INSERT/UPDATE/SELECT/DELETE -->
    <privileges check="true">
        <schema name="TESTDB" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>
</user>

<user name="buddy">
    <property name="password">123456</property>
    <property name="schemas">testdb</property>
    <property name="readOnly">false</property>
    <!-- table's DML privileges  INSERT/UPDATE/SELECT/DELETE -->
    <privileges check="true">
        <schema name="TESTDB" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>
</user>

如果我们的这个账号,需要访问多个逻辑库,配置上也很简单,只需要用逗号分隔开就行了。

代码语言:txt
复制
<property name="schemas">testdb,testdb2</property>

可能有人会担心,这个密码这样写明文的,不是很容易被人看到吗?这个问题不大,我们可以配置usingDecrypt选项来进行加密。在这里我们需要使用encrypt.sh脚本。

该脚本运行方法:sh encrypt.sh 0:{user}:{password}

代码语言:txt
复制
[root@mycat conf]# sh encrypt.sh 0:root:123456
/etc/alternatives/jre_1.8.0_openjdk/bin/java -cp /dble/lib/dble*.jar com.actiontech.dble.util.DecryptUtil password=******
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==

我们把这一串加密字符串设置进去。然后reload @@config就可以了。

代码语言:txt
复制
<user name="root">
    <property name="password">GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==</property>
    <property name="schemas">testdb</property>
    <property name="usingDecrypt">1</property>
</user>

此时使用123456能够正常登录,但是后台xml配置文件的已经设置成了密文,增强了密码安全性。

代码语言:txt
复制
[root@mysql5 ~]# mysql -uroot -p123456 -h192.168.56.185 -P8066 
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.29-dble-2.19.09.0-fd62e7a27a561169acabc11df32b2f0d13a0b922-20191121135714 dble Server (ActionTech)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
后记

今天的server.xml我们只是介绍了一些基本常用的功能,更多高级用法可以参考官方文档,官方文档对每个参数都做了具体的说明。日常在运行中遇到一些问题或者优化,可以通过调整dble系统参数来解决。同时黑白名单也进一步方便我们进行细粒度的权限控制。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • SERVER.XML介绍
  • 实战SERVER.XML配置
  • 测试慢查询功能
  • 黑白名单配置
  • 用户配置
  • 后记
相关产品与服务
访问管理
访问管理(Cloud Access Management,CAM)可以帮助您安全、便捷地管理对腾讯云服务和资源的访问。您可以使用CAM创建子用户、用户组和角色,并通过策略控制其访问范围。CAM支持用户和角色SSO能力,您可以根据具体管理场景针对性设置企业内用户和腾讯云的互通能力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档