8. Redis的主从复制架构
8.1 简介
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。
8.1.1 一主一从
如下图所示左边是Master节点,右边是slave节点,即主节点和从节点。从节点也是可以对外提供服务的,主节点是有数据的,从节点可以通过复制操作将主节点的数据同步过来,并且随着主节点数据不断写入,从节点数据也会做同步的更新。
从节点起到的就是数据备份的效果。
8.1.2 一主多从
除了一主一从模型之外,Redis还提供了一主多从的模型,也就是一个master可以有多个slave,也就相当于有了多份的数据副本。
可以做一个更加高可用的选择,例如一个master和一个slave挂掉了,还能有其他的slave数据备份。
8.2 主从复制原理
当从数据库启动后,会向主数据库发送SYNC命令
主数据库接收到SYNC命令后开始在后台保存快照(RDB持久化),并将保存快照期间接收到的命令缓存下来
快照完成后,Redis(Master)将快照文件和所有缓存的命令发送给从数据库
Redis(Slave)接收到RDB和缓存命令时,会开始载入快照文件并执行接收到的缓存的命令
一旦初始化完成,后续每当主数据库接收到写命令时,就会将命令同步给从数据库。所以3和4只会在初始化的时候执行
8.3 主从复制的应用场景
8.3.1 备份容错
如果只有一个节点,会存在单点故障问题
8.3.2 读写分离
通过主从复制可以实现读写分离,以提高服务器的负载能力
在常见的场景中(例如:电商网站),读的频率大于写
当单机Redis无法应付大量的读请求时(尤其是消耗资源的请求),就可以通过主从复制功能来建立多个从数据库节点,主数据库只进行写操作,从数据库负责读操作
这种主从复制,比较适合用来处理读多写少的场景,而当单个主数据库不能满足需求时,就需要使用Redis 3.0后推出的集群功能
8.3.3 从数据库持久化
Redis中相对耗时的操作就是持久化,为了提高性能,可以通过主从复制创建一个或多个从数据库,并在从数据库中启用持久化,同时在主数据库中禁用持久化(例如:禁用AOF)
当从数据库崩溃重启后主数据库会自动将数据同步过来,无需担心数据丢失
而当主数据库崩溃时,后续我们可以通过哨兵(Sentinel)来解决
8.4 另外两台服务器安装Redis
8.4.1 安装Redis依赖环境
在bigdata-pro-m08和bigdata-pro-m09执行以下命令安装依赖环境
yum -y install gcc-c++
8.4.2 上传Redis压缩包
在bigdata-pro-m08和bigdata-pro-m09服务器上面上传Redis压缩包,然后进行解压,并将安装包上传到/opt/software路径下
cd /opt/software tar -zxvf redis-3.2.8.tar.gz -C /opt/softwares/
8.4.3 服务器安装tcl
在bigdata-pro-m08和bigdata-pro-m09服务器执行以下命令在线装TCL
yum -y install tcl
8.4.4 编译redis
bigdata-pro-m08和bigdata-pro-m09执行以下命令进行编译Redis
执行以下命令进行编译:
cd /opt/software/redis-3.2.8/ #或者使用命令 make 进行编译 make MALLOC=libc make test && make install PREFIX=/opt/software/redis-3.2.8/
8.4.5 修改redis配置文件
bigdata-pro-m08服务器修改配置文件
执行以下命令修改Redis配置文件
cd /opt/software/redis-3.2.8/ mkdir data mkdir log vim redis.conf # 修改第61行 bind bigdata-pro-m08 # 修改第128行 daemonize yes # 修改第163行 logfile "/opt/software/redis-3.2.8/log/redis.log" # 修改第247行 dir /opt/software/redis-3.2.8/data # 修改第266行,配置bigdata-pro-m08为第一台服务器的slave节点 slaveof bigdata-pro-m07 6379
bigdata-pro-m09服务器修改配置文件
执行以下命令修改Redis配置文件
cd /opt/software/redis-3.2.8/ mkdir data mkdir log vim redis.conf # 修改第61行 bind bigdata-pro-m08 # 修改第128行 daemonize yes # 修改第163行 logfile "/opt/software/redis-3.2.8/log/redis.log" # 修改第247行 dir /opt/software/redis-3.2.8/data # 修改第266行,配置bigdata-pro-m09为第二台服务器的slave节点 slaveof bigdata-pro-m07 6379
8.5 启动Redis服务
bigdata-pro-m08和bigdata-pro-m089执行以下命令启动Redis服务
bin/redis-server redis.conf
启动成功便可以实现redis的主从复制,bigdata-pro-m07可以读写操作,bigdata-pro-m08与bigdata-pro-m09只支持读取操作。
9. Redis中的Sentinel架构
9.1 Sentinel介绍
哨兵是主要用来保障Redis主从复制架构是高可用的,是能够自动进行主节点切换的
它可以监控主从复制中的节点,当主节点崩溃的时候,会自动进行切换
一般哨兵的配置节点数不能是1个,最好是有几个主从节点,就配置几个哨兵。不能哨兵自己出现单点故障
哨兵在Linux系统上是一个独立的进程,它的默认端口号是26379
当我们去查看操作哨兵的时候,需要指定客户端的连接端口号为:26379
例如:
在Server1 掉线后:
升级Server2 为新的主服务器:
9.2 配置哨兵
9.2.1 三台机器修改哨兵配置文件
三台机器执行以下命令修改redis的哨兵配置文件
vim sentinel.conf
配置监听的主服务器
- 修改bigdata-pro-m07的sentinel.conf文件
#修改第15行, bind配置,每台机器修改为自己对应的主机名 bind bigdata-pro-m07 # 在下方添加配置,让sentinel服务后台运行 daemonize yes #修改第71行,三台机器监控的主节点,现在主节点是bigdata-pro-m07服务器 sentinel monitor mymaster bigdata-pro-m07 6379 2
参数说明
sentinel monitor代表监控
mymaster代表服务器的名称,可以自定义
bigdata-pro-m07代表监控的主服务器,6379代表端口
2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
如果Redis是有密码的,需要指定密码
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码 # sentinel auth-pass <master-name> <password>
- 分发到bigdata-pro-m08和bigdata-pro-m09
scp sentinel.conf bigdata-pro-m08:$PWD scp sentinel.conf bigdata-pro-m09:$PWD
- 分别修改配置中bind的服务器主机名
bigdata-pro-m08 # 修改第18行 bind bigdata-pro-m08 bigdata-pro-m09 # 修改第18行 bind bigdata-pro-m09
9.2.2 三台机器启动哨兵服务
bin/redis-sentinel sentinel.conf
三台服务器的进程信息:
[caizhengjie@bigdata-pro-m07 redis-3.2.8]$ ps -ef | grep redis caizhen+ 16605 1 0 00:37 ? 00:00:03 bin/redis-sentinel bigdata-pro-m07:26379 [sentinel] root 16681 1 0 00:53 ? 00:00:00 bin/redis-server bigdata-pro-m07:6379 caizhen+ 16685 1233 0 00:53 pts/0 00:00:00 grep --color=auto redis
9.2.3 bigdata-pro-m07服务器杀死redis服务进程
查看Sentinel master的状态 bin/redis-cli -h bigdata-pro-m08 -p 26379 使用ping命令检查哨兵是否工作,如果正常会返回PONG bigdata-pro-m08:26379> ping PONG bigdata-pro-m08:26379> info ... ... ... # Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=10.211.55.9:6379,slaves=2,sentinels=3
这时的主节点是bigdata-pro-m07
使用kill -9命令杀死redis服务进程,模拟redis故障宕机情况
过一段时间之后,就会在bigdata-pro-m08与bigdata-pro-m09服务器选择一台服务器来切换为主节点
# Sentinel sentinel_masters:1 sentinel_tilt:0 sentinel_running_scripts:0 sentinel_scripts_queue_length:0 sentinel_simulate_failure_flags:0 master0:name=mymaster,status=ok,address=10.211.55.11:6379,slaves=2,sentinels=3
这时的主节点是bigdata-pro-m09
9.3 Redis的sentinel模式代码开发连接
通过哨兵连接,要指定哨兵的地址,并使用JedisSentinelPool来创建连接池。
实现步骤:
在 cn.itcast.redis.api_test 包下创建一个新的类 ReidsSentinelTest
构建JedisPoolConfig配置对象
创建一个HashSet,用来保存哨兵节点配置信息(记得一定要写端口号)
构建JedisSentinelPool连接池
使用sentinelPool连接池获取连接
package cn.itcast.redis.api_test; import org.testng.annotations.AfterTest; import org.testng.annotations.BeforeTest; import org.testng.annotations.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisSentinelPool; import java.util.HashSet; import java.util.Set; /** * @author :caizhengjie * @description: * 1. 在 cn.itcast.redis.api_test 包下创建一个新的类 RedisSentinelTest * 2. 构建JedisPoolConfig配置对象 * 3. 创建一个HashSet,用来保存哨兵节点配置信息(记得一定要写端口号) * 4. 构建JedisSentinelPool连接池 * 5. 使用sentinelPool连接池获取连接 * @date :2021/1/28 4:07 下午 */ public class RedisSentinelTest { private JedisSentinelPool jedisSentinelPool; @BeforeTest public void redisConnectionPool(){ // 创建JedisPoolConfig配置对象 JedisPoolConfig config = new JedisPoolConfig(); // 指定最大空闲连接为10个 config.setMaxIdle(10); // 最小空闲连接5个 config.setMinIdle(5); // 最大等待时间为3000毫秒 config.setMaxWaitMillis(3000); // 最大连接数为50 config.setMaxTotal(50); HashSet<String> sentinelSet = new HashSet<>(); sentinelSet.add("bigdata-pro-m07:26379"); sentinelSet.add("bigdata-pro-m08:26379"); sentinelSet.add("bigdata-pro-m09:26379"); jedisSentinelPool = new JedisSentinelPool("mymaster",sentinelSet,config); } @Test public void keysTest(){ // 1.要操作redis,先要获取redis连接。现在通过哨兵连接池来获取连接 Jedis jedis = jedisSentinelPool.getResource(); // 2.执行keys操作 Set<String> keySet = jedis.keys("*"); // 3.遍历所有key for (String key : keySet) { System.out.println(key); } // 4.再将连接返回到连接池 jedis.close(); } @AfterTest public void afterTest(){ // 关闭连接池 jedisSentinelPool.close(); } }
运行结果:
k1 k2 =============================================== Default Suite Total tests run: 1, Failures: 0, Skips: 0 ===============================================
10. Redis 集群
Redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在Redis 3.x提出cluster集群模式。
10.1 引言
Redis Cluster是Redis官方提供的Redis集群功能,为什么要实现Redis Cluster?
主从复制不能实现高可用
随着公司发展,用户数量增多,并发越来越多,业务需要更高的QPS,而主从复制中单机的QPS可能无法满足业务需求;
数据量的考虑,现有服务器内存不能满足业务数据的需要时,单纯向服务器添加内存不能达到要求,此时需要考虑分布式需求,把数据分布到不同服务器上;
网络流量需求,业务的流量已经超过服务器的网卡的上限值,可考虑使用分布式来进行分流;
离线计算,需要中间环节缓冲等其他需求;
在存储引擎框架(MySQL、HDFS、HBase、Redis、Elasticsearch等)中,只要数据量很大时,单机无法承受压力,最好的方式就是:数据分布进行存储管理。
对Redis 内存数据库来说:全量数据,单机Redis节点无法满足要求,按照分区规则把数据分到若干个子集当中。
10.1.1 Redis集群解决的问题
高可用
解决单机Redis内存是有限的问题(技术组件不是内存越多越好,因为内存配置得越高,例如JVM的Heap内存配置得很高后,就会导致内存碎片整理很耗时,垃圾回收会发生卡顿,导致集群的效率下降)
解决单机Redis网络受限的问题
10.1.2 分布式存储的重点——分区
顺序分布:MySQL——根据顺序分区的方式,例如:根据主键来进行分区(分库分表),一般是在Java web开发中会遇到
按照哈希取余的方式来进行分区(类似于MapReduce的默认分区策略)
问题:当分区的数量发生变化的时候,会导致key产生较大影响,原先分布在第一个节点上的数据,分区数量调整后,指定到了其他的分区
按照一致性Hash的方式来进行分区
是一个环状的Hash空间,它的分区算法是和哈希取余算法不一样的
首先将每一个分区的标号(0、1、2)进行算法计算,然后将计算出来的值,放入到环状的Hash空间空
再将key同样进行算法计算,然后将计算出来的值,同样也放入到环状的Hash空间中
最后,找到key在hash空间中距离自己位置最近的分区,放入到该分区中
这样,当分区的数量发生变化的时候,影响不会太大
Redis集群是使用槽的方式来进行分区的
现有有一个槽的空间(0-16383),需要将这些空间分布到不同的节点中
node1: 0 -3xxx
node2: 3xxx- 6xxx
…
有一个key,首先进行CRC16算法&16383 = 值,Redis会判断这个值应该在哪个槽中
一致性哈希分区图解:
虚拟槽分区图解:
10.2 Redis Cluster 设计
Redis Cluster是分布式架构,有多个节点,每个节点都负责进行数据读写操作,每个节点之间会进行通信。Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
结构特点:
所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
节点的fail是通过集群中超过半数的节点检测失效时才生效;
客户端与redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可;
redis-cluster 把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value;
Redis集群预分好16384个桶(Slot),当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) & 16384的值,决定将一个key放到哪个桶中;
Redis 集群的优势:
缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令;
迅速恢复数据:持久化数据,能在宕机后迅速解决数据丢失的问题;
Redis可以使用所有机器的内存,变相扩展性能;
使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;
Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈;
异步处理数据,实现快速读写;
Redis 3.0以后,节点之间通过去中心化的方式提供了完整的sharding(数据分片)、replication(复制机制、Cluster具备感知准备的能力)、failover解决方案。
10.3 Redis Cluster 搭建
Redis3.0及以上版本实现,集群中至少应该有奇数个节点,所以至少有三个节点,官方推荐三主三从的配置方式。Redis 3.x和Redis4.x 搭建集群是需要手动安装ruby组件的,比较麻烦。
2018年十月 Redis 发布了稳定版本的 5.0 版本,推出了各种新特性,其中一点是放弃 Ruby的集群方式,改为 使用 C语言编写的redis-cli的方式,是集群的构建方式复杂度大大降低。Redis cluster tutorial:https://redis.io/topics/cluster-tutorial
基于Redis-5.0.8版本,在三台机器上搭建6个节点的Redis集群:三主三从架构。
10.3.1 环境准备
关闭以前Redis主从复制和哨兵模式监控的所有服务,备注:如果以前没有安装过Redis服务,不用执行此步骤操作。
# ============= node1.itcast.cn、node2.itcast.cn和node3.itcast.cn ============= # 关闭哨兵服务SentinelServer ps -ef | grep redis kill -9 哨兵的进程ID # 关闭Redis服务 redis-cli -h bigdata-pro-m07 -p 6379 SHUTDOWN redis-cli -h bigdata-pro-m08 -p 6379 SHUTDOWN redis-cli -h bigdata-pro-m09 -p 6379 SHUTDOWN
安装Redis编译环境:GCC和TCL。
yum -y install gcc-c++ tcl
10.3.2 上传和解压
将Redis-5.0.8软件安装包上传至 /opt/software 目录,并解压与安装。
chmod u+x redis-5.0.8.tar.gz tar -zxvf redis-5.0.8.tar.gz -C /opt/modules/
10.3.3 编译安装
编译Redis 源码,并安装至【/opt/modules/redis-5.0.8-bin】目录。
# bigdata-pro-m07, 编译、安装、创建软连接 # 进入源码目录 cd /opt/modules/redis-5.0.8 # 编译 make # 安装至指定目录 make PREFIX=/opt/modules/redis-5.0.8-bin install # 创建安装目录软连接 ln -s redis-5.0.8-bin redis
配置环境变量(如果以前安装过Redis,配置过环境变量,就不用配置)。
vim /etc/profile # ======================== 添加如下内容 ======================== # REDIS HOME export REDIS_HOME=/opt/modules/redis export PATH=:$PATH:$REDIS_HOME/bin # 执行生效 source /etc/profile
10.3.4 拷贝配置文件
从Redis-5.0.8源码目录下拷贝配置文件:redis.conf至Redis 安装目录。
# ====================== bigdata-pro-m07 上操作 ====================== # 拷贝配置文件 cd /opt/modules/redis-5.0.8 cp redis.conf /opt/modules/redis
10.3.5 修改配置文件
每台机器上启动2个Redis服务,一个主节点服务:7001,一个从节点服务:7002,如下图所示:
在Redis安装目录下创建7001和7002目录,分别存储Redis服务配置文件、日志及数据文件。
# 创建目录:7001和7002 cd /opt/modules/redis mkdir -p 7001 7002
拷贝配置文件:redis.conf至7001目录,并重命名为redis_7001.conf。
cd /opt/modules/redis cp redis.conf 7001/redis_7001.conf
编辑配置文件:redis_7001.conf,内容如下:
cd /opt/modules/redis/7001 vim redis_7001.conf ## =========================== 修改内容说明如下 =========================== ## 69行,配置redis服务器接受链接的网卡 bind 0.0.0.0 ## 88行,关闭保护模式 protected-mode no ## 92行,设置端口号 port 7001 ## 136行,redis后台运行 daemonize yes ## 158行,Redis服务进程PID存储文件名称 pidfile /var/run/redis_7001.pid ## 171行,设置redis服务日志存储路径 logfile "/opt/modules/redis-5.0.8-bin/7001/log/redis.log" ## 263行,设置redis持久化数据存储目录 dir /opt/modules/redis-5.0.8-bin/7001/data/ ## 699行,启动AOF方式持久化 appendonly yes ## 832行,启动Redis Cluster cluster-enabled yes ## 840行,Redis服务配置保存文件名称 cluster-config-file nodes-7001.conf ## 847行,超时时间 cluster-node-timeout 15000
创建日志目录和数据目录:
mkdir log mkdir data
配置7002端口号启动Redis服务,操作命令如下:
## 拷贝配置文件 cd /opt/modules/redis cp 7001/redis_7001.conf 7002/redis_7002.conf ## 修改配置文件:redis_7002.conf cd /opt/modules/redis/7002 vim redis_7002.conf # 进入vim编辑之后,执行以下代码将7001全部替换成7002 :%s/7001/7002/g # 表示:%s/old/new/g g表示全部替换 # 创建目录 mkdir log mkdir data
10.3.6 发送安装包
将bigdata-pro-m07上配置好的Redis安装包,发送至bigdata-pro-m08和bigdata-pro-m09,每台机器运行2个Redis服务,端口号分别为7001和7002,具体命令如下:
# 发送安装包 cd /opt/modules/ scp -r redis-5.0.8-bin bigdata-pro-m08:$PWD scp -r redis-5.0.8-bin bigdata-pro-m09:$PWD # 创建软连接 ln -s redis-5.0.8-bin redis # 配置环境变量 vim /etc/profile # ======================== 添加如下内容 ======================== # REDIS HOME export REDIS_HOME=/opt/modules/redis export PATH=:$PATH:$REDIS_HOME/bin # 执行生效 source /etc/profile
10.4 启动Redis服务
在三台机器,分别启动6个Redis服务,命令如下:
# 启动7001端口Redis服务 cd /opt/modules/redis bin/redis-server 7001/redis_7001.conf # 启动7002端口Redis服务 bin/redis-server 7002/redis_7002.conf
Redis服务启动完成以后,查看如下:
[root@bigdata-pro-m07 redis]# ps -ef | grep redis root 25362 1 0 03:37 ? 00:00:00 bin/redis-server 0.0.0.0:7001 [cluster] root 25367 1 0 03:37 ? 00:00:00 bin/redis-server 0.0.0.0:7002 [cluster] root 25372 20674 0 03:37 pts/0 00:00:00 grep --color=auto redis
10.4.1 启动集群
Redis5.x版本之后,通过redis-cli客户端命令来进行创建集群,注意:Redis对主机名解析不友好,使用IP地址。
# 任意选择一台机器执行如下命令,创建集群 bin/redis-cli --cluster create 10.211.55.9:7001 10.211.55.9:7002 10.211.55.10:7001 10.211.55.10:7002 10.211.55.11:7001 10.211.55.11:7002 --cluster-replicas
启动集群日志信息如下:
>>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 10.211.55.10:7002 to 10.211.55.9:7001 Adding replica 10.211.55.11:7002 to 10.211.55.10:7001 Adding replica 10.211.55.9:7002 to 10.211.55.11:7001 M: 85967aece18ad0a0dbba0bd8ab5dc231daa37211 10.211.55.9:7001 slots:[0-5460] (5461 slots) master S: 0e819904c77c695451f50b83c6a65fd83d1e4760 10.211.55.9:7002 replicates b870f6c001ba485caffa2ade9a152d163909a548 M: 29b88a543dd91233f5c0b7f25b8fa05495799f9f 10.211.55.10:7001 slots:[5461-10922] (5462 slots) master S: 644fe21de168518e8ece15785a96078fd8926498 10.211.55.10:7002 replicates 85967aece18ad0a0dbba0bd8ab5dc231daa37211 M: b870f6c001ba485caffa2ade9a152d163909a548 10.211.55.11:7001 slots:[10923-16383] (5461 slots) master S: aed488ce6dcbde4fc23e8b160a0ea8583ec783ab 10.211.55.11:7002 replicates 29b88a543dd91233f5c0b7f25b8fa05495799f9f 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 10.211.55.9:7001) M: 85967aece18ad0a0dbba0bd8ab5dc231daa37211 10.211.55.9:7001 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: 29b88a543dd91233f5c0b7f25b8fa05495799f9f 10.211.55.10:7001 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 0e819904c77c695451f50b83c6a65fd83d1e4760 10.211.55.9:7002 slots: (0 slots) slave replicates b870f6c001ba485caffa2ade9a152d163909a548 M: b870f6c001ba485caffa2ade9a152d163909a548 10.211.55.11:7001 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 644fe21de168518e8ece15785a96078fd8926498 10.211.55.10:7002 slots: (0 slots) slave replicates 85967aece18ad0a0dbba0bd8ab5dc231daa37211 S: aed488ce6dcbde4fc23e8b160a0ea8583ec783ab 10.211.55.11:7002 slots: (0 slots) slave replicates 29b88a543dd91233f5c0b7f25b8fa05495799f9f [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
10.4.2 测试集群
在任意一台机器,使用redis-cli客户端命令连接Redis服务:
redis-cli -c -p 7001
输入命令:cluster nodes(查看集群信息)和info replication(主从信息):
127.0.0.1:7001> cluster nodes 29b88a543dd91233f5c0b7f25b8fa05495799f9f 10.211.55.10:7001@17001 master - 0 1611909783813 3 connected 5461-10922 0e819904c77c695451f50b83c6a65fd83d1e4760 10.211.55.9:7002@17002 slave b870f6c001ba485caffa2ade9a152d163909a548 0 1611909784865 5 connected 85967aece18ad0a0dbba0bd8ab5dc231daa37211 10.211.55.9:7001@17001 myself,master - 0 1611909779000 1 connected 0-5460 b870f6c001ba485caffa2ade9a152d163909a548 10.211.55.11:7001@17001 master - 0 1611909786961 5 connected 10923-16383 644fe21de168518e8ece15785a96078fd8926498 10.211.55.10:7002@17002 slave 85967aece18ad0a0dbba0bd8ab5dc231daa37211 0 1611909788005 4 connected aed488ce6dcbde4fc23e8b160a0ea8583ec783ab 10.211.55.11:7002@17002 slave 29b88a543dd91233f5c0b7f25b8fa05495799f9f 0 1611909785916 6 connected 127.0.0.1:7001> info replication # Replication role:master connected_slaves:1 slave0:ip=10.211.55.10,port=7002,state=online,offset=280,lag=0 master_replid:f67ea78cd33268a6c217b99b249858c8372837ae master_replid2:0000000000000000000000000000000000000000 master_repl_offset:280 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:280
测试数据,设置Key值和查询Key的值。
127.0.0.1:7001> keys * (empty list or set) 127.0.0.1:7001> set k1 v1 -> Redirected to slot [12706] located at 10.211.55.11:7001 OK 10.211.55.11:7001> set k2 v2 -> Redirected to slot [449] located at 10.211.55.9:7001 OK 10.211.55.9:7001> set k3 v3 OK 10.211.55.9:7001> get k1 -> Redirected to slot [12706] located at 10.211.55.11:7001 "v1" 10.211.55.11:7001> get k2 -> Redirected to slot [449] located at 10.211.55.9:7001 "v2" 10.211.55.9:7001> get k3 "v3" 10.211.55.9:7001> KEYS * 1) "k3" 2) "k2"