Redis一致性检测调研

Mysql

1、Mysql一致性校验工具(pt-table-checksum):
https://www.percona.com/doc/percona-toolkit/LATEST/pt-table-checksum.html

binlog replication的校验。对应于redis就是aof。

2、Mysql一致性校验方案(Baron Schwartz):

https://www.xaprb.com/blog/2007/04/07/how-to-know-if-a-mysql-slave-is-identical-to-its-master/

3、Mysql一致性校验方案工具(mysqlrplsyn):

https://docs.oracle.com/cd/E17952_01/mysql-utilities-1.6-en/utils-task-rplsync.html

1与3类似,但对redis不适用,因为它们都需要:lock tables,perform then checksum,get information about the master status.

而redis只有一个db,这样做,就不允许期间有写入了。另外,这样的工具,并不能保证结果100%正确,还是有可能会失败的。

PostgreSQL

1、9.3+版本新增了checksum:

https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3#Data_Checksums

缺点:

a. 只能在集群模式下使用。

b. 开启该功能会导致性能损耗。

c. 必须在启动时开启,不支持动态调整。

2、官方回复:

https://www.postgresql-archive.org/replication-consistency-checking-td5852406.html

Stream Replication已经保证了数据的一致性。

反对者:mysql有replication synchronization问题,需要一致性校验工具,但Postgres没有该问题,根本不需要一致性校验工具。

DB2的HADR(similar to PG replication)也是不需要一致性校验工具的。

支持者:Postgres曾经发生过主从不一致的问题:

https://wiki.postgresql.org/wiki/Nov2013ReplicationIssue

https://thebuild.com/presentations/worst-day-fosdem-2014.pdf

解决该问题的方案一般有2种:

a. checksum.(比较重,需要锁住,防止新写入)

b. Keep things monitored. (比较轻)

redis可以在准备写aof那里嵌入一个函数:

a. 针对写入流,做checksum。(db级别)

b. 将写入流,发送给监听的client。(redis只提供数据,由第三方进行具体的一致性校验,以及查找不一致key的工作)

Oracle

1、Oracle VeriData:

http://www.oracle.com/us/products/middleware/059493.pdf

介绍了Oracle VeriData的功能与特性,没有具体设计。我们的最终实现效果可以参考这个。

Redislabs

1、https://redislabs.com/blog/fast-and-efficient-parallelized-comparison-of-redis-databases/

主要是用SCAN系列命令,进行比较。缺点:1)对redis性能有影响;2)假如SCAN过程中key更新了,可能结果是不一致的。

用于比较的python脚本:https://gist.github.com/yoav-steinberg/10589500