Redis-02-集群
一、redis5搭建集群
1.1、案例:搭建6台redis主机,配置如下
- redis并发量:https://www.gxlcms.com/redis-350423.html
- 主机IP:192.168.168.60~65
- 修改redis配置文件
- hash槽移动,槽内的数据也随之移动
[root@60 ~]# vim /etc/redis/6379.confport 6360 bind 192.168.168.60 //本机iPcluster-enabled yes //启用集群功能cluster-config-file nodes-6360.conf //存储集群信息文件cluster-node-timeout 5000 //和其他主机连接超时时间(毫秒)
- 重启并查看端口
[root@60 ~]# /etc/init.d/redis_6379 restart
[root@60 ~]#
[root@60 ~]# netstat -ntpl |grep redis
tcp 0 0 192.168.168.60:16360 0.0.0.0:* LISTEN 3394/redis-server 1
tcp 0 0 192.168.168.60:6360 0.0.0.0:* LISTEN 3394/redis-server 1
# 有两个端口,另一个是集群端口
- 创建集群,redis5创建集群的命令是用C语言写的,固直接使用redis-cli创建
[root@60 ~]# redis-cli --cluster create \
>192.168.168.60:6360 \
>192.168.168.61:6361 \
>192.168.168.62:6362 \
>192.168.168.63:6363 \
>192.168.168.64:6364 \
>192.168.168.74:6374 \
--cluster-replicas 1~~~
[OK] All 16384 slots covered.
1.2、查看集群信息
- 可通过ID号来分辨谁是主谁是从
[root@60 ~]# cat /var/lib/redis/6379/nodes-6360.conf
a8d25a9390b1fabc2c71066a421f75ca83164068 192.168.168.74:6374@16374 slave ce4577b185a1de74f19336ea097cfaba7287a6db 0 1614424935501 6 connected
96b11bcc1a22f00196990dd98c9ba10977b15853 192.168.168.60:6360@16360 myself,master - 0 1614424934000 1 connected 0-5460
46d9b27d6a5ae7404f5d3a9d237838d20d40eddb 192.168.168.62:6362@16362 master - 0 1614424934498 3 connected 10923-16383
3afa277b144f764cdab7001666332de6e84319d6 192.168.168.64:6364@16364 slave 96b11bcc1a22f00196990dd98c9ba10977b15853 0 1614424934000 5 connected
0b5db3a2284d6f76ed7926f0da7619a175f66886 192.168.168.63:6363@16363 slave 46d9b27d6a5ae7404f5d3a9d237838d20d40eddb 0 1614424936003 4 connected
ce4577b185a1de74f19336ea097cfaba7287a6db 192.168.168.61:6361@16361 master - 0 1614424934000 2 connected 5461-10922
vars currentEpoch 6 lastVoteEpoch 0
[root@60 ~]# redis-cli -h 192.168.168.60 -p 6360 -c
192.168.168.60:6360>
192.168.168.60:6360> cluster nodes
192.168.168.60:6360> cluster info
cluster_state:ok
cluster_slots_assigned:16384 #总共16384个hash槽
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6 #总共6个节点
cluster_size:3 # 3个主节点
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:1937
cluster_stats_messages_pong_sent:1910
cluster_stats_messages_sent:3847
cluster_stats_messages_ping_received:1905
cluster_stats_messages_pong_received:1937
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:3847
1.3、hash槽以及key存储
- hash槽分配
使用cluster info 可查看hash槽的个数,cluster nodes 可查看每个主节点的hash槽范围
使用key存储时,key值与CRC16算法取到一个值,该值与hash槽数取余(值/16384)得到的结果便为存放在hash槽的槽号
- 排错
[root@60 ~]# redis-cli -h 192.168.168.60 -p 6360
192.168.168.60:6360>
192.168.168.60:6360> set name bob
(error) MOVED 5798 192.168.168.74:6374 #该错误代表没有启用集群模板所致
- 解决方案
使用 "-c" 启用集群模板
[root@60 ~]# redis-cli -c -h 192.168.168.60 -p 6360
192.168.168.60:6360> keys *
(empty list or set)
192.168.168.60:6360> set name bob
-> Redirected to slot [5798] located at 192.168.168.74:6374
OK
192.168.168.74:6374>
二、集群参数
2.1、集群命令
- add-node #添加节点
- del-node #删除节点,
- reshard #重新划分槽
- info #查看集群主从
- check #检查集群状态
2.2、集群内部命令
- cluster reset #重置当前集群主机并重置集群文件
- info replication #查看集群信息和当前角色
- 案例
redis集群:一个主宕掉之后,从会升级成主
add-nodes: 默认添加主节点,--cluster-slave 添加从节点,需要指定主节点#添加为主库后默认是没有hash槽,需要划分hash槽
- 案例
添加67主机为master服务器:
添加时不指定主机角色,默认新主机被选为master;且需要手动分配hash槽(slots):::
1:添加master
2:手动分配hash槽
(1):add-node 添加主机,默认为master redis-cli --cluster add-node 192.168.168.67:6367 集群任意一台masterip:端口
(2):reshard 重新分配hash槽redis-cli --cluster reshard 192.168.168.67:63671:hash槽增加个数,2:要划分槽的master主机的ID号,3:all/masterID号 all代表所有,masterID 需回车后数 done4:yes完成
(3):hash槽查看redis-cli --cluster info 集群任意一台主机IP:端口
3:添加slave节点redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave
4:移除slave节点:
5:移除master节点:需要先移除hash槽,
[root@74 ~]# redis-cli --cluster add-node 192.168.168.67:6367 192.168.168.74:6374
[root@74 ~]# cat /var/lib/redis/6379/nodes-6374.conf
...
0b5db3a2284d6f76ed7926f0da7619a175f66886 192.168.168.63:6363@16363 master - 0 1614596774544 9 connected 10923-16383
a042887465d75de9b5dc022161f9072f58479880 192.168.168.67:6367@16367 master - 0 1614596774749 0 connected
#添加集群成功,但是没有hash槽,默认为master
...
[root@74 ~]# redis-cli --cluster reshard 192.168.168.67:6367
[root@74 ~]#
[root@74 ~]# cat /var/lib/redis/6379/nodes-6374.conf
a042887465d75de9b5dc022161f9072f58479880 192.168.168.67:6367@16367 master - 0 1614596970036 10 connected 0-1364 5461-6826 10923-12287
[root@62 ~]# redis-cli --cluster info 192.168.168.62:6362
192.168.168.63:6363 (0b5db3a2...) -> 1 keys | 4096 slots | 1 slaves.
192.168.168.74:6374 (a8d25a93...) -> 0 keys | 4096 slots | 1 slaves.
192.168.168.67:6367 (a0428874...) -> 2 keys | 4096 slots | 0 slaves.
192.168.168.64:6364 (3afa277b...) -> 1 keys | 4096 slots | 1 slaves.
[OK] 4 keys in 4 masters.
0.00 keys per slot on average.
移除从库时,会停掉从库,该从库目录下集群文件不变,所以启动时会自动加载集群文件
移除主库时,先移除的主库Hash槽1:移除多少个hash slots
2:接收hash槽主机的ID
3:移除hash槽主机的ID all/id+done
4:yes
三、Redis主从同步
- 主从架构:一主一从,一主多从,主从从
3.1、临时设置成主从
- info replication #登录后查看角色信息
- slaveof 主库ip 端口 #从库指定谁是主库,适用于一主一从,一主多从,主从从,临时生效
- slaveof on one #主库宕机后,从库恢复成主库
192.168.168.68:6368> SLAVEOF 192.168.168.67 6367 #指定67为68的主库
OK Already connected to specified master
192.168.168.68:6368> info replication
# Replication
role:slave
master_host:192.168.168.67
master_port:6367
master_link_status:up
192.168.168.73:6373> SLAVEOF 192.168.168.68 6368 #主从从结构配置
3.2、永久配置主从
- 主库配置:开启密码验证
[root@67 ~]# grep -n requirepass /etc/redis/6379.conf
508:requirepass 123456
- 从库配置:指定主库与主库密码
[root@68 ~]# sed -n "287p;294p" /etc/redis/6379.conf
replicaof 192.168.168.67 6367 #主库IP 端口
masterauth 123456 #主库密码
- 主从从配置,从库的从库配置
[root@73 ~]# sed -n "287p" /etc/redis/6379.conf
replicaof 192.168.168.68 6368
- 哨兵模式
简介:slave节点监视master节点,发现master节点宕机后,slave节点选举出一个新的master,原来的master节点恢复后自动变成从,但是要注意密码。
哨兵模式适用于主从从,一主多从
主库配置:
[root@67 ~]# vim /etc/redis/6379.conf bind 192.168.168.67port 6367requirepass "123456"masterauth 123456
从库配置1
[root@68 ~]# vim /etc/redis/6379.conf bind 192.168.168.68port 6368replicaof 192.168.168.68 6368 #指定主库requirepass "123456"masterauth 123456
# 从库配置2,创建监视文件,启用哨兵服务
[root@68 ~]# vim /etc/sentinel.conf #新建conf文件
sentinel monitor host-minoter 192.168.168.68 6368 1 #Hhost-minoter给监视的主机起名字,主机+端口,1代表投票的票数
sentinel auth-pass host-minoter 123456 #主库密码
# 从库启动监视器
[root@68 ~]# redis-sentinel /etc/sentinel.conf
....
在终端输出
四、数据持久化
- RDB:dump.rdb(默认),Redis database
- AOF:*.aof,append only file
4.1、RDB
- 简介
数据持久化默认方式
按照指定时间间隔,将内存中的数据快照写到硬盘
快照术语叫 Snapshot
恢复时,将快照文件直接写入内存;
- 优点,缺点
优点:高性能的持久化,创建一个子进程来执行持久化,先将数据写入临时文件,持久化结束后,再将这个临时文件替换上次持久化好的文件;替换过程中主进程不做任何的IO操作;解释:主进程只负责处理客户端的请求,不对磁盘做IO操作。
意外宕机时,丢失最后一次持久化的所有数据
- 相关配置参数
图片讲解:http://tts.tmooc.cn/ttsPage/VIP/NSDVN201805/NOSQL/DAY03/COURSE/LINUXNSD_V04NOSQLDAY03_019.png
相关配置参数:http://tts.tmooc.cn/ttsPage/VIP/NSDVN201805/NOSQL/DAY03/COURSE/LINUXNSD_V04NOSQLDAY03_020.png
文件名:
dbfilename "dump.rdb"
save "" #禁用rdb
数据从内存报错到硬盘的频率
save 900 1 //900s内且有一次修改,
save 300 10 //300s内且有10次修改
save 60 10000 //60s内且有10000次修改
4.2、AOF
- 简介
追加方式记录写操作的文件
记录redis服务所有写操作
不断的将新的写操作,追加到文件的末尾;
默认没有启用, 在vim +673 /etc/redis/6379.conf(产生的数据文件必须有开启AOF的才能使用)
可以用cat命令查看;
- 相关配置参数
appendonly no #aof默认没有开启
appendfilename "appendonly.aof"appendfsync always #写一次记一次
appendfsync everysec #默认为每秒一次,并完成磁盘同步
appendfsync no #写入aof时,不执行磁盘同步
auto-aof-rewrite-min-size 64mb //首次重写触发值
auto-aof-rewrite-percentage 100 //再次重写,增长100%
解释:首次瘦身为64mb 当第二次数据达到64mb时,进行瘦身,将第一次和第二次的数据把有相同命令的数据合并,最后瘦身剩下一个数值A(50),当第三次数据达到A(50)时,A与A对比,把有相同的数据合并剩余B(80)
- 修复AOF文件
把文件恢复到最后一次的正确操作
redis-check-aof --fix appendonly.aof
- 优点、缺点
优点:
可以灵活设置持久化方式,同步持久化appendfsync alwayls 或 异步持久化 appendfsync verysec
出现意外宕机时:仅可能丢失1秒的数据
缺点:
持久化文件的体积通常会大于RDB方式
执行fsync策略时的速度可能会比RDB方式慢
相关文章:

Redis-02-集群
一、redis5搭建集群 1.1、案例:搭建6台redis主机,配置如下 redis并发量:https://www.gxlcms.com/redis-350423.html主机IP:192.168.168.60~65修改redis配置文件hash槽移动,槽内的数据也随之移动 [root60 ~]# vim /e…...

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优
1.ModelArts云上调试调优 ModelArts密钥初始化 详细教程: 初始化OBS服务 创建训练作业 2.MindSpore IDE插件效率提升 通过智能代码块推荐、代码自动补全等特性,提升MindSpore脚本开发效率,对接ModelArts云服务,实现模型训…...

python笔记17_实例演练_二手车折旧分析p2
…… 书接上文 4.车辆等级维度 探查车龄为5年的车辆,折旧价值与车辆等级的关系。 # 筛选出车龄为5的数据创建新表 data_age5 data[data[age] 5] data_age5 # 分组聚合计算均值 data_car_level data_age5.groupby(car_level_name)[lowest_price].mean().reset…...

android 12.0长按Power弹出关机对话框去掉屏幕截图和紧急呼救功能
1.概述 在12.0的系统长按关机键,会弹出关机的对话框,关机对话框里面由关机重启截图和紧急呼叫等功能,而由于开发功能需求要求去掉屏幕截图和紧急呼叫等功能,所以就要先找到关机对框的代码 然后实现功能 功能分析: 长按电源键弹出关机对话框,通过adb shell命令发现 就是f…...

2023年下半年软考高级需要报班吗?
首先,对于软考高级考试报班与否的问题,需要根据自身的情况来做出决定。如果你有较强的自学能力,且具备丰富的实际工作经验和技术知识,那么不报班也完全可以自学备考。但如果你对软件工程的知识掌握程度较低,或者时间紧…...

使用WordPress提高企业敏捷性
喜欢WordPress的原因有很多:该平台非常适合内容管理以及控制预算。此外, 在 提高开发效率和简化项目管理方面,WordPress可以通过多种方式提供帮助。 对于任何企业业务,目标始终是在不影响质量的情况下更快地启动项目、发布修复和…...

SSM编程---Day 07
目录 SpringMVC 一、概念 二、springMVC的请求处理流程 三、mvc:annotation-driven 标签的作用 四、HandlerMapping、Handler和HandlerAdapter的介绍 五、SpringMVC 体系结构 六、SpringMVC的常用注解 七、view和controller之间的传值 SpringMVC 一、概念 1、 Spring…...

Seata术语
1.什么是Seata Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 官网 2.Seata能干嘛 一个典型的分布式事务过程 分布式事务处理过程的一ID三组件模型: Transaction ID XID 全局唯一的事务ID三组…...

【Axure教程】通过文本框维护下拉列表选项
下拉列表(Dropdown List)是一种常见的用户界面元素,用于提供一组选项供用户选择。它通常以一个展开的列表形式出现,用户可以点击或选择列表中的一个选项。一般来说,他的选项值是由系统代码组成的,所以一般是…...

【C++】基础知识--输入/输出(5)
前面部分的示例程序几乎没有提供与用户的交互(如果有的话)。他们只是在屏幕上打印简单的值,但标准库提供了许多其他方式通过其输入/输出功能与用户交互。本节将简要介绍一些最有用的方法。 cin标准输入cout标准输出cerr标准错误(输…...

经典文献阅读之--PIBT(基于可见树的实时规划方案)
0. 简介 作为路径规划而言,不单单有单个机器人自主路径规划,近年来随着机器人行业的兴起,多机器人自主路径规划也越来越受到关注,对于多智能体寻路(MAPF)。一般的操作会给定一个地图、机器人集群、以及它们的初始位置和目的地&am…...

SAP-MM-计算方案字段解析
01、 “步骤”:标识此条件类型在计算方案中的顺序编号,此编号会影响到后续业务中条件类型的排序,不同条件类型之间的编号最好间隔大一些,这样设置便于以后对计算方案进行扩展; 02、 “计数器”࿱…...

go-gf框架两个表以事务方式写入示例
下面是对每一行代码的中文解释: // 创建数据库连接对象 var tx gdb.TX这行代码声明了一个名为tx的变量,类型为gdb.TX,表示数据库事务对象。 // 开启事务 if tx, err g.DB().Ctx(ctx).Begin(ctx); err nil {这行代码通过在数据库连接&…...

2023-5-31第三十一天
conform顺从,遵从,一致 squeeze挤压 proprietary专卖权,专利的,所有的 endeavor努力,尽力 comprise由...组成,包含 compose组成,写作 compact小型的 consult咨询,查阅 expan…...

什么是MQTT?mqtt协议和http协议区别
摘要: 什么是MQTT?MQTT(Message Queuing Telemetry Transport)译为:消息队列遥测传输,是一种轻量级的通讯协议,用于在网络上传输消息。MQTT 最初由 IBM 发布,后来成为 OASIS…...

平台使用篇 | 批处理(bat)脚本使用教程(四)
导读 一个开启多机软件在环仿真的批处理文件 (对应卓面RflyTools文件夹中SITLRun快捷方式),双击它,输入想要生成的飞机数量,即可生成多机软件在环仿真,等待RflySim3D显示3DFixed 4/4,然后可通过QGC控制飞机起飞。运行…...

接口的讲解
在这里之前我想童鞋们都学习过了springmvc。mybatis-plus。Springboot等一些框架 那么下面我们就整合这些框架 我们通过写crud这些接口 写接口的第一步就是引入pom文件 在pom文件里引入一下几种依赖 引入父级工程 thymeleaf导入模版工具类 SpringMVCjar包文件 热部署工具 l…...

G0第21章 :gin框架介绍、RESTful API、Gin渲染
G0第21章 :gin框架 01 内容介绍 https://gin-gonic.com/zh-cn/docs/ web本质 Web是基于HTTP协议进行交互的应用网络Web就是通过使用浏览器/APP访问的各种资源 package mainimport ("fmt""net/http" )func sayHello(w http.ResponseWriter, r…...

python list,dict操作
一、list 操作 Python中的列表是一种有序、可变的数据类型,可以存储任意类型的数据。以下是Python中常用的列表操作: 创建列表:使用[]或list()函数创建一个空列表,或者使用[value1, value2, ...]创建一个包含初始值的列表。 访问…...

我有一个页面a,在页面a中调用了一个组件,然后组件中要切换页面a的一块区域,该怎么实现?
你可以在组件中使用路由的编程式导航,通过访问路由实例来切换页面a的对应区域。具体来说,你可以先在页面a中设置一个具有唯一标识的占位符元素,然后在组件中通过路由实例访问这个元素并修改其内容或样式来实现区域切换。路由的编程式导航可以…...

ChatGPT唤醒AI游戏:AIGC持续走深,游戏或成AI最佳抓手
随着人工智能技术的不断发展,AI在游戏行业的应用日益深入。本文将详细探讨ChatGPT在AI游戏领域的应用,以及游戏如何成为AI技术的最佳抓手。让我们一起探讨这个有趣且充满潜力的领域。 一、引言 人工智能在各行各业都取得了巨大的成功,而游戏…...

远程服务和web服务和前端,三方通过socket和websocket进行双向通信传输数据
1. 什么是socket? 在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。 2. 什么是websocket?…...

Linux 网络基础(2)应用层(http/https协议、请求格式、响应格式、session、cookie、加密传输)
说明:网络基础2讲解的是应用层的典型协议, 通过对于典型协议的理解,来体会数据的网络传输的软件层面的流程与原理。 面试中网络通信相关问题占了很大的比重,而网络通信相关的问题大多都集中在网络基础2这个单元中 下面是应用层的位…...

解决sshfs挂载报错
使用ssh命令和sshfs命令报错 read: Connection reset by peer rootjiangcheng01:~/common/remote# sshfs -o allow_other htrdxxx.xxx.xxx.xxx:/home/htrd /root/common/remote/dev01 read: Connection reset by peer 报错问题排查,追加命令 -o debug -o sshf s_d…...

由于过多的连接错误而被 MySQL服务器 阻止
Caused by: com.mysql.cj.exceptions.CJException: null, message from server: "Host 10.105.***.** is blocked because of many connection errors; unblock with mysqladmin flush-hosts" 这个错误可能表示当您尝试使用 IP 地址为 "10.105.***.**" 的…...

Go语言实现JDBC
Go语言操作数据库 Go语言提供了关于数据库的操作,包下有sql/driver 该包用来定义操作数据库的接口,这保证了无论使用哪种数据库,操作方式都是相同的; 准备工作: 下载驱动 需要在代码所在文件夹下执行相应的命令 go get github.com/go-sql-driver/mys…...

ubuntu修改环境变量的几种方法
ubuntu修改环境变量的几种方法 有多种方法可以修改Ubuntu系统的环境变量,包括: 临时修改环境变量:在终端中使用export命令可以临时修改环境变量。例如,要将PATH环境变量添加到新目录,可以运行以下命令: …...

基于html+css的图展示95
准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…...

数据库基础——5.运算符
这篇文章我们来讲一下SQL语句中的运算符操作。 说点题外话:SQL本质上也是一种计算机语言,和C,java一样的,只不过SQL是用来操作数据库的。在C,java中也有运算符,这两种语言中的运算符和数学中的运算符差距不…...

JMeter 性能测试基本过程及示例
jmeter 为性能测试提供了一下特色: 2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!_哔哩哔哩_bilibili2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集!共计11条视频&…...