【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态
1.背景
SequoiaDB 巨杉数据库是一款金融级分布式数据库,包括了分布式 NewSQL、分布式文件系统与对象存储、与高性能 NoSQL 三种存储模式,分别对应分布式在线交易、非结构化数据和内容管理、以及海量数据管理和高性能访问场景。
集群一般会使用三副本方式以确保数据安全。假若集群发生因硬件故障等原因导致的节点故障或集群异常,数据库管理员应进行系统的分析和诊断,以确保集群正常工作,不会影响用户的正常使用。本文将与大家分享一下基本的 SequoiaDB 数据库诊断方法。
2. 数据库集群诊断
1)确定 SequoiaDB 的安装路径
如果用户刚接触全新的 SequoiaDB 环境,可以通过 cat /etc/default/sequoiadb 命令查看数据库安装路径。
# cat tc/default/sequoiadb
NAME=sdbcm
SDBADMIN_USER=sdbadmin
INSTALL_DIR=/opt/sequoiadb
INSTALL_DIR即 SequoiaDB 的安装路径。
2)列出集群节点信息
【检查办法】
切换到数据库安装用户(默认为sdbadmin用户),查看节点信息和全部节点。
$ sdblist -l
$ sdblist -t all
从左到右依次为SvcName(节点名称)、Role(角色名称分为:编目节点、协调节点和数节点)、PID(进程号)、GID、NID、PRY(是否为主节点)、GroupName(组名)、StartTime(启动时间)、DBPath(安装路径)等信息,这些信息对于分析定位问题有很大的帮助。
【异常情况】
检查发现节点未启动、节点启动报错和节点无法启动等问题。
【处理办法】
假如数据节点11820节点未启动首先应尝试重新启动该节点,使用 sdbstart -p 11820 命令重新启动该节点。在节点安装目录下找到日志信息,日志信息为 ${DBPath}/diaglog/ sdbdiag.log。
【案例分析】
执行 sdbstart -p 11820 启动节点报错。
$ sdbstart -p 11820
11820: 69 bytes out==>
db role: data_test error
Failed resolving arguments(error=-6), exit
<==
Error: Start [/opt/sequoiadb/bin/../conf/local/11820] failed, rc: 127(Invalid Argument)
Total: 1; Succeed: 0; Failed: 1
通过报错信息 error 为-6参数错误,且报出 ../conf/local/11820 配置信息错误,查询节点的配置信息,节点的配置信息在安装目录下的 conf 目录中。
$ vi /opt/sequoiadb/conf/local/11820/sdb.conf
svcname=11820
dbpath=/opt/sequoiadb/database/data/11820
logfilesz=64
weight=10
sortbuf=256
sharingbreak=180000
role=data_test
catalogaddr=sdb1:11803,sdb2:11803,sdb3:11803
对比正常的节点配置信息发现role角色名称有误,导致节点启动失败,修改正确后启动成功。
3)检查集群节点是否正常
【检查办法】
在集群环境下通过协调节点获取数据库快照,可以通过监测 ErrNodes 判断出是否存在节点不可用的情况。
>cd /opt/sequoiadb/bin/
$ sdb 'db = new Sdb("localhost",11810,"username","password")'
$ sdb 'db.snapshot(SDB_SNAP_DATABASE)'
{
"TotalNumConnects": 0,
"TotalDataRead": 787373,
"TotalIndexRead": 0,
……
"ErrNodes": [
{
"NodeName": "sdb1:11820",
"Flag": -129
},
{
"NodeName": "sdb2:11820",
"Flag": -129
}
]
}
Return 1 row(s).
Takes 0.27826s.
NodeName 是出故障节点的hostname与端口号,Flag 则是尝试连接时所得到的错误码。在本例中,-129代表该节点处于全量同步状态。
如果 ErrNodes 数组为空,则意味着集群中所有节点状态正常:
$ sdb 'db.snapshot(SDB_SNAP_DATABASE)'
{
"TotalNumConnects": 1,
……
"ErrNodes": []
}
【异常情况】
如上所示出现 -129 的错误信息,在 SequoiaDB 集群中,由于分布式环境在运行过程中,不可避免会遇到突发状况,例如:某个数据节点被管理员意外杀掉,机器突然掉电重启等,这些操作都有可能触发SequoiaDB相关节点的全量同步状态。
用户可以直连到问题数据节点,然后查看 SDB_SNAP_DATABASE 快照信息:
$ sdb 'data = new Sdb("sdb2",11820)'
$ sdb ' data.snapshot(SDB_SNAP_DATABASE)'
{
"NodeName": "sdb2:11820",
"HostName": "sdb2",
"ServiceName": "11820",
"GroupName": "dg1",
"IsPrimary": false,
"ServiceStatus": false,
"Status": "FullSync",
......
快照信息显示此节点当前正在做全量同步,不能对外提供服务。
如果想知道某个数据节点过去是否进行过全量同步,可以检查此节点目录下的 diaglog/sdbdiag.log 文件,看看是否有如下内容:
2019-11-08-21.38.26.332510 Level:EVENT
PID:3151 TID:3208
Function:_onAttach Line:217
File:SequoiaDB/engine/cls/clsReplSession.cpp
Message:
Session[Type:Sync-Dest,NodeID:1008,TID:1]: The db data is abnormal, need to synchronize full data
2019-11-08-21.38.26.333890 Level:EVENT
PID:3151 TID:3208
Function:_fullSync Line:722
File:SequoiaDB/engine/cls/clsReplSession.cpp
Message:
Session[Type:Sync-Dest,NodeID:1008,TID:1]: Start the synchronization of full
显示结果表明此节点曾进行过全量同步。
【解决办法】
等待全量同步自动完成,完成后节点会自动恢复;停止全量同步节点,拷贝主节点的数据文件到需要全量的节点中,然后重新启动此节点即可。但是此方法需要业务无数据写入,如果业务不能停止则需要等待节点自动进行全量同步。
SequoiaDB 的全量同步,其实是节点在集群环境中自动恢复的一种正常状态。因为在X86服务平台上运行,机器的稳定性远远没有过去大小型机的问题,并且 SequoiaDB 的数据是存储在本地 SATA 或者 SAS 磁盘中,如果机器突然掉电,或者是节点突然被强杀,那样部分数据可能没有真正写入到磁盘中,节点就已经挂掉了。所以 SequoiaDB 为了数据正确性,会在节点启动时,去检测该节点上次停止时是否按照正常流程停止,如果不是,则认为当前存储的数据是不可靠的,需要向相同数据组的其它节点请求同步全量的数据,以保证该节点的数据正确性。
logfilesz 默认为64M,将 logfilesz 参数设置大一点可避免全量同步,建议设置为1024M。
4)检查集群是否可用
【检查办法】
连接到 SequoiaDB 使用 insert 和 find 命令检查集群是否可用,如果集群正常则能够正常返回。
$cd /opt/sequoiadb/bin/
$ sdb 'db = new Sdb("localhost",11810)'
$ sdb 'db.sample.employee.insert({"code":1,"name":"test1"})'
$ sdb 'db.sample.employee.find()'
$ sdb 'db.sample.employee.count()'
【异常情况】
查询 sample.employee 这个集合报错-5。
$ sdb 'db.sample.employee. find ()'
sdb.js:505 uncaught exception: -5
File Exist
-5表示文件已经存在,打开协调节点所在的服务器,打开协调节点日志文件并定位-5错误所发生的位置,查看到如下信息:
$ vi /opt/sequoiadb/database/coord/11810/diaglog/sdbdiag.log
2019-11-08-21.38.26.971524 Level:ERROR
PID:89651 TID:90037
Function:_queryOrDoOnCL Line:1076
File:SequoiaDB/engine/coord/coordQueryOperator.cpp
Message:
Query failed on node[{ GroupID:1000, NodeID:1002, ServiceID:2(SHARD) }], rc: -5
2019-11-08-21.38.26.971661 Level:ERROR
PID:89651 TID:90037
Function:execute Line:491
File:SequoiaDB/engine/coord/coordQueryOperator.cpp
Message:
Query failed, rc: -5
2019-11-08-21.38.26.971679 Level:ERROR
PID:89651 TID:90037
Function:_onQueryReqMsg Line:1850
File:SequoiaDB/engine/pmd/pmdProcessor.cpp
Message:
Execute operator[Query] failed, rc: -5
日志中可以看到,“Query failed on node[{ GroupID:1000, NodeID:1002, ServiceID:2(SHARD) }], rc: -5”错误信息代表着真正的错误来自数据节点:分区组1000,节点ID1000,ServiceID:2错误码-5。接着在命令行使用 db.listReplicaGroups() 可以得到复制组信息:
$ sdb 'db.listReplicaGroups()'
{
……
{
"HostName": "sdb3",
"Status": 1,
"dbpath": "/opt/sequoiadb/database/data/11820/",
"Service": [
{
"Type": 0,
"Name": "11820"
},
{
"Type": 1,
"Name": "11821"
},
{
"Type": 2,
"Name": "11822"
}
],
"NodeID": 1002
},
],
"GroupID": 1000,
"GroupName": "dg1",
"PrimaryNode": 1002,
"Role": 0,
"SecretID": 1969965962,
"Status": 1,
"Version": 7,
"_id": {
"$oid": "5d843fd23e28e361958a76bc"
}
}
通过遍历分区组信息,可以发现组ID1000,节点ID1002所对应的机器为sdb3的11820这个节点,数据库路径为 /opt/sequoiadb/database/data/11820,查看节点日志:
vi /opt/sequoiadb/database/data/11820/diaglog/sdbdiag.log
2019-11-08-21.38.26.584673 Level:ERROR
PID:4347 TID:4370
Function:open Line:66
File:SequoiaDB/engine/oss/ossMmap.cpp
Message:
Failed to open file, rc: -5
2019-11-08-21.38.26.584698 Level:ERROR
PID:4347 TID:4370
Function:openStorage Line:700
File:SequoiaDB/engine/dms/dmsStorageBase.cpp
Message:
Failed to open /opt/sequoiadb/database/data/11820/sample.1.data, rc=-5
2019-11-08-21.38.26.584721 Level:ERROR
PID:4347 TID:4370
Function:open Line:1172
File:SequoiaDB/engine/dms/dmsStorageUnit.cpp
Message:
Open storage data su failed, rc: -5
2019-11-08-21.38.26.584756 Level:ERROR
PID:4347 TID:4370
Function:rtnCreateCollectionSpaceCommand Line:1160
File:SequoiaDB/engine/rtn/rtnCommandImpl.cpp
Message:
Failed to create collection space sample at /opt/sequoiadb/database/data/11820/, rc: -5
通过日志文件可以发现-5的错误不存在的错误,是因为sdb3机器中的11820节点下的sample.1.data 文件存在异常。因此接下来进入数据节点所在路径检查集合空间文件,发现 sample 这个集合文件已经被损坏。
[sdbadmin@sdb3 11820]$ ll
total 1233564
drwxrwxrwx. 2 sdbadmin sdbadmin_group 4096 Sep 19 19:56 archivelog
drwxrwxrwx. 2 sdbadmin sdbadmin_group 4096 Sep 19 19:56 bakfile
drwxrwxrwx. 2 sdbadmin sdbadmin_group 4096 Nov 8 06:11 diaglog
-rw-r-----. 1 sdbadmin sdbadmin_group 0 Nov 8 05:27 sample.1.data
-rw-r-----. 1 sdbadmin sdbadmin_group 0 Nov 8 05:27 sample.1.idx
……
drwxrwxrwx. 2 sdbadmin sdbadmin_group 4096 Sep 19 19:56 tmp
将其他机器的 sample.1.data 和 sample.1.idx 这两个文件拷贝到 sdb3 的11820中:
$ scp -r sdbadmin@sdb2:/opt/sequoiadb/database/data/11820/sample.1.* .
$ sdb 'var dg = db.getRG("dg1")'
$ sdb 'dg.stop()'
$ sdb 'dg.start()'
重新查询集合正常:
$ sdb 'db.sample.employee.find()'
{
"_id": {
"$oid": "5dc5755ec73f4486ee4efe40"
},
"a": 1
}
Return 1 row(s)
3.总结
本文介绍了巨杉数据库SequoiaDB集群诊断基本方法,帮助用户系统地分析和诊断集群出现的问题并尽快解决。
【巨杉数据库SequoiaDB】巨杉Tech | 四步走,快速诊断数据库集群状态的更多相关文章
- Tomcat学习四步走:内核、集群、参数及性能
主题简介: 内核实现原理 分布式集群 生产部署关键参数 性能监控和分析 一.内核实现原理 HTTP Web服务器与浏览器之间以HTTP协议通信,浏览器要访问服务器即向服务器发送HTTP请求报文. 如图 ...
- JAVA EE企业级开发四步走完全攻略 [转]
http://bbs.51cto.com/thread-550558-1.html 本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划, ...
- 【JAVA EE企业级开发四步走完全攻略】
本文是J2EE企业级开发四步走完全攻略索引,因内容比较广泛,涉及整个JAVA EE开发相关知识,这是一个长期的计划,单个发blog比较零散,所以整理此索引,决定以后每发一季JAVA EE blog后会 ...
- 关于pythoh面向过程开发人员三步转面向对象的补充,再加一步,四步走战略。转面向对象也可以有固定公式。
前言: oop非常非常非常重要.搞不懂oop,就玩不了python,就算能写也一定是写代码时候喜欢靠猜瞎猫碰死老鼠写得心很虚.为什么这么说呢,我也是从面向过程编程到死走过来的,一路def到死,一看到有 ...
- CentOS下nagios报警飞信部署四步走
CentOS下nagios报警飞信部署四步走 今天 帮群里一兄弟配了下nagios上的飞信,这个东西 我个人感觉还是很实用的,不过好久没配了,今天配置了一遍,顺便 就把过程记录下来了,供大家学习! ...
- C#WPF数据绑定模板化操作四步走
前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...
- 组件 layui 表单抓取数据四步走
注意事项: layui 中提交按钮是基于"监听"机制实现的. form.on() 的调用需置于 layui.use 的回调函数中. 末尾的 'return false' 不可或缺, ...
- C# 委托的”四步走“
看了一本<深入了解C#>感觉很不错,对于委托的讲解,给大家摘录了下来! 1.什么是委托 我的拙见:委托就是将方法作为参数,进行传递的 书中的记载:将某种行为“包含”在一个对象中,这个对象可 ...
- QGIS 3.14插件开发——Win10系统PyCharm开发环境搭建四步走
前言:最近实习要求做一个QGIS插件,网上关于QGIS 3.14插件开发环境搭建的文档不多,而且也不算太全面.正好实习的时候写了一个文档,在这里给大家分享一下. 因为是Word转的Markdown,可 ...
随机推荐
- Git Gui for Windows下载(pull)的正确操作方法
- bootstrap4网格
Bootstrap 4 网格系统有以下 5 个类: .col- 针对所有设备 .col-sm- 平板 - 屏幕宽度等于或大于 576px .col-md- 桌面显示器 - 屏幕宽度等于或大于 768p ...
- RabbitMQ配置死信队列
死信队列 消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信. 既然需要保留这些死信,那么就需要一个容器来存储它 ...
- eclipse中一个项目引用另一个项目的方法
我们在开发的时候,有时候需要把一个大的项目打散,尤其是现在微服务的架构很流行,一个大的项目往往被拆成很多小的项目,而有的项目作为公共工程被独立出来,比如有个工程专门提供各种Util工具类,有的工程专门 ...
- 微信小程序入门笔记-开通云开发(3)
1.介绍 开发者可以使用云开发开发微信小程序.小游戏,无需搭建服务器,即可使用云端能力. 云开发为开发者提供完整的原生云端支持和微信服务支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API ...
- word中模板的使用
新建一个word文档,修改样式库中的样式,比如各章节的标题正式格式.设计好后,将文件保存为word模板. 一般自定义的模板默认保存在”C:\Users\lizhe\Documents\自定义 Offi ...
- gulp常用插件之gulp-eslint使用
更多gulp常用插件使用请访问:gulp常用插件汇总 ** gulp-eslint**这是一个用于识别和报告在ECMAScript/JavaScript代码中找到的模式的Gulp插件.. 更多使用文档 ...
- 四种常用的通知类型(xml)
1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...
- Just a Hook HDU - 1698Just a Hook HDU - 1698 线段树区间替换
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> us ...
- python学习随笔2:python判断和循环
1.if-else _username = 'heyue' _password = ' username = input("username:") password = input ...