为保证垂直拆分场景下,出现数据节点不可用状态时,与之不相关的不同逻辑库之间的业务场景不受影响,计算节点在启动时,对所有逻辑库的可用状态做了特殊判断处理,说明如下:
04/13 10:50:54.644 ERROR [main] (HotdbServer.java:436) -datanodes:[3] init failed. System exit.例如:A逻辑库包含1,2两个节点,B逻辑库包含3,4两个节点。如果1、2节点不可用,3、4节点可用,则计算节点可以启动,B逻辑库下的表可以正常操作,A逻辑库下的表无法进行读写;如果1、3节点不可用,则计算节点无法启动。
1.主从存储节点均配置为可用
如果主从存储节点均可以连接,则该节点可用。如果主库无法连接,从库可连接,则会发生切换,将主库置为不可用,并且使用从库。如果主库可以连接,从库无法连接,则使用主库,从库会置为不可用。如果主从数据库均无法连接,则该节点不可用。
2.主库配置不可用,从库配置可用
如果从库可以连接,则使用从库,此节点可用。如果从库无法连接,则该节点不可用
3.主库配置可用,从库配置不可用
如果主库可以连接,则使用主库,此节点可用。如果主库无法连接,则该节点不可用
为了保证数据的一致性,计算节点在启动的时候,将对存储节点实例的参数进行校验。针对不同的参数,如果参数配置不符合校验规则,计算节点将报告警告信息,或者不能启动。计算节点对存储节点实例的参数要求有两种:一种是所有的存储节点实例的参数需一致;另一种是所有的存储节点实例的参数必须为固定值。
对于下列存储节点实例的参数,计算节点要求设置为统一的固定值:
1.completion_type必须为NO_CHAN, 如果出现该参数不符合规范,则动态加载失败;
2.innodb_rollback_on_timeout需要为ON,且任何时候SHOW GLOBAL|SESSION VARIABLES显示出来的innodb_rollback_on_timeout参数都为on,说明如下:
3.read_only,参数说明如下:
如果主存储节点的参数read_only=1,计算节点将拒绝启动,动态加载失败。
如果从机的参数read_only=1且配置了切换到该从机的配置规则,计算节点可以启动,RELOAD失败。
如果从机的参数read_only=1且没有配置切换到该从机的配置规则,计算节点可以启动,reload如果无其它错误则成功。
对于下列存储节点实例的参数,计算节点要求存储节点间的参数值设置为一致:
若以上参数在存储节点间配置不一致,计算节点将给出警告信息。对于transaction_isolation参数,计算节点以设置的最高隔离级别为准,若最高配置的值高于REPEATABLE-READ,将使用SERIALIZABLE;若最低配置的值低于REPEATABLE-READ,计算节点将使用REPEATABLE-READ模式。
考虑到客户端发送超大SQL会有威胁到计算节点的可能(目前尚未发现实际案例),计算节点可以配置MAX_ALLOWED_PACKET,控制客户端发送给计算节点的SQL最大包大小,该参数可在server.xml中通过参数名maxAllowedPacket预置,如果计算节点的maxAllowedPacket默认值大于1024M,日志会给warning提示,且管理平台配置校验会给出提示
HHDB Server为客户提供了一套功能完善、操作便捷的信息监控、统计与服务管理功能。用户可以通过MySQL Client登录计算节点的监控管理端查看详细信息,详细说明请参考计算节点管理命令文档。
用户可以登录管理端(默认端口:3325)使用show @@help命令查看支持的管理端命令和相应的作用。
root> mysql -uroot -proot -P3325 -h192.168.200.201
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 992081
Server version: 5.7.42 HHDB-14.0.0 HHDB Server
Copyright (c) 2000, 2016, 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.
mysql> show @@help;
+-------------------------------------------+------------------------------+
| statement | description |
+-------------------------------------------+------------------------------+
| check @@datasource_config | 检查存储节点参数配置信息 |
| check @@route [db_name.tb_name | tb_name] | 检测分片表数据路由正确性 |
| kill @@connection [connection_id] | 将某个指定的连接关闭 |
| onlineddl "[DDLSTATEMENT]" | 执行onlineddl |
| rebuild @@pool | 重建所有节点当前可用存储节点 |
| reload @@config | 重新读取配置信息 |
...省略更多内容,可自行登陆查看...用户可以输入相应的命令以监控计算节点的服务情况,如显示存储节点信息:
mysql> show @@datasource;
|----+----+-----------------------+------+--------+-------------+------+--------+--------+------+------+--------------------+--------------+--------+-------------+-----------------+
| dn | ds | name | type | status | host | port | schema | active | idle | size | unavailable_reason | flow_control | idc_id | listener_id | listener_status |
| --- | --- | --------------------- | ---- | ------ | ----------- | ---- | ------ | ------ | ---- | ---- | ------------------ | ------------ | ------ | ----------- | --------------- |
| 17 | 17 | 10.10.0.140_3313_db01 | 1 | 1 | 10.10.0.140 | 3313 | db01 | 0 | 45 | 45 | NULL | 0/64 | 1 | 8 | 1 |
...省略更多内容,可自行登陆查看...计算节点支持限制前端连接数功能,出现访问过载时可辅助限制流量。使用方法为:在server.xml中进行配置:
<property name="maxConnections">5000</property><!-- 前端最大连接数 -->
<property name="maxUserConnections">0</property><!--用户前端最大连接数, 0为不限制-->同时支持具有super权限的用户在服务端口set global max_connections=1; set global max_user_connections=0;进行修改。
可以用SHOW VARIABLES来查看当前的连接数限制情况。
计算节点启动及运行过程中会与存储节点之间建立连接,在添加存储节点时,可通过四个配置控制连接数:
例如:
以单个计算节点举例(多计算节点服务各自限制连接数,也即极端情况下,存储节点连接数可能达到N倍),存储节点配置: 最大连接数4200,初始化连接数是32, 最小空闲连接数64 ,最大空闲连接数:512
那么计算节点在启动的时候,会与每个存储节点建立32个后端连接,定时检测线程检测时发现当前连接数不够最小空闲即增加到最小空闲连接64个;
此时若有一个2048并发的场景对计算节点压测,会发现连接池可用连接数不够用,计算节点会自动增加与存储节点的连接数。
当压测结束后,这些连接不会立即销毁,会等到空闲检测周期检测:如果空闲状态(即管理端show @@backend标记为Idle状态)的连接大于512 ,则销毁多余的连接到512个;如果小于512 就保持原样。
若需要空闲连接状态回到初始化状态,可以在计算节点运行过程中,参考计算节点管理命令文档重建连接池rebuild @@pool 相关章节重建连接池,即恢复到初始连接状态。
因磁盘空间不足会导致计算节点无法正常运行等诸多问题,计算节点在自动部署时会检测计算节点安装目录所在磁盘的剩余空间是否大于10G,同时,在写临时文件时也会检测磁盘的剩余空间,具体如下:
用户创建会话后执行例如复杂跨库JOIN等操作时,必要时会在计算节点安装目录下写入临时文件。写入临时文件的同时,计算节点若检测发现安装目录所在磁盘的剩余空间不足,则终止当前会话并报错与记录日志。
计算节点日志记录error级别日志如下,终止会话时提示信息与之相同:
2019-06-10 18:03:24.423 [ERROR] [DISKSPACE] [Employee-2] cn.hotpu.hotdb.mysql.nio.handler.MultiNodeHandler(88) - session[1606] was killed,due to less than 1G space left on device,and the size of temp-file is larger than the usable space.etl用户(用于数据抽取)
配置了etl的用户较普通用户在数据抽取时可降低内存消耗,具有更高的稳定性和数据抽取效率,具体使用配置说明如下:
计算节点配置库添加用户为etl用户(etl_users和ETL用户列表为固定参数值,只需修改test_user@%)
insert into hotdb_config_info values('etl_users','test_user@%','ETL用户列表');mysqldump -utest_user -pyy123456 -P3323 -h192.168.171.21 --set-gtid-purged=OFF --no-tablespaces --skip-triggers --single-transaction --default-character-set=utf8 --no-create-info --complete-insert --compact --skip-tz-utc hotdb customer_auto >/usr/local/etl_temp/etl_auto.sql若要了解计算节点错误码详情,请参考计算节点错误码文档。
若要了解管理平台错误码详情,可以点击"帮助中心">>"API接口说明"页面中的【状态码】查看错误码详情。
计算节点可在不重启服务的情况下,在线加载配置信息。通过"动态加载"功能可立即生效的参数请参考计算节点参数说明。
动态加载有两种方式,一种是登录管理端(3325)执行:reload @@config命令;一种是登录管理平台,点击菜单栏右上角"动态加载"按钮,将新增配置项目动态加载到计算节点中进行使用。如下图所示:
为了保证计算节点正确加载配置信息,在执行动态加载前,可先校验配置信息。动态加载过程中,若遇到主备配置库、主备存储节点切换,提示用户并提供强制停止切换并动态加载和取消动态加载两种选择方案。
登录管理平台,选择"配置"->配置校验进入配置校验面板,点击"开始校验"按钮,将校验关系集群数据库可视化管理平台中配置校验菜单中的配置项,若有配置项不正确,可根据错误提示,修改相应的配置:
通过计算节点管理端执行reload @@config命令动态加载时,默认也会先进行配置校验,校验通过后才允许动态加载。
在关系集群数据库系统中,若死锁发生在两个数据节点下的存储节点间,存储节点的死锁检测机制将无法检测到死锁。
下面表格中的操作,描述了两个数据节点产生死锁的过程。会话一与会话二分别在两个数据节点上执行DELETE操作:
会话一 | 会话二 | |
|---|---|---|
会话一开启事务 | start transaction; | |
会话二开启事务 | start transaction; | |
会话一在DNID为15的数据节点上执行DELETE语句 | delete from customer where dnid=15 and id=1; | |
会话二在DNID为13的数据节点上执行DELETE 语句 | delete from customer where dnid=13 and id=4; | |
会话一在DNID为13的数据节点上执行DELETE语句;DELETE操作将被会话二阻塞 | delete from customer where dnid=13 and id=4; | |
会话二在DNID为15的数据节点上执行DELETE语句;此操作将被会话一阻塞;因会话一被会话二阻塞,会话二也被会话一阻塞,此时将产生死锁 | delete from customer where dnid=15 and id=1; |
上述情况中,会话一与会话二互相被阻塞,将产生死锁。因是在两个数据节点下的存储节点间,存储节点无法检测到死锁的存在。
在HHDB Server关系集群数据库系统中,计算节点可检测到多个数据节点下的存储节点间的死锁,并回滚开销最少的事务。
在计算节点的配置文件server.xml中,将死锁检测周期设置为大于0的值,将开启死锁的自动检测功能。默认情况下,死锁检测是开启状态,检测周期为3000ms。
<property name=" deadlockCheckPeriod ">3000</property>当deadlockCheckPeriod值设置为0时,将不启动死锁检测功能。
在开启计算节点的死锁检测时,再次执行上述的DELETE操作:
会话一,开启事务:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)会话二,开启事务:
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)会话一,在DNID为15的数据节点上执行DELETE语句:
mysql> delete from customer where dnid=15 and id=1;
Query OK, 1 row affected (0.00 sec)会话二,在DNID为13的数据节点上执行DELETE 语句
mysql> delete from customer where dnid=13 and id=4;
Query OK, 1 row affected (0.00 sec)会话一,在DNID为13的数据节点上执行DELETE语句;DELETE操作将被会话二阻塞:
mysql> delete from customer where dnid=13 and id=4;会话二,在DNID为15的数据节点上执行DELETE语句;此操作将被会话一阻塞;因会话一被会话二阻塞,会话二也被会话一阻塞,此时将产生死锁。
mysql> delete from customer where dnid=15 and id=1;
Query OK, 1 row affected (1.59 sec)计算节点检测到死锁,回滚了会话一的事务:
mysql> delete from customer where dnid=13 and id=4;
ERROR 1213 (HY000): Deadlock found when trying to get lock; try restarting transaction注意 由于存储节点5.7及以上版本,事务中出现死锁回滚后,不会立即开启新事务。参考官方BUG链接:https://bugs.mysql.com/bug.php?id=98133。HHDB Server针对上述BUG做了兼容处理:对锁超时、死锁检测、后端连接断开,存储节点5.7及以上版本会根据前端连接autocommit判断是否要开启新事务。
若执行SQL时返回以下情况的报错信息,计算节点会将其记录到计算节点日志(hotdb-unusualsql.log)中:
如果上述记录的SQL过长导致SQL语句被截取,还会额外记录WARNING信息
例如,执行一条出现主键冲突的SQL如下:
mysql> insert into table01 (id,title,author,submission_date) values (3,"apple", "apple pie", '2019-10-11-20-05');
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'查看计算节点日志(hotdb-unusualsql.log):
2019-10-12 15:27:45.051 [INFO] **[UNUSUALSQL]** [$NIOREACTOR-7-RW] cn.hotpu.hotdb.mysql.nio.MySQLConnection(415) - ERROR 1062:Duplicate entry '3' for key 'PRIMARY' [frontend:[thread=$NIOREACTOR-7-RW,id=453,user=root,host=192.168.210.225,port=3323,localport=65442,schema=DBY]; backend:null; frontend_sql:insert into table01 (id,title,author,submission_date) values (3,"apple", "apple pie", '2019-10-11-20-05');backend_sql:null]又如,执行一条被SQL防火墙拦截SQL如下:
mysql> select * from test;
ERROR 1064 (HY000): Intercepted by sql firewall, because: not allowed to execute select without where expression查看计算节点日志(hotdb-unusualsql.log):
2019-10-14 15:41:42.246 [INFO] **[UNUSUALSQL]** [$NIOExecutor-1-2] cn.hotpu.hotdb.route.RouteService(415) - ERROR 10029:not pass sql firewall [frontend:[thread=$NIOExecutor-1-2,id=1433,user=root,host=192.168.210.225,port=3323,localport=64658,schema=DBY]; backend:null; frontend_sql:null; backend_sql:null] [DBY.count]=33注意 存储节点错误码解释可参考官方文档:https://dev.mysql.com/doc/refman/8.0/en/server-error-reference.html
该类日志信息默认保存在计算节点安装目录logs/extra/unusualsql目录下的hotdb_unusualsql.log文件中。若日志未记录至文件,可检查计算节点安装目录conf目录下的log4j2.xml下,是否存在以下配置:
<RollingFile
name="Unusualsql"
filename="${sys:HOTDB_HOME}/logs/extra/unusualsql/hotdb-unusualsql.log"
filepattern="${sys:HOTDB_HOME}/logs/extra/unusualsql/hotdb-unusualsql-%d{yyyy-MM-dd-HH-mm-ss}.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-4p] [%marker] [%t] %c(%L) - %msg%n"/>
<Policies>
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!-- 只记录unusual sql日志 -->
<filters>
<MarkerFilter marker="UNUSUALSQL" onMatch="ACCEPT" onMismatch="DENY"></MarkerFilter>
</filters>
<DefaultRolloverStrategy max="1000"/>
</RollingFile>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="Unusualsql"/>
</Root>
</Loggers>计算节点支持开启只读模式(instanceReadOnly)来平衡当前主计算节点的压力,或使用只读计算节点实例抽取数据做数据分析,一般适用于备计算节点或灾备模式下的灾备机房计算节点。
计算节点开启只读方式
修改server.xml中的instanceReadOnly为1开启只读计算节点,重启计算节点后生效
管理端执行online_readonly直接开启计算节点只读模式,online_readwrite可直接关闭计算节点只读模式
root@192.168.210.79:(none) 8.0.30 03:50:51> online_readonly;
Query OK, 1 row affected, 1 warning (0.03 sec)
Info (Code 10260): Online_readOnly command executed successfully and the instanceReadOnly parameter has been set to 1.online_readwrite命令在HA模式下等同于online,在灾备模式主节点下相当于online_dr,会导致计算节点高可用切换或机房切换,业务需谨慎使用
可通过show @@server接口中的mode字段查看是否开启了只读
开启只读的计算节点服务端只可执行DQL语句、SET会话级参数、show语句等;管理端涉及写操作的命令都不能执行,如全局表一致性修复、kill @@connection、stop @@heartbeat等操作,如:
服务端操作:
root@192.168.210.79:hotdb 8.0.30 04:24:51> create database test;
ERROR 1289 (HY000): Command CREATE_DATABASE not allowed in Read-Only mode.
root@192.168.210.79:hotdb 8.0.30 04:24:56> create table test(id int);
ERROR 1289 (HY000): Command CREATE_TABLE not allowed in Read-Only mode.
root@192.168.210.79:hotdb 8.0.30 04:25:02> insert into test values(1);
ERROR 1289 (HY000): Command INSERT not allowed in Read-Only mode. 管理端操作:
root@192.168.210.79:(none) 8.0.30 04:27:24> reload @@config;
ERROR 10234 (HY000): Not allowed to execute non-query command in readonly instance.
root@192.168.210.79:(none) 8.0.30 04:27:27> stop @@heartbeat;
ERROR 10234 (HY000): Not allowed to execute non-query command in readonly instance.
root@192.168.210.79:(none) 8.0.30 04:27:40> kill @@connection 11;
ERROR 10234 (HY000): Not allowed to execute non-query command in readonly instance.普通模式下(含灾备模式的中心机房)只读计算节点默认读优先级最高的从库,优先级最高的从库不可用或从库复制延迟大于maxLatencyForReadOnly的值时,读次优先级的从库,从库都不可用则读主库
灾备模式的灾备机房只读计算节点读灾备机房的主库,主库不可用时拒绝读取
特定场景下的只读模式释放
多计算节点集群只读模式下,开启参数allowReadConsistentInReadOnly、enableListener和enableXA且部署了监听组件后,可保证读一致性
计算节点实例级别的只读模式读从库的优先级高于用户级别的读写分离
主备模式下备计算节点若开启只读,则每10秒去主上同步最新配置信息;也可通过配置计算节点的集群参数实时同步配置(serverId、clusterSize、clusterNetwork、clusterHost、clusterPort)
集群模式下,只读计算节点不参与选主。如:备计算节点均开启了只读,主计算节点故障后会因无法选主导致集群不可用(仅管理端口可连接)
HA模式下开启只读计算节点需要手动将keepalived脚本check_hotdb_process.sh中的online改为online_readwrite,否则高可用切换后,不会释放只读属性
主计算节点不建议设置为只读模式,reload会跳过只读计算节点实例,主计算节点开启只读可能会对业务造成影响
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。