当前位置:首页 > 问答 > 正文

慢慢来,教你怎么一步步搭好那个靠谱的Redis集群环境,别急着跳过细节

整理自知乎用户“木子聊技术”的分享、Redis官方文档的入门指南部分以及《Redis开发与运维》一书中的实操章节,结合了常见的搭建经验)

第一步:先别急着装软件,想清楚你要什么样的集群

很多人一上来就敲安装命令,结果后面一堆麻烦,你先得知道,Redis集群主要有两种主流模式:

  1. 主从复制(Master-Slave):这个更像“备份”,一个主节点(Master)负责写数据,一个或多个从节点(Slave)复制主节点的数据,主要负责读,如果主节点挂了,需要手动把从节点升级成主节点,中间服务会中断,它简单,但不能自动故障恢复。
  2. Redis Cluster(官方集群):这是真正的“集群”,数据会被分片(可以理解为把数据切成很多小块)存储在多个主节点上,每个主节点还可以有从节点,它的最大好处是高可用自动故障转移——意思是任何一个主节点挂了,它的从节点会自动顶上,服务基本不受影响。

如果你的目的是搭建一个高可用的、能抗故障的生产环境,那我们的目标就是搭建Redis Cluster。 别被“Cluster”这个词吓到,我们一步步来。

第二步:准备一台“干净”的服务器

别在你的Windows电脑上折腾,生产环境都是用Linux的,你可以先找一台虚拟机(比如用VirtualBox装的CentOS 7)来练习,确保这台机器能联网,因为需要下载软件。

关键一步:关闭防火墙或者放行端口。 这是最容易卡住新手的坑!Redis集群节点之间需要通信,默认端口是6379,但集群总线端口还需要在6379的基础上加10000(即16379),最简单直接的方法是暂时关闭防火墙练手:

systemctl stop firewalld  # 临时关闭防火墙(CentOS 7)
systemctl disable firewalld # 永久关闭(练习环境可选)

如果公司服务器不让关防火墙,那你就需要把每个节点服务器的6379和16379端口都打开,命令是 firewall-cmd 开头的,这个你去搜一下具体用法。

第三步:安装Redis,但别用最简单的yum install

yum install redis 装虽然快,但版本可能很旧,我们最好自己编译安装新版本的Redis。

  1. 安装依赖包:Redis是C写的,需要编译环境。

    yum install -y gcc-c++ autoconf automake
  2. 下载并解压源码:去Redis官网(redis.io)找最新的稳定版下载链接,比如当时是6.2.6。

    wget https://download.redis.io/releases/redis-6.2.6.tar.gz
    tar xzf redis-6.2.6.tar.gz
    cd redis-6.2.6
  3. 编译和安装

    make  # 编译,等一会儿
    make install PREFIX=/usr/local/redis # 指定安装目录,方便管理
  4. 把可执行文件放到系统路径

    ln -s /usr/local/redis/bin/* /usr/local/bin/ # 创建软链接

    现在你无论在哪个目录,输入 redis-serverredis-cli 命令都能用了。

第四步:为集群准备多个实例,而不是一个

一台服务器也可以模拟集群,我们用不同的端口号来区分不同的Redis实例,假设我们模拟一个最小的集群:3个主节点(Master),每个主节点配1个从节点(Slave),一共6个实例。

  1. 创建集群专用目录

    mkdir -p /opt/redis_cluster
    cd /opt/redis_cluster
  2. 为每个实例创建独立的文件夹和配置文件:我们创建6个文件夹,分别叫7001到7006,代表6个不同的端口。

    mkdir 7001 7002 7003 7004 7005 7006
  3. 编写一个通用的配置文件模板:进入7001目录,创建一个 redis.conf 文件,内容核心如下:

    port 7001  # 端口号,每个实例要改
    daemonize yes  # 后台运行
    pidfile /var/run/redis_7001.pid  # PID文件,端口号也要改
    logfile "/opt/redis_cluster/7001/redis.log" # 日志文件路径
    dir /opt/redis_cluster/7001/  # 数据文件存放路径
    cluster-enabled yes  # 最关键的一行:开启集群模式
    cluster-config-file nodes-7001.conf # 集群生成的配置文件,每个实例不同
    cluster-node-timeout 15000 # 节点超时时间
    appendonly yes # 开启持久化

    注意:上面所有带“7001”的地方,在复制到7002文件夹时,都要相应地改成7002,以此类推,这个步骤有点枯燥,但必须仔细,你可以写个简单脚本批量替换,但手动做一遍印象更深。

第五步:逐个启动所有实例,检查是否成功

  1. 启动:分别进入6个目录,用配置文件启动Redis服务。

    cd /opt/redis_cluster/7001
    redis-server redis.conf

    对7002到7006重复这个操作。

  2. 检查:用 ps -ef | grep redis 命令,你应该能看到6个 redis-server 进程在运行,分别监听7001到7006端口,再用 netstat -tlnp | grep redis 看看端口是否都正常监听了。

    如果哪个节点没起来,第一时间去查看对应目录下的 redis.log 日志文件,里面会明确告诉你错在哪里(比如端口被占用、配置文件写错等)。

第六步:让散装的6个实例“握手”组成真正的集群

现在6个实例还是孤立的,你需要用Redis官方提供的工具 redis-cli 把它们串联起来。

执行下面这个命令(一行,很长):

redis-cli --cluster create \
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 127.0.0.1:7006 \
--cluster-replicas 1

解释一下

  • --cluster create:告诉工具我们要创建集群。
  • 后面跟了6个节点的地址。
  • --cluster-replicas 1:这个参数是关键,意思是每个主节点配1个从节点,所以工具会自动从前3个节点(7001,7002,7003)中选为主节点,后3个(7004,7005,7006)分别作为它们的从节点。

命令执行后,工具会给你显示一个它规划好的“主从分配方案”,问你“Is this configuration ok?”,你仔细看一下,比如确认是不是7004是7001的从节点,等等,确认无误后,输入 yes 并回车。

第七步:验收成果,试试你的集群牛不牛

  1. 连接测试:用集群模式连接任意一个节点(参数 -c 代表集群模式)。

    redis-cli -c -p 7001
  2. 写入数据:在命令行里设置几个键值对,

    0.0.1:7001> set name "慢慢来"
    -> Redirected to slot [5798] located at 127.0.0.1:7002
    OK

    注意看,你虽然连的是7001,但当你设置 name 这个key时,Redis根据计算发现这个key应该存放在7002节点管理的“数据片”(slot)上,于是自动给你“重定向”到了7002节点,并成功写入,这就是集群的数据分片在起作用!

  3. 读取数据:你再 get name,无论你连的是7001还是7003,它都能正确找到并返回值。

  4. 模拟故障(这是最激动人心的):你可以用 ps -ef | grep redis 找到7002这个主节点的进程ID(PID),然后用 kill -9 [PID] 命令强行杀掉它,等待十几秒后,你再执行 redis-cli -c -p 7001 cluster nodes 命令查看节点状态,你会神奇地发现,原来7002的从节点(比如是7005)已经自动升级为了新的主节点(Master)!整个集群依然可以正常读写数据,这就实现了高可用

走到这一步,恭喜你,一个真正意义上“靠谱”的Redis集群环境就亲手搭起来了!这比光看理论要踏实得多,后面你再慢慢去研究更深入的配置、监控和优化。

慢慢来,教你怎么一步步搭好那个靠谱的Redis集群环境,别急着跳过细节