当节点出现故障时,Aerospike会丢失文档

时间:2015-09-17 23:25:53

标签: amazon-web-services aerospike

我一直在使用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 stopsudo 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:我试图包含尽可能多的东西,如果你想建议更多信息,我会很感激。

1 个答案:

答案 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秒。这样做,客户端将识别该节点已关闭并将操作重定向到另一个节点。

这种设置在群集上可能是压倒性的,会产生巨大的过载,但它对我们有用。