【云原生进阶之PaaS中间件】第二章Zookeeper-3.1分布式架构介绍

1 分布式架构详解
1.1 分布式发展历程
1.1.1 单点集中式
特点:App、DB、FileServer都部署在一台机器上。并且访问请求量较少

1.1.2 应用服务和数据服务拆分
特点:App、DB、FileServer分别部署在独立服务器上。并且访问请求量较少

1.1.3 使用缓存改善性能
特点:数据库中频繁访问的数据存储在缓存服务器中,减少数据库的访问次数,降低数据库的压力

1.1.4 应用服务器集群
特点:多台应用服务器通过负载均衡同时对外提供服务,解决单台服务器处理能力上限的问题

1.1.5 数据库读写分离
特点:数据库进行读写分离(主从)设计,解决数据库的处理压力

1.1.6 反向代理和CDN加速
特点:采用反向代理和CDN加快系统的访问速度

1.1.7 分布式文件系统和分布式数据库
特点:数据库采用分布式数据库,文件系统采用分布式文件系统
随着业务的发展,最终数据库读写分离也将无法满足需求,需要采用分布式数据库和分布式文件系统来支撑。
分布式数据库是数据库拆分后的最后方法,只有在单表规模非常庞大的时候才使用,更常用的数据库拆分手段是业务分库,将不同业务的数据库部署在不同的机器上

1.2 分布式技术详解
1. 并发性
2. 分布性
大任务拆分成多个任务部署到多台机器上对外提供服务
3. 缺乏全局时钟
时间要统一
4. 对等性
一个服务部署在多台机器上是一样的,无任何差别
5. 故障肯定会发生
硬盘坏了 CPU烧了....
1.3 分布式事务
1.3.1 ACID
- 原子性(Atomicity):一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性(Consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。比如A有500元,B有300元,A向B转账100,无论怎么样,A和B的总和总是800元。
- 隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
1.3.2 2P/3P
- 2P= Two Phase commit 二段提交(RDBMS(关系型数据库管理系统)经常就是这种机制,保证强一致性)
- 3P= Three Phase commit 三段提交
说明:2P/3P是为了保证事务的ACID(原子性、一致性、隔离性、持久性)
1.3.2.1 2P的两个阶段
阶段1:提交事务请求(投票阶段)询问是否可以提交事务。

阶段2:执行事务提交(commit、rollback) 真正的提交事务。

1.3.2.2 3P的三个阶段
- 阶段1:是否提交-询问是否可以做事务提交
- 阶段2:预先提交-预先提交事务
- 阶段3:执行事务提交(commit、rollback)真正的提交事务

说明:3P把2P的阶段一拆分成了前面两个阶段
1.3.3 CAP理论
- 一致性(Consistency):分布式数据库的数据保持一致
- 可用性(Availability):任何一个节点挂了,其他节点可以继续对外提供服务
- 分区容错性(网络分区)Partition tolerance:一个数据库所在的机器坏了,如硬盘坏了,数据丢失了,可以新增一台机器,然后从其他正常的机器把备份的数据同步过来
CAP理论的特点:CAP只能满足其中2条

- CA(放弃P):将所有的数据放在一个节点。满足一致性、可用性。
- AP(放弃C):放弃强一致性,用最终一致性来保证。
- CP(放弃A):一旦系统遇见故障,受到影响的服务器需要等待一段时间,在恢复期间无法对外提供服务。
举例说明CAP理论:
有3台机器分别有3个数据库分别有两张表,数据都是一样的:
Machine1-db1-tbl_person、tbl_order
Machine2-db2-tbl_person、tbl_order
Machine3-db3-tbl_person、tbl_order
1)当向machine1的db1的表tbl_person、tbl_order插入数数据时,同时要把插入的数据同步到machine2、machine3,这就是一致性
2)当其中的一台机器宕机了,可以继续对外提供服务,把宕机的机器重新启动起来可以继续服务,这就是可用性
3)当machine1的机器坏了,数据全部丢失了,不会有任何问题,因为machine2和machine3上还有数据,重新加一台机器machine4,把machine2和machine3其中一台机器的备份数据同步过来就可以了,这就是分区容错性
1.3.4 BASE理论
基本可用(bascially available)、软状态(soft state)、最终一致性(Eventually consistent):
- 基本可用:在分布式系统出现故障,允许损失部分可用性(服务降级、页面降级)
- 软状态:允许分布式系统出现中间状态。而且中间状态不影响系统的可用性。
- 这里的中间状态是指不同的data replication之间的数据更新可以出现延时的最终一致性
如CAP理论里面的示例,当向machine1的db1的表tbl_person、tbl_order插入数数据时,同时要把插入的数据同步到machine2、machine3,当machine3的网络有问题时,同步失败,但是过一会网络恢复了就同步成功了,这个同步失败的状态就称为软状态,因为最终还是同步成功了。
- 最终一致性:data replications经过一段时间达到一致性。
1.3.5 Paxos算法
1.3.5.1 介绍Paxos算法之前我们先来看一个小故事
- 拜占庭将军问题
拜占庭帝国就是5~15世纪的东罗马帝国,拜占庭即现在土耳其的伊斯坦布尔。我们可以想象,拜占庭军队有许多分支,驻扎在敌人城外,每一分支由各自的将军指挥。假设有11位将军,将军们只能靠通讯员进行通讯。在观察敌人以后,忠诚的将军们必须制订一个统一的行动计划——进攻或者撤退。然而,这些将军里有叛徒,他们不希望忠诚的将军们能达成一致,因而影响统一行动计划的制订与传播。
问题是:将军们必须有一个协议,使所有忠诚的将军们能够达成一致,而且少数几个叛徒不能使忠诚的将军们作出错误的计划——使有些将军进攻而另一些将军撤退。
假设有9位忠诚的将军,5位判断进攻,4位判断撤退,还有2个间谍恶意判断撤退,虽然结果是错误的撤退,但这种情况完全是允许的。因为这11位将军依然保持着状态一致性。

总结:
1)11位将军进攻城池
2)同时进攻(议案、决议)、同时撤退(议案、决议)
3)不管撤退还是进攻,必须半数的将军统一意见才可以执行
4)将军里面有叛徒,会干扰决议生成
1.3.5.2 下面就来介绍一下Paxos算法
Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。
Paxos:多数派决议(最终解决一致性问题)
Paxos算法有三种角色:Proposer,Acceptor,Learner
- Proposer:提交者(议案提交者),提交议案(判断是否过半),提交批准议案(判断是否过半)
- Acceptor:接收者(议案接收者),接受议案或者驳回议案,给proposer回应(promise)
- Learner:学习者(打酱油的)
如果议案产生,学习议案。
设定1:如果Acceptor没有接受议案,那么他必须接受第一个议案
设定2:每个议案必须有一个编号,并且编号只能增长,不能重复。越往后越大。
设定3:接受编号大的议案,如果小于之前接受议案编号,那么不接受
设定4:议案有2种(提交的议案,批准的议案)

1)Prepare阶段(议案提交)
a)Proposer希望议案V。首先发出Prepare请求至大多数Acceptor。Prepare请求内容为序列号K
b)Acceptor收到Prepare请求为编号K后,检查自己手里是否有处理过Prepare请求。
c)如果Acceptor没有接受过任何Prepare请求,那么用OK来回复Proposer,代表Acceptor必须接受收到的第一个议案(设定1)
d)否则,如果Acceptor之前接受过任何Prepare请求(如:MaxN),那么比较议案编号,如果K
e)如果K>=MaxN,那么检查之前是否有批准的议案,如果没有则用OK来回复Proposer,并记录K
f)如果K>=MaxN,那么检查之前是否有批准的议案,如果有则回复批准的议案编号和议案内容(如:, AcceptN为批准的议案编号,AcceptV为批准的议案内容)
2)Accept阶段(批准阶段)
a)Proposer收到过半Acceptor发来的回复,回复都是OK,且没有附带任何批准过的议案编号和议案内容。那么Proposer继续提交批准请求,不过此时会连议案编号K和议案内容V一起提交(这种数据形式)
b)Proposer收到过半Acceptor发来的回复,回复都是OK,且附带批准过的议案编号和议案内容()。那么Proposer找到所有回复中超过半数的那个(假设为)作为提交批准请求(请求为)发送给Acceptor。
c)Proposer没有收到过半Acceptor发来的回复,则修改议案编号K为K+1,并将编号重新发送给Acceptors(重复Prepare阶段的过程)
d)Acceptor收到Proposer发来的Accept请求,如果编号K
e)Acceptor收到Proposer发来的Accept请求,如果编号K>=MaxN则批准该议案,并设置手里批准的议案为,回复Proposer。
f)经过一段时间Proposer对比手里收到的Accept回复,如果超过半数,则结束流程(代表议案被批准),同时通知Leaner可以学习议案。
g) 经过一段时间Proposer对比手里收到的Accept回复,如果未超过半数,则修改议案编号重新进入Prepare阶段。
1.3.5.3 Paxos示例
1.3.5.3.1 示例1:先后提议的场景

角色:
- proposer:参谋1,参谋2
- acceptor:将军1,将军2,将军3(决策者)
1)参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2)3个将军收到参谋1的提议,由于之前还没有保存任何编号,因此把(编号1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(ok);
3)参谋1收到至少2个将军的回复,再次派通信兵带信给3个将军,内容为(编号1,进攻时间1);
4)3个将军收到参谋1的时间,把(编号1,进攻时间1)保存下来,避免遗忘;同时让通信兵带信回去,内容为(Accepted);
5)参谋1收到至少2个将军的(Accepted)内容,确认进攻时间已经被大家接收;
6)参谋2发起提议,派通信兵带信给3个将军,内容为(编号2);
7)3个将军收到参谋2的提议,由于(编号2)比(编号1)大,因此把(编号2)保存下来,避免遗忘;又由于之前已经接受参谋1的提议,因此让通信兵带信回去,内容为(编 号1,进攻时间1);
8)参谋2收到至少2个将军的回复,由于回复中带来了已接受的参谋1的提议内容,参谋2因此不再提出新的进攻时间,接受参谋1提出的时间;
1.3.5.3.2 示例2:交叉场景

角色:
- proposer:参谋1,参谋2
- acceptor:将军1,将军2,将军3(决策者)
1)参谋1发起提议,派通信兵带信给3个将军,内容为(编号1);
2)3个将军的情况如下
a)将军1和将军2收到参谋1的提议,将军1和将军2把(编号1)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok);
b)负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
3)参谋2在同一时间也发起了提议,派通信兵带信给3个将军,内容为(编号2);
4)3个将军的情况如下
a)将军2和将军3收到参谋2的提议,将军2和将军3把(编号2)记录下来,如果有其他参谋提出更小的编号,将被拒绝;同时让通信兵带信回去,内容为(ok);
b)负责通知将军1的通信兵被抓,因此将军1没收到参谋2的提议;
5)参谋1收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号1,进攻时间1);
6)2个将军的情况如下
a)将军1收到了(编号1,进攻时间1),和自己保存的编号相同,因此把(编号1,进攻时间1)保存下来;同时让通信兵带信回去,内容为(Accepted);
b)将军2收到了(编号1,进攻时间1),由于(编号1)小于已经保存的(编号2),因此让通信兵带信回去,内容为(Rejected,编号2);
7)参谋2收到至少2个将军的回复,再次派通信兵带信给有答复的2个将军,内容为(编号2,进攻时间2);
8)将军2和将军3收到了(编号2,进攻时间2),和自己保存的编号相同,因此把(编号2,进攻时间2)保存下来,同时让通信兵带信回去,内容为(Accepted);
9)参谋2收到至少2个将军的(Accepted)内容,确认进攻时间已经被多数派接受;
10)参谋1只收到了1个将军的(Accepted)内容,同时收到一个(Rejected,编号2);参谋1重新发起提议,派通信兵带信给3个将军,内容为(编号3);
11)3个将军的情况如下
a)将军1收到参谋1的提议,由于(编号3)大于之前保存的(编号1),因此把(编号3)保存下来;由于将军1已经接受参谋1前一次的提议,因此让通信兵带信回去,内容为(编号1,进攻时间1);
b)将军2收到参谋1的提议,由于(编号3)大于之前保存的(编号2),因此把(编号3)保存下来;由于将军2已经接受参谋2的提议,因此让通信兵带信回去,内容为(编号2,进攻时间2);
c)负责通知将军3的通信兵被抓,因此将军3没收到参谋1的提议;
12)参谋1收到了至少2个将军的回复,比较两个回复的编号大小,选择大编号对应的进攻时间作为最新的提议;参谋1再次派通信兵带信给有答复的2个将军,内容为(编号3,进攻时间2);
13)将军1和将军2收到了(编号3,进攻时间2),和自己保存的编号相同,因此保存(编号3,进攻时间2),同时让通信兵带信回去,内容为(Accepted);
14)参谋1收到了至少2个将军的(accepted)内容,确认进攻时间已经被多数派接受。
1.4 Zookeeper ZAB协议
Zookeeper Automic Broadcast(ZAB),即Zookeeper原子性广播,是Paxos经典实现
术语:
quorum:集群过半数的集合
1.4.1 ZAB(zookeeper)中节点分四种状态
- looking:选举Leader的状态(崩溃恢复状态下)
- following:跟随者(follower)的状态,服从Leader命令
- leading:当前节点是Leader,负责协调工作。
- observing:observer(观察者),不参与选举,只读节点。
1.4.2 ZAB中的两个模式(ZK是如何进行选举的)
崩溃恢复、消息广播

1.4.2.1 崩溃恢复
leader挂了,需要选举新的leader

a.每个server都有一张选票,如(3,9),选票投自己。
b.每个server投完自己后,再分别投给其他还可用的服务器。如把Server3的(3,9)分别投给Server4和Server5,一次类推
c.比较投票,比较逻辑:优先比较Zxid,Zxid相同时才比较myid。比较Zxid时,大的做leader;比较myid时,小的做leader
d.改变服务器状态(崩溃恢复->数据同步,或者崩溃恢复->消息广播)
相关概念补充说明:
- epoch:周期值
- acceptedEpoch(比喻:年号):follower已经接受leader更改年号的(newepoch)提议。
- currentEpoch(比喻:当前的年号):当前的年号
- lastZxid:history中最近接收到的提议zxid(最大的值)
- history:当前节点接受到事务提议的log
Zxid数据结构说明:
cZxid = 0x10000001b
64位的数据结构
高32位:10000
Leader的周期编号+myid的组合
低32位:001b
事务的自增序列(单调递增的序列)只要客户端有请求,就+1
当产生新Leader的时候,就从这个Leader服务器上取出本地log中最大事务Zxid,从里面读出epoch+1,作为一个新epoch,并将低32位置0(保证id绝对自增)
1.4.2.2 消息广播(类似2P提交)

- Leader接受请求后,将这个请求赋予全局的唯一64位自增Id(zxid)。
- 将zxid作为议案发给所有follower。
- 所有的follower接受到议案后,想将议案写入硬盘后,马上回复Leader一个ACK(OK)。
- 当Leader接受到合法数量(过半)Acks,Leader给所有follower发送commit命令。
- follower执行commit命令。
注意:到了这个阶段,ZK集群才正式对外提供服务,并且Leader可以进行消息广播,如果有新节点加入,还需要进行同步。
1.4.2.3 数据同步
- 取出Leader最大lastZxid(从本地log日志来)
- 找到对应zxid的数据,进行同步(数据同步过程保证所有follower一致)
- 只有满足quorum同步完成,准Leader才能成为真正的Leader
参考链接
Zookeeper系列二:分布式架构详解、分布式技术详解、分布式事务
随笔分类 - Zookeeper专题系列
Zookeeper简介及核心概念_Cynicism_Kevin的博客-CSDN博客
zookeeper安装以及使用_燕少༒江湖的博客-CSDN博客
Zookeeper工作原理(详细)_zookeeper原理_笔墨登场说说的博客-CSDN博客
Zookeeper的功能以及工作原理_zookeeper的主要功能_空白格的空白的博客-CSDN博客
ZooKeeper基本原理
深入了解Zookeeper核心原理
Zookeeper原理解析 - 简书
zookeeper的领导者选举和原子广播 - lpshou - 博客园
Zookeeper原理详解_百里度的博客-CSDN博客
Zookeeper学习系列【三】Zookeeper 集群架构、读写机制以及一致性原理(ZAB协议) - 掘金
从背景到原理,到架构体系,粉碎Zookeeper面试连环炮 - 掘金
相关文章:
【云原生进阶之PaaS中间件】第二章Zookeeper-3.1分布式架构介绍
1 分布式架构详解 1.1 分布式发展历程 1.1.1 单点集中式 特点:App、DB、FileServer都部署在一台机器上。并且访问请求量较少 1.1.2 应用服务和数据服务拆分 特点:App、DB、FileServer分别部署在独立服务器上。并且访问请求量较少 1.1.3 使用缓存改善…...
2023-09-11力扣每日一题
链接: 630. 课程表 III 题意 一个课程花费ai天,需要在bi天之前修好才算成功,求最多能修几个课 解: ddl越靠后的应该越晚做,所以先按照b排序(这还用问为什么吗? 然后通过维护一个优先队列存…...
windows10使用wheel安装tensorflow2.13.0/2.10.0 (保姆级教程)
安装过程 安装虚拟环境安装virtualenv安装满足要求的python版本使用virtualenv创建指定python版本的虚拟环境 安装tensorflow安装tensorflow-docs直接下载使用wheel下载 在VSCode编辑器中使用虚拟环境下的python解释器,并使用tensorflow常见错误 注意: t…...
【LeetCode与《代码随想录》】贪心算法篇:做题笔记与总结-JavaScript版
代码随想录 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 文章目录 455. 分发饼干376. 摆动序列53. 最大子数组和122. 买卖股票的最佳时机 II55. 跳跃游戏45. 跳跃游戏 II1005. K 次取反后最大化的数组和134. 加油站135. 分发糖果(困难&#…...
Http客户端OkHttp的基本使用
简介 OkHttp是一个强大的开源HTTP客户端,它被广泛用于Android和Java应用程序中。OkHttp具有简单易用的API,提供了许多高级功能,如连接池、请求压缩和缓存等。 依赖 要使用OkHttp,需要在项目的构建文件中添加以下依赖࿱…...
认识网线上的各种参数标号
最近工作需要,接触了很多不同类型的网线,为了能够区分不同型号的网线,特意做一篇笔记用来学习,如有记录有误之处,欢迎大家指正~初步认识网线 常用的网络电缆有三种:双绞线、同轴电缆和光纤电缆(…...
软件测开记录(一)
知识点汇总 14:00面试,14:06就出来了,问的问题有点变态。。。 python自动化测试学习路线(从入门到精通) 单元知识点 测试常用工具 常用的客户端和服务器端开发和测试工具 服务器与客户端常用测试工具与…...
基数排序之代码解析
基数排序是生活中咱们写程序用的比较少的排序,但是这个排序比较巧妙,今天就给大家讲一讲,原理都在代码里面,下面会给一些解释。 import java.util.Arrays;public class Code04_RadixSort {// only for no-negative valuepublic s…...
使用C语言EasyX 创建动态爱心背景
简介 在计算机图形学的世界中,有很多方法可以使程序的界面更加吸引人。在本篇博客中,我将向大家介绍如何使用 EasyX 图形库在 C 中创建一个动态的爱心背景。这不仅是一个简单的动画效果,它还包括背景的星星、旋转的心形以及一个美观的背景渐…...
springboot redisTemplate.opsForValue().setIfAbsent返回null原理
一、版本 springboot版本:spring-boot-starter-data-redis 2.1.6 redisson版本:redisson-spring-boot-starter 3.11.5 二、场景 Boolean res redisTemplate.opsForValue().setIfAbsent("key","value");以上代码同一时间多次执行…...
Python调用Jumpserver的Api接口增删改查
引言 Jumpserver是一款强大的堡垒机系统,可以有效管理和控制企业内部服务器的访问权限,提高网络安全性。本文将介绍如何使用Python编程语言,结合Jumpserver提供的API接口,实现对跳板机的管理和操作。 1、什么是Jumpserver&#…...
后端入门教程:从零开始学习后端开发
1. 编程基础 首先,作为一名后端开发者,你需要掌握至少一门编程语言。Python是一个很好的选择,因为它易于学习且功能强大。让我们从一个简单的示例开始,在控制台输出 "Hello, World!"。 2. 学习Web基础 了解Web开发基…...
无涯教程-JavaScript - DB函数
描述 DB函数使用固定余额递减法返回指定期间内资产的折旧。 语法 DB (cost, salvage, life, period, [month])争论 Argument描述Required/OptionalCostThe initial cost of the asset.RequiredSalvageThe value at the end of the depreciation (sometimes called the salv…...
2023年财务顾问行业研究报告
第一章 行业概况 1.1 定义及分类 财务顾问(Financial Advisor,FA)也被称为融资顾问,主要为创业公司提供投资和融资的专业服务。他们在创业者和投资者之间扮演着至关重要的中介角色,为双方搭建桥梁,确保投…...
2023SICTF ROUND2 baby_heap
附件:baby_heap libc版本:glibc2.23 思路一:通过house of orange泄露libc地址,然后通过unsorted bin attack将main_arena88地址写入到chunk_ptr(也就是申请出来的堆数组)中,这时候unsorted bi…...
buuctf crypto 【密码学的心声】解题记录
1.打开可以看到一个曲谱 2.看到曲谱中的提示埃塞克码可以想到ascii码,没有八可以联想到八进制,而八进制又对应着三位的二进制,然后写个脚本就好了 oct [111,114,157,166,145,123,145,143,165,162,151,164,171,126,145,162,171,115,165,143,…...
论文阅读 (100):Simple Black-box Adversarial Attacks (2019ICML)
文章目录 1 概述1.1 要点1.2 代码1.3 引用 2 背景2.1 目标与非目标攻击2.2 最小化损失2.3 白盒威胁模型2.4 黑盒威胁模型 3 简单黑盒攻击3.1 算法3.2 Cartesian基3.3 离散余弦基3.4 一般基3.5 学习率 ϵ \epsilon ϵ3.6 预算 1 概述 1.1 要点 题目:简单黑盒对抗攻…...
41 个下载免费 3D 模型的最佳网站
推荐:使用 NSDT场景编辑器 快速搭建3D应用场景 1. Pikbest Pikbest是一个设计资源平台,提供超过3万件创意艺术品。您可以在Pikbest上找到设计模板,演示幻灯片,视频和音乐等。您可以找到不同的3D模型,例如婚礼装饰&…...
SpringMVC之JSR303和拦截器
认识JSR303 JSR303是一项Java标准规范,也叫做Bean Validation规范,提供了一种JavaBean数据验证的规范方式。在SpringMVC中,可以通过引入JSR303相关的依赖,来实现数据的校验。 在使用JSR303进行校验时,需要在需要校验的…...
通过rabbitmq生成延时消息,并生成rabbitmq镜像
通过rabbitmq生成延时消息队列,并生成rabbitmq镜像 整体描述1. 使用场景2. 目前问题3. 前期准备 具体步骤1. 拉取镜像2. 运行镜像3. 安装插件4. 代码支持4.1 config文件4.2 消费监听4.2 消息生产 5. 功能测试 镜像操作1. 镜像制作2. 镜像导入 总结 整体描述 1. 使用…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
