手把手教你配置Redis主从复制(含详细图文)
前言
这期来聊聊什么是主从复制?主从复制能干什么?Redis如何实现的主从复制?哨兵模式如何实现?最后再来说说复制的原理以及他的缺点,如果还没安装Redis的同学可以先去看一下 《手把手教你在Linux环境下安装Redis》 这篇文章,本篇主从复制的教程是在此基础上完成的
主从复制
是什么
Master-Slave replication
是一种数据处理(备份)机制,主机更新数据后根据配置的策略自动同步给从机(备份机),通常情况下Master写为主、Slave读为主。如下图所示:
能干嘛
- 读写分离,常用读多写少的场景,例如电商平台
- 容灾备份/数据恢复
如何实现
修改配置文件
配置文件 redis.conf
中需要修改的地方如下:
# 1. 修改端口号,一主多从模式,此教程中我默认是以6379为主,6380、6381为从
port 6379# 2.开启守护进程模式运行,默认是no
daemonize yes# 3. 修改pid文件名,我是以端口来区分的
pidfile "/var/run/redis_6379.pid"# 4.log文件名,以端口命名,放在log目录下
logfile "./log/6379.log"# 5. dump.rdb文件名,存储内存中的快照
dbfilename "dump_6379.rdb"
# dump文件的目录
dir "/usr/local/bin/redis/dump"# 6.拷贝多个 redis.conf 配置文件,并按照以上步骤修改配置文件
我是把多个配置文件放在了 /etc/redis/m_s/
目录下(存储位置自己随意),如下图:
建立主从关系
我这里演示的是 一主二仆
即一个作为主机,两个作为从机。首先启动 master
节点,这个环节肯定少不了服务端 redis-server
(注意:我这里是从redis解压后的src
目录复制过来的)
启动端口号6379 没有设置密码
查看主从复制配置信息
以上操作的命令:
# 指定配置文件启动redis服务
# ./redis-server /etc/redis/m_s/redis-6379.conf# 检查是否启动成功
# ps -ef|grep redis# 客户端指定端口连接服务端
# ./redis-cli -p 6379# INFO命令查看主从复制配置信息
# info replication# 剩下的6380、6381按照以上操作一次启动
启动端口号6380
启动端口号6381
查看启动日志
从上面截图可以看出,redis启动后复制机制的角色初始都是master,那么如何建立主从关系呢?
本教程中我使用 slaveof <masterhost> <masterport>
命令,当然你也可在配置文件中配置,这样重启后就不会失效了。
# 6380、6381都配置从属到6379
slaveof 127.0.0.1 6379
6381
按照同样的操作与 6379
建立主从关系,你可以使用 info replication
命令来查看是否建立成功,此时你再回到 6379
查看他是否已经有两台从机与他关联上了,显示以下结果表示你成功了
验证主从复制
建立好主从关系之后,开始验证在 master
中写数据是否会同步到从机中,验证结果如下:
此时你可以查看一下存储快照的目录,是否为你生成了三个dump
文件
从上面的验证结果可以看出在 主机6379
中写数据会自动同步到 从机6380、6381
中,这里抛出一个问题:如果在连接到从机的应用有写的操作,结果会怎样?如下图所示:
从结果来看,从机是不能进行写操作的,在 redis.conf
中从机默认配置了只读以及对此配置的相关说明:官方解释是为了保证(提高)只读从机的安全性,配置文件的内容如下(贴心的我做了一下翻译):
这里再抛出一个问题:如果redis的主机节点挂了,结果会怎样? 接下来我手动模拟master节点宕机了,看看另外两个slave节点会怎样?如下图所示:
从 6380
和 6381
来看,主机down了之后,从机不会有任何操作,而是等待主机恢复后再次重连。如下图所示:
从上面的结果来看,master(主)作为写数据的节点,如果在线上宕机了,在此期间应用就会无法写入数据,这种现象发生在线上环境是很 “危险” 的,那有没有一种方式能监控master节点,发现master节点宕机了之后立即将现有从节点升级为主节点呢?
答案肯定是有的,这个开发Redis的大佬们已经替我们想好了,接下来有请哨兵
出场…
哨兵模式
你可以理解为是一个监控,哨兵巡逻监控你的master节点,如果发现master挂了,则会在存活的从机中通过投票选主的方式选出一个从机来作为新的master节点。
如何开启哨兵
在看完我的教程之后,建议你去看一下redis解压目录下在 src
目录中的 sentinel.conf
文件
# 创建一个sentinel.conf文件
# touch sentinel.conf# sentinel.conf配置文件的内容如下:
port 26379
dir "/usr/local/bin/redis"
logfile "./log/sentinel.log"# 以上几项都可以不写,启动哨兵后会自动生成的,主要是下面这段配置
sentinel monitor redis6379 127.0.0.1 6381 1# 特别说明:
# redis6379表示hostname,你可以自己随意取名
# 最后的数字1表示当主机挂了之后,在从机中进行投票选主,票数大于1的晋升为主机# 设置为守护进程模式,为了更好的看哨兵的效果,你可以先注释他,看看投票选主的过程
daemonize yes
这里我将 sentinel.conf
哨兵配置文件跟 redis.conf
放在了一起(位置随意,只要你启动哨兵服务指向该配置文件就行)
启动哨兵,使用到的 redis-sentinel
也是从 src
目录中复制过来的。过程如下图所示:
哨兵扫描到6379有两个从节点6380和6390
接下来你就可以模拟master宕机的情况,使用 shutdown
命令关掉 6379
看看哨兵是如何运行的。验证结果如下图所示:
# 投票选主的过程# +sdown master redis6379 127.0.0.1 6379
# +odown master redis6379 127.0.0.1 6379 #quorum 1/1
# +new-epoch 1
# +try-failover master redis6379 127.0.0.1 6379
# +vote-for-leader eebe0e6a1e41fb71f8ee121df2ae0854f97c175c 1
# +elected-leader master redis6379 127.0.0.1 6379
# +failover-state-select-slave master redis6379 127.0.0.1 6379
# +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis6379 127.0.0.1 6379
* +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ redis6379 127.0.0.1 6379
* +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ redis6379 127.0.0.1 6379
# +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ redis6379 127.0.0.1 6379
# +failover-state-reconf-slaves master redis6379 127.0.0.1 6379
* +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ redis6379 127.0.0.1 6379
* +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ redis6379 127.0.0.1 6379
* +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ redis6379 127.0.0.1 6379
# +failover-end master redis6379 127.0.0.1 6379
# +switch-master redis6379 127.0.0.1 6379 127.0.0.1 6380
* +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ redis6379 127.0.0.1 6380
* +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ redis6379 127.0.0.1 6380
# +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ redis6379 127.0.0.1 6380
验证 6380
是否为上升为master,然后 6381
还会原地等待 6379
吗?验证结果如下图所示:
如果 6379
后面人为将其恢复正常后,他将扮演什么角色呢? 看到这里的同学自己验证一下吧,结果如何在评论区见~
总结
主从复制的原理
- slave启动成功连接到master后发送一个sync命令
- master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中
- 增量复制:master继续将新的所有收集到的修改命令依次传给slave,完成同步
- 但是只要是重新链接master,一次完全同步(全量复制)将被自动执行
主从复制的缺点
复制的延迟,由于所有的写都在一个master节点上操作,然后同步更新到slave节点上,所以master同步到slave机器是有一定的延迟的,当系统很繁忙的时候,延迟问题会更加严重,slave数量的增加也会使这个问题变严重。
写在最后
此教程亲测有效,如果中间有问题或遗漏,欢迎来评论区吐槽~
如果对你所有帮助,记得点赞收藏哦~(哈哈哈,时间久了忘了怎么装就回来看看)
手把手教你配置Redis主从复制(含详细图文)相关推荐
- 手把手教你撸Redis
手把手教你撸Redis Redis入门 一. 什么是Redis 二. Redis能干嘛 三. Redis和Memcached区别 四. 为什么使用Redis 五. Redis为什么单线程还这么快 六. ...
- 手把手教你 MongoDB 的安装与详细使用(二)
上一篇文章练习了,MongoDB 的以下操作 安装 MongoDB 服务 连接 MongoDB MongoDB 创建数据库 MongoDB 删除数据库 MongoDB 插入文档 MongoDB 删除文 ...
- ❤️周末爆肝两天❤️,万字长文,手把手教你配置CSDN主页的独特域名(保姆级教程,建议收藏)
❤️ 感受下效果图 ❤️ 目录 一.前言 二.先解决有没有的问题 1. 前置条件 2. 购买云服务器 3. 购买DNS域名 4. 配置Apache2服务 5. 配置云服务器的端口映射 6. 配置ngi ...
- 软件_手把手教vscode配置c++,python开发环境
原创:软件_手把手教vscode配置c++,python开发环境 之前主用Python作为项目开发语言,将项目迁移到arm边缘盒子上后发现arm的cpu不给力,软件速度低于预期,所以计划将部分程序改为 ...
- eclipse jdk配置_第一节:学会Java前提-手把手教你配置JDK环境变量
# 前言 大家好,我是 `Vic`,今天给大家带来`学会Java前提-手把手教你配置JDK环境变量`的概述,希望你们喜欢 # 下载地址 下载jdk,和eclipse就比较简单了,提供JDK 9 地址: ...
- 手把手教你配置哔哔点啥
手把手教你配置哔哔点啥 有一些闲言碎语不知道去哪说,所以搭建了一个哔哔点啥页面 一.服务部署 1. 首先保证成功激活腾讯云开发 2. 点击一键部署至云开发 3. 进入环境-登录授权,启用"匿 ...
- ❤️手把手教你配置服务器板载raid❤️
❤️手把手教你配置服务器板载raid❤️ 当我们买的服务器没有raid卡该怎么办? 但是我们还想给服务器系统做个冗余盘该怎么办? 接下来请去机房带上显示器键盘,开始操作吧!!! 现在以浪潮服务器NF5 ...
- 老唐手把手教你配置security,并增加JWT校验(copy就用)。
老唐手把手教你配置security,并增加JWT校验(copy就用). 1.首先配置security 1.1导入security的jar包 1.2配置security配置文件(直接上代码) 2.JWT ...
- Echarts 折线图完全配置指南 - 手把手教你设置 Echarts 折线图详细教程
本文首发:<Echarts 折线图完全配置指南> Echarts 折线图是图表中最常用的显示形式之一.使用 Echarts 做出基本的折线图很简单,但要是想把多组数据放在一张图表中,展示的 ...
最新文章
- 从Servlet、Dubbo、Mybatis聊聊责任链究竟怎么用
- 取余运算 C和python的区别
- C#正则表达式MatchCollection类浅析
- leetcode 617. Merge Two Binary Trees | 617. 合并二叉树(Java)
- 【C】printf按8进制、10进制、16进制输出以及高位补0
- 数据预测之BP神经网络具体应用以及matlab实现
- mysql mvcc机制rc_Mysql中MVCC的使用及原理
- 【渝粤教育】国家开放大学2018年春季 0692-21T化工设备机械基础 参考试题
- 使用maven给spring项目打可直接运行的jar包(配置文件内置外置的打法)
- 福昕阅读器中删除单个,多个注释,隐藏所有注释。
- 好心情“沉浸式VR静心疗愈—荷塘月色”第二期企业沙龙活动圆满收官
- BurpSuite安装与浏览器导入证书
- element-ui中select组件创建条目创建条目为空时报错的解决方案
- 员工格言[付总提供]
- U盘被识别为其他设备(显示U盘图标但是不显示盘符)的解决办法
- while 和 do while 循环语句格式及用法
- YBT高效进阶 6.2.5 余数之和
- 富士康员工盗卖iPhone部件3年赚3亿;张朝阳称工作只为赚钱太low;国产统一操作系统 UOS 正全面适配 | EA周报...
- 4411 三仙归洞(找规律-周期)
- python三维坐标轴单位长度_Matplotlib中三维散点图的z轴缩放和限制