Redis概述

在传统的软件项目中,使用数据库进行数据存储,但是有一些致命的缺陷,这些缺陷反映在性能方面。由于数据库存储数据的介质是磁盘,而磁盘读写的速度比较慢。在不存在大量高并发的应用场景中,这个缺陷显得并不那么重要,甚至可以忽略。但是在某些互联网项目中,高并发业务比比皆是,例如:双十一的大促,热销商品的抢购等等。在这类场景之下系统需要在极短的时间内完成成千上万次读写操作,传统的关系型数据库在处理这类业务场景显得有点力不从心,往往很容易造成数据库崩溃,严重影响业务。

为了克服这些问题,人们为此引入了NOSQL数据库,Redis是当下主流的nosql数据之一。它是一种基于内存的nosql数据库,读写性能远远优于传统的关系型数据库,并且支持集群,分布式,主从同步。这篇文章主要讨论redis的主从同步。

什么是主从同步

和我们常说的一句话“人不能吊死在一棵树上”,道理一样。要保证系统的高可用性,我们不能把希望完全寄托在一个数据库节点上,所以我们需要多个数据库备份来保证我们系统的高可用性。一般的做法就是一主多从,一个主库,多个从库。

主库负责写操作,从库负责读操作,也就是常说的读写分离,主库和从库之间通过数据同步来保证主从库的数据是一致的。这样在其中一台或者多台数据库挂掉之后我们还可以切换到其他数据库来保证系统的正常运行。

什么是哨兵模式

在一主多从的数据库架构中我们说过当其中一个或多个数据库挂掉之后我们可以通过切换到其他还在正常运转的数据库来保证系统的运行。哨兵模式通过监控每个数据库节点,当主库发生故障的时候哨兵会从其他从库中选取一个作为主库。

哨兵是一个独立的进程,独立于redis单独运行。哨兵运行架构如下图:

值得注意的是,哨兵也不是永远都处于可用状态,它也有发生故障的时候。所以一般我们会设置多个哨兵,哨兵不光监控redis服务器,哨兵与哨兵之间也会互相监控。

接下来用java+docker+linux+redis的环境实操一下哨兵模式,机器的分配如下表所示:

服务器

IP地址

端口

主redis

192.168.61.136

6379

从redis1

192.168.61.134

6379

从redis2

192.168.61.134

6370

哨兵1

192.168.61.137

26370

一、配置redis主从

用docker运行三个redis容器,docker安装redis的步骤这里不再阐述。直接讲一下redis主从怎么配置。

先查看一下主redis的信息:

从上面的图中可以看到当前redis的role是master,也就是主库,它有两个从库:slave0,slave1。那这两个从库是怎么来呢,可以用以下步骤来配置。

在134这台机器的两个redis里面分别执行上图中的slaveof命令就可以完成主从配置了。

二、配置哨兵

在这个案例中我只配置一个哨兵,哨兵可以在主从redis容器里面进行配置,但不建议那样做。因为如果redis容器挂掉了哨兵也就会跟着挂掉,所以建议哨兵另起一个容器运行。哨兵容器也是用redis镜像跑起来,只不过需要多进行一些配置。在137这台机器上另起一个哨兵容器redissentinel,如下图:

安装好vim命令后,编辑sentinel.conf,添加:sentinel monitor 【主服务器名称】【IP地址】【端口】【多个哨兵认为主服务器不可用的时候才进行切换】

编辑完sentinel.conf执行一下命令:redis-sentinel /sentinel.conf,哨兵就启动了。

三、在Spring中使用哨兵模式

在本案例中我使用的是xml配置的方式使用redis。配置如下所示:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

java测试代码:

public static void main(String[] args) {

Logger logger =Logger.getLogger(RedisService.class.getName());

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-cfg.xml");

RedisTemplate redisTemplate = applicationContext.getBean(RedisTemplate.class);

redisTemplate.opsForValue().set("key1", "value1");

String value = (String) redisTemplate.opsForValue().get("key1");

}

运行上面的代码可以得到下面的日志信息:

可以看到是先连接到哨兵,然后找到了master。现在可以测试一下主从切换,我们关掉136这台机器上的redis容器看看日志会打印出什么。

报错了,因为哨兵不是马上能检测到主服务器挂掉的,检测到之后哨兵之间还会发起一轮投票决定是否进行故障切换(多哨兵的情况),所以中间会有几分钟是不可用的状态,redis哨兵默认3分钟后进行主机切换。3分钟后重新运行得到下面的日志:

master已经切换到134,端口6379的从节点上。

至此,就完成了一次简单的哨兵模式在redis主从配置中应用的案例。纯属个人笔记,如有遗漏和错误欢迎指正。

标签:主库,Java,数据库,redis,哨兵,从库,主从

来源: https://www.cnblogs.com/whiteteeth/p/10945395.html

java 什么是哨兵_Java中使用redis哨兵模式相关推荐

  1. java 什么是哨兵_Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  2. java redis sentinel_Java中的Redis 哨兵高可用性

    让我们探索Redis Sentinel,看看如何在Java上运行它,一起来看看,最近get了很多新知识,分享给大家参考学习.需要详细的java架构思维导图路线也可以评论获取! 什么是Redis哨兵? ...

  3. java可以多重继承吗_Java中的多重继承与组合vs继承

    java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章. 在这篇文章中,我们将研究多重继承,然后了解组成优于继承的好处. Java中的多重继承 多重继承是创建具有多个超类的单个类的能 ...

  4. java中有没有栈_Java中堆和栈有什么区别

    stack 和 heep 都是内存的一部分stack 空间小,速度比较快, 用来放对象的引用heep 大,一般所有创建的对象都放在这里.栈(stack):是一个先进后出的数据结构,通常用于保存方法(函 ...

  5. java 基本类型 引用_java中 引用类型 和 基本类型 有何区别?

    栈与堆都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运行时数据区,类的(对象从中分配空间.这些对象通过new.newa ...

  6. java责任链设计模式_Java中的责任链设计模式

    java责任链设计模式 在本教程中,我们将学习如何在Java中实现责任链模式. 责任链设计模式涉及到拥有一系列负责处理请求的对象链. 当客户端发送请求时,第一个处理程序将尝试处理该请求. 如果可以处理 ...

  7. java 工厂方法模式_Java中的工厂方法模式

    java 工厂方法模式 在上一篇有关模板方法模式的文章中 ,我展示了如何利用lambda表达式和默认方法 . 在本文中,我将探讨工厂方法模式,并了解如何利用方法引用,这是Java 8中与lambda表 ...

  8. java构造器详解_Java中关于构造器的使用详解

    这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方,需要的朋友可以参考下 Java构造器使用方法及注意事项 超类的构造器在子类的构造器运行之前运行 ...

  9. java构建xml参数_Java中使用XML创建EMAIL模板

    邮件模板 让我们来看看邮件模板的格式.模板是XML文件,它包含一个根元素和一系列根的子元素.根元素是.必要的子元素是, , 和 .可选的子元素是 , , 和 .如果你使用过邮件系统,那么你可以推导出这 ...

最新文章

  1. Java并发:分布式应用限流 Redis + Lua 实践
  2. 2010版CCNP教材一览【图文】
  3. python 的 str bytes 区别
  4. SpringBoot中英文切换/国际化——java后端怎么用预置文本的内容替换web网页内容(Resource Bundle)
  5. 【C++深度剖析教程1】C++中的经典问题解析-c++中的对象的构造顺序与析构顺序
  6. java.util.concurrent.RejectedExecutionException
  7. 专题_期权交易必备知识
  8. “技术驱动创新”正成为企业发展新方向,开发者该如何修炼自己?
  9. 关系查询处理 查询优化 论文_叮!你有一份留学论文攻略,请查收~
  10. 信息组织 | 数字图书馆信息组织
  11. 服务器运行cad慢,cad从服务器上打开很慢,在本地打开很快
  12. OpenStack Cinder特性之Volume-backed image介绍与验证
  13. 继续谈下脑残的NODE_MODULE_VERSION,全世界冷眼看着electron
  14. DXP的使用及绘制PCB
  15. 关于何如在英伟达官网上下载历史驱动的方法
  16. java实现word导出(带图片)
  17. aoa计算机有效期,计算机AOA例题
  18. 程序员的五个开发神器助你更好的开发!
  19. 基于FPGA的边沿检测
  20. Python 3.8+numpy查找矩阵中所有鞍点

热门文章

  1. 打造Android的中文Siri语音助手(二)——添加虫洞的开放API
  2. vue日期倒计时插件
  3. 织梦dedecms广告管理增加广告图片上传功能
  4. 百度云BBC SSH连接
  5. linux脚本打不开文件夹,为什么这个程序向文件地址和内存地址不一样的文件加入shellcode会导致文件打不开...
  6. ViewSwitcher如何实现一次显示多个View
  7. 第十章 实验二 统计英文单词
  8. Swagger导出word和excel文档
  9. 山东标梵来探究APP开发盈利的难点在哪?
  10. 打开商场元宇宙新玩法:AR导航+AR互动营销