我有一个Aerospike(3.11.1.1)集群,其中有6个节点。当我尝试添加新节点时,有时在群集迁移数据时某些对象“暂时”丢失。迁移完成后,丢失的数据将返回。这是一个错误,还是我做错了什么?如何避免
请注意,在进行迁移时,主对象数要比迁移完成后的实际最终对象数要少
完成迁移之前,主副本和副本计数:
完成迁移后,主副本和副本计数:
我的aerospike.conf:
service {
user root
group root
paxos-single-replica-limit 1 # Number of nodes where the replica count is automatically reduced to 1.
paxos-recovery-policy auto-reset-master
pidfile /var/run/aerospike/asd.pid
service-threads 32
transaction-queues 32
transaction-threads-per-queue 4
batch-index-threads 40
proto-fd-max 15000
batch-max-requests 30000
replication-fire-and-forget true
}
logging {
# Log file must be an absolute path.
file /var/log/aerospike/aerospike.log {
context any info
}
}
network {
service {
#address any
port 3000
}
heartbeat {
mode mesh
mesh-seed-address-port 10.240.0.32 3002
mesh-seed-address-port 10.240.0.33 3002
port 3002
interval 150
timeout 20
}
fabric {
port 3001
}
info {
port 3003
}
}
namespace mynamespace {
replication-factor 2
memory-size 1500M
default-ttl 0 # 30 days, use 0 to never expire/evict.
ldt-enabled true
write-commit-level-override master
storage-engine device {
file /data/aerospike.dat
#device /dev/sdb
write-block-size 1M
filesize 280G
}
}
答案 0 :(得分:1)
某些差异是由于原始迁移/重新平衡设计中的问题所致,Aerospike 3.13中的协议更改中已解决。在3.13中更改协议之前,运行replication-factor
2时,操作员必须一次升级一个节点,然后等待迁移完成。
Aerospike的另一个差异是避免在迁移过程中过多计算master-objects
和副本对象(即prole-objects
)。同样在3.13中,我们为non-replica-objects
添加了一个统计信息,这些统计信息是当前不充当主数据库或副本数据库的对象。这些是(a)具有入站迁移并最终将充当副本的分区上的对象,或者(b)这些是分区上不参与的对象,并且在迁移终止后将被删除。
在3.13之前,类型(a)的non-replica-object
将减少master-objects
或prole-objects
的计数。这是因为在更改协议之前,当分区返回以前是主分区的分区时,即使它没有离开分区时发生的新写操作,分区也会立即恢复为主分区。这不是最佳行为,但不会丢失数据,因为我们将解决其他节点上non-replica-objects
中丢失的记录。协议更改后,返回的“主”分区在收到其他节点的所有迁移之前不会恢复为“主”分区。
在3.13之前,类型(b)的non-replica-objects
将立即下降并减少prole-objects
的计数。这会使节点离开时写入的记录replication-factor
减少1(例如replication-factor 2
暂时变为replication-factor 1
)。这也是在继续升级下一个节点之前等待迁移完成很重要的原因。协议更改后(除非仅在内存中运行),不再需要在节点升级之间等待迁移完成,因为不会删除临时“子集分区”,这可以防止记录的replication-factor
减少(实际上,使用新协议,在迁移期间通常有replication-factor
+一条记录的1个副本。