一. 对比
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端口进行节点间互相通信,保持长连接 |