初识Redis · 哨兵机制
目录
前言:
引入哨兵
模拟哨兵机制
配置docker环境
基于docker环境搭建哨兵环境
对比三种配置文件
编排主从节点和sentinel
主从节点
sentinel
模拟哨兵
前言:
在前文我们介绍了Redis的主从复制有一个最大的缺点就是,主节点挂了之后没有办法迅速重启,毕竟即便主节点挂了,人工干预恢复的话,也要花费许多时间,想必各位程序员也不想在夜深人静的时候突然去公司加班就为了修复一下主节点吧?
所以,Redis引入了另一个进制,即哨兵机制,一般来说只用主从模式的话,可用性不是很高的,所以一般来说式主从模式+哨兵一起使用。
那么我们本文就是围绕哨兵展开一系列的学习了。
引入哨兵
首先我们只是知道主从复制一旦主节点挂了之后的后果还是比较严重的,我们现在就来更加细化一下主节点挂了之后的修复工作。
当我们没有引入哨兵机制的时候,主节点挂了的流程应该是这样的:
1.先看主节点是否容易抢救,好不好抢救
2.如果主节点好抢救,那么也算是万事大吉了
3.如果主节点不好抢救,即短时间找不到原因
i)挑选一个从节点,通过slaveof no one使它成为主节点
ii)把其他的从节点通过命令行slaveof newHostip newHostport的方式连接新的主节点
iii)修改客户端的配置,使得每个客户端能够成功连接上新的主节点,从而完成数据修改的操作
这个过程看起来简单,但是实际上我们知道的是,这一套流程下来,多的不说,至少半个小时就耗进去了吧?
那么在这个时间段内,读的请求无所谓,有其他的从节点支撑着,但是写的请求呢?既然都引入了分布式系统,那么写的请求想必也不会少到哪里去,那么这个事件给整个公司带来的冲击还是比较大的。
所以我们需要一个类似于监管者的角色,用来实时检测每个节点的情况,比如某个节点挂了,这个监管者看到了就要开始干对应的事儿了。
那么,我们将这个监管者,称之为“哨兵”。这样我们就可以舍去对应的人工成本了。但是我们要注意的点是哨兵并不是我们的Redis服务器,它是单独部署在其他服务器的一个Redis sentinel进程。
我们现在假定有三个节点,分别一个主节点两个从节点,并且我们引入了三个哨兵,而因为哨兵本质上是一种轻量级服务,所以同时监测多个Redis服务器是完全可以的。
并且我们要清楚,哨兵检测的机制是通过与redis-server建立tcp长连接,定时发送心跳包,如果超过既定的时间没有收到PONG,也就代表了机器挂了。
那么我们就基于主从复制+哨兵机制的情况下,简单概述一下主节点挂了的情况下,整个体系是如何运作的。
首先,某个节点挂了,那么哨兵会判断是主节点还是从节点,如果是从节点,那么哨兵的一致想法都是:哦。
其次,如果是主节点挂了,那么首先监测到的哨兵会给该节点标志位s_down(主观下线),如果多个哨兵节点都认为它下线了,那么它的标志就会变成o_down(客观下线)。
然后,已经确定主节点已经挂了的情况下,会从多个哨兵节点里面选取一个leader,让这个leader在剩余的节点里面选取一个主节点,选取成功之后,就会开始控制被选中的节点,通过slaveof命令等,修改主节点的配置和从节点的配置。
最后,哨兵会自动通知客户端程序,告诉新的主节点是谁,从而完成数据同步工作。
我们现在可以得出结论,哨兵的作用就是:监控,故障转移,通知。那么哨兵只有一个的话,也是可以的,但是误判的概率就比较高了,这个点涉及到s_down和o_down,后面细说,并且误判也会存在一种情况就是因为网络波动,毕竟网络波动导致了丢包或者抖动,刚好哨兵就收不到对应的PONG,也就误判了。而哨兵的个数,也应该是奇数个,这个点我们到后面的票数再细说。
以上就是引入哨兵机制后,简单的一个恢复流程,那么里面还有更多的细节,我们先不着急。我们现在思考如何进行对应的模拟?
模拟哨兵机制
咱们这里为什么要叫哨兵模拟机制呢?因为我们现在是没有办法真正演示哨兵机制的,你想,哨兵是一个单独的程序,并且在一个单独的服务器上,先不谈我们只有一台云服务器,我们光是节点就需要6个,那么我们好像是要需要6个服务器?
那么好,如果你说咱就是去买6个服务器,我们的电脑也不一定能够承受的了6个服务器,即便是六个轻量级的云服务器。所以我们需要一种技术让我们的云服务器上能运行3个节点3个哨兵。毕竟对于大多数的轻量级配置(2核4G)还是难以直接操作这么多服务,毕竟我们如果直接配置,我们还需要小心的避开依赖的端口号,依赖的配置文件和依赖的数据文件,就非常繁琐了。
这里就需要用到了docker技术了,docker就能完美解决以上的问题。
Docker 通过资源隔离、轻量虚拟化、配置自动化等手段,让你在有限资源的机器上运行多个服务变得可控、高效且易管理。docke中引入容器和镜像的概念,对于容器来说,我们可以理解它把实例化的内容放在了容器里面,具有隔离性,不会干扰彼此,所以我们就能躲开冲突的资源分配的问题了。Docker 使用的是宿主机内核,不会像虚拟机那样消耗额外内存和 CPU 核心。
对于容器和镜像来说,我们可以理解是进程和可执行程序之间的关系,我们通过镜像,启动了多个容器,每个容器相当于一个进程,互不打扰,我们通过对应的配置文件就可以达到我们想要的效果。
我们现在就需要配置docker的环境了。
配置docker环境
对于云服务器来说,有的云服务器是默认安装了docker镜像的,具体我们可以使用docker --version查看一下:
有了docker之后,我们安装docker-compose,这两个的关系如图:
项目 | Docker | Docker Compose |
---|---|---|
作用 | 管理单个容器 | 管理多个容器组成的服务 |
配置方式 | 命令行为主 | 配置文件(YAML) |
适用场景 | 启动一个测试 Redis、Nginx | 启动一个完整的集群、项目或环境 |
使用方式 | docker run , docker build | docker-compose up , docker-compose down |
依赖 | 独立运行 | 基于 Docker CLI 运行(必须装了 Docker) |
相当于Docker是一个造船厂,docker compose是造船图纸,docker通过compose来管理这么多容器。
安装docker-compose也非常简单,直接apt install docker-compose -y即可:
不过我这里已经安装好了。
然后我们需要停止一下之前的Redis服务,因为当我们使用docker的时候,启动对应的Redis镜像,默认的端口号都是6379,不停止redis服务就启动docker的话,会存在端口冲突问题,导致docker启动不了。
这里我们推荐的做法是不再使用Redis服务,就使用docker服务即可。(推荐)
sudo systemctl stop redis
# 或者
sudo service redis-server stop
我们可以通过这两个方式停止Redis的服务,记住不能使用kil -9哦。
然后我们需要使用docker获取到redis的镜像,毕竟没有可执行程序我们也就没有办法启动进程了。对应的命令是docker pull redis:7.2,也可以是docker pull redis:5.0.9,5.0.9的版本较老但是非常稳定,7.2的版本是最新的稳定版,体验相对好一点,其实我们都感觉不出来所以随便选一个了。
不过这里我们会面临一个问题就是被墙,这是国内服务器(像腾讯云、阿里云、华为云)常见的现象,因为访问 Docker Hub 会被墙或受限,导致连接慢、超时、甚至失败。报错信息常见为:
此时我们需要在etc的docker目录下创建一个daemon.json配置文件,根据自己的云服务器添加相关配置文件,然后systemctl daemon-reexec再sudo systemctl restart docker重启一下docker服务即可,对于腾讯云的配置文件是这样的:
{"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}
此时我们拉取对应的镜像就没有问题了。可以使用docker images查看对应的镜像仓库
具体的信息我们到时候更新docker会着重介绍。这里我们先看着玩即可。
基于docker环境搭建哨兵环境
现在我们已经有了对应的docker环境和对应的Redis镜像了。那么我们前文介绍到了docker-compose是启动对应实例的利器,并且我们是通过配置文件的方式启动对应的实例,那么实例的相关配置也是在对应的配置文件里写了。
问题来了,我们常见的配置文件有conf,json,xml,但是这里的配置文件可不是这里面的了,docker-compose的配置文件的格式是yml。
对比三种配置文件
我们这里简单对比一下json,xml,yml三种配置文件。
其中最为繁琐的配置文件当属xml文件了,以下是一个示例:
<services><redis><image>redis:7.2</image><container_name>redis-master</container_name><ports><port>6379:6379</port></ports><volumes><volume>./data:/data</volume></volumes><command>redis-server --appendonly yes</command></redis>
</services>
这是XML文件的redis配置文件。
{"services": {"redis": {"image": "redis:7.2","container_name": "redis-master","ports": ["6379:6379"],"volumes": ["./data:/data"],"command": "redis-server --appendonly yes"}}
}
这是json的配置文件。
services:redis:image: redis:7.2container_name: redis-masterports:- "6379:6379"volumes:- ./data:/datacommand: redis-server --appendonly yes
这是yml文件的配置文件。
我们光从第一印象就能发现json文件和yml文件比xml文件简洁太多了,对于xml文件来说,它敲起来可真的太繁琐了。
那么对于json文件来说,它主要是通过花括号来表现配置的,对于yml文件来说它主要是通过缩进来表现配置的,那么在江湖上总有人戏称yml文件是游标卡尺,因为内容一多,真就得拿个游标卡尺去比对一下了。
那么不同的配置文件有不同的优势,我们这里主要是做一个了解。有了对文件的基本了解之后,就可以开始编排主从节点和哨兵了。
编排主从节点和sentinel
主从节点
首先编写主从节点的配置文件:
在家目录下创建一个redis的目录,然后创建一个docker-compose.yml配置文件,使用vim编辑,复制这么一段配置:
version: '3'
services:redis-master:image: redis:7.2container_name: redis-masterports:- "6379:6379"command: ["redis-server", "--appendonly", "yes"]redis-slave1:image: redis:7.2container_name: redis-slave1ports:- "6380:6379"command: ["redis-server", "--appendonly", "yes", "--slaveof", "redis-master", "6379"]redis-slave2:image: redis:7.2container_name: redis-slave2ports:- "6381:6379"command: ["redis-server", "--appendonly", "yes", "--slaveof", "redis-master", "6379"]
我们从截取一段来看,image代表的是镜像的版本,container_name代表的是容器名字,ports有两个,6380:6379,6380代表的是宿主机的端口号,我们可以通过映射出来的6380端口号访问这个容器,6379代表的是这个容器里面的redis分配的端口号,默认都是6379。然后是网络,启动的命令是和我们之前的通过命令行方式启动服务的时候非常相似了,指定主节点。
而这里同学们大概率会有疑问了,我们之前指定主节点的时候,都是通过的slaveof hostip hostport指定的,那么这里的话,docker有自己的一套域名解析方法,可以根据对应的名字给到对应的ip。所以我们可以直接指定名字。
此时我们主从节点的配置有了,我们就可以通过命令docker-compose up -d全部启动了:
d代表的是我们让容器在后台运行,不然就会一直在前台打印对应的信息了。
我们也可以通过docker-compose log查看一下运行日志:
这是一部分,有很多的。
然后我们就可以验证一下是否启动成功了:
从节点这里就不验证了,是同样的操作。
sentinel
我们同样先创建一个和redis同级的目录redis-sentinel:
然后在这里面配置:
version: '3'services:sentinel1:image: 'redis:7.2'container_name: redis-sentinel-1restart: alwayscommand: ["redis-sentinel", "/etc/redis/sentinel.conf"]
# command: ["/bin/sh", "/wait.sh"]volumes:- ./filesentinel1:/etc/redis# - ./sentinel1.conf:/etc/redis/sentinel.conf#- ./wait.sh:/wait.shports:- "26379:26379"networks:- defaultsentinel2:image: 'redis:7.2'container_name: redis-sentinel-2restart: alwayscommand: ["redis-sentinel", "/etc/redis/sentinel.conf"]volumes:- ./filesentinel2:/etc/redis#- ./sentinel2.conf:/etc/redis/sentinel.confports:- "26380:26379"sentinel3:image: 'redis:7.2'container_name: redis-sentinel-3restart: alwayscommand: ["redis-sentinel", "/etc/redis/sentinel.conf"]volumes:- ./filesentinel3:/etc/redis# - ./sentinel3.conf:/etc/redis/sentinel.confports:- "26381:26379"
networks:default:external:name: redis_default
不过对于哨兵来说配置文件是不能使用同一份的,因为哨兵在运行的时候会对各自的配置文件进行修改,所以需要多份配置文件。
bind 0.0.0.0
port 26379
sentinel monitor redis-master redis-master 6379 2
sentinel down-after-milliseconds redis-master 1000
哨兵的配置文件如上。
对于配置文件来说,第一行代表可以访问任意的ip,对于第二行来说代表的是端口号,sentinel默认的端口号就是26379,第三行代表的是法定票数,为2,和推荐哨兵个数为奇数有关。然后就是心跳包的截止时间了,1000ms代表的是如果1s内没有收到PONG,就认为机器挂了。
那么在这里我们着重解释一下command部分和volumes部分:
对于command部分,就是容器启动的时候,要去/etc/redis/的这个目录里面找sentinel.conf文件,而我们在volumes部分,将/etc/redis目录映射为了宿主机的./filesentinel1,即我们让它在这个目录里面找sentinel.conf文件。
那么我们的理念就是,不管怎么样,只要能让它在宿主机里面找到sentinel.conf文件就行,那么我们也可以把sentinel.conf改为sentinel1.conf或者sentinel2.conf,只要能让它在我们映射的部分找到就可以了。
所以我们也可以把三份配置文件放在一个目录下,然后对command来说,路径最后的配置文件更改为对应的配置文件名就可以了,只要能找到就可以了。
此时我们的配置就全部完成了!
然后我们尝试启动一下,启动之后我们使用docker-compose logs查看:
这个的原因是因为哨兵节点不认识redis节点,原因是因为网络:
首先我们要清楚,docker-compose一下启动了N个容器,那么N个容器就处在一个局域网里面,而我们再启动其他的容器,就是另一个局域网了,默认这两个局域网是不互通的。
但是这里,我们有的时候会面临一个非常痛苦的问题,即我们明明配置成功了,但是不管如何sentinel和redis节点都没有共享一个网络,笔者在这里碰到的原因是因为:sentinel启动的时候DNS没有准备好,导致DNS解析失败。
面对这个问题我们又两种方法,一种是直接使用ip,让sentinel不进行DNS解析的工作的,一种是使用脚本,当sentinel启动的时候检测DNS是否启动,如果启动了再进行DNS的解析工作。
脚本如下:
#!/bin/sh
echo "waiting...."
until ping -c1 redis-master >/dev/null 2>&1; dosleep 1
done
echo 'starting...'
exec redis-server /etc/redis/sentinel.conf --sentinel
如果我们不想使用DNS解析,我们可以使用上图的方式,直接使用对应的ip地址即可。我们可以使用这个命令查看与redis-master相关的网络信息,这里我们就可以看到不同节点的ip地址了。
那么现在,我们就能通过docker-compose logs查看到哨兵节点确实是正在监测对应的节点。
我们也确实看到了对应的文件发生了修改。
不过当我们启动节点时候,推荐的是先启动主从节点,然后再启动哨兵节点,如果先
模拟哨兵
现在我们就简单模拟一下主节点挂了的场景。
目前全部正常运行,然后我们挂了主节点。
//TODO
那么我们现在看到了具体的一个投票过程,其中我们也看到了s_down和o_down,其中s_down代表的是主观下线,也就是哨兵节点主观认为这个节点挂了,那么当其他哨兵认为这个节点下线的时候,就会触发o_down,即多个哨兵同时认为是它下线了。
为什么分为s_down和o_down?
因为哨兵如果因为网络抖动等问题收不到PONG是比较常见的事,所以我们就需要让多个哨兵同时确定。
对于投票过程来说,先是选出了对应的leader,然后是通过三个方面选取对应的主节点,分别是优先级,offset,runid。
其中对于优先级来说是影响最大的,在启动节点的时候会有相关的字段描述它的优先级,在它对应的配置文件里。但是默认的优先级都是一样的,如果我们不修改的话,优先级是一样的,即难以分出胜负,所以我们需要用到offset,我们可以根据从节点和主节点的offset对比,看谁的进度更加贴合于主节点,谁更贴合谁就当主节点,如果offset都一样了。就要用到runid了,这个runid我们在主从复制的部分提到过,我们当时说的就是在哨兵里面会用到,它其实是一个随机数,大小全看天命,到时候就通过runid来选取即可,单纯是比大小。
我们现在简单展开一下哨兵节点是奇数个的原因,你也看到了,有投票,如果投票是大于了哨兵个数的一半,那么它就是leader,那么,如果哨兵个数是偶数的话,出现了对半开的情况岂不是很尴尬?所以我们非常建议哨兵的个数是奇数个。
并且我们发现,redis-master重启之后,它变成了slave节点。
以上就是哨兵机制的全部内容~
感谢阅读!
相关文章:
初识Redis · 哨兵机制
目录 前言: 引入哨兵 模拟哨兵机制 配置docker环境 基于docker环境搭建哨兵环境 对比三种配置文件 编排主从节点和sentinel 主从节点 sentinel 模拟哨兵 前言: 在前文我们介绍了Redis的主从复制有一个最大的缺点就是,主节点挂了之…...
JAVA设计模式——(七)代理模式
JAVA设计模式——(七)代理模式 介绍理解实现抽象主题角色具体主题角色代理类测试 应用 介绍 代理模式和装饰模式还是挺像的。装饰模式是抽象类对装饰对象的实现,在继承装饰对象。代理模式则是直接对代理对象的实现。 理解 代理模式可以看成…...
Redis 原子操作
文章目录 前言✅ 一、什么是「原子操作」?🔍 二、怎么判断一个操作是否原子?🧪 三、项目中的原子 vs 非原子案例(秒杀系统)✅ 原子性(OK)❌ 非原子性(高风险)…...
待办事项日历组件实现
待办事项日历组件实现 今天积累一个简易的待办事项日历组件的实现方法。 需求: 修改样式,变成符合项目要求的日历样式日历上展示待办事项提示(有未完成待办:展示黄点,有已完成待办:展示绿点)…...
Flask 请求数据获取方法详解
一、工作原理 在 Flask 中,所有客户端请求的数据都通过全局的 request 对象访问。该对象是 请求上下文 的一部分,仅在请求处理期间存在。Flask 在收到请求时自动创建 request 对象,并根据请求类型(如 GET、POST)和内容…...
PicoVR眼镜在XR融合现实显示模式下无法显示粒子问题
PicoVR眼镜开启XR融合现实显示模式下,Unity3D粒子效果无法显示问题,其原因是XR融合显示模式下,Unity3D应用显示层在最终合成到眼镜显示器时,驱动层先渲染摄像机画面,再以Alpha透明方式渲染应用层画面,问题就…...
vue-lottie的使用和配置
一、vue-lottie 简介 vue-lottie 是一个 Vue 组件,用于在 Vue 项目中集成 Airbnb 的 Lottie 动画库。它通过 JSON 文件渲染 After Effects 动画,适用于复杂矢量动画的高效展示。 二、安装与基础使用 1. 安装 npm install vue-lottielatest # 或 yarn…...
PyTorch 实现食物图像分类实战:从数据处理到模型训练
一、简介 在计算机视觉领域,图像分类是一项基础且重要的任务,广泛应用于智能安防、医疗诊断、电商推荐等场景。本文将以食物图像分类为例,基于 PyTorch 框架,详细介绍从数据准备、模型构建到训练测试的全流程,帮助读者…...
传统中台的重生——云原生如何重塑政务系统后端架构
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:传统后端架构的“痛”与“变” 在过去十年中,无数企业和机构纷纷构建中台系统,尤其是政务、金融、交通、教育等领域。这些中台系统一般基于 Java EE 单体架构,集中部署于虚拟机上,靠人…...
jQuery AJAX、Axios与Fetch
jQuery AJAX、Axios与Fetch对比 #mermaid-svg-FRNqb7d4i2fmbavm {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FRNqb7d4i2fmbavm .error-icon{fill:#552222;}#mermaid-svg-FRNqb7d4i2fmbavm .error-text{fill:#552…...
【Hive入门】Hive数据导出完全指南:从HDFS到本地文件系统的专业实践
目录 引言 1 Hive数据导出概述 1.1 数据导出的核心概念 1.2 典型导出场景 2 Hive到HDFS导出详解 2.1 INSERT OVERWRITE DIRECTORY方法 2.2 多目录导出技术 2.3 动态分区导出 3 HDFS到本地文件系统转移 3.1 hadoop fs命令操作 3.2 分布式拷贝工具DistCp 4 直接导出到…...
stack __ queue(栈和队列)
1. stack的介绍和使用 栈和队列里面都叫容器适配器 存储数据就要交给别的容器 通过封装别的容器,可以进行相应的操作,来达到目的 适配的本质就是复用 这就没有迭代器了,不支持随便遍历 2. queue的介绍和使用 下面用一些题来深入理解 栈…...
UML 类图基础和类关系辨析
UML 类图 目录 1 概述 2 类图MerMaid基本表示法 3 类关系详解 3.1 实现和继承 3.1.1 实现(Realization)3.1.2 继承/泛化(Inheritance/Generalization) 3.2 聚合和组合 3.2.1 组合(Composition)3.2.2 聚…...
STM32F103C8T6信息
STM32F103C8T6 完整参数列表 一、核心参数 内核架构 ARM Cortex-M3 32位RISC处理器 最大主频:72 MHz(基于APB总线时钟) 运算性能:1.25 DMIPS/MHz(Dhrystone 2.1基准) 总线与存储 总线宽度ÿ…...
unity 读取csv
1.读取代码 string filePath Application.streamingAssetsPath "\\data.csv"; public List<MovieData> movieData new List<MovieData>(); private void ReadCSV(string filePath) { List<List<string>> data new List<…...
那些年踩过的坑之Arrays.asList
一、前言 熟悉开发的兄弟都知道,在写新增和删除功能的时候,大多数时候会写成批量的,原因也很简单,批量既支持单个也支持多个对象的操作,事情也是发生在这个批量方法的调用上,下面我简单说一下这个事情。 二…...
ASP.NET Core 自动识别 appsettings.json的机制解析
ASP.NET Core 自动识别 appsettings.json 的机制解析 在 ASP.NET Core 中,IConfiguration 能自动识别 appsettings.json 并直接读取值的机制,是通过框架的 “约定优于配置” 设计和 依赖注入系统 共同实现的。以下是详细原理: 默认配置源的自…...
深入解析Mlivus Cloud核心架构:rootcoord组件的最佳实践与调优指南
作为大禹智库的向量数据库高级研究员,同时也是《向量数据库指南》的作者,我在过去30年的向量数据库和AI应用实战中见证了这项技术的演进与革新。今天,我将以专业视角为您深入剖析Mlivus Cloud的核心组件之一——rootcoord,这个组件在系统架构中扮演着至关重要的角色。如果您…...
ApplicationEventPublisher用法-笔记
1.ApplicationEventPublisher简介 org.springframework.context.ApplicationEventPublisher 是 Spring 框架中用于发布自定义事件的核心接口。它允许你在 Spring 应用上下文中触发事件,并由其他组件(监听器)进行响应。 ApplicationEventPub…...
数字孪生:从概念到实践,重构未来产业的“虚拟镜像”
一、开篇:为什么数字孪生是下一个技术风口? 现象级案例引入: “特斯拉用数字孪生技术将电池故障预测准确率提升40%;西门子通过虚拟工厂模型缩短30%产品研发周期;波音777X飞机设计全程零实物原型……” 数据支撑&#…...
Python笔记:VS2013编译Python-3.5.10
注:本文是编译老版本,有点麻烦,测试了编译新版,基本上是傻瓜是操作即可 1. python官网下载源码 https://www.python.org/ftp/python/3.5.10/Python-3.5.10.tgz 2. 编译前查看目录中相关文档 源码目录结构 看README文档 经过查…...
STM32八股【6】-----CortexM3的双堆栈(MSP、PSP)设计
STM32的线程模式(Thread Mode)和内核模式(Handler Mode)以及其对应的权级和堆栈指针 线程模式: 正常代码执行时的模式(如 main 函数、FreeRTOS任务) 可以是特权级(使用MSPÿ…...
MySQL触法器
1. 什么是触发器及其特点 MySQL数据库中触发器是一个特殊的存储过程,不同的是执行存储过程要使用 CALL 语句来调用,而触发器的执行不需要使用 CALL 语句来调用,也不需要手工启动,只要一个预定义的事件发生就会被 MySQL自动调用。…...
金仓数据库征文-政务领域国产化数据库更替:金仓 KingbaseES 应用实践
目录 一.金仓数据库介绍 二.政务领域数据库替换的时代需求 三.金仓数据库 KingbaseES 在政务领域的替换优势 1.强大的兼容性与迁移能力 2.高安全性与稳定性保障 3.良好的国产化适配性 四.金仓数据库 KingbaseES 在政务领域的典型应用实践 1.电子政务办公系…...
微服务架构在云原生后端的深度融合与实践路径
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:后端架构的演变,走向云原生与微服务融合 过去十余年,后端架构经历了从单体应用(Monolithic)、垂直切分(Modularization)、到微服务(Microservices)的演进,每一次变化都是为了解决…...
北斗导航 | 北斗卫星导航单点定位与深度学习结合提升精度
以下是北斗卫星导航单点定位(SPP)与深度学习结合提升精度的关键方法总结,综合了误差建模、信号识别、动态环境适应等技术方向: 一、非直射信号(NLOS)抑制与权重修正 1. 双自注意力网络(Dual Self-Attention Network) 原理:通过同时建模卫星信号的空间环境特征(如天空…...
AlarmClock4.8.4(官方版)桌面时钟工具软件下载安装教程
1.软件名称:AlarmClock 2.软件版本:4.8.4 3.软件大小:187 MB 4.安装环境:win7/win10/win11(64位) 5.下载地址: https://www.kdocs.cn/l/cdZMwizD2ZL1?RL1MvMTM%3D 提示:先转存后下载,防止资…...
精益数据分析(23/126):把握创业阶段与第一关键指标
精益数据分析(23/126):把握创业阶段与第一关键指标 在创业和数据分析的学习过程中,每一次深入探索都可能为我们打开新的大门。今天,我依旧带着和大家共同进步的想法,来解读《精益数据分析》中的重要内容—…...
【华为HCIP | 华为数通工程师】821—多选解析—第十六页
多选814、关于OSPF AS-External-LSA说法正确的是: A、Net mask被设置全0 B、Link State ID被设置为目的网段地址 C、Advertising Router被设置为ASBR的Router ID D、使用Link State ID和Advertising Router可以唯一标识一条AS-External-LSA 解析:Net mask代表的是掩码…...
Linux:进程间通信->匿名管道实现内存池
1. 进程间通信 (1) 概念 进程间通信(IPC) 就是不同进程间交换数据的方法,进程间是独立的所以不能访问彼此的内存,需要某种机制来通信(管道、消息队列,共享内存等) (2) 目的 数据传输:一个进程需要他的数据发送给另一个进程 资源…...
Linux服务器离线安装ollama及大模型
Linux服务器离线安装ollama及大模型 核心思路:使用一台可以联网的电脑将需要的ollama安装包和大模型下载到本地,之后传输到Linux服务器上安装并配置 环境说明 联网机:macOS M1Pro Linux服务器:x86_64 安装ollama版本:…...
C++ 类及函数原型详解
一、引言 在C 编程中,类(Class)是面向对象编程的核心概念之一,它是一种用户自定义的数据类型,封装了数据和操作数据的函数(成员函数)。函数原型则为函数的声明提供了必要的信息,让编…...
大内存生产环境tomcat-jvm配置实践
话不多讲,奉上代码,分享经验,交流提高! 64G物理内存,8核CPU生产环境tomcat-jvm配置如下: JAVA_OPTS-server -XX:MaxMetaspaceSize4G -XX:ReservedCodeCacheSize2G -XX:UseG1GC -Xms48G -Xmx48G -XX:MaxGCPauseMilli…...
各类前端开发的框架比较及其核心特性、开发体验、生态系统以及在不同项目中的适用性
前端开发框架多种多样,每种框架都有其独特的优势和局限性。以下是几种流行的前端框架及其特点、优缺点和适合的项目类型介绍:包括它们的核心特性、开发体验、生态系统以及在不同项目中的适用性。 1. React.js 核心特性: 虚拟DOM:…...
Git基本使用(很详细)
一:Git 概述 1.1 定义:分布式版本控制系统 1.2 版本控制 (1)定义: 版本控制时一种记录文件内容变化,以便将来查阅特定版本修订情况的系统 (2)举例 多副本 优化: 不使用多…...
mybatis-plus里的com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析
以下是 com.baomidou.mybatisplus.core.override.MybatisMapperProxy 类的详细解析: 1. 类的作用 MybatisMapperProxy 是 MyBatis-Plus 框架中用于实现 Mapper 接口动态代理的核心类。它继承自 MyBatis 的 MapperProxy,并扩展了以下功能: …...
[密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统
[密码学实战]商用密码产品密钥体系架构:从服务器密码机到动态口令系统 关键词:商用密码、密钥体系、服务器密码机、金融数据密码机、动态口令、智能密码钥匙 摘要:本文深度解读商用密码产品的核心密钥体系架构,涵盖服务器密码机、…...
BongoCat - 跨平台键盘猫动画工具
本文翻译整理自:https://github.com/ayangweb/BongoCat 文章目录 一、关于 BongoCat相关链接资源关键功能特性 二、下载安装系统要求下载方式macOSWindowsLinux (X11) 三、灵感来源四、效果演示 一、关于 BongoCat BongoCat 是一款跨平台的键盘猫动画工具…...
跨Linux发行版CPU指令集兼容性深度解析与实践指南
一、指令集差异全景透视 1.1 Ubuntu与Debian指令集差异对比 # 查询语句: lscpu | grep Flags # 结果 # Ubuntu 22.04 LTS Flags: fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm ssbs# De…...
docker的安装和简单使用(ubuntu环境)
环境准备 这里用的是linux的环境,如果没有云服务器的话,就是用虚拟环境吧。 虚拟环境的安装参考:vmware17的安装 linux镜像的安装 docker安装 我使用的是ubuntu,使用以下命令: 更新本地软件包索引 sudo apt u…...
Flutter 环境搭建 (Android)
目标 上一篇Flutter应用已经能在iOS,macOS和,chrome环境下正常运行了,这次把Android跑通。 环境 macOS 15.4.1 Visual Studio Code 1.99.3 Flutter 3.29.3 • channel stable • https://github.com/flutter/flutter.git Framework • revision ea121f8859 (11 da…...
数字化技术的五个环节:大数据、云计算、人工智能、区块链、移动互联网
在21世纪的科技浪潮中,数字化技术以其强大的生命力和无限的潜力,正逐步重塑着我们的世界。大数据、云计算、人工智能、区块链、移动互联网,这五大数字化技术的环节,如同构建智慧未来的基石,每一方面都承载着推动社会进…...
PWNOS:2.0(vulnhub靶机)
文章目录 靶机地址主机发现、端口扫描web渗透目录探测漏洞利用权限提升 解密工具地址总结 靶机地址 https://download.vulnhub.com/pwnos/pWnOS_v2.0.7z 这里如果是windows系统直接使用vmware或者virtubox打开可以使用,如果是mac系统需再去做一个配置,比较麻烦 这里…...
ubuntu22.04部署Snipe-IT
文章目录 参考链接一、写在前二、安装操作系统三、安装 PHP四、下载 Snipe-IT五、安装依赖六、安装数据库并创建用户七、安装 Snipe-IT八、安装 Nginx九、Web 继续安装 Snipe-IT补充: 最后 参考链接 How to Install Snipe-IT on Ubuntu 22.04 https://www.rosehost…...
【EDA】EDA中聚类(Clustering)和划分(Partitioning)
在VLSI物理设计自动化中,聚类(Clustering)和划分(Partitioning)是两个不同的关键步骤,主要区别如下: 1. 目标与核心任务 聚类(Clustering) 目标:将电路中的…...
Java 安全:如何实现用户认证与授权?
Java 安全:如何实现用户认证与授权? 在当今数字化的世界中,用户认证与授权是 Java 应用程序安全的关键环节。它们确保只有经过授权的用户才能访问特定资源,保护系统免受未授权访问的威胁。本文将深入探讨如何在 Java 中实现用户认…...
六个能够白嫖学习资料的网站
一、咖喱君的资源库 地址:https://flowus.cn/galijun/share/de0f6d2f-df17-4075-86ed-ebead0394a77 这是一个学习资料/学习网站分享平台,包含了英语、法语、德语、韩语、日语、泰语等几十种外国语言的学习资料及平台,这个网站的优势就是外语…...
AWS Glue ETL设计与调度最佳实践
一、引言 在AWS Glue中设计和调度ETL过程时,需结合其无服务器架构和托管服务特性,采用系统化方法和最佳实践,以提高效率、可靠性和可维护性。本文将从调度策略和设计方法两大维度详细论述,并辅以实际案例说明。 二、调度策略的最…...
《深入理解 AOP》
一、AOP 是什么 AOP(Aspect Oriented Programming),即面向切面编程,是软件开发中一种重要的编程范式。它通过横向抽取机制,将那些与业务逻辑本身无关、却为业务模块所共同调用的逻辑或责任(如事务处理、日…...
2022李宏毅老师机器学习课程笔记
机器学习笔记目录 1.绪论(内容概述)2.机器学习和深度学习的基本概念transformer 1.绪论(内容概述) 机器学习:让机器找一个函数,通过函数输出想要的结果。应用举例:语音识别,图像识别…...