我一直在使用aerospike进行圆顶测试,我发现了一种与销售不同的行为。
我在同一个AZ的AWS上运行了4个节点的集群,实例是t2micro(1cpu,1GB内存,25GB SSD),使用aws linux和AMI aerospike
aerospike.conf:
heartbeat {
mode mesh
port 3002
mesh-seed-address-port XXX.XX.XXX.164 3002
mesh-seed-address-port XXX.XX.XXX.167 3002
mesh-seed-address-port XXX.XX.XXX.165 3002
#internal aws IPs
...
namespace teste2 {
replication-factor 2
memory-size 650M
default-ttl 365d
storage-engine device {
file /opt/aerospike/data/bar.dat
filesize 22G
data-in-memory false
}
}
我所做的是测试节点何时关闭时是否会丢失文档。为此,我在python上写了一些代码:
from __future__ import print_function
import aerospike
import pandas as pd
import numpy as np
import time
import sys
config = {
'hosts': [ ('XX.XX.XX.XX', 3000),('XX.XX.XX.XX',3000),
('XX.XX.XX.XX',3000), ('XX.XX.XX.XX',3000)]
} # external aws ips
client = aerospike.client(config).connect()
for i in range(1,10000):
key = ('teste2', 'setTest3', ''.join(('p',str(i))))
try:
client.put(key, {'id11': i})
print(i)
except Exception as e:
print("error: {0}".format(e), file=sys.stderr)
time.sleep(1)
我使用这段代码只是为了插入一个我可以在那之后检查的整数序列。我运行了那段代码,几秒钟后,我停止了一个节点上的aerospike服务10秒,使用sudo service aerospike stop
和sudo service aerospike colstart
重启。
我等了几秒钟,直到节点完成所有迁移并执行了以下python脚本:
query = client.query('teste2', 'setTest3')
query.select('id11')
te = []
def save_result((key, metadata, record)):
te.append(record)
query.foreach(save_result)
d = pd.DataFrame(te)
d2 = d.sort(columns='id11')
te2 = np.array(d2.id11)
for i in range(0,len(te2)):
if i > 0:
if (te2[i] != (te2[i-1]+1) ):
print('no %d'% int(te2[i-1]+1))
print(te2)
得到回应:
no 3
no 6
no 8
no 11
no 13
no 17
no 20
no 22
no 24
no 26
no 30
no 34
no 39
no 41
no 48
no 53
[ 1 2 5 7 10 12 16 19 21 23 25 27 28 29 33 35 36 37 38 40 43 44 45 46 47 51 52 54]
我的群集配置错误或这是正常的吗?
ps:我试图包含尽可能多的东西,如果你想建议更多信息,我会很感激。
答案 0 :(得分:3)
实际上我找到了一个解决方案,说实话是非常简单和愚蠢的。
在配置文件中,我们有一些节点之间的网络通信参数,例如:
interval 150 # Number of milliseconds between heartbeats
timeout 10 # Number of heartbeat intervals to wait
# before timing out a node
这两个参数设置集群实现节点关闭和离开集群所需的时间。 (在这种情况下为1.5秒)。
我们发现有用的是调整客户端的写策略以使用此参数。
根据客户端的不同,您将拥有一些策略,例如操作失败前的尝试次数,操作超时,尝试之间的时间。
您只需调整客户端参数即可。例如:将重试次数设置为4(每次在500 ms后执行),将超时设置为2秒。这样做,客户端将识别该节点已关闭并将操作重定向到另一个节点。
这种设置在群集上可能是压倒性的,会产生巨大的过载,但它对我们有用。