精华内容
下载资源
问答
  • Redis集群详解

    万次阅读 多人点赞 2019-05-10 13:56:46
    Redis集群详解 Redis有三种集群模式,分别是: * 主从模式 * Sentinel模式 * Cluster模式 三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——Redis Redis官网:https://redis.io/ ,最新版本5.0.4...

    Redis集群详解

    Redis有三种集群模式,分别是:

    * 主从模式
    
    * Sentinel模式
    
    * Cluster模式
    

    三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——Redis

    Redis官网:https://redis.io/ ,最新版本5.0.4


    主从模式

    主从模式介绍

    主从模式是三种模式中最简单的,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。

    其中主从复制有如下特点:

    * 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库
    
    * 从数据库一般都是只读的,并且接收主数据库同步过来的数据
    
    * 一个master可以拥有多个slave,但是一个slave只能对应一个master
    
    * slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来
    
    * master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务
    
    * master挂了以后,不会在slave节点中重新选一个master
    

    工作机制:

    当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。

    复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。

    安全设置:

    当master节点设置密码后,

    客户端访问master需要密码
    
    启动slave需要密码,在配置文件中配置即可
    
    客户端访问slave不需要密码
    

    缺点:

    从上面可以看出,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务。

    主从模式搭建

    • 环境准备:
    master节点                  192.168.30.128
    
    slave节点                   192.168.30.129
    
    slave节点                   192.168.30.130
    
    • 全部下载安装:
    # cd /software
    
    # wget http://download.redis.io/releases/redis-5.0.4.tar.gz
    
    # tar zxf redis-5.0.4.tar.gz && mv redis-5.0.4/ /usr/local/redis
    
    # cd /usr/local/redis && make && make install
    
    # echo $?
    0
    
    • 全部配置成服务:

    服务文件

    # vim /usr/lib/systemd/system/redis.service
    
    [Unit]
    Description=Redis persistent key-value database
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    ExecStart=/usr/local/bin/redis-server /usr/local/redis/redis.conf --supervised systemd
    ExecStop=/usr/libexec/redis-shutdown
    Type=notify
    User=redis
    Group=redis
    RuntimeDirectory=redis
    RuntimeDirectoryMode=0755
    
    [Install]
    WantedBy=multi-user.target
    

    shutdown脚本

    # vim /usr/libexec/redis-shutdown
    
    #!/bin/bash
    #
    # Wrapper to close properly redis and sentinel
    test x"$REDIS_DEBUG" != x && set -x
    
    REDIS_CLI=/usr/local/bin/redis-cli
    
    # Retrieve service name
    SERVICE_NAME="$1"
    if [ -z "$SERVICE_NAME" ]; then
       SERVICE_NAME=redis
    fi
    
    # Get the proper config file based on service name
    CONFIG_FILE="/usr/local/redis/$SERVICE_NAME.conf"
    
    # Use awk to retrieve host, port from config file
    HOST=`awk '/^[[:blank:]]*bind/ { print $2 }' $CONFIG_FILE | tail -n1`
    PORT=`awk '/^[[:blank:]]*port/ { print $2 }' $CONFIG_FILE | tail -n1`
    PASS=`awk '/^[[:blank:]]*requirepass/ { print $2 }' $CONFIG_FILE | tail -n1`
    SOCK=`awk '/^[[:blank:]]*unixsocket\s/ { print $2 }' $CONFIG_FILE | tail -n1`
    
    # Just in case, use default host, port
    HOST=${HOST:-127.0.0.1}
    if [ "$SERVICE_NAME" = redis ]; then
        PORT=${PORT:-6379}
    else
        PORT=${PORT:-26739}
    fi
    
    # Setup additional parameters
    # e.g password-protected redis instances
    [ -z "$PASS"  ] || ADDITIONAL_PARAMS="-a $PASS"
    
    # shutdown the service properly
    if [ -e "$SOCK" ] ; then
            $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdown
    else
            $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdown
    fi
    
    # chmod +x /usr/libexec/redis-shutdown
    
    # useradd -s /sbin/nologin redis
    
    # chown -R redis:redis /usr/local/redis
    
    # chown -R redis:redis /data/redis
    
    # yum install -y bash-completion && source /etc/profile                 #命令补全
    
    # systemctl daemon-reload
    
    # systemctl enable redis
    
    • 修改配置:

    192.168.30.128

    # mkdir -p /data/redis
    
    # vim /usr/local/redis/redis.conf
    
    bind 192.168.30.128               #监听ip,多个ip用空格分隔
    daemonize yes               #允许后台启动
    logfile "/usr/local/redis/redis.log"                #日志路径
    dir /data/redis                 #数据库备份文件存放目录
    masterauth 123456               #slave连接master密码,master可省略
    requirepass 123456              #设置master连接密码,slave可省略
    
    appendonly yes                  #在/data/redis/目录生成appendonly.aof文件,将每一次写操作请求都追加到appendonly.aof 文件中
    
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    
    # sysctl -p
    

    192.168.30.129

    # mkdir -p /data/redis
    
    # vim /usr/local/redis/redis.conf
    
    bind 192.168.30.129
    daemonize yes
    logfile "/usr/local/redis/redis.log"
    dir /data/redis
    replicaof 192.168.30.128 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    
    # sysctl -p
    

    192.168.30.130

    # mkdir -p /data/redis
    
    # vim /usr/local/redis/redis.conf
    
    bind 192.168.30.130
    daemonize yes
    logfile "/usr/local/redis/redis.log"
    dir /data/redis
    replicaof 192.168.30.128 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    
    # echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf
    
    # sysctl -p
    
    • 全部启动redis:
    # systemctl start redis
    
    • 查看集群状态:
    # redis-cli -h 192.168.30.128 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.128:6379> info replication
    # Replication
    role:master
    connected_slaves:2
    slave0:ip=192.168.30.129,port=6379,state=online,offset=168,lag=1
    slave1:ip=192.168.30.130,port=6379,state=online,offset=168,lag=1
    master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:168
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:168
    
    # redis-cli -h 192.168.30.129 -a 123456 info replication
    
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    # Replication
    role:slave
    master_host:192.168.30.128
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:1
    master_sync_in_progress:0
    slave_repl_offset:196
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:fb4941e02d5032ad74c6e2383211fc58963dbe90
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:196
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:196
    
    • 数据演示:
    192.168.30.128:6379> keys *
    (empty list or set)
    
    192.168.30.128:6379> set key1 100
    OK
    
    192.168.30.128:6379> set key2 lzx
    OK
    
    192.168.30.128:6379> keys *
    1) "key1"
    2) "key2"
    
    # redis-cli -h 192.168.30.129 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.129:6379> keys *
    1) "key2"
    2) "key1"
    
    192.168.30.129:6379> CONFIG GET dir
    1) "dir"
    2) "/data/redis"
    
    192.168.30.129:6379> CONFIG GET dbfilename
    1) "dbfilename"
    2) "dump.rdb"
    
    192.168.30.129:6379> get key1
    "100"
    
    192.168.30.129:6379> get key2
    "lzx"
    
    192.168.30.129:6379> set key3 aaa
    (error) READONLY You can't write against a read only replica.
    
    # redis-cli -h 192.168.30.130 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.130:6379> keys *
    1) "key2"
    2) "key1"
    
    192.168.30.130:6379> CONFIG GET dir
    1) "dir"
    2) "/data/redis"
    
    192.168.30.130:6379> CONFIG GET dbfilename
    1) "dbfilename"
    2) "dump.rdb"
    
    192.168.30.130:6379> get key1
    "100"
    
    192.168.30.130:6379> get key2
    "lzx"
    
    192.168.30.130:6379> set key3 aaa
    (error) READONLY You can't write against a read only replica.
    

    可以看到,在master节点写入的数据,很快就同步到slave节点上,而且在slave节点上无法写入数据。


    Sentinel模式

    Sentinel模式介绍

    主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。

    sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,特点如下:

    * sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义
    
    * 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master
    
    * 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据
    
    * sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群
    
    * 多sentinel配置的时候,sentinel之间也会自动监控
    
    * 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心
    
    * 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis
    
    * sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了
    

    工作机制:

    * 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令 
    
    * 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。 
    
    * 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态
    
    * 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线 
    
    * 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令 
    
    * 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次 
    
    * 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
      若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除
    

    当使用sentinel模式的时候,客户端就不要直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体的可提供服务的Redis实现,这样当master节点挂掉以后,sentinel就会感知并将新的master节点提供给使用者。

    Sentinel模式搭建

    • 环境准备:
    master节点              192.168.30.128          sentinel端口:26379
    
    slave节点               192.168.30.129          sentinel端口:26379
    
    slave节点               192.168.30.130          sentinel端口:26379
    
    • 修改配置:

    前面已经下载安装了redis,这里省略,直接修改sentinel配置文件。

    192.168.30.128

    # vim /usr/local/redis/sentinel.conf
    
    daemonize yes
    logfile "/usr/local/redis/sentinel.log"
    dir "/usr/local/redis/sentinel"                 #sentinel工作目录
    sentinel monitor mymaster 192.168.30.128 6379 2                 #判断master失效至少需要2个sentinel同意,建议设置为n/2+1,n为sentinel个数
    sentinel auth-pass mymaster 123456
    sentinel down-after-milliseconds mymaster 30000                 #判断master主观下线时间,默认30s
    

    这里需要注意,sentinel auth-pass mymaster 123456需要配置在sentinel monitor mymaster 192.168.30.128 6379 2下面,否则启动报错:

    # /usr/local/bin/redis-sentinel /usr/local/redis/sentinel.conf
    
    *** FATAL CONFIG FILE ERROR ***
    Reading the configuration file, at line 104
    >>> 'sentinel auth-pass mymaster 123456'
    No such master with specified name.
    
    • 全部启动sentinel:
    # mkdir /usr/local/redis/sentinel && chown -R redis:redis /usr/local/redis
    
    # /usr/local/bin/redis-sentinel /usr/local/redis/sentinel.conf
    
    • 任一主机查看日志:
    # tail -f /usr/local/redis/sentinel.log
    
    21574:X 09 May 2019 15:32:04.298 # Sentinel ID is 30c417116a8edbab09708037366c4a7471beb770
    21574:X 09 May 2019 15:32:04.298 # +monitor master mymaster 192.168.30.128 6379 quorum 2
    21574:X 09 May 2019 15:32:04.299 * +slave slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    21574:X 09 May 2019 15:32:04.300 * +slave slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    21574:X 09 May 2019 15:32:16.347 * +sentinel sentinel 79b8d61626afd4d059fb5a6a63393e9a1374e78f 192.168.30.129 26379 @ mymaster 192.168.30.128 6379
    21574:X 09 May 2019 15:32:31.584 * +sentinel sentinel d7b429dcba792103ef0d80827dd0910bd9284d21 192.168.30.130 26379 @ mymaster 192.168.30.128 6379
    

    Sentinel模式下的几个事件:

    ·       +reset-master :主服务器已被重置。
    
    ·       +slave :一个新的从服务器已经被 Sentinel 识别并关联。
    
    ·       +failover-state-reconf-slaves :故障转移状态切换到了 reconf-slaves 状态。
    
    ·       +failover-detected :另一个 Sentinel 开始了一次故障转移操作,或者一个从服务器转换成了主服务器。
    
    ·       +slave-reconf-sent :领头(leader)的 Sentinel 向实例发送了 [SLAVEOF](/commands/slaveof.html) 命令,为实例设置新的主服务器。
    
    ·       +slave-reconf-inprog :实例正在将自己设置为指定主服务器的从服务器,但相应的同步过程仍未完成。
    
    ·       +slave-reconf-done :从服务器已经成功完成对新主服务器的同步。
    
    ·       -dup-sentinel :对给定主服务器进行监视的一个或多个 Sentinel 已经因为重复出现而被移除 —— 当 Sentinel 实例重启的时候,就会出现这种情况。
    
    ·       +sentinel :一个监视给定主服务器的新 Sentinel 已经被识别并添加。
    
    ·       +sdown :给定的实例现在处于主观下线状态。
    
    ·       -sdown :给定的实例已经不再处于主观下线状态。
    
    ·       +odown :给定的实例现在处于客观下线状态。
    
    ·       -odown :给定的实例已经不再处于客观下线状态。
    
    ·       +new-epoch :当前的纪元(epoch)已经被更新。
    
    ·       +try-failover :一个新的故障迁移操作正在执行中,等待被大多数 Sentinel 选中(waiting to be elected by the majority)。
    
    ·       +elected-leader :赢得指定纪元的选举,可以进行故障迁移操作了。
    
    ·       +failover-state-select-slave :故障转移操作现在处于 select-slave 状态 —— Sentinel 正在寻找可以升级为主服务器的从服务器。
    
    ·       no-good-slave :Sentinel 操作未能找到适合进行升级的从服务器。Sentinel 会在一段时间之后再次尝试寻找合适的从服务器来进行升级,又或者直接放弃执行故障转移操作。
    
    ·       selected-slave :Sentinel 顺利找到适合进行升级的从服务器。
    
    ·       failover-state-send-slaveof-noone :Sentinel 正在将指定的从服务器升级为主服务器,等待升级功能完成。
    
    ·       failover-end-for-timeout :故障转移因为超时而中止,不过最终所有从服务器都会开始复制新的主服务器(slaves will eventually be configured to replicate with the new master anyway)。
    
    ·       failover-end :故障转移操作顺利完成。所有从服务器都开始复制新的主服务器了。
    
    ·       +switch-master :配置变更,主服务器的 IP 和地址已经改变。 这是绝大多数外部用户都关心的信息。
    
    ·       +tilt :进入 tilt 模式。
    
    ·       -tilt :退出 tilt 模式。
    
    • master宕机演示:

    192.168.30.128

    # systemctl stop redis
    
    # tail -f /usr/local/redis/sentinel.log
    
    22428:X 09 May 2019 15:51:29.287 # +sdown master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.371 # +odown master mymaster 192.168.30.128 6379 #quorum 2/2
    22428:X 09 May 2019 15:51:29.371 # +new-epoch 1
    22428:X 09 May 2019 15:51:29.371 # +try-failover master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.385 # +vote-for-leader 30c417116a8edbab09708037366c4a7471beb770 1
    22428:X 09 May 2019 15:51:29.403 # d7b429dcba792103ef0d80827dd0910bd9284d21 voted for 30c417116a8edbab09708037366c4a7471beb770 1
    22428:X 09 May 2019 15:51:29.408 # 79b8d61626afd4d059fb5a6a63393e9a1374e78f voted for 30c417116a8edbab09708037366c4a7471beb770 1
    22428:X 09 May 2019 15:51:29.451 # +elected-leader master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.451 # +failover-state-select-slave master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.528 # +selected-slave slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.528 * +failover-state-send-slaveof-noone slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:29.594 * +failover-state-wait-promotion slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.190 # +promoted-slave slave 192.168.30.129:6379 192.168.30.129 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.190 # +failover-state-reconf-slaves master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.258 * +slave-reconf-sent slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:30.511 # -odown master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.233 * +slave-reconf-inprog slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.233 * +slave-reconf-done slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.297 # +failover-end master mymaster 192.168.30.128 6379
    22428:X 09 May 2019 15:51:31.297 # +switch-master mymaster 192.168.30.128 6379 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:52:31.307 # +sdown slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    

    从日志中可以看到,master已经从192.168.30.128转移到192.168.30.129上

    192.168.30.129上查看集群信息

    # /usr/local/bin/redis-cli -h 192.168.30.129 -p 6379 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.129:6379> info replication
    # Replication
    role:master
    connected_slaves:1
    slave0:ip=192.168.30.130,port=6379,state=online,offset=291039,lag=1
    master_replid:757aff269236ed2707ba584a86a40716c1c76d74
    master_replid2:47a862fc0ff20362be29096ecdcca6d432070ee9
    master_repl_offset:291182
    second_repl_offset:248123
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:1
    repl_backlog_histlen:291182
    
    192.168.30.129:6379> set key4 linux
    OK
    

    当前集群中只有一个slave——192.168.30.130,master是192.168.30.129,且192.168.30.129具有写权限。

    192.168.30.130上查看redis的配置文件也可以看到replicaof 192.168.30.129 6379,这是sentinel在选举master是做的修改。

    重新把192.168.30.128上进程启动

    # systemctl start redis
    
    # tail -f /usr/local/redis/sentinel.log
    
    22428:X 09 May 2019 15:51:31.297 # +switch-master mymaster 192.168.30.128 6379 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.130:6379 192.168.30.130 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:51:31.298 * +slave slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 15:52:31.307 # +sdown slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    22428:X 09 May 2019 16:01:24.872 # -sdown slave 192.168.30.128:6379 192.168.30.128 6379 @ mymaster 192.168.30.129 6379
    

    查看集群信息

    # /usr/local/bin/redis-cli -h 192.168.30.128 -p 6379 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.128:6379> info replication
    # Replication
    role:slave
    master_host:192.168.30.129
    master_port:6379
    master_link_status:up
    master_last_io_seconds_ago:0
    master_sync_in_progress:0
    slave_repl_offset:514774
    slave_priority:100
    slave_read_only:1
    connected_slaves:0
    master_replid:757aff269236ed2707ba584a86a40716c1c76d74
    master_replid2:0000000000000000000000000000000000000000
    master_repl_offset:514774
    second_repl_offset:-1
    repl_backlog_active:1
    repl_backlog_size:1048576
    repl_backlog_first_byte_offset:376528
    repl_backlog_histlen:138247
    
    192.168.30.128:6379> get key4
    "linux"
    
    192.168.30.128:6379> set key5
    (error) ERR wrong number of arguments for 'set' command
    

    即使192.168.30.128重新启动redis服务,也是作为slave加入redis集群,192.168.30.129仍然是master。


    Cluster模式

    Cluster模式介绍

    sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。

    cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。

    使用集群,只需要将redis配置文件中的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。

    cluster集群特点:

    * 多个redis节点网络互联,数据共享
    
    * 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用
    
    * 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,
      并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
      
    * 支持在线增加、删除节点
    
    * 客户端可以连接任何一个主节点进行读写
    

    Cluster模式搭建

    • 环境准备:
    三台机器,分别开启两个redis服务(端口)
    
    192.168.30.128              端口:7001,7002
    
    192.168.30.129              端口:7003,7004
    
    192.168.30.130              端口:7005,7006
    
    • 修改配置文件:

    192.168.30.128

    # mkdir /usr/local/redis/cluster
    
    # cp /usr/local/redis/redis.conf /usr/local/redis/cluster/redis_7001.conf
    
    # cp /usr/local/redis/redis.conf /usr/local/redis/cluster/redis_7002.conf
    
    # chown -R redis:redis /usr/local/redis
    
    # mkdir -p /data/redis/cluster/{redis_7001,redis_7002} && chown -R redis:redis /data/redis
    
    # vim /usr/local/redis/cluster/redis_7001.conf
    
    bind 192.168.30.128
    port 7001
    daemonize yes
    pidfile "/var/run/redis_7001.pid"
    logfile "/usr/local/redis/cluster/redis_7001.log"
    dir "/data/redis/cluster/redis_7001"
    #replicaof 192.168.30.129 6379
    masterauth 123456
    requirepass 123456
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7001.conf
    cluster-node-timeout 15000
    
    # vim /usr/local/redis/cluster/redis_7002.conf
    
    bind 192.168.30.128
    port 7002
    daemonize yes
    pidfile "/var/run/redis_7002.pid"
    logfile "/usr/local/redis/cluster/redis_7002.log"
    dir "/data/redis/cluster/redis_7002"
    #replicaof 192.168.30.129 6379
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7002.conf
    cluster-node-timeout 15000
    

    其它两台机器配置与192.168.30.128一致,此处省略

    • 启动redis服务:
    # redis-server /usr/local/redis/cluster/redis_7001.conf
    
    # tail -f /usr/local/redis/cluster/redis_7001.log
    
    # redis-server /usr/local/redis/cluster/redis_7002.conf
    
    # tail -f /usr/local/redis/cluster/redis_7002.log
    

    其它两台机器启动与192.168.30.128一致,此处省略

    • 安装ruby并创建集群(低版本):

    如果redis版本比较低,则需要安装ruby。任选一台机器安装ruby即可

    # yum -y groupinstall "Development Tools"
    
    # yum install -y gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel
    
    # mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
    
    # wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P ~/rpmbuild/SOURCES
    
    # wget http://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P ~/rpmbuild/SPECS
    
    # rpmbuild -bb ~/rpmbuild/SPECS/ruby22x.spec
    
    # rpm -ivh ~/rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.x86_64.rpm
    
    # gem install redis                 #目的是安装这个,用于配置集群
    
    # cp /usr/local/redis/src/redis-trib.rb /usr/bin/
    
    # redis-trib.rb create --replicas 1 192.168.30.128:7001 192.168.30.128:7002 192.168.30.129:7003 192.168.30.129:7004 192.168.30.130:7005 192.168.30.130:7006
    
    • 创建集群:

    我这里是redis5.0.4,所以不需要安装ruby,直接创建集群即可

    # redis-cli -a 123456 --cluster create 192.168.30.128:7001 192.168.30.128:7002 192.168.30.129:7003 192.168.30.129:7004 192.168.30.130:7005 192.168.30.130:7006 --cluster-replicas 1
    
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    >>> 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.30.129:7004 to 192.168.30.128:7001
    Adding replica 192.168.30.130:7006 to 192.168.30.129:7003
    Adding replica 192.168.30.128:7002 to 192.168.30.130:7005
    M: 80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001
       slots:[0-5460] (5461 slots) master
    S: b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002
       replicates 6788453ee9a8d7f72b1d45a9093838efd0e501f1
    M: 4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003
       slots:[5461-10922] (5462 slots) master
    S: b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004
       replicates 80c80a3f3e33872c047a8328ad579b9bea001ad8
    M: 6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005
       slots:[10923-16383] (5461 slots) master
    S: 277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006
       replicates 4d74ec66e898bf09006dac86d4928f9fad81f373
    Can I set the above configuration? (type 'yes' to accept): yes                  #输入yes,接受上面配置
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    

    可以看到,

    192.168.30.128:7001是master,它的slave是192.168.30.129:7004;
    
    192.168.30.129:7003是master,它的slave是192.168.30.130:7006;
    
    192.168.30.130:7005是master,它的slave是192.168.30.128:7002
    

    自动生成nodes.conf文件:

    # ls /data/redis/cluster/redis_7001/
    appendonly.aof  dump.rdb  nodes-7001.conf
    
    # vim /data/redis/cluster/redis_7001/nodes-7001.conf 
    
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557454406312 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557454407000 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557454408371 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557454406000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557454407366 4 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557454407000 3 connected 5461-10922
    vars currentEpoch 6 lastVoteEpoch 0
    

    集群操作

    • 登录集群:
    # redis-cli -c -h 192.168.30.128 -p 7001 -a 123456                  # -c,使用集群方式登录
    
    • 查看集群信息:
    192.168.30.128: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:580
    cluster_stats_messages_pong_sent:551
    cluster_stats_messages_sent:1131
    cluster_stats_messages_ping_received:546
    cluster_stats_messages_pong_received:580
    cluster_stats_messages_meet_received:5
    cluster_stats_messages_received:1131
    
    • 列出节点信息:
    192.168.30.128:7001> CLUSTER NODES                  #列出节点信息
    
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557455176000 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557455174000 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557455175000 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557455175000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557455174989 4 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557455175995 3 connected 5461-10922
    

    这里与nodes.conf文件内容相同

    • 写入数据:
    192.168.30.128:7001> set key111 aaa
    -> Redirected to slot [13680] located at 192.168.30.130:7005                #说明数据到了192.168.30.130:7005上
    OK
    
    192.168.30.130:7005> set key222 bbb
    -> Redirected to slot [2320] located at 192.168.30.128:7001                 #说明数据到了192.168.30.128:7001上
    OK
    
    192.168.30.128:7001> set key333 ccc
    -> Redirected to slot [7472] located at 192.168.30.129:7003                 #说明数据到了192.168.30.129:7003上
    OK
    
    192.168.30.129:7003> get key111
    -> Redirected to slot [13680] located at 192.168.30.130:7005
    "aaa"
    
    192.168.30.130:7005> get key333
    -> Redirected to slot [7472] located at 192.168.30.129:7003
    "ccc"
    
    192.168.30.129:7003> 
    

    可以看出redis cluster集群是去中心化的,每个节点都是平等的,连接哪个节点都可以获取和设置数据。

    当然,平等指的是master节点,因为slave节点根本不提供服务,只是作为对应master节点的一个备份。

    • 增加节点:

    192.168.30.129上增加一节点:

    # cp /usr/local/redis/cluster/redis_7003.conf /usr/local/redis/cluster/redis_7007.conf
    
    # vim /usr/local/redis/cluster/redis_7007.conf
    
    bind 192.168.30.129
    port 7007
    daemonize yes
    pidfile "/var/run/redis_7007.pid"
    logfile "/usr/local/redis/cluster/redis_7007.log"
    dir "/data/redis/cluster/redis_7007"
    #replicaof 192.168.30.129 6379
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7007.conf
    cluster-node-timeout 15000
    
    # mkdir /data/redis/cluster/redis_7007
    
    # chown -R redis:redis /usr/local/redis && chown -R redis:redis /data/redis
    
    # redis-server /usr/local/redis/cluster/redis_7007.conf 
    

    192.168.30.130上增加一节点:

    # cp /usr/local/redis/cluster/redis_7005.conf /usr/local/redis/cluster/redis_7008.conf
    
    # vim /usr/local/redis/cluster/redis_7007.conf
    
    bind 192.168.30.130
    port 7008
    daemonize yes
    pidfile "/var/run/redis_7008.pid"
    logfile "/usr/local/redis/cluster/redis_7008.log"
    dir "/data/redis/cluster/redis_7008"
    #replicaof 192.168.30.130 6379
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7008.conf
    cluster-node-timeout 15000
    
    # mkdir /data/redis/cluster/redis_7008
    
    # chown -R redis:redis /usr/local/redis && chown -R redis:redis /data/redis
    
    # redis-server /usr/local/redis/cluster/redis_7008.conf 
    

    集群中增加节点:

    192.168.30.129:7003> CLUSTER MEET 192.168.30.129 7007
    OK
    
    192.168.30.129:7003> CLUSTER NODES
    
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 myself,master - 0 1557457361000 3 connected 5461-10922
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557457364746 1 connected 0-5460
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557457362000 6 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557457363000 4 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557457362000 5 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557457362729 0 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557457363739 5 connected 10923-16383
    
    192.168.30.129:7003> CLUSTER MEET 192.168.30.130 7008
    OK
    
    192.168.30.129:7003> CLUSTER NODES
    
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 myself,master - 0 1557457489000 3 connected 5461-10922
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557457489000 1 connected 0-5460
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557457489000 6 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557457488000 4 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557457489472 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 master - 0 1557457489259 0 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557457489000 0 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557457490475 5 connected 10923-16383
    

    可以看到,新增的节点都是以master身份加入集群的

    • 更换节点身份:

    将新增的192.168.30.130:7008节点身份改为192.168.30.129:7007的slave

    # redis-cli -c -h 192.168.30.130 -p 7008 -a 123456 cluster replicate e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
    

    cluster replicate后面跟node_id,更改对应节点身份。也可以登入集群更改

    # redis-cli -c -h 192.168.30.130 -p 7008 -a 123456
    
    192.168.30.130:7008> CLUSTER REPLICATE e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
    OK
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458316881 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557458314864 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458316000 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557458315872 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557458317890 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458315000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458315000 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458314000 0 connected
    

    查看相应的nodes.conf文件,可以发现有更改,它记录当前集群的节点信息

    # cat /data/redis/cluster/redis_7001/nodes-7001.conf
    
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458236169 7 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557458235000 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458234103 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557458235129 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557458234000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458236000 4 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458236000 0 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458233089 3 connected 5461-10922
    vars currentEpoch 7 lastVoteEpoch 0
    
    • 删除节点:
    192.168.30.130:7008> CLUSTER FORGET 1a1c7f02fce87530bd5abdfc98df1cffce4f1767
    (error) ERR I tried hard but I can't forget myself...               #无法删除登录节点
    
    192.168.30.130:7008> CLUSTER FORGET e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
    (error) ERR Can't forget my master!                 #不能删除自己的master节点
    
    192.168.30.130:7008> CLUSTER FORGET 6788453ee9a8d7f72b1d45a9093838efd0e501f1
    OK              #可以删除其它的master节点
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458887328 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557458887000 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458886000 3 connected 5461-10922
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave - 0 1557458888351 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458885000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458883289 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458885310 0 connected
    
    192.168.30.130:7008> CLUSTER FORGET b4d3eb411a7355d4767c6c23b4df69fa183ef8bc
    OK              #可以删除其它的slave节点
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557459031397 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557459032407 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557459035434 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557459034000 5 connected 10923-16383
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557459032000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557459034000 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557459034427 0 connected
    
    • 保存配置:
    192.168.30.130:7008> CLUSTER SAVECONFIG                 #将节点配置信息保存到硬盘
    OK
     
    # cat /data/redis/cluster/redis_7001/nodes-7001.conf
    
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557458236169 7 connected
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557458235000 5 connected 10923-16383
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557458234103 6 connected
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557458235129 5 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 myself,master - 0 1557458234000 1 connected 0-5460
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557458236000 4 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557458236000 0 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557458233089 3 connected 5461-10922
    vars currentEpoch 7 lastVoteEpoch 0
    
    # redis-cli -c -h 192.168.30.130 -p 7008 -a 123456
    Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
    
    192.168.30.130:7008> CLUSTER NODES
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557459500741 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master - 0 1557459500000 1 connected 0-5460
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557459501000 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557459500000 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557459499737 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557459499000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 slave 80c80a3f3e33872c047a8328ad579b9bea001ad8 0 1557459501750 1 connected
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557459498000 0 connected
    

    可以看到,之前删除的节点又恢复了,这是因为对应的配置文件没有删除,执行CLUSTER SAVECONFIG恢复。

    • 模拟master节点挂掉:

    192.168.30.128

    # netstat -lntp |grep 7001
    tcp        0      0 192.168.30.128:17001    0.0.0.0:*               LISTEN      6701/redis-server 1 
    tcp        0      0 192.168.30.128:7001     0.0.0.0:*               LISTEN      6701/redis-server 1 
    
    # kill 6701
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557461178000 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 master,fail - 1557460950483 1557460947145 1 disconnected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557461174922 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557461181003 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557461179993 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557461176000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 master - 0 1557461178981 8 connected 0-5460
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557461179000 0 connected
    

    对应7001的一行可以看到,master fail,状态为disconnected;而对应7004的一行,slave已经变成master。

    • 重新启动7001节点:
    # redis-server /usr/local/redis/cluster/redis_7001.conf
    
    192.168.30.130:7008> CLUSTER NODES
    
    277daeb8660d5273b7c3e05c263f861ed5f17b92 192.168.30.130:7006@17006 slave 4d74ec66e898bf09006dac86d4928f9fad81f373 0 1557461307000 3 connected
    80c80a3f3e33872c047a8328ad579b9bea001ad8 192.168.30.128:7001@17001 slave b6331cbc986794237c83ed2d5c30777c1551546e 0 1557461305441 8 connected
    4d74ec66e898bf09006dac86d4928f9fad81f373 192.168.30.129:7003@17003 master - 0 1557461307962 3 connected 5461-10922
    6788453ee9a8d7f72b1d45a9093838efd0e501f1 192.168.30.130:7005@17005 master - 0 1557461304935 5 connected 10923-16383
    b4d3eb411a7355d4767c6c23b4df69fa183ef8bc 192.168.30.128:7002@17002 slave 6788453ee9a8d7f72b1d45a9093838efd0e501f1 0 1557461306000 5 connected
    1a1c7f02fce87530bd5abdfc98df1cffce4f1767 192.168.30.130:7008@17008 myself,slave e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 0 1557461305000 7 connected
    b6331cbc986794237c83ed2d5c30777c1551546e 192.168.30.129:7004@17004 master - 0 1557461308972 8 connected 0-5460
    e51ab166bc0f33026887bcf8eba0dff3d5b0bf14 192.168.30.129:7007@17007 master - 0 1557461307000 0 connected
    

    可以看到,7001节点启动后为slave节点,并且是7004的slave节点。即master节点如果挂掉,它的slave节点变为新master节点继续对外提供服务,而原来的master节点如果重启,则变为新master节点的slave节点。

    另外,如果这里是拿7007节点做测试的话,会发现7008节点并不会切换,这是因为7007节点上根本没数据。集群数据被分为三份,采用哈希槽 (hash slot)的方式来分配16384个slot的话,它们三个节点分别承担的slot 区间是:

    节点7004覆盖0-5460
    节点7003覆盖5461-10922
    节点7005覆盖10923-16383
    

    更多参考:

    Redis集群常用命令

    展开全文
  • Redis 集群

    千次阅读 2020-02-09 22:54:02
    Redis Cluster即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果...

    Redis 集群简介

    Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。

    Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接,这些 TCP 连接会永久保持。

    Redis Cluster 同其他分布式存储系统一样,主要具备以下两个功能:

    数据分区
    Redis 集群会将用户数据分散保存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生 16384 个哈希槽slot,同时会根据节点的数量大致均等的将 16384 个哈希槽映射到不同的节点上。当用户存储key-value时,集群会先对key进行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现自动分割数据到不同的节点上。

    数据冗余
    Redis 集群支持主从复制和故障恢复。集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给集群里的其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。

    关于 Redis Cluster 详细介绍以及实现原理请参见 Redis Cluster 教程 和 Redis Cluster 规范,在此不再赘述。

    下载 & 安装 Redis#

    实验环境信息
    Linux 版本:CentOS Linux release 7.4.1708
    Redis 版本:5.0.3

    先在服务器或虚拟机中安装一个单机 Redis,如果已安装可以跳过本节,未安装过的正好学习下。

    进入 Redis 待安装目录。

    
     

    Copy

    cd /usr/local

    下载、解压 Redis 源代码压缩包。

    
     

    Copy

    wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -zxvf redis-5.0.3.tar.gz

    然后进入解压后的目录并使用 make 命令执行编译安装 Redis。

    
     

    Copy

    cd redis-5.0.3 make && make install

    不要高兴,因为你极有可能会遇到因为 GCC 编译器未安装导致编译失败的情况。不要着急,请顺序执行如下命令。

    
     

    Copy

    yum -y install gcc make distclean make && make install

    Redis 基于 C 语言开发,故编译源码需要 GCC(Linux下的一个编译器,这里需要用来编译.c文件)的支持。如机器上未安装需要先执行命令yum -y install gcc安装 GCC 编译工具,然后make distclean清除之前生成的文件,最后make && make install重新编译安装。

    最终出现类似下文输出则表示 Redis 安装成功。

    
     

    Copy

    ...... Hint: It's a good idea to run 'make test' ;) INSTALL install INSTALL install INSTALL install INSTALL install INSTALL install make[1]: 离开目录“/usr/local/redis-5.0.3/src”

    如果源码编译无误且执行结果正确,make install命令会将程序安装至系统预设的可执行文件存放路径,一般是/usr/local/bin目录,可以通过如下终端输出确认。当然,也可以使用make install PREFIX=<path>命令安装到指定路径。

    
     

    Copy

    [root@localhost bin]# cd /usr/local/bin [root@localhost bin]# ls -l 总用量 32672 -rwxr-xr-x. 1 root root 4367328 3月 6 06:11 redis-benchmark -rwxr-xr-x. 1 root root 8092024 3月 6 06:11 redis-check-aof -rwxr-xr-x. 1 root root 8092024 3月 6 06:11 redis-check-rdb -rwxr-xr-x. 1 root root 4802696 3月 6 06:11 redis-cli lrwxrwxrwx. 1 root root 12 3月 6 06:11 redis-sentinel -> redis-server -rwxr-xr-x. 1 root root 8092024 3月 6 06:11 redis-server

    至此,单机 Redis 安装完成。

    搭建 Redis 集群#

    进入正题。

    依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上。

    条件有限,测试环境下我们只能在一台机器上创建一个伪集群,通过不同的 TCP 端口启动多个 Redis 实例,组成集群。

    目前 Redis Cluster 的搭建有两种方式:

    1. 手动方式搭建,即手动执行 cluster 命令,一步步完成搭建流程。
    2. 自动方式搭建,即使用官方提供的集群管理工具快速搭建。

    两种方式原理一样,自动搭建方式只是将手动搭建方式中需要执行的 Redis 命令封装到了可执行程序。生产环境下推荐使用第二种方式,简单快捷,不易出错。不过本文实战演示两种方式都会提及。

    手动方式搭建#

    启动节点#

    搭建集群的第一步就是要先把参与搭建集群的每个节点启动起来。

    由于我们这是在一台机器上模拟多个节点,可以预先规划下各个节点的属性:

    节点编号 IP 地址 TCP 端口 节点类型 从节点 启动配置
    A 127.0.0.1 7001 D /usr/local/redis-cluster/7001/redis.conf
    B 127.0.0.1 7002 E /usr/local/redis-cluster/7002/redis.conf
    C 127.0.0.1 7003 F /usr/local/redis-cluster/7003/redis.conf
    D 127.0.0.1 8001 / /usr/local/redis-cluster/8001/redis.conf
    E 127.0.0.1 8002 / /usr/local/redis-cluster/8002/redis.conf
    F 127.0.0.1 8003 / /usr/local/redis-cluster/8003/redis.conf

    根据上述规划,可以先通过如下命令创建各个节点启动配置文件的存放目录。

    
     

    Copy

    mkdir /usr/local/redis-cluster cd redis-cluster mkdir -p 7001 7002 7003 8001 8002 8003

    顺序执行如下行命令,进入 Redis 源码包目录并将默认配置文件redis.conf分别复制到六个节点配置存放目录中,作为各自节点启动配置文件。

    
     

    Copy

    cd /usr/local/redis-5.0.3 cp redis.conf /usr/local/redis-cluster/7001 cp redis.conf /usr/local/redis-cluster/7002 cp redis.conf /usr/local/redis-cluster/7003 cp redis.conf /usr/local/redis-cluster/8001 cp redis.conf /usr/local/redis-cluster/8002 cp redis.conf /usr/local/redis-cluster/8003

    接下来需要分别修改每个节点的配置文件。下面贴的是节点 A 的配置文件/usr/local/redis-cluster/7001/redis.conf中启用或修改的一些必要参数。其他节点 B、C、D、E、F 参照修改,注意把涉及端口的地方修改成各自节点预先规划的即可。

    
     

    Copy

    bind 192.168.83.128 # 设置当前节点主机地址 port 7001 # 设置客户端连接监听端口 pidfile /var/run/redis_7001.pid # 设置 Redis 实例 pid 文件 daemonize yes # 以守护进程运行 Redis 实例 cluster-enabled yes # 启用集群模式 cluster-node-timeout 15000 # 设置当前节点连接超时毫秒数 cluster-config-file nodes-7001.conf # 设置当前节点集群配置文件路径

    完成上述工作就可以通过如下几组命令启动待搭建集群中的 6 个节点了。

    
     

    Copy

    /usr/local/bin/redis-server /usr/local/redis-cluster/7001/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7002/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/7003/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/8001/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/8002/redis.conf /usr/local/bin/redis-server /usr/local/redis-cluster/8003/redis.conf

    最后通过ps -ef|grep redis命令确认各个节点服务是否已经正常运行。

    
     

    Copy

    [root@localhost bin]# ps -ef|grep redis root 5613 1 0 04:25 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:7001 [cluster] root 5650 1 0 04:26 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:7002 [cluster] root 5661 1 0 04:26 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:7003 [cluster] root 5672 1 0 04:27 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:8001 [cluster] root 5681 1 0 04:27 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:8002 [cluster] root 5690 1 0 04:27 ? 00:00:00 /usr/local/bin/redis-server 127.0.0.1:8003 [cluster] root 5731 1311 0 04:28 pts/0 00:00:00 grep --color=auto redis

    如上输出可以看出上面规划的 6 个节点都成功启动。

    节点握手#

    虽然上面 6 个节点都启用了群集支持,但默认情况下它们是不相互信任或者说没有联系的。节点握手就是在各个节点之间创建链接(每个节点与其他节点相连),形成一个完整的网格,即集群。

    节点握手的命令如下:

    
     

    Copy

    cluster meet ip port

    但为了创建群集,不需要发送形成完整网格所需的所有 cluster meet 命令。只要能发送足够的cluster meet消息,可以让每个节点都可以通过一系列已知节点到达每个其他节点,缺失的链接将被自动创建。

    例如,如果我们通过cluster meet将节点 A 与节点 B 连接起来,并将 B 与 C 连接起来,则 A 和 C 会自己找到握手方式并创建链接。

    我们的创建的 6 个节点可以通过 redis-cli 连接到 A 节点执行如下五组命令完成握手,生产环境需要将 IP 127.0.0.1替换成外网 IP。

    
     

    Copy

    cluster meet 127.0.0.1 7002 cluster meet 127.0.0.1 7003 cluster meet 127.0.0.1 8001 cluster meet 127.0.0.1 8002 cluster meet 127.0.0.1 8003

    如上述命令正常执行输出结果如下。

    
     

    Copy

    [root@localhost bin]# /usr/local/bin/redis-cli -p 7001 127.0.0.1:7001> cluster meet 127.0.0.1 7002 OK 127.0.0.1:7001> cluster meet 127.0.0.1 7003 OK 127.0.0.1:7001> cluster meet 127.0.0.1 8001 OK 127.0.0.1:7001> cluster meet 127.0.0.1 8002 OK 127.0.0.1:7001> cluster meet 127.0.0.1 8003 OK

    接下来可以通过 cluster nodes 命令查看节点之间 的链接状态。我随机找了两个节点 B 和 F 测试,输出结果如下所示。

    
     

    Copy

    [root@localhost /]# /usr/local/bin/redis-cli -p 7002 cluster nodes 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220691885 4 connected a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 master - 0 1552220691000 5 connected 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220690878 3 connected 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 myself,master - 0 1552220690000 1 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220691000 2 connected ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220690000 0 connected [root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected

    可以看到,节点 B 和节点 F 都已经分别和其他 5 个节点建立链接。

    至此,节点握手完成。

    分配槽位#

    此时 Redis 集群还并没有处于上线状态,可以在任意一节点上执行 cluster info 命令来查看目前集群的运行状态。

    
     

    Copy

    [root@localhost ~]# /usr/local/bin/redis-cli -p 7001 cluster info cluster_state:fail ......

    上面输出cluster_state:fail表示当前集群处于下线状态。因为只有给集群中所有主节点分配好槽位(即哈希槽slot,本文第一小节有提及)集群才能上线。

    分配槽位的命令如下:

    
     

    Copy

    cluster addslots slot [slot ...]

    根据预先规划,这一步需要使用 cluster addslots 命令手动将 16384 个哈希槽大致均等分配给主节点 A、B、C。

    
     

    Copy

    /usr/local/bin/redis-cli -p 7001 cluster addslots {0..5461} /usr/local/bin/redis-cli -p 7002 cluster addslots {5462..10922} /usr/local/bin/redis-cli -p 7003 cluster addslots {10923..16383}

    上面三组命令执行完毕,可以再次查看目前集群的一些运行参数。

    
     

    Copy

    [root@localhost ~]# /usr/local/bin/redis-cli -p 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:5 cluster_my_epoch:4 cluster_stats_messages_ping_sent:11413 cluster_stats_messages_pong_sent:10509 cluster_stats_messages_meet_sent:11 cluster_stats_messages_sent:21933 cluster_stats_messages_ping_received:10509 cluster_stats_messages_pong_received:10535 cluster_stats_messages_received:21044

    如上输出cluster_state:ok证明 Redis 集群成功上线。

    主从复制#

    Redis 集群成功上线,不过还没有给主节点指定从节点,此时如果有一个节点故障,那么整个集群也就挂了,也就无法实现高可用。

    集群中需要使用 cluster replicate 命令手动给从节点配置主节点。

    集群复制命令如下:

    
     

    Copy

    cluster replicate node-id

    集群中各个节点的node-id可以用cluster nodes命令查看,如下输出1b4b3741945d7fed472a1324aaaa6acaa1843ccb即是主节点 B 的node-id

    
     

    Copy

    [root@localhost /]# /usr/local/bin/redis-cli -p 8002 cluster nodes 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552220700255 1 connected ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 master - 0 1552220703281 0 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552220700000 2 connected a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,master - 0 1552220701000 5 connected 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552220702275 4 connected 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 master - 0 1552220701265 3 connected

    根据预先规划,A主D从;B主E从;C主F从。执行如下三组命令分别为从节点 D、E、F 指定其主节点,使群集可以自动完成主从复制。

    
     

    Copy

    /usr/local/bin/redis-cli -p 8001 cluster replicate 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 /usr/local/bin/redis-cli -p 8002 cluster replicate 1b4b3741945d7fed472a1324aaaa6acaa1843ccb /usr/local/bin/redis-cli -p 8003 cluster replicate 19147f56e679767bcebb8653262ff7f56ca072a8

    命令执行成功后,我们便算以手动方式成功搭建了一个 Redis 集群。

    最后,再来查看一下集群中的节点信息。

    
     

    Copy

    [root@localhost ~]# /usr/local/bin/redis-cli -p 8002 cluster nodes 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 127.0.0.1:7002@17002 master - 0 1552233328337 1 connected 5462-10922 ed6fd72e61b747af3705b210c7164bc68739303e 127.0.0.1:8003@18003 slave 19147f56e679767bcebb8653262ff7f56ca072a8 0 1552233327000 2 connected 19147f56e679767bcebb8653262ff7f56ca072a8 127.0.0.1:7003@17003 master - 0 1552233325000 2 connected 10923-16383 a8a41694f22977fda78863bdfb3fc03dd1fab1bd 127.0.0.1:8002@18002 myself,slave 1b4b3741945d7fed472a1324aaaa6acaa1843ccb 0 1552233327000 5 connected 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 127.0.0.1:7001@17001 master - 0 1552233327327 4 connected 0-5461 51987c4b5530c81f2845bb9d521daf6d3dce3659 127.0.0.1:8001@18001 slave 61e8c4ed8d1ff2a765a4dd2c3d300d8121d26e12 0 1552233326320 4 connected

    自动方式搭建#

    Redis 3.0 版本之后官方发布了一个集群管理工具 redis-trib.rb,集成在 Redis 源码包的src目录下。其封装了 Redis 提供的集群命令,使用简单、便捷。

    不过 redis-trib.rb 是 Redis 作者使用 Ruby 语言开发的,故使用该工具之前还需要先在机器上安装 Ruby 环境。后面作者可能意识到这个问题,Redis 5.0 版本开始便把这个工具集成到 redis-cli 中,以--cluster参数提供使用,其中create命令可以用来创建集群。

    启动节点#

    使用集群管理工具搭建集群之前,也是需要先把各个节点启动起来的。节点的启动方式请参见本文「手动方式创建」-「启动节点」一节,此处不再赘述。

    集群管理工具搭建#

    如果您安装的 Redis 是 3.x 和 4.x 的版本可以使用 redis-trib.rb 搭建,不过之前需要安装 Ruby 环境。

    先使用 yum 安装 Ruby 环境以及其他依赖项。

    
     

    Copy

    yum -y install ruby ruby-devel rubygems rpm-build

    确认安装版本。

    
     

    Copy

    [root@localhost redis-cluster]# ruby -v ruby 2.0.0p648 (2015-12-16) [x86_64-linux]

    再使用 redis-trib.rb 脚本搭建集群,具体命令如下所示。

    
     

    Copy

    /usr/local/redis-5.0.3/src/redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003

    不过,本文实验环境使用的 Redis 版本是 5.0.3,所以我可以直接使用redis-cli --cluster create命令搭建,具体命令如下所示。

    
     

    Copy

    /usr/local/bin/redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 1

    主节点在前,从节点在后。其中--cluster-replicas参数用来指定一个主节点带有的从节点个数,如上--cluster-replicas 1即表示 1 个主节点有 1 个从节点。

    命令执行成功会有类似如下输出。

    
     

    Copy

    [root@localhost bin]# redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 --cluster-replicas 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 127.0.0.1:8001 to 127.0.0.1:7001 Adding replica 127.0.0.1:8002 to 127.0.0.1:7002 Adding replica 127.0.0.1:8003 to 127.0.0.1:7003 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: 32f9819fc7d561bfa2b7189182200e86d9901b8a 127.0.0.1:7001 slots:[0-5460] (5461 slots) master M: cca0fbfa374bc175d481e68ee9ed13b65453e967 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master M: 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master S: 1b47b9e6e7a79523579b8d2ddcd5e708583ed317 127.0.0.1:8001 replicates 32f9819fc7d561bfa2b7189182200e86d9901b8a S: aba9330f3e70f26a8af4ced1b672fbcc7bc62d78 127.0.0.1:8002 replicates cca0fbfa374bc175d481e68ee9ed13b65453e967 S: 254db0830cd764e075aa793144572d5fa3a398f0 127.0.0.1:8003 replicates 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 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 127.0.0.1:7001) M: 32f9819fc7d561bfa2b7189182200e86d9901b8a 127.0.0.1:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: aba9330f3e70f26a8af4ced1b672fbcc7bc62d78 127.0.0.1:8002 slots: (0 slots) slave replicates cca0fbfa374bc175d481e68ee9ed13b65453e967 S: 1b47b9e6e7a79523579b8d2ddcd5e708583ed317 127.0.0.1:8001 slots: (0 slots) slave replicates 32f9819fc7d561bfa2b7189182200e86d9901b8a S: 254db0830cd764e075aa793144572d5fa3a398f0 127.0.0.1:8003 slots: (0 slots) slave replicates 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e M: cca0fbfa374bc175d481e68ee9ed13b65453e967 127.0.0.1:7002 slots:[5461-10922] (5462 slots) master 1 additional replica(s) M: 964cfa1c2dcfe36b6d3c63637f0d57ccb568354e 127.0.0.1:7003 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.

    OK,搭建完成!一条命令搞定。

    展开全文
  • Redis集群

    千次阅读 2019-10-13 20:30:49
    Redis集群Redis集群数据分布数据分区理论基础Redis数据分区集群功能限制 Redis集群 Redis Cluster是redis的分布式解决方案,在3.0版本正式推出后,有效地解决了Redis分布式方面的需求。Redis分布式的方案一般由两...

    Redis集群

    Redis Cluster是redis的分布式解决方案,在3.0版本正式推出后,有效地解决了Redis分布式方面的需求。Redis分布式的方案一般由两种:

    1. 客户端分区方案,优点是分区逻辑可控,缺点是需要自己处理数据路由,高可用,故障转移等问题;
    2. 代理方案,优点是简化客户端分布式逻辑和升级维护便利,缺点是加重架构部署复杂性和性能损耗
      现在官方为我们提供了专门的集群方案:Redis Cluster,采用Hash分区

    数据分布

    数据分区理论基础

    分布式数据库首先要解决的问题是整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集。
    常见的数据分区规则有hash分区和顺序分区两种
    哈希分区和数据分区的特点对比

    分区方式 特点 代表产品
    hash分区 离散性好,数据分布业务无关,无法顺序访问 Redis Cluster,Cassandra,Dynamo
    顺序分区 离散度易倾斜,数据分布业务相关,可顺序访问 Bigtable,HBase,Hypertable

    Hash分区常见有三种:

    1. 节点取余分区
      定义:根据节点数量N使用公式hash(key)%N,计算出出hash值,用来决定数据映射到哪个节点上
      优点:简单,常用于数据库的分库分表规则,一般采用预分区的方案,提前根据数据量规划好分区数。
      存在问题:当节点数量变化,需要扩容或者收缩节点,数据节点映射关系需要重新计算会导致数据的重新迁移
      注意事项:扩容时采用翻倍扩容,避免数据全量被打乱导致全量迁移
    2. 一致性Hash分区
      定义:为每个系统分配一个token,范围一般在0~2的32次方,这些token构成一个hash环,数据读写执行节点查找操作时,先根据key计算hash值,然后顺时针找到第一个大于等于该hash值的token节点
      优点:加入和删除节点只影响哈希环中相邻的节点,对其他节点无影响
      存在问题:
      1) 加减节点会造成哈希环中部分数据无法命中,需要手动处理或者或略这部分数据,因此一致性hash常用于缓存场景
      2)当使用少量节点时,节点变化将会大范围影响哈希环中数据映射,因此这种方式不适合少量数量节点的分布式方案
      3)普通的一致性hash分区在增加节点时需要增加一倍或者减去一般节点才能保证数据和负载的均衡
    3. 虚拟槽分区
      定义:虚拟槽分区巧妙地使用了哈希分区空间,使用分散性良好的哈希函数把所有数据映射到一个固定范围的整数集合中,整数定义为槽
      这个范围一般远远大于节点数,比如Redis Cluster槽的范围是0~16383
      槽是集群内数据管理和迁移的基本单位,采用大范围的主要目的是为了方便数据拆分和集群扩展

    Redis数据分区

    Redis Cluster采用了虚拟槽分区,所有的键根据哈希函数映射到0~16383整数槽内,计算公式:slot=CRC16(key)&16383。每一个节点负责维护一部分槽以及槽所映射的键值数据

    • Redis虚拟槽分区特点
    1. 解耦数据和节点之间的关系,简化了节点扩容和收缩的难度
    2. 节点自身维护槽的映射关系,不需要客户端或者代理服务维护槽分区元数据
    3. 支持节点,槽,键之间的映射关系,用于数据路由,在线伸缩等场景

    集群功能限制

    Redis集群相对于单机存在一些限制

    1. key批量操作支持有限。如mset,mget,目前只支持具有相同slot值的key执行批量操作
    2. key事务操作支持有限。只支持多key在同一节点上的事务特性
    3. key作为数据分区的最小粒度。因此不能将一个大的键值对象如hash,list等映射到不同的节点上
    4. 不支持多数据库空间。单机模式下可以支持16个数据库,集群模式下只能使用一个数据库空间,即db 0
    5. 复制结构只支持一层,从节点只能复制主节点,不支持嵌套树状复制结构

    节点通信

    通信流程

    分布式存储中需要提供维护节点元数据信息的机制,元数据是指:节点负责哪些数据,是否出现故障等状态信息
    常见元数据维护方式分为两种:集中式和P2P方式
    Redis采用的是P2P的gossip协议。Gossip协议工作原理就是节点彼此不断通信交换信息,一段时间后所有节点都会知道集群完整的信息
    通信说明:

    1. 集群中每个节点都会单独开辟一个TCP通道,用于节点之间彼此通信,通信端口号在基础端口号上加10000
    2. 每个节点在固定周期内通过特定规则选择几个节点发送ping消息
    3. 接收到ping消息的节点用pong消息进行响应

    Gossip消息

    Gossip协议的主要职责是信息交换。信息交换的载体是节点彼此发送的Gossip消息。
    常见Gossip消息有:ping,pong,meet,fail等

    meet:用于通知新节点加入。消息发送者通知接受者加入到当前集群,meet消息通知正常完成后,接受节点会加入到集群中进行周期性的ping,pong消息交换
    ping:集群内交换最频繁的消息,集群内每个节点每秒向多个其他节点发送ping消息,用于检测节点是否在线和交换状态信息,ping消息发送封装了自身节点和部分其他节点的状态数据
    pong:当接收到ping,meet消息时,作为响应消息回复给发送方确认消息正常通信。pong消息内部封装了自身状态数据,节点也可以向集群内广播自身的pong消息来通知整个集群对自身状态进行更新
    fail:当节点判定集群中另一个节点下线时,会向集群中广播一个fail消息,其他节点收到fail消息之后把对应节点更新为下线状态

    节点选择

    Redis集群节点通信采用固定频率(定时任务每秒执行10次)。因此节点每次选择需要通信的节点列表十分重要,选择过多,信息交换及时但是成本较高;选择过少会导致节点彼此信息交换不及时,影响故障判断,新节点发现等需求速度。因此Redis集群的Gossip协议需要兼顾信息交换实时性和成本开销

    1. 选择发送消息的节点数量
      集群内每个节点维护定时任务默认每秒执行10次,每秒随机选择5个节点找出最久没有通信的节点发送ping消息,用于保证Giossip消息交换的随机性。每100毫秒都会扫描本地节点列表,如果发现节点最近一次接收pong消息时间大于cluster_node_timeout/2,则立刻发送ping消息,防止该节点消息太长时间未更新。
    2. 消息数据量
      每个ping消息的数据量体现在消息头和消息体中,其中消息头主要占用空间的字段是myslots[CLUSTER_SLOTS/8],占用2KB,这块空间相对稳定。
      消息体中会携带一定数量的其他节点信息用于信息交换。

    集群伸缩

    伸缩原理

    Redis集群可以在不影响集群对外提供服务的情况下,为集群添加节点进行扩容也可以下线部分节点进行缩容

    以上图为例进行说明集群节点上下线,原理可抽象为槽和对应数据在不同节点之间灵活移动。

    上图为初始状态,把一部分槽和数据迁移到新的节点6385上,如下图

    扩容集群

    Redis集群扩容操作可分为如下步骤

    • 准备新节点
    • 加入集群
    • 迁移槽和数据
    1. 准备新节点
      提前把新节点运行在集群模式下,启动两个节点6385,6386
      启动后的节点作为孤儿节点,并没有和其他节点进行通信,集群结构
    2. 加入节点
      新节点依然采用cluster master命令把6385和6386加入到现有集群中
      先加入后的节点开始都是主节点状态,但是没有负责的槽,不能接收任何的读写操作,对于新节点有两种选择:
      1 它迁移槽和数据实现扩容
      2 作为其他主节点的从节点负责故障转移
    3. 迁移槽和数据
      加入集群后需要为新节点迁移槽和数据,槽的迁移过程中集群可以正常提供读写服务。
      迁移过程的流程
      (1)槽迁移计划
      槽是Redis集群管理数据的基本单位,首先需要为新节点制定槽的迁移计划,确定哪些槽需要迁移到新节点,迁移计划需要保证每个节点负责相似数量的槽,从而保证各节点均匀分布。

      (2)迁移数据
      数据迁移过程是逐个槽进行的,每个槽数据迁移的流程如下
      1)对目标节点发送cluster setslot {slot} importing {sourceNodeId}命令,让目标节点准备导入槽的数据
      2)对槽节点发送cluster setslots {slot} migrating {targetNodeId}命令,让源节点准备迁移出槽的数据
      3)源节点循环执行cluster getkeysinslot {slot} {count}命令,获取count个属于槽{slot}的键
      4)在源节点上执行migrate {targetIp} {targetPort} “” 0 {timeout} keys {keys…} 命令,把获取到的键通过流水线(pipeline)机制批量迁移到目标节点,对于3.0.6版本以前只能单个迁移
      5)重复执行步骤3和步骤4直到槽下所有的键值数据迁移到目标节点
      6)向集群内所有主节点发送cluster setslot {slot} node {targetNodeId} 命令,通知槽分配给目标节点。
      (3)添加从节点
      把6386作为6385的从节点,从而保证整个集群的高可用,使用cluster replicate {masterNodeId}命令为主节点添加从节点,注意在集群模式下slaveof添加从节点操作不再支持。

    收缩集群

    收缩集群意味着减小规模,需要从现有集群中安全下线部分节点

    流程说明
    1)首先需要确定下线节点是否有负责的槽,如果有,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性
    2)当下线节点不再负责槽或者本身是从节点,就可以通知集群内其他节点忘记下线节点,当所有的节点忘记该节点后就可以关闭了。

    1. 下线迁移槽
      下线节点需要把自己负责的槽迁移到其他节点,原理与之前扩容迁移槽过程一样,下线节点槽迁出后,剩下的步骤需要让集群忘记该节点
    2. 忘记节点

      集群内的节点不停地通过Gossip消息彼此交换节点状态,因此需要通过一种健壮的机制让集群内所有节点忘记下线的节点。Redis提供了cluster forget {downNodeId}命令实现该功能。
      当节点接收到cluster forget {downNodeId}命令后,会把nodeId指定的节点加入禁用列表中,在禁用列表中的节点不再发送Gossip消息,禁用列表有效期为60s,超过60s节点会再次参与消息交换。也就是说当第一次forget命令翻出后,我们有60s的时间让集群内的所有节点忘记下线节点。
      线上不建议直接使用cluster forget 命令下线节点,需要跟大量节点命令交互,实际操作过于繁琐并且容易遗漏forget节点。建议使用redis-teib.rb del-node {node:port} {downNodeId}命令。
      del-node帮我们实现安全下线,当下线主节点具有从节点时,需要该从节点指向到其他拥有最少从节点的主节点,因此对于主从节点都下线的情况,建议先下线从节点,在下线主节点,防止不必要的全量复制。
    展开全文
  • redis集群搭建(非常详细,适合新手)

    万次阅读 多人点赞 2018-10-01 16:33:03
    redis集群搭建 在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程 下载redis压缩包,然后解压压缩文件; 进入到解压缩后的redis文件目录(此时可以看到Makefile文件),编译redis源文件; 把编译...

    redis集群搭建

    在开始redis集群搭建之前,我们先简单回顾一下redis单机版的搭建过程

    1. 下载redis压缩包,然后解压压缩文件;
    2. 进入到解压缩后的redis文件目录(此时可以看到Makefile文件),编译redis源文件;
    3. 把编译好的redis源文件安装到/usr/local/redis目录下,如果/local目录下没有redis目录,会自动新建redis目录;
    4. 进入/usr/local/redis/bin目录,直接./redis-server启动redis(此时为前端启动redis);
    5. 将redis启动方式改为后端启动,具体做法:把解压缩的redis文件下的redis.conf文件复制到/usr/local/redis/bin目录下,然后修改该redis.conf文件->daemonize:no 改为daemonize:yse;
    6. 在/bin目录下通过./redis-server redis.conf启动redis(此时为后台启动)。
      综上redis单机版安装启动完成。
      具体详细带图步骤请参考 -> redis入门
      请原谅我的啰嗦,ok,接着咱们回到本次话题----redis集群搭建!

    一、Redis Cluster(Redis集群)简介

    • redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;
    • redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;
    • redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制),每个节点都是一个redis实例;
    • 为了实现集群的高可用,即判断节点是否健康(能否正常使用),redis-cluster有这么一个投票容错机制:如果集群中超过半数的节点投票认为某个节点挂了,那么这个节点就挂了(fail)。这是判断节点是否挂了的方法;
    • 那么如何判断集群是否挂了呢? -> 如果集群中任意一个节点挂了,而且该节点没有从节点(备份节点),那么这个集群就挂了。这是判断集群是否挂了的方法;
    • 那么为什么任意一个节点挂了(没有从节点)这个集群就挂了呢? -> 因为集群内置了16384个slot(哈希槽),并且把所有的物理节点映射到了这16384[0-16383]个slot上,或者说把这些slot均等的分配给了各个节点。当需要在Redis集群存放一个数据(key-value)时,redis会先对这个key进行crc16算法,然后得到一个结果。再把这个结果对16384进行求余,这个余数会对应[0-16383]其中一个槽,进而决定key-value存储到哪个节点中。所以一旦某个节点挂了,该节点对应的slot就无法使用,那么就会导致集群无法正常工作。
    • 综上所述,每个Redis集群理论上最多可以有16384个节点。

    二、集群搭建需要的环境
    2.1 Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群。
    2.2 要保证集群的高可用,需要每个节点都有从节点,也就是备份节点,所以Redis集群至少需要6台服务器。因为我没有那么多服务器,也启动不了那么多虚拟机,所在这里搭建的是伪分布式集群,即一台服务器虚拟运行6个redis实例,修改端口号为(7001-7006),当然实际生产环境的Redis集群搭建和这里是一样的。
    2.3 安装ruby
    三、集群搭建具体步骤如下(注意要关闭防火墙)
    3.1 在usr/local目录下新建redis-cluster目录,用于存放集群节点
    新建Redis集群目录
    3.2 把redis目录下的bin目录下的所有文件复制到/usr/local/redis-cluster/redis01目录下,不用担心这里没有redis01目录,会自动创建的。操作命令如下(注意当前所在路径):

    cp -r redis/bin/ redis-cluster/redis01
    

    在这里插入图片描述
    3.3 删除redis01目录下的快照文件dump.rdb,并且修改该目录下的redis.cnf文件,具体修改两处地方:一是端口号修改为7001,二是开启集群创建模式,打开注释即可。分别如下图所示:
    删除dump.rdb文件
    删除dump.rdb文件
    修改端口号为7001,默认是6379
    在这里插入图片描述
    将cluster-enabled yes 的注释打开
    在这里插入图片描述
    3.4 将redis-cluster/redis01文件复制5份到redis-cluster目录下(redis02-redis06),创建6个redis实例,模拟Redis集群的6个节点。然后将其余5个文件下的redis.conf里面的端口号分别修改为7002-7006。分别如下图所示:
    创建redis02-06目录
    在这里插入图片描述

    分别修改redis.conf文件端口号为7002-7006
    在这里插入图片描述
    3.5 接着启动所有redis节点,由于一个一个启动太麻烦了,所以在这里创建一个批量启动redis节点的脚本文件,命令为start-all.sh,文件内容如下:

    cd redis01
    ./redis-server redis.conf
    cd ..
    cd redis02
    ./redis-server redis.conf
    cd ..
    cd redis03
    ./redis-server redis.conf
    cd ..
    cd redis04
    ./redis-server redis.conf
    cd ..
    cd redis05
    ./redis-server redis.conf
    cd ..
    cd redis06
    ./redis-server redis.conf
    cd ..
    
    

    3.6 创建好启动脚本文件之后,需要修改该脚本的权限,使之能够执行,指令如下:

    chmod +x start-all.sh
    

    在这里插入图片描述
    3.7 执行start-all.sh脚本,启动6个redis节点
    在这里插入图片描述
    3.8 ok,至此6个redis节点启动成功,接下来正式开启搭建集群,以上都是准备条件。大家不要觉得图片多看起来冗长所以觉得麻烦,其实以上步骤也就一句话的事情:创建6个redis实例(6个节点)并启动。
    要搭建集群的话,需要使用一个工具(脚本文件),这个工具在redis解压文件的源代码里。因为这个工具是一个ruby脚本文件,所以这个工具的运行需要ruby的运行环境,就相当于java语言的运行需要在jvm上。所以需要安装ruby,指令如下:

    yum install ruby
    

    然后需要把ruby相关的包安装到服务器,我这里用的是redis-3.0.0.gem,大家需要注意的是:redis的版本和ruby包的版本最好保持一致。
    将Ruby包安装到服务器:需要先下载再安装,如图
    在这里插入图片描述
    安装命令如下:

    gem install redis-3.0.0.gem
    

    在这里插入图片描述

    3.9 上一步中已经把ruby工具所需要的运行环境和ruby包安装好了,接下来需要把这个ruby脚本工具复制到usr/local/redis-cluster目录下。那么这个ruby脚本工具在哪里呢?之前提到过,在redis解压文件的源代码里,即redis/src目录下的redis-trib.rb文件。
    在这里插入图片描述
    在这里插入图片描述
    3.10 将该ruby工具(redis-trib.rb)复制到redis-cluster目录下,指令如下:

    cp redis-trib.rb /usr/local/redis-cluster
    

    然后使用该脚本文件搭建集群,指令如下:

    ./redis-trib.rb create --replicas 1 47.106.219.251:7001 47.106.219.251:7002 47.106.219.251:7003 47.106.219.251:7004 47.106.219.251:7005 47.106.219.251:7006
    

    注意:此处大家应该根据自己的服务器ip输入对应的ip地址!
    在这里插入图片描述

    中途有个地方需要手动输入yes即可
    在这里插入图片描述
    至此,Redi集群搭建成功!大家注意最后一段文字,显示了每个节点所分配的slots(哈希槽),这里总共6个节点,其中3个是从节点,所以3个主节点分别映射了0-5460、5461-10922、10933-16383solts。

    3.11 最后连接集群节点,连接任意一个即可:

    redis01/redis-cli -p 7001 -c 
    

    注意:一定要加上-c,不然节点之间是无法自动跳转的!如下图可以看到,存储的数据(key-value)是均匀分配到不同的节点的:
    在这里插入图片描述

    四、结语
    呼~~~长舒一口气…终于搭建好了Redis集群。
    整个过程其实挺简单,本篇主要正对入门级别的小伙伴,插入了很多图片,所以显得冗长,希望大家多多理解,如果不当之处,还望及时指正~

    最后,加上两条redis集群基本命令:
    1.查看当前集群信息

    cluster info
    

    2.查看集群里有多少个节点

    cluster nodes
    
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 50,521
精华内容 20,208
关键字:

redis集群

redis 订阅