Redis实现主从复制方式(Master&Slave)


Posted in Redis onJune 21, 2022

主从复制方式(Master&Slave)

由于前段时间公司项目比较赶,一直抽不出时间写博客,今天偷空写一篇吧。前面给大家讲解了单机版redis的基本操作,现在继续给大家讲解一下Redis的进阶部分,主从复制和读写分离。

一、Master&Slave是什么?

也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

二、它能干嘛?

1、读写分离;

2、容灾恢复。

三、怎么玩?

1、配从(库)不配主(库);

2、从库配置:slaveof [主库IP] [主库端口];

  • 补充:每次slave与master断开后,都需要重新连接,除非你配置进redis.conf文件;
  • 键入info replication 可以查看redis主从信息。

3、修改配置文件细节操作

- 拷贝多个redis.conf文件

Redis实现主从复制方式(Master&Slave)

- 指定端口

Redis实现主从复制方式(Master&Slave)

- 开启daemonize yes

Redis实现主从复制方式(Master&Slave)

- Pid文件名字

Redis实现主从复制方式(Master&Slave)

- Log文件名字

Redis实现主从复制方式(Master&Slave)

- Dump.rdb名字

Redis实现主从复制方式(Master&Slave)

4、常用3招

- 一主二仆

Redis实现主从复制方式(Master&Slave)

一个Master,两个Slave,Slave只能读不能写;当Slave与Master断开后需要重新slave of连接才可建立之前的主从关系;Master挂掉后,Master关系依然存在,Master重启即可恢复。

- 薪火相传

Redis实现主从复制方式(Master&Slave)

上一个Slave可以是下一个Slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个slave的Master,如此可以有效减轻Master的写压力。如果slave中途变更转向,会清除之前的数据,重新建立最新的。

- 反客为主

当Master挂掉后,Slave可键入命令 slaveof no one使当前redis停止与其他Master redis数据同步,转成Master redis。

四、复制原理

1、Slave启动成功连接到master后会发送一个sync命令;

2、Master接到命令启动后的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master 将传送整个数据文件到slave,以完成一次完全同步;

3、全量复制:而slave服务在数据库文件数据后,将其存盘并加载到内存中;

4、增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步;

5、但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

五、哨兵模式(sentinel)

反客为主的自动版,能够后台监控Master库是否故障,如果故障了根据投票数自动将slave库转换为主库。一组sentinel能同时监控多个Master。

使用步骤:

1、在Master对应redis.conf同目录下新建sentinel.conf文件,名字绝对不能错;

2、配置哨兵,在sentinel.conf文件中填入内容:

  • sentinel monitor 被监控数据库名字(自己起名字) ip port 1
  • 说明:上面最后一个数字1,表示主机挂掉后slave投票看让谁接替成为主机,得票数多少后成为主机。

3、启动哨兵模式:

  • 命令键入:redis-sentinel /myredis/sentinel.conf
  • 注:上述sentinel.conf路径按各自实际情况配置

六、复制的缺点

延时,由于所有的写操作都是在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使得这个问题更加严重。

Redis master, slave节点部署详解

1. 创建两个redis.conf文件, 一主一从

redis_6379.conf
redis_6380.conf

2. master conf 主要配置

bind 127.0.0.1
port 6379
protected-mode yes
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/Data/apps/redis-3.2.12/logs/redis_6379.log"
dbfilename dump_6379.rdb
dir /Data/apps/redis-3.2.12/workplace
requirepass paopao

3. slave conf 主要配置

bind 127.0.0.1
port 6380
protected-mode yes
daemonize yes
pidfile /var/run/redis_6380.pid
logfile "/Data/apps/redis-3.2.12/logs/redis_6380.log"
dbfilename dump_6380.rdb
dir /Data/apps/redis-3.2.12/workplace
slaveof 127.0.0.1 6379
masterauth paopao

4. 启动主从redis-server进程

redis-server /Data/apps/redis-3.2.12/conf/redis_6379.conf
redis-server /Data/apps/redis-3.2.12/conf/redis_6380.conf

5.其他相关配置

# 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:
# 1) 如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求
# 2) 如果slave-serve-stale-data是指为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个
#    错误"SYNC with master in progress"
slave-serve-stale-data yes
slave-read-only yes
# 从库会按照一个时间间隔向主库发送PINGs.可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒
repl-ping-slave-period 10
# repl-timeout 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒
# 一定要确保repl-timeout大于repl-ping-slave-period
repl-timeout 60
# slave节点磁盘慢, 网速快时, 置为yes, master上的rdb文件将以socket方式传输, 跳过磁盘存储
repl-diskless-sync no
# 传输前等待秒数, 为了等待更多的slave节点加入
repl-diskless-sync-delay 5
# 传输时,是否禁用tcp nodelay
repl-disable-tcp-nodelay no
# 复制缓冲区大小
repl-backlog-size 1mb
# 复制缓冲区释放周期
repl-backlog-ttl 3600
# 为了sentinal模式, 选举master准备, 数值越小, 优先级越高
slave-priority 100
# require at least 3 slaves with a lag <= 10 seconds use
min-slaves-to-write 3
min-slaves-max-lag 10
# 可覆盖bind, port 配置, 对外ip port
slave-announce-ip 5.5.5.5
slave-announce-port 1234

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。


Tags in this post...

Redis 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
Redis6.0搭建集群Redis-cluster的方法
May 08 Redis
基于Redis实现分布式锁的方法(lua脚本版)
May 12 Redis
Redis延迟队列和分布式延迟队列的简答实现
May 13 Redis
5分钟教你docker安装启动redis全教程(全新方式)
May 29 Redis
Redis三种集群模式详解
Oct 05 Redis
聊聊redis-dump工具安装问题
Jan 18 Redis
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
Mar 16 Redis
redis数据一致性的实现示例
Mar 18 Redis
Redis 操作多个数据库的配置的方法实现
Mar 23 Redis
基于Redission的分布式锁实战
Aug 14 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 Redis
浅谈Redis变慢的原因及排查方法
使用Redis实现分布式锁的方法
Jun 16 #Redis
关于Redis的主从复制及哨兵问题
Jun 16 #Redis
Redis实现分布式锁的五种方法详解
Redis实现短信验证码登录的示例代码
Jun 14 #Redis
Redis批量生成数据的实现
Jun 05 #Redis
Redis实现订单过期删除的方法步骤
Jun 05 #Redis
You might like
php中看实例学正则表达式
2006/12/25 PHP
PHP中strnatcmp()函数“自然排序算法”进行字符串比较用法分析(对比strcmp函数)
2016/01/07 PHP
Yii框架连接mongodb数据库的代码
2016/07/27 PHP
PHP钩子实现方法解析
2019/05/21 PHP
PHP获取当前时间不准确问题解决方案
2020/08/14 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
js 数组实现一个类似ruby的迭代器
2009/10/27 Javascript
利用JS延迟加载百度分享代码,提高网页速度
2013/07/01 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
jQuery封装的tab选项卡插件分享
2015/06/16 Javascript
基于jquery css3实现点击动画弹出表单源码特效
2015/08/31 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
JavaScript基于activexobject连接远程数据库SQL Server 2014的方法
2017/07/12 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
2017/09/20 Javascript
Webstorm2016使用技巧(SVN插件使用)
2018/10/29 Javascript
javascript对HTML字符转义与反转义
2018/12/13 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
利用Fn.py库在Python中进行函数式编程
2015/04/22 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
python 多线程将大文件分开下载后在合并的实例
2018/11/09 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
Python写捕鱼达人的游戏实现
2020/03/31 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
乌克兰网上服装店:Bolf.ua
2018/10/30 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
Why we need EJB
2016/10/20 面试题
房屋转让协议书
2014/04/11 职场文书
会计学专业自荐信
2014/06/25 职场文书
幼儿园家长安全责任书
2014/07/22 职场文书
MYSQL数据库使用UTF-8中文编码乱码的解决办法
2021/05/26 MySQL
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android
浅谈 JavaScript 沙箱Sandbox
2021/11/02 Javascript
使用refresh_token实现无感刷新页面
2022/04/26 Javascript