为了确保 Redis 的高可用性和扩展性,可以使用 Redis Sentinel 和 Redis Cluster。
Redis Sentinel
Redis Sentinel 是用于监控 Redis 服务器及其复制的高可用性解决方案。它能够自动进行故障转移,并通知客户端新的主服务器地址。下面是设置和使用 Redis Sentinel 的步骤和代码示例。
设置 Redis Sentinel
-
配置 Redis 主从:
配置主服务器 (redis.conf
):port 6379
配置从服务器 (
redis-slave.conf
):port 6380 replicaof 127.0.0.1 6379
-
配置 Sentinel:
创建 Sentinel 配置文件 (sentinel.conf
):port 26379 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 10000 sentinel parallel-syncs mymaster 1
-
启动 Redis 和 Sentinel:
redis-server redis.conf redis-server redis-slave.conf redis-sentinel sentinel.conf
使用 Redis Sentinel 的 Go 示例
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
func main() {
ctx := context.Background()
// Sentinel client
sentinelClient := redis.NewFailoverClient(&redis.FailoverOptions{
MasterName: "mymaster",
SentinelAddrs: []string{"localhost:26379"},
})
// 设置键值
err := sentinelClient.Set(ctx, "key", "value", 0).Err()
if err != nil {
fmt.Println("Error setting key:", err)
return
}
// 获取键值
val, err := sentinelClient.Get(ctx, "key").Result()
if err != nil {
fmt.Println("Error getting key:", err)
return
}
fmt.Println("key:", val)
}
Redis Cluster
Redis Cluster 提供了一种在多个 Redis 节点之间自动分片数据的方式,支持更大的数据集和更高的可用性。
设置 Redis Cluster
-
配置每个节点:
创建redis-cluster-7000.conf
配置文件:port 7000 cluster-enabled yes cluster-config-file nodes-7000.conf cluster-node-timeout 5000 appendonly yes
类似地,为其他节点(如 7001, 7002 等)创建配置文件。
-
启动 Redis 节点:
redis-server redis-cluster-7000.conf redis-server redis-cluster-7001.conf redis-server redis-cluster-7002.conf
-
创建集群:
使用redis-cli
创建集群:redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1
使用 Redis Cluster 的 Go 示例
package main
import (
"context"
"fmt"
"github.com/go-redis/redis/v8"
)
func main() {
ctx := context.Background()
// Cluster client
clusterClient := redis.NewClusterClient(&redis.ClusterOptions{
Addrs: []string{"localhost:7000", "localhost:7001", "localhost:7002"},
})
// 设置键值
err := clusterClient.Set(ctx, "key", "value", 0).Err()
if err != nil {
fmt.Println("Error setting key:", err)
return
}
// 获取键值
val, err := clusterClient.Get(ctx, "key").Result()
if err != nil {
fmt.Println("Error getting key:", err)
return
}
fmt.Println("key:", val)
}
集群管理和维护
集群管理
可以使用 redis-cli
工具进行集群的管理,如重新分片、添加节点、删除节点等。
重新分片:
redis-cli --cluster reshard 127.0.0.1:7000
添加节点:
redis-cli --cluster add-node 127.0.0.1:7003 127.0.0.1:7000
删除节点:
redis-cli --cluster del-node 127.0.0.1:7000 <node-id>
集群维护
- 监控节点:使用
INFO
命令监控每个节点的状态。 - 备份数据:定期备份 RDB 文件。
- 故障处理:设置告警机制,及时处理节点故障。