Redis集群的示例分析

49次阅读
没有评论

共计 36307 个字符,预计需要花费 91 分钟才能阅读完成。

自动写代码机器人,免费开通

这篇文章主要介绍 Redis 集群的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

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 sentineltest x $REDIS_DEBUG  != x   set -x
REDIS_CLI=/usr/local/bin/redis-cli# Retrieve service nameSERVICE_NAME= $1 if [ -z  $SERVICE_NAME  ]; then
 SERVICE_NAME=redisfi# Get the proper config file based on service nameCONFIG_FILE= /usr/local/redis/$SERVICE_NAME.conf # Use awk to retrieve host, port from config fileHOST=`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, portHOST=${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 properlyif [ -e  $SOCK  ] ; then
 $REDIS_CLI -s $SOCK $ADDITIONAL_PARAMS shutdownelse
 $REDIS_CLI -h $HOST -p $PORT $ADDITIONAL_PARAMS shutdownfi
# 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.confbind 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.confbind 192.168.30.129
daemonize yeslogfile  /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.confbind 192.168.30.130
daemonize yeslogfile  /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 123456Warning: Using a password with  -a  or  -u  option on the command line interface may not be safe.
192.168.30.128:6379  info replication# Replicationrole: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 replicationWarning: Using a password with  -a  or  -u  option on the command line interface may not be safe.# Replicationrole: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
192.168.30.128:6379  set key2 lzx
192.168.30.128:6379  keys *
1)  key1 2)  key2
# redis-cli -h 192.168.30.129 -a 123456Warning: 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 dir1)  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 123456Warning: 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 dir1)  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.confdaemonize yeslogfile  /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.log21574:X 09 May 2019 15:32:04.298 # Sentinel ID is 30c417116a8edbab09708037366c4a7471beb77021574:X 09 May 2019 15:32:04.298 # +monitor master mymaster 192.168.30.128 6379 quorum 221574: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.log22428:X 09 May 2019 15:51:29.287 # +sdown master mymaster 192.168.30.128 637922428:X 09 May 2019 15:51:29.371 # +odown master mymaster 192.168.30.128 6379 #quorum 2/222428:X 09 May 2019 15:51:29.371 # +new-epoch 122428:X 09 May 2019 15:51:29.371 # +try-failover master mymaster 192.168.30.128 637922428:X 09 May 2019 15:51:29.385 # +vote-for-leader 30c417116a8edbab09708037366c4a7471beb770 122428:X 09 May 2019 15:51:29.403 # d7b429dcba792103ef0d80827dd0910bd9284d21 voted for 30c417116a8edbab09708037366c4a7471beb770 122428:X 09 May 2019 15:51:29.408 # 79b8d61626afd4d059fb5a6a63393e9a1374e78f voted for 30c417116a8edbab09708037366c4a7471beb770 122428:X 09 May 2019 15:51:29.451 # +elected-leader master mymaster 192.168.30.128 637922428:X 09 May 2019 15:51:29.451 # +failover-state-select-slave master mymaster 192.168.30.128 637922428: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 637922428: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 637922428:X 09 May 2019 15:51:30.190 # +failover-state-reconf-slaves master mymaster 192.168.30.128 637922428: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 637922428: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 637922428:X 09 May 2019 15:51:31.297 # +switch-master mymaster 192.168.30.128 6379 192.168.30.129 637922428: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 123456Warning: Using a password with  -a  or  -u  option on the command line interface may not be safe.
192.168.30.129:6379  info replication# Replicationrole: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.log22428:X 09 May 2019 15:51:31.297 # +switch-master mymaster 192.168.30.128 6379 192.168.30.129 637922428: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 637922428: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 123456Warning: Using a password with  -a  or  -u  option on the command line interface may not be safe.
192.168.30.128:6379  info replication# Replicationrole: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.confbind 192.168.30.128
port 7001
daemonize yespidfile  /var/run/redis_7001.pid logfile  /usr/local/redis/cluster/redis_7001.log dir  /data/redis/cluster/redis_7001 #replicaof 192.168.30.129 6379masterauth 123456
requirepass 123456
appendonly yescluster-enabled yescluster-config-file nodes_7001.conf
cluster-node-timeout 15000
# vim /usr/local/redis/cluster/redis_7002.confbind 192.168.30.128
port 7002
daemonize yespidfile  /var/run/redis_7002.pid logfile  /usr/local/redis/cluster/redis_7002.log dir  /data/redis/cluster/redis_7002 #replicaof 192.168.30.129 6379masterauth  123456 requirepass  123456 appendonly yescluster-enabled yescluster-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 1Warning: 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.confbind 192.168.30.129
port 7007
daemonize yespidfile  /var/run/redis_7007.pid logfile  /usr/local/redis/cluster/redis_7007.log dir  /data/redis/cluster/redis_7007 #replicaof 192.168.30.129 6379masterauth  123456 requirepass  123456 appendonly yescluster-enabled yescluster-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.confbind 192.168.30.130
port 7008
daemonize yespidfile  /var/run/redis_7008.pid logfile  /usr/local/redis/cluster/redis_7008.log dir  /data/redis/cluster/redis_7008 #replicaof 192.168.30.130 6379masterauth  123456 requirepass  123456 appendonly yescluster-enabled yescluster-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
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
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 123456192.168.30.130:7008  CLUSTER REPLICATE e51ab166bc0f33026887bcf8eba0dff3d5b0bf14
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.conf1a1c7f02fce87530bd5abdfc98df1cffce4f1767 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.conf1a1c7f02fce87530bd5abdfc98df1cffce4f1767 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 123456Warning: 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 7001tcp 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.conf192.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 集群的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注丸趣 TV 行业资讯频道!

向 AI 问一下细节

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-12-04发表,共计36307字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)