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中设置一个具有唯一标识的占位符元素,然后在组件中通过路由实例访问这个元素并修改其内容或样式来实现区域切换。路由的编程式导航可以…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
