Docker搭建Redis三主三从集群

Docker搭建Redis三主三从集群

什么是Redis集群?

简单说,Redis集群就是让多个Redis服务器一起工作,主要有两个好处:

  • 数据分片:把数据分散存储在多个服务器上,解决单台服务器内存不足的问题
  • 高可用:每个主服务器都有一个从服务器作为备份,主服务器故障时从服务器可以顶上

今天要搭建的是"三主三从"架构:3个主节点负责数据存储,每个主节点对应1个从节点负责备份。

准备工作

在开始之前,我已经在虚拟机上安装了Docker,因为用Docker搭建集群会更简单快捷。如果还没安装Docker,可以先安装好。

搭建步骤

第一步:拉取Redis镜像

首先需要获取Redis的Docker镜像,执行以下命令:

docker pull redis:latest

这个命令会从Docker仓库下载最新版本的Redis镜像。执行完成后,可以用docker images命令查看是否下载成功:

docker images

如果看到redis的镜像信息,就说明拉取成功了。

第二步:创建集群目录和配置文件

我们需要为6个节点(3主3从)创建各自的配置文件和数据目录。我用循环命令来批量创建:

# 循环创建6个节点的配置和数据目录
for port in 8001 8002 8003 8004 8005 8006; do
  # 创建目录
  mkdir -p /mydata/redis/node-${port}/{conf,data}
  
  # 生成配置文件
  cat << EOF > /mydata/redis/node-${port}/conf/redis.conf
port ${port}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.1.148
cluster-announce-port ${port}
cluster-announce-bus-port $((port + 10000))
appendonly yes
protected-mode no
EOF
done

# 赋予权限
chmod -R 777 /mydata/redis

这里解释一下关键配置:

  • port ${port}:每个节点的端口号(8001-8006)
  • cluster-enabled yes:开启集群模式
  • cluster-announce-ip:服务器的IP地址(需要替换成你自己的IP)
  • cluster-announce-port:节点端口
  • cluster-announce-bus-port:节点间通信的总线端口(端口号+10000)

第三步:启动6个Redis容器

接下来,我们用Docker启动6个Redis容器,分别对应8001到8006这6个节点:

for port in 8001 8002 8003 8004 8005 8006; do
  docker run -d --name redis-node-${port} --net host -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf -v /mydata/redis/node-${port}/data:/data redis:latest redis-server /etc/redis/redis.conf
done

命令说明:

  • --name redis-node-${port}:给容器起名字
  • --net host:使用主机网络,方便节点间通信
  • -v:挂载配置文件和数据目录,实现数据持久化
  • redis-server /etc/redis/redis.conf:指定配置文件启动Redis

启动完成后,可以用docker ps命令查看容器是否正常运行。

第四步:初始化Redis集群

现在我们有了6个独立的Redis节点,需要把它们组成一个集群。执行以下命令:

docker exec -it redis-node-8001 redis-cli --cluster create 192.168.1.148:8001 192.168.1.148:8002 192.168.1.148:8003 192.168.1.148:8004 192.168.1.148:8005 192.168.1.148:8006 --cluster-replicas 1

命令说明:

  • --cluster create:创建集群
  • 后面跟的是6个节点的IP和端口
  • --cluster-replicas 1:指定每个主节点有1个从节点

执行命令后,会看到如下输出:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.1.148:8005 to 192.168.1.148:8001
Adding replica 192.168.1.148:8006 to 192.168.1.148:8002
Adding replica 192.168.1.148:8004 to 192.168.1.148:8003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 423b23d250f83d9de63a34abe4d5d37da6f6c479 192.168.1.148:8001
   slots:[0-5460] (5461 slots) master
M: f38fd7946eda90f448ddf0411d75603f4b587df4 192.168.1.148:8002
   slots:[5461-10922] (5462 slots) master
M: b840d4d34390a6ca1b32d68ca8390969e67c441c 192.168.1.148:8003
   slots:[10923-16383] (5461 slots) master
S: 3cad2ba9c42abd34c650de12c6a5b2ac4b3dbdf2 192.168.1.148:8004
   replicates f38fd7946eda90f448ddf0411d75603f4b587df4
S: 3efbb28e63cc70c91f7275232e3fc67d58dfb270 192.168.1.148:8005
   replicates b840d4d34390a6ca1b32d68ca8390969e67c441c
S: d857863fb19bd0ae001e9dc5c76d2e04a33e7164 192.168.1.148:8006
   replicates 423b23d250f83d9de63a34abe4d5d37da6f6c479
Can I set the above configuration? (type 'yes' to accept):

这段输出告诉我们:

  1. Redis集群共有16384个哈希槽(slots)
  2. 这16384个槽被平均分配给了3个主节点:
    • 8001节点负责0-5460号槽
    • 8002节点负责5461-10922号槽
    • 8003节点负责10923-16383号槽
  3. 从节点分配情况:
    • 8005是8001的从节点
    • 8006是8002的从节点
    • 8004是8003的从节点

此时,我们需要输入yes确认这个配置:

Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.1.148:8001)
M: 423b23d250f83d9de63a34abe4d5d37da6f6c479 192.168.1.148:8001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 3cad2ba9c42abd34c650de12c6a5b2ac4b3dbdf2 192.168.1.148:8004
   slots: (0 slots) slave
   replicates f38fd7946eda90f448ddf0411d75603f4b587df4
S: 3efbb28e63cc70c91f7275232e3fc67d58dfb270 192.168.1.148:8005
   slots: (0 slots) slave
   replicates b840d4d34390a6ca1b32d68ca8390969e67c441c
M: f38fd7946eda90f448ddf0411d75603f4b587df4 192.168.1.148:8002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: b840d4d34390a6ca1b32d68ca8390969e67c441c 192.168.1.148:8003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: d857863fb19bd0ae001e9dc5c76d2e04a33e7164 192.168.1.148:8006
   slots: (0 slots) slave
   replicates 423b23d250f83d9de63a34abe4d5d37da6f6c479
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

看到[OK] All 16384 slots covered.这个提示,就说明Redis三主三从集群已经成功搭建完成了!

总结

回顾整个过程,我们从拉取Redis镜像开始,创建了6个节点的配置文件和目录,启动了6个Redis容器,最后通过集群初始化命令将它们组成了一个三主三从的Redis集群。

这个集群实现了:

  1. 数据分片:3个主节点分别存储不同范围的哈希槽
  2. 数据备份:每个主节点都有一个从节点实时同步数据
  3. 高可用:当主节点出现故障时,从节点可以自动接管工作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值