某500强客户要上线一个功能,其后台所有数据库是我司设计开发的NoSQL数据库。
为了避免数据库集群中,数据节点不一致而导致问题,需要对数据库节点间的数据进行校验。
理论上说,数据库节点之间的数据,应当保持最终一致性。而我司的数据库,是在对主节点对数据进行操作时,coord节点会(立即)通知备节点拉取数据,从而保持数据的一致性。所以,对于正常运行的数据库来说,一个集群内每个节点上的数据,是完全一致的。
客户是上帝,我们所作的就是要让客户放心。虽然我们强调我们的数据库集群内的节点中数据是一致的,让客户看到实际的数据,才是让客户放心的唯一方法。
针对客户提出的需求,我做了一下分析:
最开始,我想写一个dump工具,dump每个节点下的数据库存储文件,对每个节点上的每一条数据进行遍历比较,把不同的数据列出来。该方法的优点是速度快,效率高。但是,我的想法太天真了,我的出发点在一开始,集群中的节点被同时创建,这样,数据库中的每条记录的偏移是一致的。我没有考虑到扩容后的情况。
在实施方,随时可能扩容,增加数据节点,这样的话,新的节点和旧的节点,最开始的数据,和记录的偏移,可能就不一致。新的节点创建成功,会主动去向主节点同步,拉取数据,同时,主节点进行数据操作时,会通知新的节点同步数据,二者之间我共同作用,可能就影响了数据记录的偏移,导致新的数据记录偏移和主节点的记录偏移不一致。虽然编目结点也会记录数据插入的偏移,但是对编目结点进行查询后再去读取数据记录比较,会影响效率。
因此,我选择了另外一种方式:
用过C++驱动,对每个数据节点的的每条数据按照oid升序进行查询,对比每条记录。如果有不一致的数据,先将数据记录下来,并记录哪些节点存在该条数据,哪些节点不存在该条记录。然后将记录最小oid的节点游标向下移动,可能会移动多个节点的游标。因为oid最小的节点,向下移动一条,是最可能匹配的下一条记录。按照该方法,逐步移动游标,到游标末尾。
有可能在程序运行时,节点间的数据正在同步,这样,第一次的检查结果可能有不一致的数据。因此可以指定循环检查的次数,第二次检查,就不会再去遍历所有数据,而是从第一次遍历之后的结果中选取记录下来的数据,对每个节点进行查找,都存在或者都不存在才移除改记录。
理论有了,则是实践。
经过两天的冥想,两天的story文档编写,得到了领导的认可。经过一个周的开发和调试,工具终于问世了。
对我自己机器上的数据库集群进行检查,发现没有不一致的数据。我们的数据库还是经得起考验的 :)
对数据库节点进行操作,不通过coord节点(这样,从节点收不到同步信号,也不会在coord节点上查询到数据操作),对节点进行数据增删改,然后用工具测试。结果依然是我预期的。
真棒!好有成就感的说 :)
数据库将会开源,大家以后就可以看到我写的工具和代码了 :)
分布式数据库集群节点数据一致性校验,布布扣,bubuko.com
原文地址:http://www.cnblogs.com/tynia/p/consistency_inspect.html