当我尝试使用Aerospike客户端Write()时,出现以下错误:
22 AS_PROTO_RESULT_FAIL_FORBIDDEN
仅在Truncate()之后且仅在特定键上调用Write操作时,才会发生该错误。
我试过了:
更改密钥类型(字符串,长号,小号,大号)
更改传递的键类型(值,长整数,字符串)
更改WritePolicy的重试次数
在每次写入之前添加延迟(200ms,500ms)
生成全新的键(GUID.NewGuid()。ToString())
没有人能解决问题,所以我认为唯一的原因是Truncate操作。
错误是系统的;因为同一组键完全在同一键上失败。
当调用Truncate I等待X秒钟并检查控制台管理中的Set上的对象编号为“ 0”时,也会发生该错误。
我必须等待几分钟(1到5分钟),以确保运行该过程后问题不再存在。
群集具有3个节点,副本因子为2。SSD持久性
我正在使用NuGet C#Aerospike.Client v 3.4.4
在单个本地节点(内存中的docker)上运行该进程不会产生任何错误。
我怎么知道Truncate()进程(其后面的删除操作)何时完全终止并且可以安全地使用Set?
[解]
如建议的那样,我们的开发人员检查了时间跨度同步。他发现在机器映像上未启用NTP(错误)。
启用它。再次测试。没有更多的错误。
谢谢,
亚历克斯
最佳答案
听起来像是跨节点时间同步的潜在问题,请确保正确设置ntp ...这是我目前唯一的猜测,尤其是当您提到它确实在单个节点上运行时。 truncate命令将捕获当前时间(如果您未指定时间),并将使用该时间来防止写入在该时间之前的记录。检查(从我的头顶,很抱歉,如果不完全是这样)/opt/aerospike/smd/truncate.smd,以在每个节点上查看截断命令的时间戳,并检查不同节点上的时间。
[感谢@kporter发表评论。因此,所有truncate.smd文件中的时间都将相同,但是计算机之间的时间差异仍然会导致针对某些节点的写入失败]
关于aerospike - 调用Truncate后,写入操作(代码22)出错。 -C#客户端,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46492540/