redis主从同步及redis哨兵机制
1.主从和哨兵的作用:
| 角色 |
作用 |
| 主从 |
1.(提供)数据副本:多一份数据副本,保证redis高可用 2. 扩展(读)性能:如容量、QPS等 |
| 哨兵 |
1.监控: 监控redis主库及从库运行状态; 2.通知: 如果redis发生故障转移,可以通过邮件通知管员; 3.自动故障转移: 一旦发现主库宕机,则在从库中通过选举新的master进行故障转移。 |
master: 192.168.1.16
slave1: 192.168.1.17
slave2: 192.168.1.18
主库配置:
不设置密码,从库可以直接使用slaveof ip port连接主库。
#修改配置文件: 6379.conf
以守护进程在后台运行:
daemonize yes
bind 0.0.0.0
设置一个认证密码,从库需要指定master的密码才能完成同步,否则日志会有报错提示:
#修改配置文件 redis.conf
#以守护进程在后台运行:
daemonize yes
#可选设置认证密码:
requirepass "123456" (294行设置)
bind 0.0.0.0
从库配置:
#修改配置文件设置(重启服务器生效)需要关闭防火墙
bind 0.0.0.0
#指定隶属谁;
slaveof 192.168.1.16 6379
#或者
REPLICAOF 192.168.1.16 6379
#指定master的认证密码(如果远程服务器设置了密码,则需要认证密码)
masterauth "123456" (294行设置) #指定在命令行设置(直接生效,重启服务失效);
#指定谁是主库;
slaveof 192.168.1.16 6379
#或者
REPLICAOF 192.168.1.16 6379
#设置master的认证密码:
CONFIG set masterauth 123456
#取消主从关系,恢复master身份:
SLAVEOF no one


从库查看状态:
[root@localhost]# redis-cli
192.168.1.17:6379> info replication


主库查看状态:
[root@localhost]# redis-cli
192.168.1.16:6379> info replication

日志分析:
tailf /usr/local/redis/6379.log
redis同步过程:
Connecting to MASTER 192.168.1.16:6379
MASTER <-> REPLICA sync started
# 开始非阻塞同步
Non blocking connect for SYNC fired the event.
Master replied to PING, replication can continue...
Partial resynchronization not possible (no cached master)
# 全量同步
Full resync from master: 74fb29643971834fdf701beb1708ce9ddc23bdee:0
# 接受数据
MASTER <-> REPLICA sync: receiving 193 bytes from master
# 清空以前缓存得数据
MASTER <-> REPLICA sync: Flushing old data
# 加载数据库到内存
MASTER <-> REPLICA sync: Loading DB in memory
# 完成同步
MASTER <-> REPLICA sync: Finished with success

# 指定主库IP和端口:
replicaof 192.168.75.136 6379
# 指定主库得认证密码:
masterauth 123456
# 从库正在复制时,从库可以相应用户读请求,如果设置为no,则返回报错信息。
replica-serve-stale-data yes
# 设置从库为只读
replica-read-only yes
# 启动socket方式复制数据库,master生成rdb文件,不在是先保存到磁盘,然后发给从库,而是直接把 rdb发送给从库,减少了磁盘IO
repl-diskless-sync yes
# 配置延时时间,让更多slave加入传输队列,如果复制已经开始,则5秒内,不接受新的slave同步请求
repl-diskless-sync-delay 5
# 指定从库定期检查主库状态,默认10秒
repl-ping-replica-period 10
# 同步超时时间
repl-timeout 60
# 是否禁用tcp-nodelay,yes表示禁用,redis会在写缓存积累到一定量之后一起发送,节省带宽,但是 会导致master和slave数据延迟,no,表示启用,redis会立即发送数据包,即使是很小数据,数据同步会 比较快,但是消耗更多带宽
repl-disable-tcp-nodelay no
# 设置在同步过程中,写缓冲区得大小,需要考虑到同步的时间和数据的写入速度
repl-backlog-size 1mb
# 设置从库的优先级,在主库宕机后,根据优先级选择slave,值越小,则优先级越高,0,表示不参与竞选, 故永远不会被选中。
replica-priority 100
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命 令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
|
Redis主从同步略:
|
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任 何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从 机进行全量同步。
|
| 注意点: |
如果多个Slave重启或者master重启,会因为master_replid不一致导致全量同步,当多个同时出现的时 候,可能会导致Master IO剧增宕机。
|
| 哨兵模式: |
redis主从虽然解决了单点导致的数据丢失问题,但是还是没有解决无缝的故障转移,也就是说在主库宕机后,从库无法自动切换为主库,需要手工去切换,在这一瞬间会对后端数据库造成极大的负载,可能直接导致后端数据宕机。
|
| 工作原理: |
哨兵(sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel)进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols) 来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。 每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如 果发现对方在指定时间(可配置)内未回应,则暂时认为对方宕机了,这就是所谓的”主观认为宕机” Subjective Down,简称sdown)。
若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master真正宕机,即客观上认 为宕机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为 master,然后自动修改相关配置。
|
哨兵模式配置:
master: 192.168.1.16
slave1: 192.168.1.17
slave2: 192.168.1.18

首先得配置主从:(前边已经配置了,这里就不在配置)
#配置master,开启网卡监听,(可选设置密码 294行);
vim /usr/local/redis/6379/6379.conf
bind 0.0.0.0
#配置slave1,指定master:
bind 0.0.0.0
replicatof 192.168.1.16 6379 #配置slave2,指定master:
bind 0.0.0.0
replicaof 192.168.1.16 6379
查看主从状态:
# 在master执行以下指令,均可查看同步信息:
127.0.0.1:6379> role
1) "master"
2) (integer) 322
3) 1) 1) "192.168.1.17"
2) "6379"
3) "322"
2) 1) "192.168.1.18"
2) "6379"
3) "322"
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.1.17,port=6379,state=online,offset=784,lag=1
slave1:ip=192.168.1.18,port=6379,state=online,offset=784,lag=1
配置哨兵:
master配置sentinel:
#复制哨兵的配置文件:
[root@localhost ~]# cp /usr/src/redis-stable/sentinel.conf /usr/local/redis/
#修改配置文件:
vim /usr/local/redis/sentinel.conf #绑定监听IP
bind 0.0.0.0
#监听端口
port 26379
#后台运行
daemonize yes
pidfile /var/run/redis-sentinel.pid
#哨兵的日志文件
logfile "sentinel.log"
#日志文件存放路径
dir /usr/local/redis/
#设置初始化master以及法定认为下线人数:
sentinel monitor mymaster 192.168.1.16 6379
#master主观下线时间,默认30秒,30秒内没有回复pong,则认为下线了
sentinel down-after-milliseconds mymaster 30000
#指定在故障转移期间,多少个slave向新的master同步数量,如果slave是提供查询服务,则应该设置小一点更好
sentinel parallel-syncs mymaster 1
# 指定故障转移超时时间,默认为3分钟
sentinel failover-timeout mymaster 180000
# 设置通知脚本,发生故障转移可以向管理员发送通知(可选)
sentinel notification-script mymaster /usr/local/redis/notify.sh
# 禁止修改脚本,避免脚本重置
sentinel deny-scripts-reconfig yes
--------------


创建notify.sh脚本
vim /usr/local/redis/notify.sh
#!/bin/bash
# lutixia
#####################
TO="1550684538@qq.com"
SUBJECT="redis 发生故障转移"
CONTEXT="redis 发生故障转移"
echo -e "$CONTEXT"|mailx -s "$SUBJECT" "$TO" #授予权限:
chmod +x /usr/local/redis/notofy.sh
#执行脚本
/usr/local/redis/notify.sh

启动哨兵模式:
[root@bogon ~]# /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
[root@bogon ~]# netstat -nutlp

复制哨兵配置文件及notify.sh脚本到slave服务器/并且在slave服务器启动哨兵:
#远程scp哨兵配置文件:
[root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.17:/usr/local/redis/
root@192.168.1.17's password:
sentinel.conf 100% 9901 3.1MB/s 00:00
[root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.18:/usr/local/redis/
root@192.168.1.18's password:
sentinel.conf
#远程scp notify.sh脚本: 100% 9901 2.6MB/s 00:00
[root@localhost ~]# scp /usr/local/redis/sentinel.conf 192.168.1.17:/usr/local/redis/
root@192.168.1.17's password:
notify.sh 100% 186 131.8KB/s 00:00
[root@localhost ~]# scp /usr/local/redis/notify.sh 192.168.1.18:/usr/local/redis/
root@192.168.1.18's password:
notify.sh 100% 186 111.4KB/s 00:00
slave节点启动哨兵:
[root@bogon ~]# /usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel.conf
master哨兵查看;
[root@bogon ~]# redis-cli -p 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.1.16:6379,slaves=2,sentinels=3
谢谢关注!!!
redis主从同步及redis哨兵机制的更多相关文章
- Redis主从同步介绍
Redis主从同步命令和配置项 启动主从复制:master无需任何操作,slave中使用以下任意一种开启复制功能 (1).通过配置文件启动主从复制: 在redis.conf中加入"slave ...
- Redis 主从同步+哨兵
简介 通过使用 Redis 自带“主从同步+哨兵守护”功能提高Redis稳定性. 主从同步:保障数据主从数据实时同步. 哨兵:实时监控主redis如果故障,将从redis作为主使用. 环境: 系统:C ...
- redis 主从同步&哨兵模式&codis
主从同步 1.CPA原理 1. CPA原理是分布式存储理论的基石: C(一致性): A(可用性): P(分区容忍性); 2. 当主从网络无法连通时,修改操作无法同步到节点,所以“一致性”无法满足 ...
- redis主从同步故障切换及集群配置
一.redis是一中高性能的缓存数据库, 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下 ...
- Redis主从复制架构和Sentinel哨兵机制
一.redis主从复制原理 redis主从同步策略:slave刚加入集群会触发一次全量同步(全量复制).全量同步之后,进行增量复制.slave优先是增量同步,如果增量同步失败会尝试从master节点进 ...
- Redis 主从配置密码以及哨兵
目录: Redis 主从介绍 哨兵机制 Redis 主从配置 环境 安装 启动服务 检查主从状态 测试数据同步 默认是读写分离的 Redis Sentinel 配置 主Redis宕机测试 配置多个哨兵 ...
- Redis系列之(二):Redis主从同步,读写分离
1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...
- Redis系列之(二):Redis主从同步,读写分离(转)
1. Redis主从同步 Redis支持主从同步.数据可以从主服务器向任意数量的从服务器上同步,同步使用的是发布/订阅机制. 2. 配置主从同步 Mater Slave的模式,从Slave向Maste ...
- Redis主从同步分析(转)
一.Redis主从同步原理 1.1 Redis主从同步的过程 配置好slave服务器连接的master后,slave会建立和master的连接,然后发送sync命令.无论是第一次同步建立的连接还是连接 ...
- 15.6,redis主从同步
redis主从同步 原理:1. 从服务器向主服务器发送 SYNC 命令.2. 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令.3 ...
随机推荐
- 【SpringBoot】整合Redis
1.前言 最近公司在做项目,用到了redis,,发现自己一点都不会,然后就乘闲暇时间,自己学习一些redis相关的知识,在这里分享给像我一样的初学者. 2.我的项目结构: 2.1 pom.xml &l ...
- Java_Day17_作业
1:需求:递归删除带内容的目录 假设删除当前项目下的目录:demo,demo中可以有文件夹自己给出 2:需求:请大家把E:\JavaSE目录下所有的java结尾的文件的绝对路径给输出在控制台. 3:下 ...
- 深度学习(五)——DatadLoader的使用
一.DataLoader简介 官网地址: torch.utils.data - PyTorch 2.0 documentation 1. DataLoder类 class torch.utils.da ...
- MIT6.s081/6.828 lectrue1:Introduction and examples
目前课程官网能够查到 2020,2021.2022 秋季的课程表,但是视频都是 2020 年录制的那一版 简单复习+回顾下自己的 OS 学习之旅 参考资料: 官网:https://pdos.csail ...
- python打包方法
在Python中,要编写setup.py文件,用于构建和打包你的Python项目,你可以遵循以下步骤: 创建项目目录结构:首先,你需要创建项目的目录结构,包括源代码文件.资源文件等.一个常见的项目结构 ...
- Mysql高级1-存储引擎
一.Mysql体系结构 1.1.连接层 最上层是一个客户端和链接服务,主要完成一些类似于链接处理,授权认证,及相关的安全方案,服务器也会为安全接入的而每个客户端验证它所具有的操作权限 1.2.服务层 ...
- Swiper.vue?56a2:132 Uncaught DOMException: Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.
错误代码 解决方案 删除div标签.修改后,如下所示:
- ABC295 D题 题解
题意简述 给定一个长度不超过\(\;5\times 10^5\;\)的,仅有数字构成的字符串,问存在多少段子串,使得子串内字符重新排序后,前半段与后半段相同? 做法分析 重组后前后两部分相同,其实也就 ...
- js中的函数式编程
函数是javascript中非常重要的一部分,用途也非常的多,可作为参数.返回值.回调等等,下面有一些函数式编程的重要概念和定义 纯函数 纯函数属于程序设计的名词,其它语言中也是存在的,而在javas ...
- FreeSWITCH添加自定义endpoint之媒体交互
操作系统 :CentOS 7.6_x64 FreeSWITCH版本 :1.10.9 之前写过FreeSWITCH添加自定义endpoint的文章: https://www.cnblogs.com/ ...