Redis 提供了兩種高可用性解決方案:哨兵模式和集群模式。它們各自有不同的特點和適用場景。以下是詳細的對比和結合代碼的示例:
哨兵模式(Sentinel)
特點
-
高可用性:
- Sentinel 通過監控、通知、故障轉移等功能,保證 Redis 服務的高可用性。
-
主從復制:
- 使用主從復制實現數據冗余和讀寫分離。
-
自動故障轉移:
- 當主節點發生故障時,Sentinel 會自動將一個從節點提升為新的主節點。
-
客戶端連接:
- 客戶端通過 Sentinel 獲取當前主節點的信息以確保連接到正確的節點。
示例
配置主從架構和 Sentinel:
主節點配置(master.conf):
port 6379
bind 127.0.0.1
dir /var/lib/redis
appendonly yes
從節點配置(slave.conf):
port 6380
bind 127.0.0.1
dir /var/lib/redis
appendonly yes
slaveof 127.0.0.1 6379
Sentinel 配置(sentinel.conf):
port 26379
dir /tmp
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000
啟動 Sentinel:
redis-sentinel sentinel.conf
Java 代碼示例:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;import java.util.HashSet;
import java.util.Set;public class RedisSentinelExample {private static final String MASTER_NAME = "mymaster";public static void main(String[] args) {Set<String> sentinels = new HashSet<>();sentinels.add("127.0.0.1:26379");try (JedisSentinelPool sentinelPool = new JedisSentinelPool(MASTER_NAME, sentinels);Jedis jedis = sentinelPool.getResource()) {jedis.set("mykey", "myvalue");String value = jedis.get("mykey");System.out.println("mykey: " + value);System.out.println("Connected to master: " + jedis.getClient().getHost() + ":" + jedis.getClient().getPort());}}
}
集群模式(Cluster)
特點
-
數據分片:
- Redis 集群將數據分片存儲在不同的節點上,每個節點存儲整個數據集的一部分。
-
高可用性:
- Redis 集群通過復制和分區來實現高可用性和數據的高可靠性。
-
自動故障轉移:
- 集群模式內建自動故障轉移機制,發生故障時可以自動選擇新的主節點。
-
水平擴展:
- 可以通過增加節點來擴展集群的存儲容量和處理能力。
示例
配置 Redis 集群:
節點配置(node1.conf, node2.conf, …, node6.conf):
port 7000
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
啟動每個節點:
redis-server node1.conf
redis-server node2.conf
redis-server node3.conf
redis-server node4.conf
redis-server node5.conf
redis-server node6.conf
創建集群:
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1
Java 代碼示例:
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.HostAndPort;import java.util.HashSet;
import java.util.Set;public class RedisClusterExample {public static void main(String[] args) {Set<HostAndPort> clusterNodes = new HashSet<>();clusterNodes.add(new HostAndPort("127.0.0.1", 7000));clusterNodes.add(new HostAndPort("127.0.0.1", 7001));clusterNodes.add(new HostAndPort("127.0.0.1", 7002));clusterNodes.add(new HostAndPort("127.0.0.1", 7003));clusterNodes.add(new HostAndPort("127.0.0.1", 7004));clusterNodes.add(new HostAndPort("127.0.0.1", 7005));try (JedisCluster jedisCluster = new JedisCluster(clusterNodes)) {jedisCluster.set("mykey", "myvalue");String value = jedisCluster.get("mykey");System.out.println("mykey: " + value);}}
}
對比總結
-
高可用性:
- 哨兵模式:通過 Sentinel 實現高可用性,適用于小規模集群。
- 集群模式:內建高可用性,通過節點間的復制和自動故障轉移實現。
-
擴展性:
- 哨兵模式:擴展性有限,適用于少量節點的主從架構。
- 集群模式:支持水平擴展,適用于大規模數據集和高并發場景。
-
數據分片:
- 哨兵模式:不支持數據分片,所有數據存儲在主節點及其復制的從節點上。
- 集群模式:支持數據分片,每個節點存儲部分數據,通過哈希槽分配數據。
-
客戶端連接:
- 哨兵模式:客戶端通過 Sentinel 獲取主節點信息,連接到正確的主節點。
- 集群模式:客戶端直接連接到集群節點,自動處理數據分片和故障轉移。
根據具體需求選擇合適的模式。如果需要高可用性和簡單的主從復制,可以選擇哨兵模式;如果需要更高的擴展性和數據分片,則選擇集群模式。