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 ...
随机推荐
- [Java基础]String,StringBuffer,StringBuilder的区别
String 和 StringBuffer/StringBuilder应该分开来看 java.lang.String源码中的注释说明 java.lang.StringBuffer源码中的注释说明 ja ...
- 深度学习(五)——DatadLoader的使用
一.DataLoader简介 官网地址: torch.utils.data - PyTorch 2.0 documentation 1. DataLoder类 class torch.utils.da ...
- 2023年ccpc大学生程序设计竞赛-crf
第一次参加这种大型线下程序设计比赛,心情自然是很激动,但比赛中并没有想象中那么顺利,甚至可以说有些惊险,比赛开始的时候,我们三人随便看看题,顺便等着跟榜,对于签到题我们自然是相信clk可以很快地独立完 ...
- Go语言的Printf用法
在 Go 语言中,Printf 是用于格式化输出的函数,用于将数据以指定格式打印到标准输出或其他输出流.其中,%p 是 Printf 函数的一个格式化动词,用于输出指针的值. 以下是 %p 的详细说明 ...
- 2021-11-30 wpf的mvvm绑定2
主页页面代码 <Grid> <TextBox x:Name="First" Width="80" Height="20" ...
- 自用 .net C# List集合和DataTable互转,可自定义表头
using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.R ...
- 用 Python 自动创建 Markdown 表格 - 每天5分钟玩转 GPT 编程系列(4)
目录 1. 他们居然问我要 Prompts 2. 让 GPT-4 来写代码 2.1 我对 DevChat 说 2.2 DevChat 回答 2.3 我又对 DevChat 说 2.4 DevChat ...
- [selenium]取值元素文本属性样式
前言 版本: python:3.9 selenium:4.1.5 获取元素文本 text = driver.find_element(by=By.XPATH, value=""). ...
- selenium报错:This version of ChromeDriver only supports Chrome version 109 Current browser version is 112.0.5615.49...解决办法
前言:跟GPT交互,让其写一段代码,执行失败.经过排查验证,GPT写的代码没有问题,是本地环境问题. 执行报错: selenium.common.exceptions.SessionNotCreate ...
- Web攻防--xxe实体注入
web攻防--xxe实体注入 漏洞简介 XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理.它通常允许攻击者查看应用程序服务器文件系统上的文件 ...