Redis哨兵和集群模式

07-03 1442阅读

特性哨兵模式集群模式
高可用性
数据分片
水平扩展
配置复杂度
管理复杂度
多键操作支持否(有限制)

哨兵模式

原理:

Redis 哨兵模式是一种高可用性解决方案,它通过监控 Redis 主从架构,自动执行故障转移,从而确保服务的连续性。哨兵模式的核心组件包括哨兵(Sentinel)节点、主节点(Master)和从节点(Slave)。

Redis哨兵和集群模式

1. 哨兵节点

哨兵节点是专门用于监控 Redis 主从架构的独立进程。哨兵节点会周期性地检查主从服务器的健康状况,并在主服务器宕机时进行自动故障转移。哨兵节点的功能包括:

  • 监控:哨兵节点持续地向主从服务器发送 PING 请求,以确定它们的健康状况。如果服务器在指定时间内没有响应,就认为它已经失效。

  • 通知:哨兵节点会将服务器的状态变化通知给管理员或其他应用程序。

  • 自动故障转移:当检测到主服务器失效时,哨兵节点会从现有的从服务器中选举出一个新的主服务器,并将其他从服务器指向新的主服务器。

  • 配置提供者:哨兵节点可以提供当前主服务器的地址给 Redis 客户端,以便客户端可以连接到正确的服务器。

    2. 监控和故障检测

    哨兵节点通过 PING 和 INFO 命令监控主从服务器的状态。如果一个服务器在 down-after-milliseconds 时间内没有响应,哨兵节点会认为它失效。为了避免误报,哨兵节点之间会相互通信,只有达到 quorum 个哨兵节点一致认为主服务器失效,才会进行故障转移。

    3. 领导选举

    当主服务器被确认失效后,哨兵节点会进行领导选举,以决定哪个哨兵节点负责故障转移。选举过程使用类 Raft 算法,确保在多个哨兵节点中选出一个领导者来执行故障转移操作。

    4. 自动故障转移

    领导哨兵节点从现有的从服务器中选举一个新的主服务器,并更新所有其他从服务器的配置,让它们开始复制新的主服务器。故障转移完成后,领导哨兵节点会通知其他哨兵节点和 Redis 客户端新的主服务器地址。

    搭建哨兵模式:

    1.环境准备:
    IP地址角色操作系统
    99.99.10.30redis-master,sentinelCentOS Linux release 7.9.2009 (Core)
    99.99.10.31redis-slave1,sentinelCentOS Linux release 7.9.2009 (Core)
    99.99.10.32redis-slave2,sentinelCentOS Linux release 7.9.2009 (Core)
    2.安装Redis
    # 安装 C/C++ 环境,编译 Redis 安装包使用
    yum -y install gcc gcc-c++ make
    ​
    # 切换软件安装目录
    cd /usr/local/
    ​
    # 新建 redis 安装目录
    mkdir redis
    ​
    # 切换到 redis 安装目录
    cd redis
    ​
    # 下载 redis 安装包
    wget http://download.redis.io/releases/redis-6.2.5.tar.gz
    ​
    # 解压 redis 安装包
    tar -zxvf redis-6.2.5.tar.gz
    ​
    # 进入解压后的 redis 目录
    cd redis-6.2.5/
    ​
    # 编译
    make
    ​
    # 进入编译好的目录(编译成功后 src 目录下会出现编译后的 redis 服务程序 redis-server)
    cd src
    ​
    # 进入 Redis 的主目录
    cd /usr/local/redis/redis-6.2.5
    ​
    # 创建工作目录 tmp
    mkdir tmp
    ​
    # 创建日志目录 log
    mkdir log
    ​
    # 编辑 Redis 配置
    vim redis.conf
    ​
    # 编辑哨兵配置
    vim sentinel.conf
    ​
    3.配置Redis
    # 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
    bind 0.0.0.0
    ​
    # 允许redis后台运行
    daemonize yes
    ​
    # 设置redis日志存放路径
    logfile "/usr/local/redis/redis-6.2.5/log/redis_6379.log"
    ​
    # 设置为no,允许外部网络访问
    protected-mode no
    ​
    # 修改redis监听端口(可以自定义)
    port 6379
    ​
    # pid存放目录
    pidfile /var/run/redis_6379.pid
    ​
    # 工作目录,需要创建好目录,可自定义
    dir /usr/local/redis/redis-6.2.5/tmp
    ​
    # 设置redis密码
    requirepass 123456
    ​
    # 主从同步master的密码
    masterauth 123456
    ​
    # 表示redis允许所有地址连接。默认127.0.0.1,仅允许本地连接。
    bind 0.0.0.0
    ​
    # 允许redis后台运行
    daemonize yes
    ​
    # 设置redis日志存放路径
    logfile "/usr/local/redis/redis-6.2.5/log/redis_6379.log"
    ​
    # 设置为no,允许外部网络访问
    protected-mode no
    ​
    # 修改redis监听端口(可以自定义)
    port 6379
    ​
    # pid存放目录
    pidfile /var/run/redis_6379.pid
    ​
    # 工作目录,需要创建好目录,可自定义
    dir /usr/local/redis/redis-6.2.5/tmp
    ​
    # 设置redis密码
    requirepass 123456
    ​
    # 主从同步master的密码
    masterauth 123456
    ​
    # 多了这一行,用于追随某个节点的redis,被追随的节点为主节点,追随的为从节点,Redis5.0前版本可使用slaveof
    replicaof 99.99.10.30 6379

    从节点&哨兵sentinel.conf与主节点的sentinel.conf保持一致。

    4.启动Redis
    # 启动 redis 命令如下(从节点类似),下面这条命令执行后没有出错,一般就是启动成功了
    /usr/local/redis/redis-6.2.5/src/redis-server /usr/local/redis/redis-6.2.5/redis.conf
    ​
    #查看启动是否成功
    ps aux | grep redis
    -----------------------------------------
    root     110885  0.0  0.1 162500  2884 ?        Ssl  15:58   0:00 /usr/local/redis/redis-6.2.5/src/redis-server 0.0.0.0:6379
    root     110950  0.0  0.0 112808   968 pts/1    R+   15:58   0:00 grep --color=auto redis
    -----------------------------------------
    ​
    ​
    #查看集群信息
    #切换到主库目录下
    /usr/local/redis/redis-6.2.5/src
    ​
    #连接redis
    ./redis-cli 
    ​
    #验证密码
    auth 123456
    ​
    #查看集群
    info replication
    -----------------------------------------
    [root@redis-master src]# ./redis-cli 
    127.0.0.1:6379> auth 123456
    OK
    127.0.0.1:6379> info replication
    # Replication
    role:master
    connected_slaves:0
    master_failover_state:no-failover
    master_replid:4d028dc9b02e861a7d2aa5e2cc779f24da0b4434
    master_replid2:8ee54d1d08888609608c841507a08b4e53ab880b
    master_repl_offset:87976
    second_repl_offset:83227
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:80121
    repl_backlog_histlen:7856
    -----------------------------------------
    5.启动哨兵
    # 启动 redis 命令如下(从节点类似),下面这条命令执行后没有出错,一般就是启动成功了
    /usr/local/redis/redis-6.2.5/src/redis-sentinel /usr/local/redis/redis-6.2.5/sentinel.conf
    ​
    # 查看是否启动成功
    ps aux | grep redis
    -----------------------------------------
    [root@redis-master src]# ps aux | grep redis
    root      72040  0.5  0.1 162500  3052 ?        Ssl  15:22   0:14 /usr/local/redis/redis-6.2.5/src/redis-sentinel *:26379 [sentinel]
    root     110885  0.1  0.1 240840  3124 ?        Ssl  15:58   0:00 /usr/local/redis/redis-6.2.5/src/redis-server 0.0.0.0:6379
    root     117591  0.0  0.0 112808   968 pts/1    S+   16:05   0:00 grep --color=auto redis
    -----------------------------------------
    6.进行测试

    kill掉主节点的redis之后,在从节点查看redis信息,会发现选举了一个新的主节点。

    哨兵的优缺点

    优点:
    • 提供高可用性和自动故障转移。

    • 简单易用,适合小规模的 Redis 部署。

      缺点:
      • 不能水平扩展。

      • 故障转移期间可能有短暂的不可用时间。

        集群模式

        原理:

        Redis 集群模式是一种分布式解决方案,通过数据分片和多个节点来实现水平扩展和高可用性。集群模式的核心组件包括多个主节点(Master)和从节点(Slave),每个节点存储整个数据集的一部分。以下是集群模式的详细工作原理:

        1. 数据分片

        Redis 集群将整个键空间划分为 16384 个哈希槽(Hash Slots),每个键根据 CRC16 哈希算法被映射到一个哈希槽。每个主节点负责管理一部分哈希槽,从而实现数据的分布式存储。

        2. 主从复制

        每个主节点可以有一个或多个从节点,从节点用于数据的冗余备份和故障转移。当主节点失效时,集群会自动选举一个从节点作为新的主节点。

        3. 节点通信

        Redis 集群节点之间通过 Gossip 协议进行通信,定期交换状态信息。每个节点都了解集群中其他节点的状态和负责的哈希槽。

        4. 故障检测和恢复

        Redis 集群中的节点会监控彼此的健康状况。当检测到某个主节点失效时,集群中的其他节点会协同选举一个从节点作为新的主节点,确保数据的高可用性。

        5. 客户端连接和重定向

        Redis 客户端连接到集群中的任意一个节点进行操作。如果请求的键不在当前节点负责的哈希槽内,节点会返回一个 MOVED 响应,指示客户端重定向到正确的节点。

        搭建Redis-cluster集群:

        1.环境准备:
        IP地址角色操作系统
        99.99.10.40:7001redis-master1CentOS Linux release 7.9.2009 (Core)
        99.99.10.40:7002redis-master2CentOS Linux release 7.9.2009 (Core)
        99.99.10.40:7003redis-master3CentOS Linux release 7.9.2009 (Core)
        99.99.10.40:7004redis-slave1CentOS Linux release 7.9.2009 (Core)
        99.99.10.40:7005redis-slave2CentOS Linux release 7.9.2009 (Core)
        99.99.10.40:7006redis-slave3CentOS Linux release 7.9.2009 (Core)
        2.安装Redis
        # 安装 C/C++ 环境,编译 Redis 安装包使用
        yum -y install gcc gcc-c++ make
        ​
        # 切换软件安装目录
        cd /usr/local/
        ​
        # 新建 redis 安装目录
        mkdir redis
        ​
        # 切换到 redis 安装目录
        cd redis
        ​
        # 下载 redis 安装包
        wget http://download.redis.io/releases/redis-6.2.5.tar.gz
        ​
        # 解压 redis 安装包
        tar -zxvf redis-6.2.5.tar.gz
        ​
        # 进入解压后的 redis 目录
        cd redis-6.2.5/
        ​
        # 编译
        make
        ​
        # 进入编译好的目录(编译成功后 src 目录下会出现编译后的 redis 服务程序 redis-server)
        cd src
        3.配置Redis
        # 在/usr/local/redis下创建redis-cluster目录,在其下创建7001、7002......7006目录
        mkdir -p /usr/local/redis/redis-cluster
        ​
        mkdir -v 7001 7002 7003 7004 7005 7006 
        # 将redis解压路径下的配置文件redis.conf,依次拷贝到每个700X目录内,并修改每个700X目录下的redis.conf配置文件:
        port 700X
        bind 99.99.10.40
        cluster-enabled yes (启动redis-cluster集群模式)
        cluster-config-file nodes-700x.conf
        daemonized yes
        logfile /usr/local/redis/redis-cluster/700X/node.log 
        4.启动Redis
        cd /usr/local/redis/redis/src
        ./redis-server /usr/local/redis/7001/redis.conf
        ./redis-server /usr/local/redis/7002/redis.conf
        ./redis-server /usr/local/redis/7003/redis.conf
        ./redis-server /usr/local/redis/7004/redis.conf
        ./redis-server /usr/local/redis/7005/redis.conf
        ./redis-server /usr/local/redis/7006/redis.conf
        -----------------------------------------
        [root@redis-cluster src]# ps -ef | grep redis
        root      13793      1  0 09:14 ?        00:00:03 ./redis-server 99.99.10.40:7001 [cluster]
        root      31859      1  0 09:30 ?        00:00:02 ./redis-server 99.99.10.40:7002 [cluster]
        root      34685      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7003 [cluster]
        root      34797      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7004 [cluster]
        root      34828      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7005 [cluster]
        root      34907      1  0 09:32 ?        00:00:02 ./redis-server 99.99.10.40:7006 [cluster]
        root      67927   3526  0 10:00 pts/0    00:00:00 grep --color=auto redis
        -----------------------------------------
        5.创建集群
        ./redis-cli --cluster create 99.99.10.40:7001 99.99.10.40:7002 99.99.10.40:7003 99.99.10.40:7004 99.99.10.40:7005 99.99.10.40:7006 --cluster-replicas 1
        -----------------------------------------
        # 查看集群状态
        [root@redis-cluster src]# ./redis-cli -h 99.99.10.40 -p 7001
        99.99.10.40:7001> cluster info
        cluster_state:ok
        cluster_slots_assigned:16384
        cluster_slots_ok:16384
        cluster_slots_pfail:0
        cluster_slots_fail:0
        cluster_known_nodes:6
        cluster_size:3
        cluster_current_epoch:6
        cluster_my_epoch:1
        cluster_stats_messages_ping_sent:1651
        cluster_stats_messages_pong_sent:1603
        cluster_stats_messages_sent:3254
        cluster_stats_messages_ping_received:1598
        cluster_stats_messages_pong_received:1651
        cluster_stats_messages_meet_received:5
        cluster_stats_messages_received:3254
        -----------------------------------------
        99.99.10.40:7001> cluster nodes
        ef8f95cec7e4ecdc53bf76d3c905fa60d6ee5202 99.99.10.40:7002@17002 master - 0 1719885779875 2 connected 5461-10922
        786ace6e78fb2c78966befa242aaac6a6f1a13d4 99.99.10.40:7003@17003 master - 0 1719885780000 3 connected 10923-16383
        aa831e1f7eb98a51f6e4782b08961e296c16b6d4 99.99.10.40:7004@17004 slave 627a959d0a9542ecef06f1363d7521e30c753295 0 1719885779000 1 connected
        0174a8f28735d92789a55badf5819e1818596a04 99.99.10.40:7005@17005 slave ef8f95cec7e4ecdc53bf76d3c905fa60d6ee5202 0 1719885780886 2 connected
        b4b975788e013c8eb426a4db0526a664050576f6 99.99.10.40:7006@17006 slave 786ace6e78fb2c78966befa242aaac6a6f1a13d4 0 1719885780000 3 connected
        627a959d0a9542ecef06f1363d7521e30c753295 99.99.10.40:7001@17001 myself,master - 0 1719885776000 1 connected 0-5460
        -----------------------------------------

        优缺点

        优点:
        • 支持数据的水平扩展,可以处理大规模数据。

        • 提供高可用性,节点失效时能够自动进行故障转移。

        • 高并发性能。

          缺点:
          • 配置和管理复杂度较高。

          • 不支持多键操作,某些命令在集群模式下受到限制。

          • 需要更多的资源和节点来维持高可用性和性能。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]