Redis 的主从集群搭建与配置

标签:Redis首次发布:2023-11-29最近修改:2026-08-16
Redis 的集群模式
  1. 主从复制模式:利用主从复制原理,一主多从架构。读写分离,主节点可读可写,从节点只能提供读服务。
  2. 哨兵模式:哨兵实现了自动化的故障恢复,哨兵节点是特殊的 redis 节点,不存储数据。哨兵监控整个 redis 集群。
  3. Cluster 模式:实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。

Redis 主从集群模式

Redis 的主从集群是一个“一主多从”的读写分离集群。集群中的 Master 节点负责处理客户端的读写请求,而 Slave 节点仅能处理客户端的读请求。只所以要将集群搭建为读写分离模式,主要原因是,对于数据库集群,写操作压力一般都较小,压力大多数来自于读操作请求。所以,只有一个节点负责处理写操作请求即可。

redis_master_slave_read_write

下面要搭建的读写分离伪集群包含一个 Master 与两个 Slave。它们的端口号分别是:6380、6381、6382。

伪集群搭建过程

  1. 在 Redis 目录下新建一个目录 cluster(意为集群),并把 Redis 目录下的 redis.conf 文件复制到 cluster 目录下。

    bash
    [root@centos redis]# mkdir cluster[root@centos redis]# cp redis.conf cluster/[root@centos redis]# cd cluster/[root@centos cluster]# ll总用量 108-rw-r--r--. 1 root root 106859 5月 10 22:03 redis.conf
  2. 修改 redis.conf 文件
    masterauth 因为我们要搭建主从集群,且每个主机都有可能会是 Master,所以最好不要设置密码验证属性 requirepass。如果真需要设置,一定要每个主机的密码都设置为相同的。此时每个配置文件中都要设置两个完全相同的属性:requirepass 与 masterauth。其中 requirepass 用于指定当前主机的访问密码,而 masterauth 用于指定当前 slave 访问 master 时向 master 提交的访问密码,用于让 master 验证自己身份是否合法。

    bash
    # If the master is password protected (using the "requirepass" configuration# directive below) it is possible to tell the replica to authenticate before# starting the replication synchronization process, otherwise the master will# refuse the replica request.masterauth 1425723960

    repl-disable-tcp-nodelay 该属性用于设置是否禁用 TCP 特性 tcp-nodelay。设置为 yes 则禁用 tcp-nodelay。

    bash
    # By default we optimize for low latency, but in very high traffic conditions# or when the master and replicas are many hops away, turning this to "yes" may# be a good idea.repl-disable-tcp-nodelay no
    什么是 tcp-nodelay

    由于每个 TCP 报文包括除了要发送的数据部分,还有固定长度 20 字节的 TCP 首部。当数据部分太小会使网络带宽的利用率下降。为了充分复用网络带宽,TCP 总是希望发送尽可能大的数据块。为了达到该目的,TCP 中使用了一个名为 Nagle 的算法。

    Nagle 算法的工作原理是,网络在接收到要发送的数据后,并不直接发送,而是等待着数据量足够大(由 TCP 网络特性决定)时再一次性发送出去。这样,网络上传输的有效数据比例就得到了大大提升,无效数据传递量极大减少,于是就节省了网络带宽,缓解了网络压力。

    详见:TCP 的 Nagle 算法和 delayed ack

    有了上面的背景知识,我们就能理解 repl-disable-tcp-nodelay 配置了。如果设置为 yes,表示禁用 tcp-nodelay,也就是 Redis 的主从节点之间在通信时没有 TCP 协议为了充分利用网络带宽带来的延迟。换句话说,如果主从节点之间流量流动很大,最好设置为 yes。

  3. 新建 redis638x.conf 文件(x 为 0,1,2,3······)
    以 redis6380.conf 为例,文件内容如下:

    bash
    include redis.confpidfile /var/run/redis_6380.pidport 6380dbfilename dump6380.rdbappendfilename appendonly6380.aofreplica-priority 90# logfile access6380.log

    redis6381.conf 文件只需把上面内容所有的 6380 改成 6381 即可。最后结果如下:

    bash
    [root@centos cluster]# ll总用量 120-rw-r--r--. 1 root root    165 5月 10 22:44 redis6380.conf-rw-r--r--. 1 root root    165 5月 10 22:46 redis6381.conf-rw-r--r--. 1 root root    165 5月 10 22:46 redis6382.conf-rw-r--r--. 1 root root 106849 5月 10 22:36 redis.conf
  4. 启动所有节点
    虽然这三个节点以及启动,但是这三个节点之间并没有主从关系。

    bash
    [root@centos cluster]# redis-server redis6380.conf[root@centos cluster]# redis-server redis6381.conf[root@centos cluster]# redis-server redis6382.conf
  5. 设置主从关系
    打开三个会话框,分别使用客户端连接三台 Redis。然后通过 slaveof 命令,指定 6380 的 Redis 为 Master。

    bash
    # 6380 主机[root@centos cluster]# redis-cli -p 6380127.0.0.1:6380> auth 1425723960OK# 6381 主机[root@centos cluster]# redis-cli -p 6381127.0.0.1:6381> auth 1425723960OK127.0.0.1:6381> slaveof 127.0.0.1 6380OK# 6382 主机[root@centos cluster]# redis-cli -p 6382127.0.0.1:6382> auth 1425723960OK127.0.0.1:6382> slaveof 127.0.0.1 6380OK
  6. 查看状态信息

    使用 info replication 命令查看各个节点的状态信息。

分级管理

若 Redis 主从集群中的 Slave 较多时,它们的数据同步过程会对 Master 形成较大的性能压力。此时可以对这些 Slave 进行分级管理。

redis_cascading_slave

设置方式很简单,只需要让低级别 Slave 指定其 slaveof 的主机为其上一级 Slave 即可。不过,上一级 Slave 的状态仍为 Slave,只不过,其是更上一级的 Slave。

容灾冷处理

在 Master/Slave 的 Redis 集群中,若 Master 出现宕机怎么办呢?有两种处理方式,一种是通过手工角色调整,使 Slave 晋升为 Master 的冷处理;一种是使用哨兵模式,实现 Redis 集群的高可用 HA,即热处理。

无论 Master 是否宕机,Slave 都可通过执行 slaveof no one 命令将自己由 Slave 晋升为 Master。如果其原本就有下一级的 Slave,那么,其就直接变为了这些 Slave 的真正的 Master 了。而原来的 Master 也会失去这个原来的 Slave。

Comments

评论区将在滚动到这里时加载。