Linux下搭建Redis集群

环境准备

  • 操作系统:CentOS 7.5
  • Redis版本:6.2.6,链接

搭建Redis主从集群

  • 新建slave1slave2目录,复制两份redis配置文件

    1
    2
    3
    4
    5
    mkdir slave1
    mkdir slave2

    cp redis.conf.bak /usr/my_software/redis/slave1/redis.conf
    cp redis.conf.bak /usr/my_software/redis/slave2/redis.conf

    修改端口号等其他配置,slave2设置类似

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    cd slave1
    vim redis.conf

    # 设置端口号
    port 6389

    # 设置后台运行
    daemonize yes

    # 设置pid路径
    pidfile /var/run/redis_6389.pid

    # 设置redis.log路径
    logfile "/usr/my_software/redis/slave1/redis.log"

    # 设置dump.rdb路径
    dir "/usr/my_software/redis/slave1"

    # 设置主节点
    replicaof 127.0.0.1 6379

    # 设置主节点密码(如果主节点有设置密码)
    masterauth "codecho@0110"
  • 启动slave1slave2

    1
    2
    3
    4
    5
    cd slave1
    redis-server redis.conf

    cd slave2
    redis-server redis.conf

    查看主从节点启动情况

    1
    ps -ef|grep redis

  • 连接主节点,使用info命令可以看到主节点现在有两个从节点slave1slave2

    1
    2
    redis-cli -p 6379 [-a 密码]
    127.0.0.1:6379> info

  • 测试主节点和从节点数据同步

    !!!注意!!!从节点只能读数据,无法进行写数据操作

    再开启一个窗口,连接从节点slave1slave2,通过keys *命令可以发现redis中没有数据

    1
    2
    3
    redis-cli -p 6389
    127.0.0.1:6389> keys *
    (empty array)

    在连接主节点的窗口中插入一些数据

    1
    2
    3
    4
    127.0.0.1:6379> set today 2022-01-05
    OK
    127.0.0.1:6379> hset student_1001 name xiaoming gender male age 22
    (integer) 3

    在连接从节点的窗口中重新查询数据,现在从节点也有数据了

    1
    2
    3
    127.0.0.1:6389> keys *
    1) "student_1001"
    2) "today"

在这种模式下,如果主节点挂掉,我们只能通过手动重新启动主节点,显然,这种情况是我们难以接受的,因此,需要另一种方式来实现主节点的故障转移,而哨兵模式就可以做到这一点。

设置哨兵模式

  • 新建sentinel1sentinel2sentinel3目录,复制三份sentinel配置文件

    1
    2
    3
    4
    5
    6
    7
    mkdir sentinel1
    mkdir sentinel2
    mkdir sentinel3

    cp sentinel.conf /usr/my_software/redis/sentinel1
    cp sentinel.conf /usr/my_software/redis/sentinel2
    cp sentinel.conf /usr/my_software/redis/sentinel3

    修改端口等信息,sentinel2sentinel3设置类似

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    cd sentinel1
    vim sentinel.conf

    # 设置端口号
    port 26379

    # 设置后台运行
    daemonize yes

    # 设置pid路径
    pidfile /var/run/redis-sentinel1.pid

    # 设置sentinel日志路径
    logfile "/usr/my_software/redis/sentinel1/sentinel.log"

    # 设置工作目录
    dir "/usr/my_software/redis/sentinel1"

    # sentinel monitor <master-name> <ip> <redis-port> <quorum>
    # quorum表示至少有<quorum>个哨兵认定主节点下线(主观下线),这个主节点才真正下线了(客观下线)
    sentinel monitor mymaster 127.0.0.1 6379 2

    # 设置主节点连接密码(如果主节点设置了)
    sentinel auth-pass mymaster codecho@0110
  • 启动哨兵

    1
    2
    3
    4
    /usr/local/bin
    ./redis-sentinel /usr/my_software/redis/sentinel1/sentinel.conf
    ./redis-sentinel /usr/my_software/redis/sentinel2/sentinel.conf
    ./redis-sentinel /usr/my_software/redis/sentinel3/sentinel.conf

    查看sentinel1sentinel2sentinel3启动情况

    查看sentinel1日志,可以看到主节点、从节点、其他哨兵节点信息

  • 模拟主节点挂掉的情况

    1
    kill -9 redis主节点pid

    查看sentinel1的日志

    1
    tail -f sentinel.log

    可以看到,当主节点6379挂掉后,哨兵选举了从节点6399作为新的主节点,并且会更新其他从节点配置文件中的主节点信息

  • 重新启动原来的主节点6379

    1
    redis-server redis.conf

    可以看到原来的主节点的配置文件中多了一行replicaof 127.0.0.1 6399 ,表示它现在是6399的从节点了

    也可以用info命令查看从节点信息

搭建Redis Cluster

  • 创建cluster目录,在cluster目录中创建6379、6380、6381、6382、6383、6384(每个目录代表一个端口号,可以使用其他端口号)共6个目录,表示一共有6个redis节点(3主3从)

    1
    2
    3
    mkdir cluster
    cd cluster
    mkdir 6379 6380 6381 6382 6383 6384
  • 将redis源码目录中的redis.conf分别复制到上述6个目录下,并修改端口号等信息

    注意,像设置后台运行、pid路径、redis日志文件路径等配置自行参考上节部分按需修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cd 6379

    # 修改端口号
    port 6379

    # 开启aof
    appendonly yes

    # 设置以集群方式运行
    cluster-enabled yes

    # 每个集群节点的配置文件,不需要手动创建
    cluster-config-file nodes.conf

    # 集群节点超时,单位:毫秒
    cluster-node-timeout 5000
  • 启动上述6个节点

    1
    2
    3
    4
    5
    cd 6379
    redis-server redis.conf


    ...

    查看节点是否启动成功

  • 创建真正的集群!!!

    对于redis-5及之后的版本,使用redis-cli 命令来创建集群,redis-4.x及之前的版本貌似使用的是redis-trib.rb可参考官网文档

    注意:如果要想在外部通过代码连接集群,这里的ip地址需要换成服务器的公网ip

    1
    2
    3
    redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1

    输入yes确认保存配置

  • 更简单快速地创建集群

    使用redis源码create-cluster目录下的create-cluster脚本创建集群

    1
    2
    3
    4
    5
    cd utils/create-cluster
    ./create-cluster start
    ./create-cluster create

    ./create-cluster stop

    可以看到create-cluster脚本中端口号是从30000开始的,也是创建6个节点,本质上和上面手动创建是一样的操作

  • 连接集群并使用

    1
    redis-cli -c -p 6380

    可以看到,我们连接任意一个集群节点,写入的数据会根据key重定向到不同的哈希槽,同样,查询数据时也会从对应的集群节点中获取

  • 模拟三个主节点中的一个挂掉

    1
    kill -9 6379主节点的pid

    可以看到,6379的从节点6384被选举为新的主节点

    重新启动6379节点,连接集群后可以看到6379已经变成6384的从节点了

使用Redis工具连接Redis Cluster

  • 推荐使用AnotherRedisDesktopManager客户端工具,github地址