redis分片集群的部署和使用教程

好的,这是一份详细的 Redis 分片集群部署与使用教程。本教程将从概念讲起,逐步深入到环境准备、部署、配置、使用和管理。

图片[1]_redis分片集群的部署和使用教程_知途无界

一、Redis 分片集群核心概念

在开始之前,必须理解几个关键概念:

  1. 什么是分片?​
    • 分片是一种将数据分散存储在多个 Redis 实例(节点)上的技术。每个节点只存储一部分数据,而不是将所有数据都放在一个节点上。
    • 目的​:突破单机内存、CPU和网络带宽的限制,实现水平扩展,从而支持海量数据存储和高并发访问。
  2. 为什么需要集群模式?​
    • 主从复制​:解决了数据冗余和高可用问题,但当单个 master 节点内存或负载达到极限时,依然无法扩展。
    • 哨兵模式​:解决了主从切换的高可用问题,但同样没有解决数据分片的问题。
    • 集群模式​:​同时解决了高可用和数据分片两个问题。它是官方推荐的大规模部署方案。
  3. Redis Cluster 的核心架构
    • 数据分片​:采用 ​哈希槽​ 机制。整个数据集被逻辑上划分为 16384 个 slots。每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个 slot。
      • HASH_SLOT = CRC16(key) mod 16384
    • 节点与槽位映射​:集群中的每个 master 节点负责处理一部分哈希槽。例如,一个有 3 个 master 的集群,可以这样分配:
      • Node A: slots 0 – 5460
      • Node B: slots 5461 – 10922
      • Node C: slots 10923 – 16383
    • 高可用​:每个 master 节点可以有多个 slave 节点。当 master 宕机时,其 slave 会自动升级为新的 master,继续负责原来 master 的哈希槽,保证服务不中断。
    • 客户端重定向​:当客户端连接到一个节点请求一个不属于该节点的 key 时,该节点会返回一个 MOVED 错误,告知客户端正确的节点地址。现代客户端库通常能自动处理这个重定向。

二、环境准备

我们将部署一个 ​3主3从​ 的最小化生产级集群。这意味着需要 6 个 Redis 实例。

角色IP (示例)端口配置文件路径
Master 1192.168.1.1017000/etc/redis/cluster/7000.conf
Slave 1192.168.1.1017001/etc/redis/cluster/7001.conf
Master 2192.168.1.1027002/etc/redis/cluster/7002.conf
Slave 2192.168.1.1027003/etc/redis/cluster/7003.conf
Master 3192.168.1.1037004/etc/redis/cluster/7004.conf
Slave 3192.168.1.1037005/etc/redis/cluster/7005.conf

准备工作:​

  1. 准备至少 3 台 Linux 服务器(虚拟机或物理机均可),并关闭防火墙或开放相应端口(如 7000-7005, 17000-17005)。 # CentOS/Fedora 关闭防火墙(生产环境建议精细配置) systemctl stop firewalld systemctl disable firewalld # Ubuntu/Debian ufw disable
  2. 确保服务器之间网络互通。
  3. 在所有服务器上安装 Redis。可以从源码编译或使用包管理器。这里以源码编译为例: wget https://download.redis.io/releases/redis-7.2.4.tar.gz tar xzf redis-7.2.4.tar.gz cd redis-7.2.4 make && sudo make install

三、部署与配置

步骤 1:创建目录和配置文件

在每台服务器上,为不同的实例创建目录和配置文件。以 192.168.1.101 上的两个实例为例:

# 创建配置目录
sudo mkdir -p /etc/redis/cluster
sudo mkdir -p /var/lib/redis/7000
sudo mkdir -p /var/lib/redis/7001
sudo chown -R redis:redis /var/lib/redis # 假设用户为redis,请根据实际情况修改

创建 7000.conf 文件 (/etc/redis/cluster/7000.conf):

# 基础配置
port 7000
bind 192.168.1.101 # 绑定本机IP,重要!不要绑定127.0.0.1
daemonize yes
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/7000.log
dir /var/lib/redis/7000

# 集群核心配置
cluster-enabled yes
cluster-config-file nodes-7000.conf # 集群自动生成和维护的文件
cluster-node-timeout 15000 # 节点超时时间,毫秒

# 安全与性能
appendonly yes # 开启AOF持久化
requirepass "your_strong_password" # 设置密码,所有节点密码需一致
masterauth "your_strong_password" # 从节点访问主节点的密码

创建 7001.conf 文件,只需修改与端口相关的部分:

port 7001
pidfile /var/run/redis_7001.pid
logfile /var/log/redis/7001.log
dir /var/lib/redis/7001
cluster-config-file nodes-7001.conf
# 其他配置(bind, cluster-enabled, requirepass等)与7000.conf相同

在其他两台服务器上重复此过程,创建对应的 7002.conf, 7003.conf, 7004.conf, 7005.conf,并确保 bind 指令指向各自的服务器 IP。

步骤 2:启动所有 Redis 实例

在每台服务器的配置目录下,分别启动各个实例。

# 在 192.168.1.101 上
redis-server /etc/redis/cluster/7000.conf
redis-server /etc/redis/cluster/7001.conf

# 在 192.168.1.102 上
redis-server /etc/redis/cluster/7002.conf
redis-server /etc/redis/cluster/7003.conf

# 在 192.168.1.103 上
redis-server /etc/redis/cluster/7004.conf
redis-server /etc/redis/cluster/7005.conf

使用 ps aux | grep redis 检查所有实例是否都已成功启动。


四、创建集群

使用 Redis 自带的 redis-cli 工具来创建集群。

方法一:使用 redis-cli --cluster create(推荐)

这是最简单的方法,一条命令即可完成集群的创建和槽位分配。

命令语法:​
redis-cli -a <password> --cluster create <node1_ip:port> <node2_ip:port> ... --cluster-replicas 1

  • -a: 指定密码。
  • --cluster create: 创建集群命令。
  • --cluster-replicas 1: 表示为每个 master 创建一个 slave。1 代表副本数。对于 6 个节点,--cluster-replicas 1 会自动配置为 3主3从。

执行命令(在一台服务器上执行即可):​

redis-cli -a your_strong_password --cluster create \
192.168.1.101:7000 \
192.168.1.101:7001 \
192.168.1.102:7002 \
192.168.1.102:7003 \
192.168.1.103:7004 \
192.168.1.103:7005 \
--cluster-replicas 1

执行过程:​

  1. 命令行会打印出拟定的 master-slave 关系和槽位分配方案。
  2. 它会询问你是否接受这个配置:Can I set the above configuration? (type 'yes' to accept):
  3. 输入 yes 确认。
  4. 工具将开始分配槽位,并将 slave 关联到对应的 master。成功后你会看到 [OK] All 16384 slots covered

方法二:手动分配槽位(了解原理)

此方法用于特殊场景,手动将指定范围的槽位分配给特定节点。过程繁琐,一般不推荐新手使用。大致步骤为:

  1. redis-cli --cluster add-node 逐个添加空节点。
  2. redis-cli --cluster reshard 进行槽位迁移。

五、验证与使用集群

1. 基本连接与信息查看

使用 redis-cli 连接集群,​必须加上 -c 参数,表示以集群模式工作,否则无法进行自动重定向。

# 连接到集群中任意节点
redis-cli -c -h 192.168.1.101 -p 7000 -a your_strong_password

# 查看集群信息
127.0.0.1:7000> CLUSTER INFO
# 重点关注 cluster_state:ok 表示集群正常

# 查看集群节点信息
127.0.0.1:7000> CLUSTER NODES
# 输出会列出所有节点,包括它们的ID、角色(master/slave)、负责的槽位、连接状态等。

2. 读写数据测试

# 设置一个key
127.0.0.1:7000> SET foo bar
-> Redirected to slot [12182] located at 192.168.1.103:7004 # 自动重定向到了负责这个slot的节点
OK

# 获取这个key
127.0.0.1:7004> GET foo
"bar"

# 再设置一个key,可能就在当前节点
127.0.0.1:7004> SET hello world
OK

# 可以看到,foo和hello被存储在了不同的节点上,实现了分片。

3. 使用应用程序客户端

大多数现代编程语言的 Redis 客户端都支持集群。你需要使用集群专用客户端,而不是普通的单节点客户端。

  • Java: JedisCluster, Lettuce
  • Python: redis-py-cluster (注意:新版本redis-py也内置了集群支持)
  • Go: go-redis/v9

Python 示例 (使用 redis-py):​

from redis.cluster import RedisCluster

# 定义集群节点起始点,客户端会自动发现所有节点
startup_nodes = [
    {"host": "192.168.1.101", "port": "7000"},
    {"host": "192.168.1.102", "port": "7002"},
    {"host": "192.168.1.103", "port": "7004"}
]

# 创建集群客户端
rc = RedisCluster(
    startup_nodes=startup_nodes,
    password="your_strong_password",
    decode_responses=True # 自动解码返回值为字符串
)

# 像使用普通Redis一样操作
rc.set("name", "redis_cluster")
print(rc.get("name")) # 输出: redis_cluster

六、集群管理常用操作

1. 添加新主节点

# 1. 在新机器上启动一个空的Redis实例(如端口7006)
redis-server /path/to/new/7006.conf

# 2. 将新节点加入集群(作为master)
redis-cli -a your_strong_password --cluster add-node 192.168.1.104:7006 192.168.1.101:7000
# 第一个IP是新节点,第二个IP是集群中任意一个现有节点

# 3. 为新节点分配槽位(resharding)
redis-cli -a your_strong_password --cluster reshard 192.168.1.101:7000

执行 reshard 后,根据提示输入要迁移的槽位数量、接收节点的 ID,以及从哪些节点迁移(输入 all 表示从所有现有master平均迁移)。

2. 添加从节点

# 启动一个新的空实例(如端口7007)
redis-server /path/to/new/7007.conf

# 将其添加为某个master的slave
# 先通过 CLUSTER NODES 找到目标master的Node ID
redis-cli -a your_strong_password --cluster add-node 192.168.1.104:7007 192.168.1.101:7000 --cluster-slave --cluster-master-id <target_master_node_id>

3. 删除节点

注意:​​ 只能删除没有负责任何槽位的节点(纯slave节点)或已清空所有槽位的master节点。

# 删除一个节点(通过Node ID)
redis-cli -a your_strong_password --cluster del-node 192.168.1.101:7000 <node_id_to_remove>

4. 故障模拟与恢复

手动停止一个 master 节点(如 kill 掉进程),等待 cluster-node-timeout(我们设为15秒)后,观察集群状态:

redis-cli -c -p 7000 cluster nodes | grep myself

如果原来的 slave 节点状态变为 master,则表示故障转移成功,集群依然可用。重新启动被停止的旧 master,它会自动作为新 master 的 slave 重新加入集群。


七、注意事项与最佳实践

  1. 奇数个Master节点​:生产环境建议使用奇数个 master 节点(如 3, 5, 7),便于故障选举。
  2. 密码一致性​:所有节点的 requirepassmasterauth 必须设置为相同的强密码。
  3. 网络与防火墙​:确保所有节点之间的 TCP 端口(如7000)和 ​集群总线端口​(通常是 客户端端口 + 10000,如17000)是互通的。
  4. 数据备份​:集群模式下的备份需要在每个 master 节点上单独进行(如使用 BGSAVE),或者使用 redis-cli --cluster backup 命令。
  5. 避免大Key和热Key​:大Key会导致迁移缓慢,热Key会使单个节点压力过大。在设计数据结构时应尽量避免。
  6. 监控​:使用 Prometheus + Grafana 等工具对集群的每个节点进行监控,关注内存、CPU、连接数、命中率等指标。

通过以上步骤,你应该能够成功部署并管理一个基本的 Redis 分片集群。在实际生产环境中,还需要根据具体业务负载进行更细致的调优。

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞84 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容