第13章:Redis缓存集群方案

发布时间:2026/9/2 13:26:21
第13章:Redis缓存集群方案 健康管理系统项目 第13章Redis是一个基于key-value的高速缓存系统用来缓存数据。支持更复杂的数据结构List、Set、Sorted Set并且有持久化的功能。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作redis支持各种不同方式的排序。为了保证效率数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。目前Redis在企业中的应用已经非常广泛同时Redis也是面试中的重点内容。1. Redis缓存相关问题1.1 缓存穿透缓存穿透是指查询一个数据库一定不存在的数据。我们以前正常的使用Redis缓存的流程大致是1、数据查询首先进行缓存查询2、如果数据存在则直接返回缓存数据3、如果数据不存在就对数据库进行查询并把查询到的数据放进缓存4、如果数据库查询数据为空则不放进缓存例如我们的数据表中主键是自增产生的所有的主键值都大于0。此时如果用户传入的参数为-1会是怎么样这个-1就是一定不存在的对象。程序就会每次都去查询数据库而每次查询都是空每次又都不会进行缓存。假如有人恶意攻击就可以利用这个漏洞对数据库造成压力甚至压垮我们的数据库。为了防止有人利用这个漏洞恶意攻击我们的数据库我们可以采取如下措施如果从数据库查询的对象为空也放入缓存key为用户提交过来的主键值value为null只是设定的缓存过期时间较短比如设置为60秒。这样下次用户再根据这个key查询redis缓存就可以查询到值了当然值为null从而保护我们的数据库免遭攻击。1.2 缓存雪崩缓存雪崩是指在某一个时间段缓存集中过期失效。在缓存集中失效的这个时间段对数据的访问查询都落到了数据库上对于数据库而言就会产生周期性的压力波峰。为了避免缓存雪崩的发生我们可以将缓存的数据设置不同的失效时间这样就可以避免缓存数据在某个时间段集中失效。例如对于热门的数据访问频率高的数据可以缓存的时间长一些对于冷门的数据可以缓存的时间段一些。甚至对于一些特别热门的数据可以设置永不过期。1.3 缓存击穿缓存击穿是指一个key非常热点例如双十一期间进行抢购的商品数据在不停的扛着大并发大并发集中对这一个点进行访问当这个key在失效的瞬间持续的大并发就穿破缓存直接请求到数据库上就像在一个屏障上凿开了一个洞。我们同样可以将这些热点数据设置永不过期就可以解决缓存击穿的问题了。2. Redis集群方案单机Redis的读写速度非常快能够支持大量用户的访问。虽然Redis的性能很高但是对于大型网站来说每秒需要获取的数据远远超过单台redis服务所能承受的压力所以我们迫切需要一种方案能够解决单台Redis服务性能不足的问题。这就需要使用到Redis的集群了。Redis集群有多种方案下面分别进行讲解。2.1 主从复制Replicationredis支持主从复制的模式。在主从复制模式下Redis节点分为两种角色主节点(也称为master)和从节点(也称为slave)。这种模式集群是由一个主节点和多个从节点构成。原则Master会将数据同步到slave而slave不会将数据同步到master。Slave启动时会连接master来同步数据。这是一个典型的分布式读写分离模型。我们可以利用master来处理写操作slave提供读操作。这样可以有效减少单个机器的并发访问数量。要实现主从复制这种模式非常简单主节点不用做任何修改直接启动服务即可。从节点需要修改redis.conf配置文件加入配置slaveof 主节点ip地址 主节点端口号例如master的ip地址为192.168.200.129端口号为6379那么slave只需要在redis.conf文件中配置slaveof 192.168.200.129 6379即可。#安装redis #第一步下载获得redis-3.0.4.tar.gz后将它放入我们的Linux目录/opt #第二步/opt目录下解压redis-4.0.14.tar.gz [rootliusp opt]# tar -zxvf redis-4.0.14.tar.gz #第三步进入目录:cd redis-4.0.14 [rootliusp opt]# cd redis-4.0.14/ #第四步安装gcc-c必须可以联网 [rootliusp redis-4.0.14]# yum install gcc-c #第五步运行make distclean 清空残留的目录文件 [rootliusp redis-4.0.14]# make distclean #第六步在redis-4.0.14目录下执行make命令 [rootliusp redis-4.0.14]# make #第八步如果make完成后继续执行make install [rootliusp redis-4.0.14]# make install #第九步查看默认安装目录usr/local/bin [rootliusp redis-4.0.14]# cd /usr/local/bin #第十步启动 #在解压的目录中有redis.conf文件 [rootliusp bin]# cd /opt/redis-4.0.14/ #修改redis.conf文件将里面的daemonize no 改成 yes让服务在后台启动 [rootliusp redis-4.0.14]# vim redis.conf #启动服务 [rootliusp redis-4.0.14]# redis-server /opt/redis-4.0.14/redis.conf #启动后查看当前用户启动的进程 [rootliusp redis-4.0.14]# ps -ef |grep redis root 7532 1 0 10:33 ? 00:00:00 redis-server 127.0.0.1:6379 root 7538 2215 0 10:33 pts/0 00:00:00 grep --colorauto redis #第十一步启动客户端 [rootliusp redis-4.0.14]# redis-cli #退出客户端 ctrl c #查看端口后是否被占用 [rootliusp redis-4.0.14]# lsof -i :6379 #第十五退出redis命令服务停止 [rootliusp redis-4.0.14]# redis-cli 127.0.0.1:6379 Shutdown not connected exit #设置密码 #查看密码 127.0.0.1:6379 config get requirepass #修改密码 127.0.0.1:6379 config set requirepass 123456 #密码登陆 127.0.0.1:6379 auth 123456 #密码登录 [rootliusp redis-4.0.14]# redis-cli -h 127.0.0.1 -p 6379 -a 123456 #配置远程连接redis #检查redis.conf配置文件中相关配置是否配置正确。 #配置文件第61行的本地连接地址需要注释掉第94行修改为no第247行守护进行模式daemonize 改成yes(默认为no) 61 # bind 127.0.0.1 ::1 94 protected-mode no 247 daemonize yes配置Redis的复制(Master/Slave)行话也就是我们所说的主从复制主机数据更新后根据配置和策略自动同步到备机的master/slaver机制Master以写为主Slave以读为主#在 /opt/redis-4.0.14 目录下复制多个redis.conf文件 [rootliusp redis-4.0.14]# cp redis.conf redis6380.conf [rootliusp redis-4.0.14]# cp redis.conf redis6381.conf #修改配置文件细节操作 #配置第一台从服务器 [rootliusp redis-4.0.14]# vim redis6380.conf #开启daemonize yes daemonize yes #指定端口 port 6380 #Pid文件名字 pidfile /var/run/redis_6380.pid #Log文件名字 logfile mylog6380.log #Dump.rdb名字 dbfilename dump6380.rdb #配置第二台从服务器 [rootliusp redis-4.0.14]# vim redis6381.conf #开启daemonize yes daemonize yes #指定端口 port 6381 #Pid文件名字 pidfile /var/run/redis_6381.pid #Log文件名字 logfile mylog6381.log #Dump.rdb名字 dbfilename dump6381.rdb #启动三台redis服务和客户端 [rootliusp redis-4.0.14]# redis-server /opt/redis-4.0.14/redis.conf [rootliusp redis-4.0.14]# redis-server /opt/redis-4.0.14/redis6380.conf [rootliusp redis-4.0.14]# redis-server /opt/redis-4.0.14/redis6381.conf #打开两个redis客户端 [rootliusp ~]# redis-cli -h 192.168.11.64 -p 6379 -a 123456 [rootliusp ~]# redis-cli -h 192.168.11.64 -p 6380 -a 123456 [rootliusp ~]# redis-cli -h 192.168.11.64 -p 6381 -a 123456 #可以看到三台服务器现在都是master 192.168.11.64:6379 info replication # Replication role:master connected_slaves:0 ... 192.168.11.64:6380 info replication # Replication role:master connected_slaves:0 ... 192.168.11.64:6381 info replication # Replication role:master connected_slaves:0 ... #主服务器6379写入数据 192.168.11.64:6379 set k18 v18 #从服务器6380同步主服务器数据 192.168.11.64:6380 slaveof 127.0.0.1 6379 192.168.11.64:6380 get k18 v18 #从服务器6381同步主服务器数据 192.168.11.64:6380 slaveof 127.0.0.1 6379 #这个时候可以看到已经是一台master主机两台slave从机了 192.168.11.64:6379 info replication # Replication role:master connected_slaves:2 slave0:ip127.0.0.1,port6380,stateonline,offset12951,lag1 slave1:ip127.0.0.1,port6381,stateonline,offset12951,lag0 192.168.11.64:6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 192.168.11.64:6381 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379分别连接主节点和从节点测试发现主节点的写操作从节点立刻就能看到相同的数据。但是在从节点进行写操作提示READONLY You cant write against a read only slave不能写数据到从节点。现在我们就可以通过这种方式配置多个从节点进行读操作主节点进行写操作实现读写分离。2.2 哨兵sentinel我们现在已经给Redis实现了主从复制可将主节点数据同步给从节点实现了读写分离提高Redis的性能。但是现在还存在一个问题就是在主从复制这种模式下只有一个主节点一旦主节点宕机就无法再进行写操作了。也就是说主从复制这种模式没有实现高可用。那么什么是高可用呢如何实现高可用呢2.2.1 高可用介绍高可用(HA)是分布式系统架构设计中必须考虑的因素之一它是通过架构设计减少系统不能提供服务的时间。保证高可用通常遵循下面几点单点是系统高可用的大敌应该尽量在系统设计的过程中避免单点。通过架构设计而保证系统高可用的其核心准则是冗余。实现自动故障转移。2.2.2 Redis sentinel介绍sentinel(哨兵)是用于监控redis集群中Master状态的工具其本身也是一个独立运行的进程是Redis 的高可用解决方案sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel可以监视一个或者多个redis master服务以及这些master服务的所有从服务当某个master服务下线时自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求并且其余从节点开始从新的主节点复制数据。在redis安装完成后会有一个redis-sentinel的文件这就是启动sentinel的脚本文件同时还有一个sentinel.conf文件这个是sentinel的配置文件。sentinel工作模式注意可能有些同学会有疑问现在我们已经基于sentinel实现了高可用但是如果sentinel挂了怎么办呢其实sentinel本身也可以实现集群也就是说sentinel也是高可用的。2.2.3 Redis sentinel使用2.2.3.1 配置sentinelSentinel在redis的安装包中有我们直接使用就可以了但是先需要修改配置文件执行命令#进入redis解压目录可以看到有一个文件sentinel.conf [rootliusp ~]# cd /opt/redis-4.0.14/ #复制一份sentinel.conf文件 [rootliusp redis-4.0.14]# cp sentinel.conf sentinel01.conf #修改配置文件 [rootliusp redis-4.0.14]# vim sentinel01.conf在sentinel01.conf配置文件中添加# 外部可以访问 bind 0.0.0.0 sentinel monitor mymaster 127.0.0.1 6379 1 sentinel down-after-milliseconds mymaster 10000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1注意如果有sentinel monitor mymaster 127.0.0.1 6379 2配置则注释掉。参数说明sentinel monitor mymaster 192.168.200.129 6379 1mymaster主节点名,可以任意起名但必须和后面的配置保持一致。192.168.200.128 6379主节点连接地址。1将主服务器判断为失效需要投票这里设置至少需要 1个 Sentinel 同意。sentinel down-after-milliseconds mymaster 10000设置Sentinel认为服务器已经断线所需的毫秒数。sentinel failover-timeout mymaster 60000设置failover故障转移的过期时间。当failover开始后在此时间内仍然没有触发任何failover操作当前sentinel 会认为此次failover失败。sentinel parallel-syncs mymaster 1设置在执行故障转移时 最多可以有多少个从服务器同时对新的主服务器进行同步 这个数字越小表示同时进行同步的从服务器越少那么完成故障转移所需的时间就越长。2.2.3.2 启动sentinel配置文件修改后执行以下命令启动sentinel[rootliusp redis-4.0.14]# redis-sentinel sentinel01.conf效果如下可以看到6379是主服务6380和6381是从服务。2.2.3.3 测试sentinel我们在6379执行shutdown关闭主服务Sentinel提示如下sdown master mymaster 192.168.200.129 6379 #主节点宕机 odown master mymaster 192.168.200.129 6379 #quorum 1/1 new-epoch 1 try-failover master mymaster 192.168.200.129 6379 #尝试故障转移 vote-for-leader 00a6933e0cfa2b1bf0c3aab0d6b7a1a6455832ec 1 #选举领导 elected-leader master mymaster 192.168.200.129 6379 failover-state-select-slave master mymaster 192.168.200.129 6379 #故障转移选择从服务 selected-slave slave 192.168.200.129:6380 192.168.200.129 6380 mymaster 192.168.200.129 6379 #故障转移状态发送 发送到6380 failover-state-send-slaveof-noone slave 192.168.200.129:6380 192.168.200.129 6380 mymaster 192.168.200.129 6379 failover-state-wait-promotion slave 192.168.200.129:6380 192.168.200.129 6380 mymaster 192.168.200.129 6379 promoted-slave slave 192.168.200.129:6380 192.168.200.129 6380 mymaster 192.168.200.129 6379 failover-state-reconf-slaves master mymaster 192.168.200.129 6379 slave-reconf-sent slave 192.168.200.129:6381 192.168.200.129 6381 mymaster 192.168.200.129 6379 slave-reconf-inprog slave 192.168.200.129:6381 192.168.200.129 6381 mymaster 192.168.200.129 6379 slave-reconf-done slave 192.168.200.129:6381 192.168.200.129 6381 mymaster 192.168.200.129 6379 failover-end master mymaster 192.168.200.129 6379 #故障转移结束原来的主服务是6379 switch-master mymaster 192.168.200.129 6379 192.168.200.129 6380 #转换主服务由原来的6379转为现在的6380 slave slave 192.168.200.129:6381 192.168.200.129 6381 mymaster 192.168.200.129 6380 slave slave 192.168.200.129:6379 192.168.200.129 6379 mymaster 192.168.200.129 6380 sdown slave 192.168.200.129:6379 192.168.200.129 6379 mymaster 192.168.200.129 6380根据提示信息我们可以看到6379故障转移到了6380通过投票选择6380为新的主服务器。在6380执行info# Replication role:master connected_slaves:1 slave0:ip127.0.0.1,port6381,stateonline,offset80531,lag1在6381执行info# Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up当再次启动6379会怎样[rootliusp redis-4.0.14]# redis-server /opt/redis-4.0.14/redis.conf [rootliusp redis-4.0.14]# redis-cli -h 192.168.11.64 -p 6379 -a 123456 192.168.11.64:6379 info replication # Replication role:slave master_host:127.0.0.1 master_port:6380发现6379已经是从服务器。2.3 Redis内置集群cluster2.3.1 Redis cluster介绍Redis Cluster是Redis的内置集群在Redis3.0推出的实现方案。在Redis3.0之前是没有这个内置集群的。Redis Cluster是无中心节点的集群架构依靠Gossip协议协同自动化修复集群的状态。Redis cluster在设计的时候就考虑到了去中心化去中间件也就是说集群中的每个节点都是平等的关系都是对等的每个节点都保存各自的数据和整个集群的状态。每个节点都和其他所有节点连接而且这些连接保持活跃这样就保证了我们只需要连接集群中的任意一个节点就可以获取到其他节点的数据。2.3.2 哈希槽方式分配数据需要注意的是这种集群模式下集群中每个节点保存的数据并不是所有的数据而只是一部分数据。那么数据是如何合理的分配到不同的节点上的呢Redis 集群是采用一种叫做哈希槽 (hash slot)的方式来分配数据的。redis cluster 默认分配了 16384 个slot当我们set一个key 时会用CRC16算法来取模得到所属的slot然后将这个key 分到哈希槽区间的节点上具体算法就是CRC16(key) % 16384。假设现在有3个节点已经组成了集群分别是A, B, C 三个节点它们可以是一台机器上的三个端口也可以是三台不同的服务器。那么采用哈希槽 (hash slot)的方式来分配16384个slot 的话它们三个节点分别承担的slot 区间是节点A覆盖05460节点B覆盖546110922节点C覆盖1092316383那么现在要设置一个key ,比如叫my_name:set my_name liusp按照redis cluster的哈希槽算法CRC16(my_name)%16384 2412。 那么就会把这个key 的存储分配到 节点A 上了。2.3.3 Redis cluster的主从模式redis cluster 为了保证数据的高可用性加入了主从模式一个主节点对应一个或多个从节点主节点提供数据存取从节点则是从主节点拉取数据备份当这个主节点挂掉后就会在这些从节点中选取一个来充当主节点从而保证集群不会挂掉。redis cluster加入了主从模式后的效果如下2.3.4 Redis cluster搭建2.3.4.1 准备Redis节点为了保证可以进行投票需要至少3个主节点。每个主节点都需要至少一个从节点,所以需要至少3个从节点。一共需要6台redis服务器我们这里使用6个redis实例端口号为7001~7006。先准备一个干净的redis环境开一个新的虚拟机安装一个新的redis,先不启动服务复制安装好的bin文件夹清理后作为第一个redis节点具体命令如下#进入redis安装目录 [rootliusp local]# cd /usr/local/ #复制redis [rootliusp local]# mkdir cluster [rootliusp local]# cp -R bin/ cluster/node1 # 删除持久化文件如果没有不用就不用删除 cd cluster/node1 rm -rf dump.rdb rm -rf appendonly.aof # 删除原来的配置文件 rm -rf redis.conf #复制新的配置文件没有使用过刚解压出来的redis.conf配置文件放到node1目录中 #用我已经配置好的文件 [rootliusp node1]# cp /opt/redis-4.0.14/redis.conf redis.conf # 修改配置文件 [rootliusp node1]# vim redis.conf集群环境redis节点的配置文件如下把redis.conf配置文件中配置项清空然后添加下面配置。# Redis服务器可以跨网络访问 bind 0.0.0.0 # 修改端口号 port 7001 # Redis后台启动 daemonize yes # 开启aof持久化(命令重刷模式) appendonly yes # 开启集群 cluster-enabled yes #持久化数据根目录改为cluster dir /usr/local/cluster # 集群的配置 配置文件首次启动自动生成 其他节点改为相应的端口保证不同名或者目录不一样即可 cluster-config-file nodes7001.conf #AOF持久化日志其他节点改为相应的端口 appendfilename appendonly7001.aof #RDB持久化日志其他节点改为相应的端口 dbfilename dump7001.rdb # 请求超时 cluster-node-timeout 5000 #开启集群部分数据槽丢失不完整兼容性 cluster-require-full-coverage no第一个redis节点node1准备好之后再分别复制5份[rootliusp cluster]# cp -R node1/ node2 [rootliusp cluster]# cp -R node1/ node3 [rootliusp cluster]# cp -R node1/ node4 [rootliusp cluster]# cp -R node1/ node5 [rootliusp cluster]# cp -R node1/ node6修改六个节点的端口号为7001~7006修改redis.conf配置文件即可[rootliusp cluster]# cd node2 [rootliusp node2]# vim redis.conf [rootliusp node2]# cd .. [rootliusp cluster]# cd node3 [rootliusp node3]# vim redis.conf [rootliusp node3]# cd .. [rootliusp cluster]# cd node4 [rootliusp node4]# vim redis.conf [rootliusp node4]# cd .. [rootliusp cluster]# cd node5 [rootliusp node5]# vim redis.conf [rootliusp node5]# cd .. [rootliusp cluster]# cd node6 [rootliusp node6]# vim redis.conf [rootliusp node6]#编写启动节点的脚本#在cluster目录下创建启动脚本文件 [rootliusp cluster]# vim start-all.sh内容为cd node1 ./redis-server redis.conf cd .. cd node2 ./redis-server redis.conf cd .. cd node3 ./redis-server redis.conf cd .. cd node4 ./redis-server redis.conf cd .. cd node5 ./redis-server redis.conf cd .. cd node6 ./redis-server redis.conf cd ..设置脚本的权限并启动#设置可执行权限 [rootliusp cluster]# chmod 744 start-all.sh #启动 [rootliusp cluster]# ./start-all.sh #查看启动的redis服务 [rootliusp cluster]# ps -ef | grep redis使用命令 ps -ef | grep redis 查看效果如下停止redis服务需要停止服务就执行shutdown[rootliusp cluster]# redis-cli -p 7001 shutdown [rootliusp cluster]# redis-cli -p 7002 shutdown [rootliusp cluster]# redis-cli -p 7003 shutdown [rootliusp cluster]# redis-cli -p 7004 shutdown [rootliusp cluster]# redis-cli -p 7005 shutdown [rootliusp cluster]# redis-cli -p 7006 shutdown2.3.4.2 启动Redis集群redis集群的管理工具使用的是ruby脚本语言安装集群需要ruby环境先安装ruby环境# 安装ruby [rootliusp cluster]# yum -y install ruby ruby-devel rubygems rpm-build # 升级ruby版本redis4.0.14集群环境需要2.2.2以上的ruby版本 [rootliusp cluster]# yum install centos-release-scl-rh [rootliusp cluster]# yum install rh-ruby23 -y [rootliusp cluster]# scl enable rh-ruby23 bash # 查看ruby版本 [rootliusp cluster]# ruby -v ruby 2.3.8p459 (2018-10-18 revision 65136) [x86_64-linux]下载符合环境要求的gem下载地址如下https://rubygems.org/gems/redis/versions/4.1.0课程资料中已经提供了redis-4.1.0.gem直接上传安装即可安装命令#上传到/usr/local/cluster目录 [rootliusp opt]# cd /usr/local/cluster #安装 [rootliusp cluster]# gem install redis-4.1.0.gem进入redis安装目录使用redis自带的集群管理脚本执行命令# 进入redis安装包 [rootliusp cluster]# cd /opt/redis-4.0.14/src # 查看集群管理脚本 [rootliusp src]# ll *.rb # 使用集群管理脚本启动集群下面命令中的1表示为每个主节点创建1个从节点 ./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:7004 127.0.0.1:7005 127.0.0.1:7006 #注意启动集群过程中输入yes 输入y会出错效果如下 Creating cluster Performing hash slots allocation on 6 nodes... Using 3 masters: 192.168.200.129:7001 192.168.200.129:7002 192.168.200.129:7003 Adding replica 192.168.200.129:7005 to 192.168.200.129:7001 Adding replica 192.168.200.129:7006 to 192.168.200.129:7002 Adding replica 192.168.200.129:7004 to 192.168.200.129:7003 Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: f0094f14b59c023acd38098336e2adcd3d434497 192.168.200.129:7001 slots:0-5460 (5461 slots) master M: 0eba44418d7e88f4d819f89f90da2e6e0be9c680 192.168.200.129:7002 slots:5461-10922 (5462 slots) master M: ac16c5545d9b099348085ad8b3253145912ee985 192.168.200.129:7003 slots:10923-16383 (5461 slots) master S: edc7a799e1cfd75e4d80767958930d86516ffc9b 192.168.200.129:7004 replicates ac16c5545d9b099348085ad8b3253145912ee985 S: cbd415973b3e85d6f3ad967441f6bcb5b7da506a 192.168.200.129:7005 replicates f0094f14b59c023acd38098336e2adcd3d434497 S: 40fdde45b16e1ac85c8a4c84db75b43978d1e4d2 192.168.200.129:7006 replicates 0eba44418d7e88f4d819f89f90da2e6e0be9c680 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 Waiting for the cluster to join.. Performing Cluster Check (using node 192.168.200.129:7001) M: f0094f14b59c023acd38098336e2adcd3d434497 192.168.200.129:7001 slots:0-5460 (5461 slots) master 1 additional replica(s) M: ac16c5545d9b099348085ad8b3253145912ee985 192.168.200.129:7003 slots:10923-16383 (5461 slots) master 1 additional replica(s) S: cbd415973b3e85d6f3ad967441f6bcb5b7da506a 192.168.200.129:7005 slots: (0 slots) slave replicates f0094f14b59c023acd38098336e2adcd3d434497 S: 40fdde45b16e1ac85c8a4c84db75b43978d1e4d2 192.168.200.129:7006 slots: (0 slots) slave replicates 0eba44418d7e88f4d819f89f90da2e6e0be9c680 M: 0eba44418d7e88f4d819f89f90da2e6e0be9c680 192.168.200.129:7002 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: edc7a799e1cfd75e4d80767958930d86516ffc9b 192.168.200.129:7004 slots: (0 slots) slave replicates ac16c5545d9b099348085ad8b3253145912ee985 [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered.2.3.5 使用Redis集群按照redis cluster的特点它是去中心化的每个节点都是对等的所以连接哪个节点都可以获取和设置数据。使用redis的客户端连接redis集群命令如下./redis-cli -h 127.0.0.1 -p 7001 -c其中-c 一定要加这个是redis集群连接时进行节点跳转的参数。连接到集群后可以设置一些值可以看到这些值根据前面提到的哈希槽方式分散存储在不同的节点上了。[rootliusp src]# ./redis-cli -h 127.0.0.1 -p 7001 -c 127.0.0.1:7001 set my_name liusp - Redirected to slot [12803] located at 127.0.0.1:7003 OK 127.0.0.1:7003重定向到位于127.0.0.1:7003的槽位[12803]连接到7001查看集群关系[rootliusp ~]# redis-cli -h 127.0.0.1 -p 7001 -c 127.0.0.1:7001 info Replication # Replication role:master#可以看到7001是masterslave0是7006 connected_slaves:1 slave0:ip127.0.0.1,port7006,stateonline,offset630,lag1 master_replid:b3abeeb2850b007ea56b5c2cdb4f8d94cf681c8f master_replid2:0000000000000000000000000000000000000000 master_repl_offset:630 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:630 127.0.0.1:7001 #停掉7001服务观察7006是否会成为master实现高可用 127.0.0.1:7001 SHUTDOWN not connected exit [rootliusp ~]# redis-cli -h 127.0.0.1 -p 7006 -c 127.0.0.1:7006 info Replication # Replication role:master#7006成为master connected_slaves:0 master_replid:a27de9d09bc8b8fc692deb674a9db0440414fb95 master_replid2:b3abeeb2850b007ea56b5c2cdb4f8d94cf681c8f master_repl_offset:770 second_repl_offset:771 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:770 127.0.0.1:7006 #重新启动7001是否会再次成为master [rootliusp node1]# ./redis-server redis.conf [rootliusp node1]# redis-cli -h 127.0.0.1 -p 7001 -c 127.0.0.1:7001 info Replication # Replication role:slave master_host:127.0.0.1 master_port:7006 master_link_status:up #可以看到7001是slavemaster是7006

相关新闻