一. 对比

redis 提供了redis sentinal 的高可用策略,以及redis cluster来支持扩展性(同时也支持高可用)。redis cluster,ealsticsearch 都属于有状态数据存储服务,这里做一个简单的对比。

特性 redis cluster elasticsearch  备注
主要设计目标 在保证high performance的条件下,提供可扩展性 可扩展,高可用  
数据特点 内存存储,存储的数据一般不超过GB级别 主要为硬盘存储,elasticsearch 存储数据通常在TB级别以上 针对不同的数据特点,redis 和 elasticsearch 采用不同的分区策略。考虑redis较小的数据规模,redis在存储数据时候可以做轻量的设计,比如将所有数据分为固定数量的slot,做精细化的数据迁移
数据内容 kv 对 倒排索引,文档,docValues,并区分topic  
数据分区 数据分为2^14 个slot,slot分布在多个master节点上;最多支持 1000个节点 对每个topic进行分区,分片均匀分布在各个节点上 elasticsearch 的分片 rebalance 更智能,redis cluster 需要手动调整slot位置
复制与分片 一个节点要么是master,要么是replica 一个节点包含多个分片,有主分片,复制分片  
路由算法 crc16(key) / 2^14,或者使用hashTag shard = hash(routing) % number_of_primary_shards  
查询代理 无代理,客户端直接进行查询,如果查询节点没有对应的slot,返回MOVE error,客户端使用新的节点查询。这样做可以降低redis 节点压力,避免同步调用。 每个节点可以当做代理节点,向其他节点发送请求,合并响应返回给客户端  
客户端 客户端需要缓存slot 和 node 的映射关系  
可用性 复制节点支持failover 复制分片支持failover  
写入复制 采用异步复制,保证写入高性能 可配置写一致性,quorum/one/all, 默认为quorum,即大多数分片可用才允许写操作  
选举算法 gossip bully gossip算法能预防广播风暴
节点间通信tcp端口 10000 + data port (Redis Cluster Bus) 9300 redis 和 elasticsearch 都是用特定tcp端口进行节点间互相通信,保持长连接