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 ...
随机推荐
- 浅析华为云Astro的5大关键能力技术
摘要:本文以技术方案视角,对华为云Astro低代码平台的一些核心功能进行简要介绍. 背景介绍 低代码开发基于可视化开发的概念,结合了云原生和多终端体验技术,它可以在大多数业务场景中,帮助企业显著的提升 ...
- 并发编程-FutureTask解析
1.FutureTask对象介绍 Future对象大家都不陌生,是JDK1.5提供的接口,是用来以阻塞的方式获取线程异步执行完的结果. 在Java中想要通过线程执行一个任务,离不开Runnable与C ...
- 2021-3-13 xml的增删改查
public void XmlAdd(string filename, List<People> pList) { try { List<People> peoples = X ...
- PXE服务器搭建--ARM
PXE服务搭建 一. 什么是PXE PXE是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过 ...
- AttributeError:module‘win32com.gen_py has no attribute ‘CLSIDToClassMap‘
解决方案如下: 1. 运行如下代码,找到文件所在位置 from win32com.client.gencache import EnsureDispatch import sys xl = Ensur ...
- eclipse module-info.java文件
module 本模块的名称{ exports 对外暴露的包路径; requires 需要依赖的其他模块名称; } module-info.java不是类,不是接口,是一些模块描述信息.module也不 ...
- 需求太多处理不过来?MoSCoW模型帮你
一.MoSCoW模型是什么 MoSCoW模型是在项目管理.软件开发中使用的一种排序优先级的方法,以便开发人员.产品经理.客户对每个需求交付的重要性达成共识. MoSCoW是一个首字母缩略词,代表: M ...
- VScode软件的安装以及C/C++环境配置的方法
今天和大家分享一下VScode软件的安装以及C/C++环境配置的方法.手把手教大家入门. 1,下载VScode编译器 (1) 官网下载链接:https://code.visualstudio.c ...
- 应用管理平台Walrus开源,构建软件交付新范式
今日,数澈软件Seal(以下简称"Seal")宣布正式开源 Walrus,这是一款基于平台工程理念的应用管理平台,致力于解决应用交付领域的深切痛点. 借助 Walrus 将云原生的 ...
- 《Kali渗透基础》15. WEB 渗透
@ 目录 1:WEB 技术 1.1:WEB 攻击面 1.2:HTTP 协议基础 1.3:AJAX 1.4:WEB Service 2:扫描工具 2.1:HTTrack 2.2:Nikto 2.3:Sk ...