网站设计厂/西安今日头条新闻消息
目录
- 1. 文章前言
- 2. 基本概念
- 2.1 主从复制的问题
- 2.2 人工恢复主节点故障
- 2.3 哨兵机制自动恢复主节点故障
- 3. 安装部署哨兵(基于docker)
- 3.1 安装docker
- 3.2 编排redis主从节点
- 3.3 编排redis-sentinel节点
- 4. 重新选举
- 5. 选举原理
- 6. 总结
1. 文章前言
(1)Redis的主从复制模式下,一旦主节点由于故障不能提供服务,需要人工进行主从切换,同时大量的客户端需要被通知切换到新的主节点上,对于上了一定规模的应用来说,这种方案是无法接受的,于是Redis从2.8开始提供了Redis Sentinel (哨兵)来解决这个问题。本章主要内容如下:
- Redis Sentinel的概念。
- Redis Sentinel的部署。
- Redis Sentinel命令。
- Redis Sentinel客户端。
- Redis Sentinel实现原理。
2. 基本概念
(1)由于对Redis的许多概念都有不同的名词解释,所以在介绍Redis Sentinel之前,先对几个名词概念进行必要的说明,如下表所示。
Redis Sentinel是Redis的高可用实现方案,在实际的生产环境中,对提高整个系统的高可用是非常有帮助的,本节首先整体梳理主从复制模式下故障处理可能产生的问题,而后引出高可用的概念,最后重点分析Redis Sentinel的基本架构、优势,以及是如何实现高可用的。
2.1 主从复制的问题
(1)Redis的主从复制模式可以将主节点的数据改变同步给从节点,这样从节点就可以起到两个作用:
- 第一,作为主节点的一个备份,一旦主节点出了故障不可达的情况,从节点可以作为后备“顶” 上来,并且保证数据尽量不丢失(主从复制表现为最终一致性) 。
- 第二,从节点可以分担主节点上的读压力,让主节点只承担写请求的处理,将所有的读请求负载均衡到各个从节点上。但是主从复制模式并不是万能的,它同样遗留下以下几个问题:
- 主节点发生故障时,进行主备切换的过程是复杂的,需要完全的人工参与,导致故障恢复时间无法保障。
- 主节点可以将读压力分散出去,但写压力/存储压力是无法被分担的,还是受到单机的限制。
其中第一个问题是高可用问题,即Redis哨兵主要解决的问题。第二个问题是属于存储分布式的问题,留给Redis集群去解决,本章我们集中讨论第一个问题。
2.2 人工恢复主节点故障
(1)Redis主从复制模式下,主节点故障后需要进行的人工工作是比较繁琐的,我们在图中大致展示了整体过程。redis主节点故障后需要进行的操作:
- 运维人员通过监控系统,发现Redis主节点故障宕机。
- 运维人员从所有节点中,选择- -个(此处选择了slave 1)执行slaveof no one,使其作为新的主节点。
- 运维人员让剩余从节点(此处为slave 2)执行slaveof {newMasterlp} {newMasterPort}从新主节点开始数据同步。
- 更新应用方连接的主节点信息到{newMasterlp} {newMasterPort}。
- 如果原来的主节点恢复,执行slaveof {newMasterlp} {newMasterPort}让其成为一个从节点。
上述过程可以看到基本需要人工介入,无法被认为架构是高可用的。而这就是Redis Sentinel所要做的。
2.3 哨兵机制自动恢复主节点故障
(1)当主节点出现故障时,Redis Sentinel能自动完成故障发现和故障转移,并通知应用方,从而实现真正的高可用。
- Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下线表示。
- 如果下线的是主节点,它还会和其他的Sentinel节点进行“协商” ,当大多数Sentinel节点对主节点不可达这个结论达成共识之后,它们会在内部“选举” 出一 个领导节点来完成自动故障转移的工作,同时将这个变化实时通知给Redis应用方。整个过程是完全自动的,不需要人工介入。整体的架构如图所示。
- 这里的分布式架构是指: Redis 数据节点、Sentinel 节点集合、客户端分布在多个物理节点上,不要与后边章节介绍的Redis Cluster分布式混淆。
(2)Redis Sentinel架构:
(3)Redis Sentinel相比于主从复制模式是多了若干(建议保持奇数) Sentinel 节点用于实现监控数据节点,哨兵节点会定期监控所有节点(包含数据节点和其他哨兵节点)。针对主节点故障的情况,故障转移流程大致如下:
- 主节点故障,从节点同步连接中断,主从复制停止。
- 哨兵节点通过定期监控发现主节点出现故障。哨兵节点与其他哨兵节点进行协商,达成多数认同主节点故障的共识。这步主要是防止该情况:出故障的不是主节点,而是发现故障的哨兵节点,该情况经常发生于哨兵节点的网络被孤立的场景下。
- 哨兵节点之间使用Raft算法选举出一个领导角色,由该节点负责后续的故障转移工作。
- 哨兵领导者开始执行故障转移:从节点中选择一个作为新主节点;让其他从节点同步新主节点;通知应用层转移到新主节点。
(4)通过上面的介绍,可以看出Redis Sentinel具有以下几个功能:
- 监控:Sentinel节点会定期检测Redis数据节点、其余哨兵节点是否可达。
- 故障转移:实现从节点晋升(promotion) 为主节点并维护后续正确的主从关系。
- 通知:Sentinel节点会将故障转移的结果通知给应用方。
3. 安装部署哨兵(基于docker)
3.1 安装docker
(1)安装docker和docker-compose:
- docker-compose的安装:
# ubuntu
apt install docker-compose
# centos
yum install docker-compose
(2)停止之前的redis-server:
# 停⽌ redis-server
service redis-server stop
# 停⽌ redis-sentinel 如果已经有的话.
service redis-sentinel stop
(3)使用docker获取redis镜像:
docker pull redis:5.0.9
3.2 编排redis主从节点
(1)编写docker-compose. yml:
- 创建docker-compose.yml文件,同时cd到yml所在目录中。
- 注意:docker中可以通过容器名字,作为ip地址,进行相互之间的访问。
version: '3.7'
services:master:image: 'redis:5.0.9'container_name: redis-masterrestart: alwayscommand: redis-server --appendonly yesports: - 6379:6379slave1:image: 'redis:5.0.9'container_name: redis-slave1restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6380:6379slave2:image: 'redis:5.0.9'container_name: redis-slave2restart: alwayscommand: redis-server --appendonly yes --slaveof redis-master 6379ports:- 6381:6379
(2)启动所有容器:
docker-compose up -d
如果启动后发现前面的配置有误,需要重新操作,使用docker-compose down即可停止并删除刚才创建好的容器。
(3)查看运行日志:
docker-compose logs
上述操作必须保证工作目录在yml的同级目录中,才能工作.
(4)验证:
- 连接主节点:
[root@host ~]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.22.0.3,port=6379,state=online,offset=348,lag=1
slave1:ip=172.22.0.4,port=6379,state=online,offset=348,lag=1
master_replid:a22196b425ab42ddfd222cc5a64d53acffeb3e63
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:348
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:348
- 连接两个从节点:
[root@host ~]# redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:446
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a22196b425ab42ddfd222cc5a64d53acffeb3e63
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:446
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:446
[root@host ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:slave
master_host:redis-master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:516
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:a22196b425ab42ddfd222cc5a64d53acffeb3e63
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:516
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:516
3.3 编排redis-sentinel节点
(1)也可以把redis-sentinel放到和上面的redis的同一个yml中进行容器编排。此处分成两组,主要是为了两方面:
- 观察日志方便。
- 确保redis主从节点启动之后才启动redis-sentinel。如果先启动redis-sentinel的话,可能触发额外的选举过程,混淆视听(不是说先启动哨兵不行,而是观察的结果可能存在一定随机性)。
(2)编写docker-compose.yml文件:
- 创建docker- compose.yml文件,同时cd到yml所在目录中。
- 注意:每个目录中只能存在一个docker-compose.yml文件。
version: '3.7'
services:sentinel1:image: 'redis:5.0.9'container_name: redis-sentinel-1restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel1.conf:/etc/redis/sentinel.confports:- 26379:26379sentinel2:image: 'redis:5.0.9'container_name: redis-sentinel-2restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel2.conf:/etc/redis/sentinel.confports:- 26380:26379sentinel3:image: 'redis:5.0.9'container_name: redis-sentinel-3restart: alwayscommand: redis-sentinel /etc/redis/sentinel.confvolumes:- ./sentinel3.conf:/etc/redis/sentinel.confports:- 26381:26379
networks:default:external:name: redis-data_default
(3)创建配置文件:
- 创建sentinel1.conf、sentinel2.conf、sentinel3.conf三份文件的内容是完全相同的。都放到/root/redis-sentinel/目录中.
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000
(4)理解 sentinel monitor:
sentinel monitor #主节点名 主节点ip 主节点端⼝ 法定票数
- 主节点名,这个是哨兵内部自己起的名字。
- 主节点ip,部署redis-master的设备ip。此处由于是使用docker,可以直接写docker的容器名,会被自动DNS成对应的容器ip。
- 主节点端口,不解释。
- 法定票数,哨兵需要判定主节点是否挂了。但是有的时候可能因为特殊情况,比如主节点仍然工作正常,但是哨兵节点自己网络出问题了,无法访问到主节点了。此时就可能会使该哨兵节点认为主节点下线,出现误判。使用投票的方式来确定主节点是否真的挂了是更稳妥的做法。需要多个哨兵都认为主节点挂了,票数>=法定票数之后,才会真的认为主节点是挂了。
(5)理解sentinel down-after-milli seconds:
- 主节点和哨兵之间通过心跳包来进行沟通。如果心跳包在指定的时间内还没回来就视为是节点出现故障。
- 既然内容相同为啥要创建多份配置文件?redis-sentinel在运行中可能会对配置进行rewrite,修改文件内容。如果用一份文件,就可能出现修改混乱的情况。
(6)启动所有容器:
docker-compose up -d
如果启动后发现前面的配置有误,需要重新操作,使用docker-compose down 即可停止并删除刚才创建好的容器。
(7)查看运行日志:
docker-compose logs
上述操作必须保证工作目录在yml的同级目录中,才能工作。可以看到哨兵节点已经通过主节点认识到了对应的从节点。
(8)观察redis-sentinel的配置rewrite:
- 再次打开哨兵的配置文件,发现文件内容已经被自动修改了。
bind 0.0.0.0
port 26379
sentinel myid 4d2d562860b4cdd478e56494a01e5c787246b6aa
sentinel deny-scripts-reconfig yes
# Generated by CONFIG REWRITE
dir "/data"
sentinel monitor redis-master 172.22.0.4 6379 2
sentinel down-after-milliseconds redis-master 1000
sentinel config-epoch redis-master 1
sentinel leader-epoch redis-master 1
sentinel known-replica redis-master 172.22.0.2 6379
sentinel known-replica redis-master 172.22.0.3 6379
sentinel known-sentinel redis-master 172.22.0.7 26379 f718caed536d178f5ea6d1316d
sentinel known-sentinel redis-master 172.22.0.5 26379 2ab6de82279bb77f8397c309d3
sentinel current-epoch 1
# Generated by CONFIG REWRITE这里的内容就是自动修改的.
对比这三份文件,可以看到配置内容是存在差异的。
4. 重新选举
(1)手动把redis-master干掉,redis-master宕机之后:
docker stop redis-master
(2)观察哨兵的日志:
(3)可以看到哨兵发现了主节点sdown,进一步的由于主节点宕机得票达到3/2 ,达到法定得票,于是master被判定为odown:
- 主观下线(Subjectively Down, SDown):哨兵感知到主节点没心跳了判定为主观下线.
- 客观下线(Objectively Down, ODown):多个哨兵达成一致意见,才能认为master确实下线了.
(4)接下来,哨兵们挑选出了一个新的master。在上图中,是172.22. 04:6379这个节点。
(5)此时对于Redis来说仍然是可以正常使用的。redis-master重启之后手动把redis-master 启动起来。
docker start redis-master
(6)观察哨兵日志可以看到刚才新启动的redis-master 被当成了slave
(7)使用redis-cli也可以进一步的验证这一点:
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:172.22.0.4
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:324475
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:ececc285a2892fba157318c77ebe1409f9c2254e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:324475
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:318295
repl_backlog_histlen:6181
(8)结论:
- Redis 主节点如果宕机,哨兵会把其中的一个从节点,提拔成主节点.
- 当之前的 Redis主节点重启之后,这个主节点被加入到哨兵的监控中,但是只会被作为从节点使用。
5. 选举原理
(1)假定当前环境如上方介绍,三个哨兵(sentenal1, sentenal2, sentenal3),一个主节点(redis-master),两个从节点(redis-slave1, redis-slave2)。当主节点出现故障,就会触发重新一系列过程:
(2)主观下线:
- 当redis-master宕机,此时redis- master和三个哨兵之间的心跳包就没有了。
- 此时,站在三个哨兵的角度来看,redis-master出现严重故障。因此三个哨兵均会把redis-master判定为主观下线(SDown)。
(3)客观下线:
- 此时,哨兵sentenal1, sentenal2, sentenal3均会对主节点故障这件事情进行投票。当故障得票数>=配置的法定票数之后
sentinel monitor redis-master 172.22.0.4 6379 2
- 在这个地方配置的2,即为法定票数。此时意味着redis-master故障这个事情被做实了。此时触发客观下线(ODown)。
(4)选举出哨兵的leader:
- 接下来需要哨兵把剩余的slave中挑选出- -个新的master。这个工作不需要所有的哨兵都参与。只需要选出个代表(称为leader),由leader负责进行slave升级到master的提拔过程。这个选举的过程涉及到Raft算法
(5)假定一共三个哨兵节点:S1、S2、S3
- 每个哨兵节点都给其他所有哨兵节点,发起一一个"拉票请求"(S1->S2、S1->S3、S2-> S1、S2-> S3、S3-> S1、S3-> S2)。
- 收到拉票请求的节点,会回复一个"投票响应"。响应的结果有两种可能,投or不投。比如S1给S2发了个投票请求,S2就会给S1返回投票响应。到底S2是否要投S1呢?取决于S2是否给别人投过票了(每个哨兵只有一票)。如果S2没有给别人投过票,换而言之,S1是第一个向S2拉票的,那么S2就会投S1。否则则不投。
- 一轮投票完成之后,发现得票超过半数的节点,自动成为leader。如果出现平票的情况(S1投S2、S2投S3、S3投S1、每人一票)就重新再投一次即可。这也是为啥建议哨兵节点设置成奇数个的原因。如果是偶数个,则增大了平票的概率,带来不必要的开销。
- leader节点负责挑选一个slave成为新的master。当其他的sentenal发现新的master出现了,就说明选举结束了。
(6)简而言之,Raft算法的核心就是"先下手为强".谁率先发出了拉票请求,谁就有更大的概率成为leader。这里的决定因素成 了"网络延时"。网络延时本身就带有一定随机性。具体选出的哪个节点是leader这个不重要,重要的是能选出一个节点即可。
(7)leader挑选出合适的slave成为新的master的挑选规则:
- 比较优先级。优先级高(数值小的)的上位。优先级是配置文件中的配置项( slave-priority或者replica-priority)。
- 比较replication offset谁复制的数据多,高的上位。
- 比较run id,谁的id小,谁上位。
(8)当某个slave节点被指定为master之后:
- leader 指定该节点执行slave no one,成为master。
- leader 指定剩余的slave节点,都依附于这个新master。
6. 总结
- 哨兵节点最好是奇数个。方便选举leader,得票更容易超过半数。哨兵节点不负责存储数据。仍然是redis主从节点负责存储。
- 哨兵+主从复制解决的问题是"提高可用性",不能解决"数据极端情况下写丢失"的问题。
- 哨兵+主从复制不能提高数据的存储容量。当我们需要存的数据接近或者超过机器的物理内存,这样的结构就难以胜任了。
相关文章:

Redis的哨兵机制
目录 1. 文章前言2. 基本概念2.1 主从复制的问题2.2 人工恢复主节点故障2.3 哨兵机制自动恢复主节点故障 3. 安装部署哨兵(基于docker)3.1 安装docker3.2 编排redis主从节点3.3 编排redis-sentinel节点 4. 重新选举5. 选举原理6. 总结 1. 文章前言 &…...

CSS系列(1)-- 选择器体系详解
前端技术探索系列:CSS 选择器体系详解 🎯 致读者:探索 CSS 选择器的奥秘 👋 前端开发者们, 今天我们将深入探讨 CSS 选择器体系,这是构建优雅样式表的基础。让我们一起学习如何精确地选中并控制网页中的…...

用Python开发打字速度测试小游戏
本文将带你一步步开发一个简单的打字速度测试小游戏,通过随机生成词组并计算用户输入速度,帮助提升打字技能。 一、功能描述 随机生成一段句子,用户需要尽快输入。计时功能,统计用户输入的总时长。对比正确率和速度,给出评分反馈。二、开发环境 语言:Python依赖库:pygam…...

基于gitlab API刷新MR的commit的指定status
场景介绍 自己部署的gitlab Jenkins,并已经设置好联动(如何设置可以在网上很容易搜到)每个MergeRequest都可以触发多个Jenkins pipeline,pipeline结束后会将状态更新到gitlab这个MR上希望可以跳过pipeline运行,直接将指定的MR的指定pipeline状态刷新为…...

服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs࿰…...

Spark on Yarn安装配置,大数据技能竞赛(容器环境)
Spark on Yarn模式,即把Spark作为一个客户端,将作业提交给Yarn服务,由于在生产环境中,很多时候都要与Hadoop使用同一个集群,因此采用Yarn来管理资源调度,可以有效提高资源利用率。 环境说明: 服…...
遣其欲,而心自静 -- 33DAI
显然,死做枚举只能的50分。 错了4次总算对了。 大体思路: 因题目说只有两个因数,那么有两种情况: 1:两个质数相乘,如:3*515 5*745 等(不包括5*525 或5*315 重复计算\ 因为3*5算了…...

No.25 笔记 | 信息收集与Google语法的实践应用
什么是信息收集? 信息收集(Information Gathering)是渗透测试的第一步,其目的是通过各种手段收集目标的漏洞和弱点,为后续的攻击策略提供依据。 正所谓“知己知彼,百战百胜”,信息收集的重要性…...

GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册
文章目录 GitLab基础环境部署:Ubuntu 22.04.5系统在线安装GitLab 17.5.2实操手册一、环境准备1.1 机器规划1.2 环境配置1.2.1 设置主机名1.2.2 停止和禁用防火墙1.2.3 更新系统 二、GitLab安装配置2.1 安装GitLab所需的依赖包2.2 添加GitLab存储库2.2.1 将GitLab存储…...

SpringBoot3配置文件
一、统一配置管理概述: SpringBoot工程下,进行统一的配置管理,你想设置的任何参数(端口号、项目根路径、数据库连接信息等等)都集中到一个固定位置和命名的配置文件(application.properties或application.yml)中 配置文件应该放置在Spring Boot工程的s…...

【机器学习】任务十二:循环神经网络
1.循环神经网络 1.1 什么是循环神经网络(RNN)? 循环神经网络(Recurrent Neural Network, RNN) 是一种用于处理序列数据的神经网络类型,它的主要特点是拥有循环连接,使得网络可以对序列中的每个…...

【返璞归真】-切比雪夫不等式(Chebyshev‘s Inequality)
切比雪夫不等式(Chebyshev’s Inequality) 切比雪夫不等式是概率论中的一个基本不等式,用于估计随机变量偏离其期望值一定范围的概率。它对于任何具有有限期望和有限方差的随机变量都成立。 公式表达 切比雪夫不等式的基本形式如下…...

【Django】在view中调用channel来主动进行websocket通信
前提:consumer中已经写好了建立连接的代码,并且能够成功把连接加入到通道层的组内 可以参考我的另一个博客: LuckySheet协同编辑后端示例(DjangoChannel,Websocket通信)_lucksheet 协同编辑-CSDN博客 我是懒得去折腾luckysheet的源码&…...

18.[极客大挑战 2019]BabySQL1
进入靶场 随便输输 再输输 可以判断是单引号闭合 再随便输输 查询字段数量 得,过滤了 关键字也过滤了 只能双写了 根据回显,这样可以,只是需要改改 1,2不行 1,2,3行 1,2,3,4不行 可以尝试得到库名,表名了 库名 database(…...

Python快速入门二:Python3 基础语法
一、编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码,对应适…...

1-1 C语言链表
目录 目录 1.0 定义 2.0 为什么使用链表 3.0 链表原理 4.0 创建链表节点 5.0 链表原理续 6.0 链表实现 6.0.1 创建节点 6.0.2 初始化链表 6.0.3 添加链表节点 6.0.4 循环遍历 6.0.5 插入节点 6.0.6 插入头结点main函数 7.0 完整代码 8.0 节点添加方案二 8.0.1 …...

[0629].第29节:配置中心业务规则与动态刷新
我的后端学习大纲 SpringCloud学习大纲 1、编码实现3377服务: 1.1.建module: 1.2.改pom: 1.3.写YML: 1.Nacos同Consul一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正…...

mac: docker : Command not found解决
描述: 安装docker但是docker命令显示Command not found 分析: mac没有配置对应的环境变量 解决方案: 打开配置文件: vim ~/.zshrc写docker环境变量: export PATH"/Applications/Docker.app/Contents/Resources/bin:$PATH"保存退出: esc,输入wq,按enter 配置文…...

Django drf基于APIView 快速使用
1. 注册 # settings.pyINSTALLED_APPS [,rest_framework, ]2. 路由 from django.urls import pathurlpatterns [path(task/, views.TaskAPIView.as_view()) ]3. 视图 from rest_framework.views import APIView from rest_framework.response import Responseclass TaskAPIV…...

【MarsCode】每日一题数组 之 数字分组求偶数和
数字分组求偶数和 1.问题描述 问题描述 小M面对一组从 1 到 9 的数字,这些数字被分成多个小组,并从每个小组中选择一个数字组成一个新的数。目标是使得这个新数的各位数字之和为偶数。任务是计算出有多少种不同的分组和选择方法可以达到这一目标。 n…...

解决:error: subprocess-exited-with-error 的问题
系统和配置: ubuntu20.04 python3.10 torch2.5.1 pip install时报错如下 (实际指令是:pip3 install -r drl_grasping/python_requirements.txt) Collecting python-xlib>0.17 (from pynput1.7.6->-r drl_grasping/python_…...

使用腾讯混元(HunYuanVideo)视频模型FP8量化版本来生成绅士动画,模型体积30G,8G甜品卡可玩,2秒视频需要15分钟
腾讯混元(HunYuanVideo)视频模型发布以来,视频效果有口皆碑,但由于推理门槛比较高,消费级显卡用户望而却步,最近大神Kijai发布了FP8量化版本模型,使得甜品卡用户也有了一餐秀色的可能。 本次我们利用HunYuanVideo量化…...

使用Ancona安装node,安装vue
搜索Conda仓库中可用的Node.js版本 conda search nodejs 通过Conda安装Node.js conda install nodejs 检查已安装的Node.js版本 node -v 安装中国npm镜像(cnpm) conda install cnpm 使用cnpm全局安装Vue CLI cnpm install -g vue/cli...

如何“安装Android SDK“?
一、下载 https://android-sdk.en.softonic.com/ 二、解压(不能有中文) 三、配置环境变量 1、ANDROID_HOME:D:\android-sdk 2、在Path添加文件路径 四、验证 adb version...

天童教育:提升孩子的语言表达能力
语言表达能力如同阳光、空气和水,无处不在,无时不用。然而,很多人并没有意识到,想要让孩子能够良好适应社会生活,提升他们的语言表达能力是至关重要的。大连天童教育认为,我们务必重视孩子的语言表达能力&a…...

Node.js中JWT的token完整生命周期管理:从生成到销毁
Node.js中JWT的token完整生命周期管理:从生成到销毁 在Node.js中使用JWT(JSON Web Token)进行身份验证和授权是一种常见的实践。下面详细介绍JWT从生成到销毁的过程。 JWT生成 安装jsonwebtoken库: 要生成JWT,首先…...
Kotlin报错:lateinit property xxx has not been initialized
Kotlin报错:lateinit property xxx has not been initialized 发生在定义了一个名为xxx的lateinit变量。 解决,在调用前,可以先判断一层该xxx变量是否已经初始化: if (this::xxx.isInitialized) {//正常使用该变量} kotlin.Unini…...

debian编译失败
A、缘由和分析 debian的代码在删除该路径下的2个包后, 重新全编,编译不过的问题。 至于我为什么删除这2个包,这是因为在sdk第一次编译时一些文件已经打包进去了,我现在的修改无法更新进img中,而现在我的项目中不需要…...

flink-connector-mysql-cdc:03 mysql-cdc常见问题汇总
flink-connector-mysql-cdc: 01 mysql-cdc基础配置代码演示02 mysql-cdc高级扩展03 mysql-cdc常见问题汇总04 mysql-cdc-kafka生产级代码分享05 flink-kafka-doris生产级代码分享06 flink-kafka-hudi生产级代码分享flink-cdc版本:3.2.0 flink版本:flink-1.18.0 mysql版本:…...

JSP技术发展现状
多年前,Java入门时学习的JSP可谓时风光无限,J2EE如日中天,短短数年,技术迭代更新光速般发展,有些技术慢慢就退出历史舞台。 JSP(Java Server Pages) 技术在早期 Java Web 开发中曾是构建动态网…...