Redis基础、环境搭建、主从切换

  • 一、Redis简介
    • 1.引入NoSQL的背景
    • 2.Redis简介
    • 二、环境部署
    • 1.server1源码安装redis,并创建redis实例
    • 2.server2主机,创建redis的slave实例
    • 3.Redis主从复制原理
  • 三、Redis主从切换(高可用,sentinel哨兵模式)
    • 1. Sentinel简介
    • 2.sentinel部署

一、Redis简介

1.引入NoSQL的背景

   在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。所以在当今云计算、大数据盛行的时代,对性能有了更多的需求,主要体现在以下四个方面:

   1. 低延迟的读写速度:应用快速地反应能极大地提升用户的满意度
   2. 支撑海量的数据和流量:对于搜索这样大型应用而言,需要利用PB级别的数据和能应对百万级的流量
   3. 大规模集群的管理:系统管理员希望分布式应用能更简单的部署和管理
   4. 庞大运营成本的考量:IT部门希望在硬件成本、软件成本和人力成本能够有大幅度地降低

为了克服上述的问题,Java Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。

Nosql数据库介绍
NoSQL 简介
NoSQL最常见的解释是“non-relational”, “Not Only SQL”也被很多人接受。NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证关系数据的ACID特性。NoSQL是一项全新的数据库革命性运动,其拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。

2.Redis简介

Redis是现在最受欢迎的NoSQL数据库之一,Redis是一个使用ANSI C编写的开源、包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库,其具备如下特性:

  • 基于内存运行,性能高效
  • 支持分布式,理论上可以无限扩展
  • key-value存储系统
  • 开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

Redis 在 Java Web 主要有两个应用场景:

存储 缓存 用的数据;
需要高速读/写的场合使用它快速读/写;

Redis简介:https://www.cnblogs.com/qqflying/p/9192331.html
Redis使用教程:https://www.cnblogs.com/qqflying/p/9192331.html
Redis官网:https://redis.io/

缓存

  • 在日常对数据库的访问中,读操作的次数远超写操作,比例大概在 1:9 到 3:7,所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读写操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。
  • 如果我们把数据放在 Redis 中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,那么这样速度明显就会快上不少,并且会极大减小数据库的压力,但是使用内存进行数据存储开销也是比较大的,限于成本的原因,一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。

二、环境部署

1.server1源码安装redis,并创建redis实例

Redis源码包下载地址


通过查看INSTALL和README.md文件获取安装帮助,进行编译 make USE_SYSTEMD=yes(在编译时可能会遇到依赖,根据提示解决即可):


make USE_SYSTEMD=yes #表示编译systemd的脚本,除了systemd的启动方式外,还有init.d的脚本启动方式

make install,安装二进制程序redis-server redis-cli redis-benchmar到环境变量,默认安装在/usr/local/bin目录下


使用源码自带的脚本创建redis实例,需要先注释脚本中systemd部分





如果本机的内存足够大,可以创建多个redis实例
创建监听端口为6380的redis实例
关闭不需要的redis实例
从网络接口状态可以看出,redis服务监听的是本机的回环接口,外网无法访问,需要在配置文件中修改监听端口。
配置文件中修改为监听本机所有接口

进入redis实例,查看信息

2.server2主机,创建redis的slave实例

将server1主机上已经编译好的redis,发送到server2主机

利用脚本创建redis实例
修改redis服务的监听端口,以及将该实例状态改为slave,并指向master的redis实例,重启服务生效


进入redis实例,查看replication信息,可以看到为slave状态

master端创建key值,进行验证

主机,redis设置主从比mysql简单,因为redis作slave接入master时,不需要考虑复制的位置,不需要先同步base数据,因为一旦redis作为slave去连接新的master,将放弃本机的所有数据,而且也将变为只读

    redis常用指令:config get *            //查看配置select 1              //切换数据库,类似mysql的use,0-15,总共16个,默认连接的为数据库0flushdb              //清空当前数据库flushall               //清空所有数据库move key 1         //移动keydel key              //删除rename oldkey newkey    //改名expire key 10               //设置过期时间persist key             //设置持久化,默认单位为s,好处就是免维护,不想mysql删除数据还需要deletekeys user*              //查询exists key          //判断是否存在


redis的持久化默认保存位置
Redis命令中文官网详解

3.Redis主从复制原理

redis主从复制:

  • slaveof 172.25.0.11 6379
  • min-slaves-to-write <slave 数量>
  • min-slaves-max-lag <秒数> 默认与slave端10s没有连接了,就认为slvae出问题了。
  • Redis 使用BGSAVE异步复制方式,因此无法确保 slave 是否实际接收到给定的写命令

    bgsave方式设置redis主从需要注意的是,当master端的物理内存不富于时,比如master端物理内存10G,redis已经占了8G的物理内存,此时去fork线程做内存快照,没有足够的的内存做快照,fork线程做快照需要8G,物理内存不够,就会使用交换分区,会拉慢速度,类似假死

三、Redis主从切换(高可用,sentinel哨兵模式)

min-slaves-to-write=2 :此参数保证master至少有两个slave正常连接时才允许客户端写入,当不满足此条件时,master就不允许客户端再写入数据,以防止通信出故障时客户端写入的数据丢失。

当redis做主从切时,如果min-slaves-to-write为默认值0时会出现一种问题,就是如上图master有两个slave,当master与slave因网络故障,导致master与slave连接不上,但不影响客户端往master端写入数据。此时sentinel检查到master网络故障,将通过投票选举将其中一个slave切换为master,其他slave自动转向新的master。当网络重新恢复时,原来的master检测到集群master已经发生变换,此时原master接入集群将会切换为slave转向新的master,此时会执行flushall放弃本机所有的数据。但是在网络故障期间,客户端写入原master的数据将会丢失。所以在主从切换时,需要添加min-slaves-to-write=2,也就是作为master要有两个slave可用,说明集群主从关系是稳定的,网络没有异常,当不能满足master至少有两个slave可用时,master将不允许客户端写数据,也就不会导致客户端写入的数据丢失。

redis主从复制是异步机制,没有mysql的半同步机制。
sentinel是redis自带的高可用组件,负责健康检测、故障切换以及报警。

1. Sentinel简介

Redis 的 Sentinel 文档

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 –sentinel 选项来启动 Redis Sentinel 。

哨兵模式

介绍

主从模式下,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这种方式并不推荐,实际生产中,我们优先考虑哨兵模式。这种模式下,master宕机,哨兵会自动选举master并将其他的slave指向新的master。

监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。

提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器。

哨兵可以有多个,一般为了便于决策选举,使用奇数个哨兵。哨兵可以和redis机器部署在一起,也可以部署在其他的机器上。多个哨兵构成一个哨兵集群,哨兵直接也会相互通信,检查哨兵是否正常运行,同时发现master宕机哨兵之间会进行决策选举新的master

哨兵模式的作用

通过发送命令,让Redis服务器返回其监控的redis实例运行状态,包括主服务器和从服务器;

当哨兵监测到master宕机,会自动将slave切换到master,然后通过发布订阅模式通过其他的从服务器,修改配置文件,让它们切换主机;

然而一个哨兵进程对Redis服务器进行监控,也可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

min-slaves-to-write=2 :此参数保证master至少有两个slave正常连接时才允许客户端写入,当不满足此条件时,master就不允许客户端再写入数据,以防止通信出故障时客户端写入的数据丢失。

2.sentinel部署

设置master最少正常连接slave数量,防止故障切换时,丢失客户端写入的数据。
热生效
永久生效

因为需要一主两从架构,所以在server3主机上创建redis实例,并配置为slave指向master。



从源码中复制sentinel的配置文件,在每个redis实例所在主机上部署哨兵监控主从集群。



不过要注意, 无论你设置要多少个 Sentinel 同意才能判断一个服务器失效, 一个 Sentinel 都需要获得系统中多数(majority) Sentinel 的支持, 才能发起一次自动故障迁移, 并预留一个给定的配置纪元 (configuration Epoch ,一个配置纪元就是一个新主服务器配置的版本号)。
换句话说, 在只有少数(minority) Sentinel 进程正常运作的情况下, Sentinel 是不能执行自动故障迁移的。

   down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。

  如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )

  不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行

  将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。

切记只有master端被客观下线后才会进行故障切换

  parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
  如果从服务器被设置为允许使用过期数据集(参见对 redis.conf 文件中对 slave-serve-stale-data 选项的说明), 那么可能不希望所有从服务器都在同一时间向新的主服务器发送同步请求, 因为尽管复制过程的绝大部分步骤都不会阻塞从服务器, 但从服务器在载入主服务器发来的 RDB 文件时, 仍然会造成从服务器在一段时间内不能处理命令请求: 如果全部从服务器一起对新的主服务器进行同步, 那么就可能会造成所有从服务器在短时间内全部不可用的情况出现。

  可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。

设置整个故障切换动作超时时间

将sentinel配置文件复制到slave端,必须在sentinel开启之前传过去,因为sentinel开启会自动修改配置文件

所有节点开启sentinel
server1开启sentinel

server2开启sentinel

server3开启sentinel


关闭server1上的redis
各节点的sentinel检测到master主观下线,经过交流后确定客观下线,有sentinel的leader发起切换,其他sentinel只负责投票

可以看到server2的redis切换为master

重新启动server1的redis,可以看到server1切换slave,并自动指向新的master(server2)


测试完成后,可以将sentinel打入后台,实验中设置占用前台是为了看到整个切换的过程日志

Redis之Redis基础、环境搭建、主从切换相关推荐

  1. 基础环境搭建——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(五)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  2. 【谷粒商城基础篇】基础环境搭建

    谷粒商城笔记合集 分布式基础篇 分布式高级篇 高可用集群篇 ===简介&环境搭建=== 项目简介与分布式概念(第一.二章) 基础环境搭建(第三章) ===整合SpringCloud=== 整合 ...

  3. 强化学习Openai Gym基础环境搭建

    ​ Gym提供了一些基础的强化学习环境,并且集成了许多有意思的环境,下面我们来一起看下如何在你的电脑上搭建Gym的开发环境吧. ​ Gym的Github地址. 1. ReadMe解读 ​ Gym 是一 ...

  4. SpringCloud Alibaba微服务实战(一) - 基础环境搭建

    说在前面 Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来 ...

  5. (一)Hyperledger Fabric 1.1安装部署-基础环境搭建

    在学习和开发hyperledger fabric的时候遇到了一些坑,现将自己的一些总结和心得整理如下,以期对大家有所帮助. 本次使用的宿主机环境:ubuntu,版本:Ubuntu 16.04.3 LT ...

  6. typescript+react+antd基础环境搭建

    typescript+react+antd基础环境搭建(包含样式定制) tsconfig.json 配置 // 具体配置可以看上面的链接 这里module moduleResolution的配置都会影 ...

  7. Spring的使用——基础环境搭建以及IOC概念理解(持续更新)

    spring基础环境搭建 1.添加Spring依赖 2.编写一个Spring的配置文件 3.通过Spring的应用程序应用上下文获取对象 优点:在修改方案时可以不用修改代码,只需修改配置文件的bean ...

  8. 【1】windows下IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  9. Hi3516开发笔记(三):Hi3516虚拟机基础环境搭建之交叉编译环境境搭建以及开机启动脚本分析

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121458516 长期持续项目技术分享,Shang业Di ...

  10. Hi3516开发笔记(二):Hi3516虚拟机基础环境搭建之串口调试、网络连接以及sftp文件传输

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/121314575 长期持续项目技术分享,Shang业Di ...

最新文章

  1. 二次元老婆生成器,想要什么样的老婆就靠自己勤劳的双手啦
  2. Zookeeper --笔记
  3. python作业网站_python大作业
  4. 【美文】接受生活的无力感,才能更好的出发
  5. js控制复选框选中显示不同表单_Vue之 表单
  6. ftp模式 503、227错误
  7. 大端字节序码流中取出2字节_产生字节码
  8. mysql联合索引数据库查询数据会变慢_如何定位并优化慢查询SQL以及联合索引和索引多的弊端...
  9. pandas.plotting
  10. 微波雷达智能感应模块,在智能面板上的技术应用
  11. 区块链技术驱动商业银行开展供应链金融业务的创新路径
  12. iOS 上传苹果商店失败记录
  13. Tapping and Tripping with NFC 基于NFC手机的公共交通票据系统
  14. Android平台下使用BingMaps地图
  15. 服务器软硬件安装和配置,Windows Server 2016-系统安装软硬件要求
  16. ESP32-BMP180气压、气温传感器
  17. python函数名词解释_python的面向对象程序设计(名词解释及实例)
  18. 【结构化思考】边缘计算架构 3D模型参考
  19. java解析XML saxReader.read(xml) 错误:org.dom4j.DocumentException: no protocol
  20. 翻出2018的Java84班的二阶段项目-商城项目

热门文章

  1. php社区twig,twig模板简单实用介绍
  2. 维基解密:攻击 Mac/Linux 的CIA三款工具
  3. 《区块链技术与应用》北大肖臻老师——课程笔记【4-5】
  4. libtool使用方法
  5. XP中服务与后门技术
  6. txt文件合并方法(不需要工具)
  7. 字符串转为 double 类型
  8. win11打不开 浏览器
  9. Docker三剑客——Docker Compose
  10. 银价近期持续行情寡淡,关注病毒恐慌情绪的避险需求