用户在使用 SequoiaDB 巨杉数据库的过程中,如果遇到一些由数据库抛出的异常错误,可以通过 sdbdiag.log 日志来定位问题。在进行集群日志分析前,用户可参考 SequoiaDB 的节点章节,了解 SequoiaDB 中各类节点在请求执行中的作用。
用户在使用 SequoiaDB 集群时,如果遇到命令执行失败或者查询数据抛出异常,sdbdiag.log 日志能够帮助用户快速定位具体失败原因。例如,当用户向数据库进行数据写入时,数据无法写入导致写入操作执行失败。具体执行命令如下:
> db.sample.employee.insert({"id": 1001, "name": "zhangSan"})
sdb.js:625 uncaught exception: -105
Not enough number of data nodes
Takes 0.006951s.
SequoiaDB 处理请求的过程:协调节点接收客户端的请求并转发至对应的数据节点,数据节点将执行结果返回至协调节点后,由协调节点汇总并返回至客户端。
用户在进行日志分析时,应先分析协调节点日志,再分析数据节点日志。以下是具体分析步骤:
查看协调节点的诊断日志,查看方式可参考节点诊断日志章;通过分析可以看到记录在插入 “GroupID:1000, NodeID:1001” 节点时失败
...
2019-07-05-13.38.41.145166 Level:ERROR
PID:7038 TID:7507
Function:execute Line:341
File:SequoiaDB/engine/coord/coordInsertOperator.cpp
Message:
Insert failed on node[{ GroupID:1000, NodeID:1001, ServiceID:2(SHARD) }], rc: -105
2019-07-05-13.38.41.146227 Level:ERROR
PID:7038 TID:7507
Function:processMsg Line:1869
File:SequoiaDB/engine/pmd/pmdProcessor.cpp
Message:
Error processing Agent request, rc=-105
...
Note:
每个协调节点只会记录通过自身连接进行请求的相关信息,用户需要确认请求通过哪个协调节点发出,以便于找到正确的日志信息。
通过复制组列表获取异常节点 “GroupID:1000, NodeID:1001” 信息
$ sdb 'db.list(SDB_LIST_GROUPS, {"GroupID" : 1000})'
由输出结果可以判断发生异常的节点是 sdbserver2:11820
...
{
"HostName": "sdbserver2",
"Status": 1,
"dbpath": "/opt/sequoiadb/database/data/11820/",
"Service": [
{
"Type": 0,
"Name": "11820"
},
{
"Type": 1,
"Name": "11821"
},
{
"Type": 2,
"Name": "11822"
}
],
"NodeID": 1001
}
...查看数据节点的诊断日志,通过分析判断在连接 sdbserver3:11821 时失败,而 11821 端口被 11820 节点占用;节点的当前存活数量为:2,需要存活的节点数量为:3
... 2019-07-05-13.38.27.749514 Level:ERROR PID:7046 TID:7336 Function:syncConnect Line:358 File:SequoiaDB/engine/net/netEventHandler.cpp Message: Connection[Handle:8] connect to sdbserver3:11821(11821) failed, rc: -79 2019-07-05-13.38.27.749565 Level:EVENT PID:7046 TID:7336 Function:_sharingBeat Line:866 File:SequoiaDB/engine/cls/clsReplicateSet.cpp Message: Reset node[1005] sharing-beat time to 1800(sec) 2019-07-05-13.38.41.142127 Level:ERROR PID:7046 TID:7554 Function:_calculateW Line:4740 File:SequoiaDB/engine/cls/clsShardSession.cpp Message: alive num[2] can not meet need[3] ...
查看集合的编目信息快照,通过分析可以判断集合的的同步副本数 ReplSize 设置为 3,即要求数据在写入三个副本后才返回成功
> db.snapshot(SDB_SNAP_CATALOG, {"Name":"emp.employees"})
{
...
"Name": "sample.employees",
"UniqueID": 17179869185,
"Version": 2,
"ReplSize": 3,
"Attribute": 0,
"AttributeDesc": "",
"ShardingKey": {
"_id": 1
}
...
}根据以上分析,可以得出结论: