Redis超全精讲!(三)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
日志服务 SLS,月写入数据量 50GB 1个月
简介: 介: 课程目标 能够掌握Redis不同数据类型操作 能够使用Java API操作Redis 能够理解Redis的两种持久化方式 能够理解Redis的主从复制架构 能够理解Redis的Sentinel架构 能够理解Redis集群架构

8. Redis的主从复制架构


8.1 简介

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。


25.png

默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。


8.1.1 一主一从

如下图所示左边是Master节点,右边是slave节点,即主节点和从节点。从节点也是可以对外提供服务的,主节点是有数据的,从节点可以通过复制操作将主节点的数据同步过来,并且随着主节点数据不断写入,从节点数据也会做同步的更新。

26.png

从节点起到的就是数据备份的效果。


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 读写分离


27.png

通过主从复制可以实现读写分离,以提高服务器的负载能力

在常见的场景中(例如:电商网站),读的频率大于写

当单机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

例如:

30.png

在Server1 掉线后:

31.png

升级Server2 为新的主服务器:


32.png

9.2 配置哨兵

33.png


9.2.1 三台机器修改哨兵配置文件

三台机器执行以下命令修改redis的哨兵配置文件

vim sentinel.conf

配置监听的主服务器

  1. 修改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>
  1. 分发到bigdata-pro-m08和bigdata-pro-m09
scp sentinel.conf bigdata-pro-m08:$PWD
scp sentinel.conf bigdata-pro-m09:$PWD
  1. 分别修改配置中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节点无法满足要求,按照分区规则把数据分到若干个子集当中。

40.png



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会判断这个值应该在哪个槽中

一致性哈希分区图解:

41.png

虚拟槽分区图解:


42.png

10.2 Redis Cluster 设计

Redis Cluster是分布式架构,有多个节点,每个节点都负责进行数据读写操作,每个节点之间会进行通信。Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

43.png


结构特点:


所有的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放到哪个桶中;

44.png


Redis 集群的优势:


缓存永不宕机:启动集群,永远让集群的一部分起作用。主节点失效了子节点能迅速改变角色成为主节点,整个集群的部分节点失败或者不可达的情况下能够继续处理命令;

迅速恢复数据:持久化数据,能在宕机后迅速解决数据丢失的问题;

Redis可以使用所有机器的内存,变相扩展性能;

使Redis的计算能力通过简单地增加服务器得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长;

Redis集群没有中心节点,不会因为某个节点成为整个集群的性能瓶颈;

异步处理数据,实现快速读写;

Redis 3.0以后,节点之间通过去中心化的方式提供了完整的sharding(数据分片)、replication(复制机制、Cluster具备感知准备的能力)、failover解决方案。


45.png


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


46.png

基于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,如下图所示:

50.png

在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"






相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
缓存 NoSQL 应用服务中间件
|
6月前
|
NoSQL 关系型数据库 MySQL
redis 入门01
redis 入门01
37 0
|
缓存 NoSQL 关系型数据库
redis系列1-入门
redis系列1-入门
41 0
|
存储 监控 负载均衡
Redis 从入门到弃坑
Redis 从入门到弃坑
118 0
|
存储 缓存 NoSQL
(三)、Redis入门
(三)、Redis入门
|
消息中间件 SQL NoSQL
Redis初入门(一)
本文站在入门者的角度简单介绍了一下Redis,并列举了部分常用操作
|
消息中间件 存储 缓存
Redis入门(一)
Redis入门
246 1
|
消息中间件 存储 缓存
redis 入门-redis 简介| 学习笔记
快速学习 redis 入门-redis 简介
|
存储 SQL 缓存
Redis超全精讲!(一)
课程目标 能够掌握Redis不同数据类型操作 能够使用Java API操作Redis 能够理解Redis的两种持久化方式 能够理解Redis的主从复制架构 能够理解Redis的Sentinel架构 能够理解Redis集群架构
Redis超全精讲!(一)
下一篇
无影云桌面