当前位置: 首页 > news >正文

Redis主从哨兵模式

  • 简介

    • 主从 – 用法
      • 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构。 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承担。 redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低redis的处理性能。 主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。 在主从架构中,从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。但是从服务器仍然可以接受CONFIG等指令,所以还是不应该将从服务器直接暴露到不安全的网络环境中。如果必须如此,那可以考虑给重要指令进行重命名,来避免命令被外人误执行。
    • 主从 – 同步原理
      • 从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,主服务器将执行的写指令都缓存在内存中。 在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器。 另外,要说的一点是,即使有多个从服务器同时发来SYNC指令,主服务器也只会执行一次BGSAVE,然后把持久化好的RDB文件发给多个下游。在redis2.8版本之前,如果从服务器与主服务器因某些原因断开连接的话,都会进行一次主从之间的全量的数据同步;而在2.8版本之后,redis支持了效率更高的增量同步策略,这大大降低了连接断开的恢复成本。 主服务器会在内存中维护一个缓冲区,缓冲区中存储着将要发给从服务器的内容。从服务器在与主服务器出现网络瞬断之后,从服务器会尝试再次与主服务器连接,一旦连接成功,从服务器就会把“希望同步的主服务器ID”和“希望请求的数据的偏移位置(replication offset)”发送出去。主服务器接收到这样的同步请求后,首先会验证主服务器ID是否和自己的ID匹配,其次会检查“请求的偏移位置”是否存在于自己的缓冲区中,如果两者都满足的话,主服务器就会向从服务器发送增量内容。 增量同步功能,需要服务器端支持全新的PSYNC指令。这个指令,只有在redis-2.8之后才具有。
  • 环境

    • 三台服务器通信畅通。
    • 并部署redis
    • 关闭防火墙和selinux
      启用多重执行
      在这里插入图片描述
      在这里插入图片描述
1.Redis安装
  • 安装redis
 wget http://download.redis.io/releases/redis-4.0.9.tar.gz -O /redis-4.0.9.tar.gz
  • 从redis.io下载最新版redis-X.Y.Z.tar.gz后解压,然后进入redis-X.Y.Z文件夹后直接make即可
    - redis-4.0.9.tar.gz
cd  /进入资源目录
tar xzf redis-4.0.9.tar.gz解压缩安装包
cd /redis-4.0.9/进入安装包所在目录
make编译安装
  • 开机启动
 mkdir  /etc/rediscp   /redis-4.0.9/redis.conf  /etc/redis/6379.confcp /redis-4.0.9/utils/redis_init_script   /etc/init.d/redis
  • 新增第6,7,13,15,29行
 vim /etc/init.d/redis6 # chkconfig: 2345 10 90
7 # description: Start and Stop redis
12 #EXEC=/usr/local/bin/redis-server
13 EXEC=/redis-4.0.9/src/redis-server
14 #CLIEXEC=/usr/local/bin/redis-cli
15 CLIEXEC=/redis-4.0.9/src/redis-cli23         if [ -f $PIDFILE ]
24         then
25                 echo "$PIDFILE exists, process is already running or crashed"
26         else
27                 echo "Starting Redis server..."
28                 #$EXEC $CONF 
29                 $EXEC $CONF &
30 
31         fi
 chmod +x /etc/init.d/redischkconfig --add redis
  • 增加开机启动设置
 chkconfig --listredis          	0:关	1:关	2:开	3:开	4:开	5:开	6:关chkconfig  redis  on
  • 设置redis开机启动
 systemctl daemon-reload
  • 重新加载自启动信息
 systemctl start redis
  • 启动redis

master1 192.168.145.11

vim /etc/redis/6379.conf bind 127.0.0.1bind 0.0.0.0
  • 监听本机所有地址
    请添加图片描述
   protected-mode yesprotected-mode no
  • 关闭保护模式
    请添加图片描述
systemctl  restart  redis
  • 重启

  • slave1 192.168.145.12

 vim /etc/redis/6379.conf slaveof 192.168.145.11  6379

请添加图片描述

   bind 0.0.0.0protected-mode nosystemctl  restart  redis
  • slave2 192.168.145.13
 vim /etc/redis/6379.conf slaveof 192.168.145.11  6379bind 0.0.0.0protected-mode nosystemctl  restart  redis
  • 测试

    • 数据一致性

      • master1记录键值对

      • [root@master1 ~]# /redis-4.0.9/src/redis-cli
        127.0.0.1:6379> set abc hahahahah
        OK
        127.0.0.1:6379> get abc
        "hahahahah"
    • slave1查询数据,验证数据一致性

    • [root@slave1 redis-4.0.9]#  /redis-4.0.9/src/redis-cli
      127.0.0.1:6379> get abc
      "hahahaah"
      127.0.0.1:6379>
  • 服务状态

/redis-4.0.9/src/redis-cli 登录redis客户端info replication查看复制状态master
  [root@master ~]# /redis-4.0.9/src/redis-cli127.0.0.1:6379> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.145.12,port=6379,state=online,offset=280,lag=1slave1:ip=192.168.145.13,port=6379,state=online,offset=280,lag=1master_replid:54a4066c4ca51148adb6e273e37265aa1401a941master_replid2:0000000000000000000000000000000000000000master_repl_offset:280second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:280- slave[root@slave~]# /redis-4.0.9/src/redis-cli127.0.0.1:6379> info replication# Replicationrole:slavemaster_host:192.168.145.11master_port:6379master_link_status:upmaster_last_io_seconds_ago:1master_sync_in_progress:0slave_repl_offset:182slave_priority:100slave_read_only:1connected_slaves:0master_replid:54a4066c4ca51148adb6e273e37265aa1401a941master_replid2:0000000000000000000000000000000000000000master_repl_offset:182second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:15repl_backlog_histlen:168127.0.0.1:6379>127.0.0.1:6379> get abc"hahahahah"

redis-sentinel

  • 简介

    • sentinel介绍

      • 作用

        • Redis Sentinel Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案。实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署。

        • 作用:

          1):Master状态检测

          2):如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave

          3):Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换

      • 工作方式

        • 1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令
        • 2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。
        • 3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
        • 4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线
    • 主观下线和客观下线

      • 主观下线:Subjectively Down,简称 SDOWN,指的是当前 Sentinel 实例对某个redis服务器做出的下线判断。
      • 客观下线:Objectively Down, 简称 ODOWN,指的是多个 Sentinel 实例在对Master Server做出 SDOWN 判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,然后开启failover.
  • 环境

    • 在上一个实验的基础上。
    • 注意:每台机器的防火墙
  • 步骤

    • 1.每台机器上修改redis主配置文件设置:bind 0.0.0.0(略)

    • 2.每台机器上修改sentinel配置文件:添加如下配置

 vim /redis-4.0.9/sentinel.conf
​     sentinel monitor mymaster 192.168.145.11 6379 2
  • 当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。
  sentinel down-after-milliseconds mymaster 3000
  • 单位毫秒
  • 如果在down-after-millisecondes毫秒内,没有收到有效的回复,则会判定该节点为主观下线。
   sentinel failover-timeout mymaster 10000
  • 若sentinel在该配置值内未能完成failover(故障转移)操作(即故障时master/slave自动切换),则认为本次failover失败。
protected-mode no
  • 3.每台机器启动服务:
 cd  /redis-4.0.9./src/redis-sentinel sentinel.conf
  • 4.关闭主服务器,观察从服务器改变状态

    • master1
 systemctl stop redis
  • 观察三台服务器返回信息。会显示新主人信息。

    36596:X 13 Aug 08:11:01.260 # -odown master mymaster 192.168.145.11 6379
    36596:X 13 Aug 08:11:01.260 # +failover-end master mymaster 192.168.145.11 6379
    36596:X 13 Aug 08:11:01.260 # +switch-master mymaster 192.168.145.11 6379 192.168.145.13 6379
    36596:X 13 Aug 08:11:01.260 * +slave slave 192.168.145.12:6379 192.168.145.12 6379 @ mymaster 192.168.145.13 6379
    36596:X 13 Aug 08:11:01.260 * +slave slave 192.168.145.11:6379 192.168.145.11 6379 @ mymaster 192.168.145.13 6379
    36596:X 13 Aug 08:11:04.275 # +sdown slave 192.168.145.11:6379 192.168.145.11 6379 @ mymaster 192.168.145.13 6379
  • 新主服务器上观察状态转换

/redis-4.0.9/src/redis-cli 
info replication
  • 观察状态由主转从

  • redis相关工具(了解)

 find /redis-4.0.9/src -type f -executable./redis-benchmark //用于进行redis性能测试的工具./redis-check-dump //用于修复出问题的dump.rdb文件./redis-cli //redis的客户端./redis-server //redis的服务端./redis-check-aof //用于修复出问题的AOF文件./redis-sentinel //用于集群管理

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Web开发中的Cookie、Session与Token:一场身份认证之旅
  • 日期类代码实现-C++
  • windows关闭英语美式键盘
  • conda配置国内源
  • Python | Leetcode Python题解之第334题递增的三元子序列
  • c语言中比较特殊的输入函数
  • 基于Mediepipe的手势识别系统 | OpenCV | Mediapipe | C++ | QT | Python | C# | Unity
  • Doris与StarRocks
  • linux网络配置脚本
  • 《机器学习by周志华》学习笔记-决策树-04多变量决策树
  • 【重学c++primer】第五章第二节 深入浅出:左值和右值
  • LabVIEW VI 多语言动态加载与运行的实现
  • Cesium天空盒子(Skybox)制作(js代码)和显示
  • C语言中的函数sscanf()用法
  • Golang基于DTM的分布式事务TCC实战
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • es6要点
  • Flex布局到底解决了什么问题
  • Fundebug计费标准解释:事件数是如何定义的?
  • input的行数自动增减
  • js操作时间(持续更新)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Vue--数据传输
  • Vue组件定义
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 高度不固定时垂直居中
  • 汉诺塔算法
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 设计模式走一遍---观察者模式
  • 责任链模式的两种实现
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (~_~)
  • (145)光线追踪距离场柔和阴影
  • (C)一些题4
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (LeetCode) T14. Longest Common Prefix
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (回溯) LeetCode 46. 全排列
  • (每日一问)设计模式:设计模式的原则与分类——如何提升代码质量?
  • (强烈推荐)移动端音视频从零到上手(上)
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (三)SvelteKit教程:layout 文件
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)、python程序--模拟电脑鼠走迷宫
  • .gitignore文件_Git:.gitignore
  • .Net - 类的介绍
  • .Net(C#)自定义WinForm控件之小结篇
  • .NET大文件上传知识整理
  • .skip() 和 .only() 的使用
  • @property括号内属性讲解
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限