个人博客网:https://wushaopei.github.io/    (你想要这里多有)

sentinel-目录

        主从复制高可用
安装配置
实现原理
架构说明
客户端连接
常见开发运维问题

一、主从复制高可用

1、主从复制的作用?

为主提供一个备份,当主服务器挂掉后,可以为客户端提供主服务器中完整的数据;

为主服务器进行分流,将读操作放到从节点上。

2、主从复制高可用存在的问题?

手动故障转移

写能力和存储能力受限

3、手动故障转移:

如图,假如这时候master挂掉了, master向slave的复制也被断掉了,这对于我们连接master的客户端肯定会连接或者读写失败的。这对于连接或读写分离的策略,这里的读是正常的,但是数据的更新却是无法保证的。

解决方案:

发生以上问题后,要进行故障转移。首先,要选中一个客户端slave,让它执行slaveof no one,让它成为master;然后对于其余的slave让它们执行slaveof new master 从而向新的master进行数据同步,这样就完成了生成一个新的master和向它复制的过程。

同时,我们的客户端slave也会去读取新的master。

二、 redis sentinel

1、  Redis Sentinel架构:

首先,Redis Sentinel包含多个redis节点,其中包括一主一从或者一主多从等多个节点;同样包含有多个sentinel节点。

sentinel节点主要用于对redis节点的状态进行故障判断,对redis进行故障转移的处理以及对客户端进行通知的处理。

对于一个节点的失败是可以达到公平性,还可以保证高可用,因为当前某个sentinel节点挂了,还可以保证整个Senetinel结构是完美的。

2、Redis Sentinel故障转移:

  1. 多个Sentinel发现并确认master有问题
  2. 选举出一个sentinel作为领导
  3. 选出一个slave作为master
  4. 通知其余slave成为新的master的slave
  5. 通知客户端主从变化
  6. 等待老的master复活成为新master的slave

整个过程其实就是从手动故障配置转移改成由sentinel进行故障发现、故障处理转移、故障通知的机制。

Redis Sentinel可以进行多套master~slave的机制的监控;每套master~slave会使用一个master-name进行标识。

三、redis sentinel 安装

1、安装与配置

1)配置开启主从节点

2) 配置开启sentinel监控主节点。(sentinel是特殊的redis)

3)实际应该多机器

4)详细配置节点

2、案例:

有个master:master-7000,两个slave: slave-7001,slave-7002:

1)Redis主节点:

启动:

redis-server redis-7000.conf

配置:

port 7000

daemonnize yes

pidfile /var/run/redis-7000.pid

logfile "7000.log"

2) Redis从节点

启动 :

redis-server redis-7001.conf

redis-server redis-7002.conf

配置:

slave-1:

port 7001

daemonnize yes

pidfile /var/run/redis-7001.pid

logfile "7001.log"

dir "/opt/soft/redis/data/"

slaveof 127.0.0.1 7000

slave-2:

port 7002

daemonnize yes

pidfile /var/run/redis-7002.pid

logfile "7002.log"

dir "/opt/soft/redis/data/"

slaveof 127.0.0.1 7000

3、sentinel主要配置

port ${port}

dir "/opt/soft/redis/data/"

logfile "${port}.log"

sentinel monitor mymaster 127.0.0.1 7000 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

四、redis sentine安装演示1

1、配置主节点配置文件: redis-7000.conf

[root@VM_0_14_centos conf]# ll

total 0

[root@VM_0_14_centos conf]# vim redis-7000.conf

1)配置参数:

port 7000

daemonize yes

pidfile /var/run/redis-7000.pid

logfile "7000.log"

dir "/usr/local/redis/data/"

2)将redis-7000复制为从节点rediss-7001、redis-7002

[root@VM_0_14_centos conf]# sed "s/7000/7001/g" redis-7000.conf > redis-7001.conf

[root@VM_0_14_centos conf]# sed "s/7000/7002/g" redis-7000.conf > redis-7002.conf

[root@VM_0_14_centos conf]# ll

total 12

-rw-r--r-- 1 root root 106 Nov 11 14:53 redis-7000.conf

-rw-r--r-- 1 root root 106 Nov 11 14:54 redis-7001.conf

-rw-r--r-- 1 root root 106 Nov 11 14:54 redis-7002.conf

3)让redis-7001、redis-7002指向redis-7000主节点:

[root@VM_0_14_centos conf]# echo "slaveof 127.0.0.1 7000" >> redis-7001.conf

[root@VM_0_14_centos conf]#

[root@VM_0_14_centos conf]# echo "slaveof 127.0.0.1 7000" >> redis-7002.conf

[root@VM_0_14_centos conf]# ll

total 12

-rw-r--r-- 1 root root 106 Nov 11 14:53 redis-7000.conf

-rw-r--r-- 1 root root 129 Nov 11 14:55 redis-7001.conf

-rw-r--r-- 1 root root 129 Nov 11 14:55 redis-7002.conf

[root@VM_0_14_centos conf]# cat redis-7000.conf

port 7000

daemonize yes

pidfile /var/run/redis-7000.pid

logfile "7000.log"

dir "/usr/local/redis/data/"

[root@VM_0_14_centos conf]# cat redis-7001.conf

port 7001

daemonize yes

pidfile /var/run/redis-7001.pid

logfile "7001.log"

dir "/usr/local/redis/data/"

slaveof 127.0.0.1 7000

[root@VM_0_14_centos conf]# cat redis-7002.conf

port 7002

daemonize yes

pidfile /var/run/redis-7002.pid

logfile "7002.log"

dir "/usr/local/redis/data/"

slaveof 127.0.0.1 7000

2、启动主、从节点:

[root@VM_0_14_centos conf]# redis-server redis-7000.conf

[root@VM_0_14_centos conf]# redis-cli -p 7000 ping

PONG

[root@VM_0_14_centos conf]# redis-server redis-7001.conf

[root@VM_0_14_centos conf]# redis-cli -p 7001 ping

PONG

[root@VM_0_14_centos conf]# redis-server redis-7002.conf

[root@VM_0_14_centos conf]# redis-cli -p 7002 ping

PONG

3、查看主从节点端口及相关配置信息:

五、 redis sentinel 安装2

安装配置redis-sentinel:

1、创建sentinel.conf文件:

port 26379

dir /tmp

sentinel monitor mymaster 192.168.1.108 6379 2

sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

2、复制创建 redis-sentinel-26379.conf文件:

cat sentinel.conf | grep -v "#" | grep -v "^$" > redis-sentinel-26379.conf

3、主节点参数配置:

port 26379

daemonize yes

dir /usr/local/redis/data/

logfile "26379.log"

sentinel monitor mymaster 127.0.0.1 7000 2

sentinel down-after-milliseconds mymaster 30000

sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000

4、启动redis-sentinel-26379主节点:

[root@VM_0_14_centos conf]# /usr/bin/redis-sentinel redis-sentinel-26379.conf

5、查看主节点状态:

[root@VM_0_14_centos conf]# ps -ef | grep redis-sentinel

root     31610     1  0 15:31 ?        00:00:00 /usr/bin/redis-sentinel *:26379 [sentinel]

root     31699 25301  0 15:32 pts/0    00:00:00 grep --color=auto redis-sentinel

6、从sentinel端口26379启动:

[root@VM_0_14_centos conf]# redis-cli -p 26379

127.0.0.1:26379>

7、为两个从节点配置sentinel:

[root@VM_0_14_centos conf]# sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf

[root@VM_0_14_centos conf]# sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf

8、启动从节点的sentinel:

[root@VM_0_14_centos conf]# /usr/bin/redis-sentinel redis-sentinel-26380.conf

[root@VM_0_14_centos conf]# /usr/bin/redis-sentinel redis-sentinel-26381.conf

9、状态查看;

[root@VM_0_14_centos conf]# ps -ef | grep redis-sentinel

root     31610     1  0 15:31 ?        00:00:00 /usr/bin/redis-sentinel *:26379 [sentinel]

root     32545     1  0 15:38 ?        00:00:00 /usr/bin/redis-sentinel *:26380 [sentinel]

root     32556     1  0 15:38 ?        00:00:00 /usr/bin/redis-sentinel *:26381 [sentinel]

root     32582 25301  0 15:38 pts/0    00:00:00 grep --color=auto redis-sentinel

[root@VM_0_14_centos conf]# redis-cli -p 26381127.0.0.1:26381> info# Server

redis_version:3.0.7

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:d709ac81eddea5b3

redis_mode:sentinel

os:Linux 4.9.87-linuxkit-aufs x86_64

arch_bits:64

multiplexing_api:epoll

gcc_version:4.8.5

process_id:202

run_id:0120cece7bbd3c8c6ae3f7c8530e7608efda863e

tcp_port:26381

uptime_in_seconds:62

uptime_in_days:0

hz:16

lru_clock:14510388

config_file:/opt/soft/redis-3.0.7/config/redis-sentinel-26381.conf

# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

master0:name=mymaster,status=ok,address=127.0.0.1:7000,slaves=2,sentinels=3

[root@VM_0_14_centos conf]# redis-cli -p 26380 info sentinel# Sentinel

sentinel_masters:1

sentinel_tilt:0

sentinel_running_scripts:0

sentinel_scripts_queue_length:0

master0:name=mymaster,status=ok,address=127.0.0.1:7000,slaves=2,sentinels=3

六、 java 客服端

  • 请求响应流程
  • Jedis
  • Redis-py
  • 直连?

1.服务高可用?

2.客户端高可用?

1、客户端实现基本原理-step1

首先,我们要获取所有的sentinel节点,因为我们不知道哪个sentinel节点是活的,哪个sentnel节点已经宕机,所以我们要获取所有的sentinel节点的集合。同时,我要获取所以的master,就需要获取所有的master-name。

然后去遍历sentinel集合,找到可用的sentinel节点,也就是可以被ping通的节点。

2、客户端实现基本原理-step2

通过sentinel节点的集合和masterName去sentine-k中去查询并返回可用master节点的真正可用信息。

3、客户端实现基本原理-step3

当我们的客户端获取到master节点的时候,它会执行一次role或rol replication进行一次验证,从而验证该节点是否是真的master节点

如果master节点发生了变化,那么,sentinel是感知的。因为谁是真正的master,是由他来决定的。

Sentinel和客户端进行通知的机制:它们内部采用的是发布订阅的方式实现的。

4、客户端接入流程:

1) Sentinel 地址集合

2)masterName

3)不是代理模式

5、Jedis的使用:

JedisSentinelPool senntinelPool = new JedisSentinelPool(masterName,sentinelSet,poolConfig,timeout);
Jedis jedis = null;
try {
jedis = redisSentinelPool.getResource();
//jedis command
}catch(Exception e){
logger.error(e.getMessage(),e);
}finally(
if(jedis != null)
jedis.close():
}

Redis 入门到分布式 (八)Redis Sentinel的更多相关文章

  1. redis入门(15)redis的数据备份和恢复

    redis入门(15)redis的数据备份和恢复

  2. redis入门(14)redis集群下的数据分区存储

    redis入门(10)redis集群下的数据分区存储

  3. Redis 入门到分布式 (二)API的理解和使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 内容: 通用命令 单线程架构 数据结构和内部编码 一.常用的通用命令: keys       计算所有的 ...

  4. <Redis> 入门X 分布式锁

    分布式其实就是多进程的程序,当多个进程访问一个资源,会造成问题: 1.资源共享的竞争问题 2.数据的安全性 分布式锁的解决方案: 1.怎么去获取锁 数据库 zookeeper redis 2.怎么释放 ...

  5. Redis 入门到分布式 (一)Redis初识

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Redis特性目录 Redis的特性: 速度快 持久化 多种数据结构 支持多种编辑语言 功能丰富 简 ...

  6. Redis 入门到分布式 (五) Redis持久化的取舍和选择

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) Redis持久化的取舍和选择 持久化的作用 RDB AOF RDB和AOF的选择 一.持久化的作用   ...

  7. Redis 入门到分布式 (三) Redis客户端的使用

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.Java客服端:jedis 获取Jedis Jedis基本使用 Jedis连接池使用 1.Jedis ...

  8. SpringBoot开发二十-Redis入门以及Spring整合Redis

    安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis 的常用命 ...

  9. Redis入门到放弃系列-redis安装

    Redis是什么? Redis is an open source (BSD licensed), in-memory data structure store, used as a database ...

  10. SpringBoot开发二十四-Redis入门以及Spring整合Redis

    需求介绍 安装 Redis,熟悉 Redis 的命令以及整合Redis,在Spring 中使用Redis. 代码实现 Redis 内置了 16 个库,索引是 0-15 ,默认选择第 0 个 Redis ...

随机推荐

  1. JAVA实现拼手气红包算法

    实现拼手气红包算法,有以下几个需要注意的地方: 抢红包的期望收益应与先后顺序无关 保证每个用户至少能抢到一个预设的最小金额,人民币红包设置的最小金额一般是0.01元,如果需要发其他货币类型的红包,比如 ...

  2. Zookeeper入门一篇就够了

    谈点分布式 什么是分布式呢? 起初,我们的应用流量比较小,所有东西全部部署在一个服务器,比如全部丢给一个tomcat来处理,顶多做一个tomcat的多节点部署多分,再挂一台Nginx做一下负载均衡就O ...

  3. Mybatis极速入门

    搭建mybatis的环境 导入相关jar包 mybatis-3.5.3.jar commons-logging-1.1.1.jar log4j-1.2.16.jar cglib-2.2.2.jar a ...

  4. 2018-06-18 Javascript 基础1

    js是一门基于对象的若类型语言,他和JAVA没有关系: js标签放置位置:1.内联 2.外部 3.内部: js代码是有执行顺序的,这点和css代码有所区别:当对象没有加载完或者还没加载的情况下js代码 ...

  5. ssh别名登录,非常适合从跳板机登录其他主机

    一般连主机会是这样的: ssh admin@IP 端口变了的话还要加上端口号 ssh admin@IP -p 10022 可以用ssh别名简化这个操作: vim .ssh/config 想要全局生效的 ...

  6. python中copy与deepcopy的区别

    目录 区别 python代码举例 区别 高级语言中变量是对内存及其地址的抽象 copy.copy(object), 拷贝的是内嵌套结构的地址引用,当前到结构发生变化的时候,浅拷贝也相应的改变. cop ...

  7. Spring 注入内部 Beans

    注入内部 Beans inner beans 是在其他 bean 的范围内定义的 bean. 下面是一个基于setter注入的内部 bean 进行配置的配置文件 Beans.xml 文件: <? ...

  8. python基本数据类型;字符串及其方法三:

    ###################判断类型################### ######################################################### ...

  9. 树形DP 2415HDU

    Bribing FIPA Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  10. HDU1588

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1588 题目大意:g(i)= k * i + b. 给定 k 和 b,求0 <= i < n ...