Redis【Redis集群(哨兵监控环境搭建、哨兵工作原理详解、故障转移、Cluster模式概述、Cluster模式搭建、Cluster模式原理分析)】(六)-全面详解(学习总结---从入门到深化)

 

 Redis集群_哨兵监控环境搭建

 新建sentinel-26379.conf文件

 新建sentinel-26380.conf文件

新建sentinel-26381.conf文件

哨兵节点的启动两种方式

查看哨兵节点状态

Redis集群_哨兵工作原理详解

 监控阶段

 通知阶段

故障转移阶段

 投票方式

 Redis集群_故障转移

 概述

演示故障转移

使用kill命令杀掉主节点

查看哨兵节点信息

 重启6379节点

配置文件都会被改写

 Redis集群_Cluster模式概述

 Redis有三种集群模式

 哨兵模式的缺点

 Cluster模式概述

 Redis集群的优点

Redis集群_Cluster模式搭建 

 环境准备

 创建文件夹

拷贝配置文件

验证集群 

查看集群的信息 

 Redis集群_Cluster模式原理分析

 命令执行

故障恢复 

查看节点

 杀死Master节点

观察节点信息

 Redis集群_Java操作Redis集群

 Jedis整合Redis

引入jedis的maven坐标

Java编写的代码

SpringBoot 整合 Redis

引入maven坐标

配置文件

java代码


 Redis集群_哨兵监控环境搭建

 新建sentinel-26379.conf文件

#端口
port 26379
#守护进程运行
daemonize yes
#日志文件
logfile "26379.log"
sentinel monitor mymaster 192.168.92.128 6379 2

 新建sentinel-26380.conf文件

#端口
port 26380
#守护进程运行
daemonize yes
#日志文件
logfile "26380.log"
sentinel monitor mymaster 192.168.66.100 6379 2

新建sentinel-26381.conf文件

#端口
port 26381
#守护进程运行
daemonize yes
#日志文件
logfile "26381.log"
sentinel monitor mymaster 192.168.66.100 6379 2

哨兵节点的启动两种方式

redis-sentinel sentinel-26379.conf

查看哨兵节点状态

[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379>
127.0.0.1:26379>
127.0.0.1:26379> info sentinel
# 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=192.168.66.100:6379,slaves=2,sentinels=3

Redis集群_哨兵工作原理详解

 监控阶段

 

 通知阶段

sentinel不断的向master和slave发起通知,收集信息。

故障转移阶段

通知阶段sentinel发送的通知没得到master的回应,就会把master标记为SRI_S_DOWN,并且把master 的状态发给各个sentinel,其他sentinel听到master挂了,说我不信,我也去看看,并把结果共享给各 个sentinel,当有一半的sentinel都认为master挂了的时候,就会把master标记为SRI_0_DOWN。

 

 

 投票方式

 方式: 自己最先接到哪个sentinel的竞选通知就会把票投给它。

剔除一些情况:

1. 不在线的

2. 响应慢的

3. 与原来master断开时间久的

4. 优先级原则

 

 1.Redis哨兵模式是Redis的___架构的一种方式。高可用

 Redis集群_故障转移

 概述

演示当主节点发生故障时,哨兵的监控和自动故障转移功能。

演示故障转移

使用kill命令杀掉主节点

ps aux |grep redis
kill -9 pid

查看哨兵节点信息

如果此时立即在哨兵节点中使用info Sentinel命令查看。

[root@localhost src]# ./redis-cli -p 26379
127.0.0.1:26379> info sentinel
# 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=127.0.0.1:6381,slaves=5,sentinels=3

注意: 会发现主节点还没有切换过来,因为哨兵发现主节点故障并转移,需要一段时间。

 重启6379节点

[root@localhost src]# ./redis-cli info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6381
master_link_status:down

配置文件都会被改写

故障转移阶段,哨兵和主从节点的配置文件都会被改写

include /usr/local/redis/redis.conf
pidfile "/var/run/redis_6379.pid"
port 6379
dbfilename "dump6379.rdb"
# Generated by CONFIG REWRITE
daemonize yes
protected-mode no
appendonly yes
slowlog-max-len 1200
slowlog-log-slower-than 1000
save 5 1
user default on nopass ~* &* +@all
dir "/usr/local/redis"
replicaof 127.0.0.1 6381

 Redis集群_Cluster模式概述

 Redis有三种集群模式

 哨兵模式的缺点

 

 Cluster模式概述

 Redis集群是一个由多个主从节点群组成的分布式服务集群,它具有复制、高可用和分片特性。

 Redis集群的优点

 1.Redis集群是一个由__节点群组成的分布式服务集群。多个主从

 2.Redis哨兵模式的缺点是____。哨兵选举期间,不能对外提供服务

Redis集群_Cluster模式搭建 

 Redis的集群搭建最少需要3个master节点,我们这里搭建3个master,每个下面挂一个slave节点,总 共6个Redis节点;

 环境准备

第1台机器: 192.168.66.101 8001端口 8002端口

第2台机器: 192.168.66.102 8001端口 8002端口

第3台机器: 192.168.66.103 8001端口 8002端口

 创建文件夹

mkdir -p /usr/local/redis/redis-cluster/8001 /usr/local/redis/redis-cluster/8002

拷贝配置文件

将redis安装目录下的 redis.conf 文件分别拷贝到8001目录下

cp /usr/local/redis/redis.conf /usr/local/redis/redis-cluster/8001

 修改redis.conf文件以下内容

port 8001
daemonize yes
pidfile "/var/run/redis_8001.pid"
#指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据
dir /usr/local/redis/redis-cluster/8001/
#启动集群模式
cluster-enabled yes
#集群节点信息文件,这里800x最好和port对应上
cluster-config-file nodes-8001.conf
# 节点离线的超时时间
cluster-node-timeout 5000
#去掉bind绑定访问ip信息
#bind 127.0.0.1
#关闭保护模式
protected-mode no
#启动AOF文件
appendonly yes
#如果要设置密码需要增加如下配置:
#设置redis访问密码
#requirepass xiaoton
#设置集群节点间访问密码,跟上面一致
#masterauth xiaoton

文件拷贝到8002文件夹

#将8001修改为8002:
cp /usr/local/redis/redis-cluster/8001/redis.conf /usr/local/redis/rediscluster/8002
# 批量修改字符串
:%s/8001/8002/g

将本机机器上的文件拷贝到另外两台机器上

# 第二台机器
scp /usr1/redis/redis-cluster/8001/redis.conf
[email protected]:/usr1/redis/redis-cluster/8001/
scp /usr1/redis/redis-cluster/8002/redis.conf
[email protected]:/usr1/redis/redis-cluster/8002/
# 第三台机器
scp /usr1/redis/redis-cluster/8001/redis.conf
[email protected]:/usr1/redis/redis-cluster/8001/
scp /usr1/redis/redis-cluster/8002/redis.conf
[email protected]:/usr1/redis/redis-cluster/8002/

分别启动这6个redis实例

/usr/local/redis/src/redis-server /usr/local/redis/redis-cluster/8001/redis.conf
/usr/local/redis/src/redis-server /usr/local/redis/redis-cluster/8002/redis.conf

检查是否启动成功

ps -ef |grep redis

 使用redis-cli创建整个redis集群

/usr/local/redis/src/redis-cli -a redis-pw --cluster create --cluster-replicas 1
192.168.66.101:8001 192.168.66.101:8002 192.168.66.102:8001 192.168.66.102:8002
192.168.66.103:8001 192.168.66.103:8002

查看帮助命令 

src/redis‐cli --cluster help

验证集群 

连接任意一个客户端

/usr/local/redisd/src/redis-cli -a redis-pw -c -h 192.168.66.101 -p 8001

查看集群的信息 

cluster info

 Redis集群_Cluster模式原理分析

 Redis Cluster将所有数据划分为16384个slots(槽位),每个节点负责其中一部分槽位。槽位的信息存储 于每个节点中。只有master节点会被分配槽位,slave节点不会分配槽位。

HASH_SLOT = CRC16(key) % 16384

 命令执行

set k1 v1

 

 可以通过{}来定义组的概念,从而是key中{}内相同内容的键值对放到同一个slot中。

mset k1{test} v1 k2{test} v2 k3{test} v3

故障恢复 

查看节点

192.168.66.103:8001> cluster nodes

 杀死Master节点

lsof -i:8001
kill -9 pid

观察节点信息

 1. Redis Cluster模式默认会对key值使用__算法进行hash得到一个整数值,然后用这个整数值对16384 进行取模来得到具体槽位。crc-16

 Redis集群_Java操作Redis集群

 Jedis整合Redis

引入jedis的maven坐标

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

Java编写的代码

public class JedisClusterTest {
    public static void main(String[] args) throws IOException {
         JedisPoolConfig config = new JedisPoolConfig();
         config.setMaxTotal(20);
         config.setMaxIdle(10);
         config.setMinIdle(5);
         Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
         jedisClusterNode.add(new HostAndPort("192.168.66.101", 8001));
         jedisClusterNode.add(new HostAndPort("192.168.66.102", 8002));
         jedisClusterNode.add(new HostAndPort("192.168.66.103", 8001));
         JedisCluster jedisCluster = null;
         try {
               //connectionTimeout:指的是连接一个url的连接等待时间
               //soTimeout:指的是连接上一个url,获取response的返回等待时间
               jedisCluster = new JedisCluster(jedisClusterNode, 6000, 5000, 10, "redis-pw", config);
               System.out.println(jedisCluster.set("name", "zhangsan"));
               System.out.println(jedisCluster.get("name"));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (jedisCluster != null) {
                        jedisCluster.close();
            }
        }
    }
}

SpringBoot 整合 Redis

引入maven坐标

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring‐boot‐starter‐data‐redis</artifactId>
</dependency>

配置文件

##单服务器
spring.redis.cluster.nodes=192.168.159.129:7001,192.168.159.129:7002,192.168.159
.129:7003,192.168.159.129:7004,192.168.159.129:7005,192.168.159.129:7006
## 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=300
## Redis数据库索引(默认为0)
spring.redis.database=0
## 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
## 连接池中的最大空闲连接
spring.redis.pool.max-idle=100
## 连接池中的最小空闲连接
spring.redis.pool.min-idle=20
## 连接超时时间(毫秒)
spring.redis.timeout=60000

java代码

@RestController
public class TestController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @RequestMapping("/test_cluster")
    public void testCluster() throws InterruptedException {
        stringRedisTemplate.opsForValue().set("user:name", "xiaoton");
        System.out.println(stringRedisTemplate.opsForValue().get("user:name"));
    }
}

猜你喜欢

转载自blog.csdn.net/m0_58719994/article/details/131361084