redis数据库的主从、哨兵和cluster模式的实现原理与搭建详解(win10系统)
Redis
- 内存K-V 型数据库
内存占用
redis 的数据保存在内存中,数据变多,内存占用更大。当 redis 服务器停止运行时,数据便会消失。
使用 save
和 bgsave
命令可以将内存中的数据存储在硬盘上(rdb 和 aof)
RDB:通过rdb文件恢复数据比较快
AOF:追加日志文件,备份速度较快,但数据恢复速度较慢
当 redis 服务启动时,会把 rdb 中的数据再次放在内存中使用(因此要考虑 redis 内存占用的问题)
下载:https://github.com/MicrosoftArchive/redis/releases
主从模式
应用场景:可以实现读写分离
参考:https://www.cnblogs.com/cang12138/p/9132288.html
参考:https://blog.csdn.net/ITLTX1024/article/details/100665452
- 开启主 redis 服务
./redis-server.exe redis.windows.conf // 开启服务
./redis-cli.exe -h 127.0.0.1 -p 6379 // 在服务中执行操作
默认配置运行在 127.0.0.0:6379 上,可以在 redis.windows.conf 中修改此配置
- 开启从 redis 服务
复制 redis 安装目录至新的文件夹,如 ./redis6380
修改 redis.windows.conf 和 redis.windows.service.conf 的配置,端口号改为 6380
./redis-server.exe redis.windows.conf // 开启服务
./redis-cli.exe -h 127.0.0.1 -p 6380 // 在服务中执行操作
同步到主服务的数据
127.0.0.1:6380> slaveof 127.0.0.1 6379
// slaveof host port 同步到某主服务,将主服务所有数据一起同步过来
// slaveof no one 取消同步
// 主服务发送 rdb 文件 → 主服务发送缓冲区数据 → 从服务删除老数据 → 加载新的 rdb 数据和缓冲区数据
// 如果同步的过程中,连接断开,则会在下次连接之后继续同步
- 读写
主服务:可读、可写
从服务:只读、不可写
当主服务停止运行后,从服务 **不会 ** 自动成为主服务
- 永久保持主从关系
修改从 redis 服务的配置 redis.windows.config ,搜索 slaveof ,加入 slaveof 127.0.0.1 6379
即可
哨兵模式
- 每个哨兵会定时向其他哨兵、Master、slave发送消息,以确定对方是否存活,若如果发现对方在指定时间(可配置)内未回应,则认为 master 挂了,会采用 vote 算法,选出一个新的 master
哨兵监控原理:https://blog.csdn.net/xiaoxiaole0313/article/details/103813759
主服务目录中建立 sentinel.conf 哨兵配置
#当前Sentinel服务运行的端口
port 26381
#master
#Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,
#而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
sentinel monitor mymaster 127.0.0.1 6379 1
#指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。
#只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
sentinel down-after-milliseconds mymaster 5000
#指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
sentinel config-epoch mymaster 12
#如果在该时间(ms)内未能完成failover操作,则认为该failover失败
sentinel leader-epoch mymaster 13
从服务目录中建立 sentinel.conf 哨兵配置
port 26382
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 12
sentinel leader-epoch mymaster 13
在两个服务的目录中启动两个 sentinel
redis-server.exe sentinel.conf --sentinel
查看 sentinel 信息
主服务目录下:
./redis-cli.exe -p 26381
info sentinel
此时,主服务器关闭,查看 sentinel ,主服务器从 6379 变成 6380
PS D:\redis\redis> ./redis-cli.exe -p 26381
127.0.0.1:26381> 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=127.0.0.1:6379,slaves=1,sentinels=2
127.0.0.1:26381> 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=127.0.0.1:6380,slaves=1,sentinels=2
127.0.0.1:26381>
注:如果原主服务器修好了,那么也只能作为从服务器听从新的主服务器
哨兵监控:每隔一段时间,每个哨兵会向主节点和从节点发送 info 命令( ping ),获取各个节点的信息,以判断节点的存活状态。
如:向主节点发送 info replication
node01:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.239.102,port=6379,state=online,offset=18621889,lag=1 slave1:ip=192.168.239.103,port=6379,state=online,offset=18621889,lag=1
每个哨兵会订阅
__sentinel__:hello
这个频道,并定时发送以下信息<sentinel ip> <sentinel port> <sentinel runId> <Sentinel 配置版本> <master name> <master ip> <master port> <master 配置版本>
以此来定时了解其他哨兵的信息,哨兵之间也会互相交换主节点的状态。
确认下线(Gossip协议)
- 主观下线:每个 sentinel 会向其他节点和 sentinel 定时发送信息( ping ),若没有收到响应,则判断为主观下线
- 客观下线:多个 sentinel 都判定某个节点下线,则该节点为客观下线
故障转移 leader
若 sentinel-0 率先发现某个节点下线,则会先申请成为 leader,其他 sentinel 负责投票。其他 sentinel 发现节点下线后也可以申请 leader ,正常情况下,哪个 sentinel 节点最先确认 master 客观下线,哪个 sentinel 节点就会成为执行故障转移的 leader。
Master 节点选举:不选择不健康的节点
- 主观下线的 slave
- 大于等于5秒没有回复过 sentinel 节点 ping 响应的 slave
- 与 master 失联超过
down-after-milliseconds * 10
秒的 slave
————————————————————————————————
- 对节点进行排序:priority 最小的(从节点优先级,可以设置)→ 复制偏移量最大的 → 选择 runid 最小的从节点(runid:每个redis服务器的唯一标志id)
故障转移
sentinel leader 对新的 Master 执行 slaveof no one,
对其他节点执行 slaveof
cluster 模式:多个 redis 实例,把数据分布到不同位置
配置: https://www.cnblogs.com/vettel0329/p/11843342.html
虚拟槽分区 slots:redis cluster 默认有 0-16383 虚拟槽,每个槽可以存放一定的数据。
哈希槽:每个槽可以当成是一个分区,当使用 redis 单个节点时,只有一个分区。当使用 cluster 模式时,会生成 16384 个分区,每个分区中都可以存储很多 k-v。数据存储在哪个槽则是由 key 值计算后决定。
把某些范围的 key 存到某些槽里
redis cluster 集群会平均分配一定数量的槽,由各个 redis 节点进行管理。
- cluster 集群模式
- 由多个 redis 服务器组成的分布式网络服务集群
- 多个主节点,每个节点都可写可读
- 节点之间可以互相通信
- cluster 应用场景
- 数据量特别大
1、安装Ruby:http://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.3.3-x64.exe
2、下载 redis-trib.rb https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100 下载 Source code(zip) 源码包
3、配置 Ruby :在cmd命令行执行 gem install redis
4、复制6份Redis作为6个节点,分别命名为8081、8082、8083、8084、8085 和 8086
5、修改 Redis 各节点中的 redis.windows.conf 配置文件
#端口号改为8081,其他5个端口号分别为 8082、8083、8084、8085、8086
port 8081
#开启集群模式
cluster-enabled yes
#保存节点配置,自动创建,自动更新(建议命名时加上端口号)
cluster-config-file nodes-8081.conf
#集群超时时间,节点超过这个时间没反应就断定是宕机
cluster-node-timeout 15000
#指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 yes表示:存储方式,aof,将写操作记录保存到日志中
appendonly yes
6、在每个节点目录下创建 start.bat 来启动 redis
title redis-8081
redis-server.exe redis.windows.conf
7、redis-trib.rb 文件复制到 redis 集群的目录下
8、双击各节点文件夹下的 start.bat 文件启动各Redis节点
9、到 redis 集群目录下执行cmd命令:ruby redis-trib.rb create --replicas 1 127.0.0.1:8081 127.0.0.1:8082 127.0.0.1:8083 127.0.0.1:8084 127.0.0.1:8085 127.0.0.1:8086
redis-trib:创建集群的工具
1、每个节点要独立,且db为空
2、检查 master 节点数目必须大于三个
3、计算每个 master 要分配的 slot 数量,以及给 master 分配 slave参考:https://www.cnblogs.com/kevingrace/p/9868366.html
注:redis-trib 集群命令只需要执行一次,以后只需要执行各节点的 start.bat 即可
10、yes( 配置主节点和从节点)
Cluster 中的主从模式,从节点默认不具备 读和写 的功能,读写操作会默认重定向给主节点
从节点 : port>readonly 在从节点上使用 readonly 命令,可以让从节点允许 get 功能(相当于告诉从节点,只读不写)
127.0.0.1:8084> readonly OK 127.0.0.1:8084> get aa "m"
11、分配各个槽点至各个节点,配置完毕
12、./redis-cli.exe -c -p port 进入某个节点
// set
127.0.0.1:8081> set name 44
-> Redirected to slot [5798] located at 127.0.0.1:8082
OK
127.0.0.1:8082>// get
127.0.0.1:8083> get name
-> Redirected to slot [5798] located at 127.0.0.1:8082
"44"
127.0.0.1:8082>
cluster 集群命令:https://www.cnblogs.com/mumian2/p/10626509.html
cluster info
cluser nodes
redis & mysql
- redis 存放一些用户最常用到的数据,如最新消息、排行榜等,用户在查看消息时,可以先从 redis 中查询是否存在,若不存在,则去 mysql 中查询,并将查询的结果放在 redis 中(放在 redis 中的数据最好设置过期时间,若 redis 数据量太大会占用较多内存)
redis数据库的主从、哨兵和cluster模式的实现原理与搭建详解(win10系统)相关推荐
- 图文详解 epoll 原理【Redis,Netty,Nginx实现高性能IO的核心原理】epoll 详解
[Redis,Netty,Nginx 等实现高性能IO的核心原理] I/O 输入输出(input/output)的对象可以是文件(file), 网络(socket),进程之间的管道(pipe).在li ...
- Day267.预约系统的性能瓶颈、营销活动无缝切换秒杀活动、预约系统数据迁移方案、高流量下预约系统搭建熔断机制、预约系统redis集群主从哨兵架构 -Redis的高并发预约抢购系统
一.预约系统的性能瓶颈 1.预约系统应对热门爆品时的缺陷 用户进行预约会涉及到两个维度的数据变更一个是用户信息,一个是SKU信息,如图↓所示: 正常来说这么搞一点问题没有,即便涉及到写数据库,但是每个 ...
- redis队列优先级java实现_Redis 实现队列原理的实例详解
Redis 实现队列原理的实例详解 场景说明: ·用于处理比较耗时的请求,例如批量发送邮件,如果直接在网页触发执行发送,程序会出现超时 ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后 ...
- mysql cluster rpm包的作用_MySQL之——MySQL Cluster集群搭建详解(基于RPM安装包)
1.下载MySQL-cluster 7.3.7 http://dev.mysql.com/downloads/cluster/ 2.环境清理及安装 1)清理CentOS6.5自带的mysql服务,其中 ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- 工程之星android版使用,安卓版工程之星软件网络1+1模式及网络cors连接操作详解...
原标题:安卓版工程之星软件网络1+1模式及网络cors连接操作详解 现在,越来越多用户开始使用安卓版工程之星进行作业,科力达技术工程师总结了安卓版工程之星网络1+1模式及网络CORS连接方式操作步骤, ...
- java 配置jmstemplate_SpringBoot集成JmsTemplate(队列模式和主题模式)及xml和JavaConfig配置详解...
1.导入jar包: org.springframework.boot spring-boot-starter-activemq org.apache.activemq activemq-pool 2. ...
- 命令行模式下几个网络命令详解
命令行模式下几个网络命令详解 上一篇 / 下一篇 2007-05-16 16:20:55 查看( 166 ) / 评论( 0 ) / 评分( 0 / 0 ) 命令行模式下几个网络命令详解 一.pin ...
- 并网模式微电网逆变器VSG控制_SIMULINK_模型搭建详解
背景 在微电网中,采用电压控制型VSG可以实现并网.离网.以及两种模式的无缝切换,能够为微电网系统提供电压和频率支撑:就应用范围而言,电压控制型相较于电流控制型的VSG适用范围更广.基于电压控制型VS ...
最新文章
- Spring+Mybatis多数据源配置
- 视频操作_02视频追踪:meanshift算法+Camshift算法
- java 内部类 作用_java内部类的作用分析
- 递归总结 By greenhand
- linux shell解析1
- 3种方法实现http虚拟主机
- 作业车间调度问题特征与调度效率相关性的研究Correlation of job-shop scheduling problem features with scheduling efficiency
- Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day33】—— 手撸算法2
- 随便举个例子,说明单线程比多线程编程提高性能
- Superset航班数据可视化实战
- 三国合肥会战\孙仲谋二战张文远\张辽威震逍遥津\张辽八百骑打破孙仲谋
- 实现点击按钮 复制文本内容
- matlab自带电机案例,MATLAB电机仿真精华50例,源代码
- 【区块链】深入剖析免费赚钱app的本质
- 非计算机类专业毕业生五年程序员职业生涯的回顾和思考
- 【原创】Ubuntu 下使用 NCverilog 仿真 Verilog 工程
- 目标检测 YOLOv5 - 如何提高模型的指标,提高精确率,召回率,mAP等
- 电化学微量元素分析仪的执行标准
- 滴滴技术牛逼吗?看它开源了哪些有意思的项目
- How to Perfectly Uninstall Nero 11