分布式详解5
分布式事务有哪些解决方案基于XA协议的两阶段提交和三阶段提交,需要数据库层面支持。 XA协议通常不是通过简单的单条SQL命令来完成的,而是通过一组命令/API调用来管理一个分布式事务的完整生命周期。这些命令通常由事务管理器 调用,而应用程序则通过高级抽象(如Java JTA)来间接使用。 一些核心命令: 段 命令/函数名 说明 常见实现举例 阶段一:准备阶段 xa_start 开启一个分布式事务分支,将其与一个全局事务ID(XID)关联。 C API / 数据库驱动内部调用 xa_end 结束当前线程与分布式事务分支的关联。 C API / 数据库驱动内部调用 xa_prepare 核心命令。事务管理器向所有参与者发出此命令。参与者将事务内容持久化到日志中,并锁定相关资源,然后返回“就绪”或“失败”状态。 MySQL: XA PREPARE '<xid>' 阶段二:提交/回滚阶段 xa_commit 提交命令。如果所有参与者都返回“就绪”,事务管理器向所有参与者发出此命令,要...
分布式详解4
集群、分布式、SOA、微服务的概念及区别集群不同服务器部署同一套应用服务对外提供访问,实现服务的负载均衡或者互备(热备,主从等),指向一种组件的多个实例,形成的逻辑上的整体。单个节点可以提供完整服务。集群是物理形态 问题“节点对等”是理想集群的一个核心特征,而“Nginx分发”是实现这一特征的最常用技术手段之一。 集群是一种系统架构的目标和组织形式。 节点对等是实现该目标的一种优秀内部结构和设计原则,它使得集群易于扩展和高可用。 Nginx分发是实现该目标的一个关键外部工具和流量调度机制,它负责将用户请求合理地分配给内部那些对等的节点,是集群能力的“放大器”。 详细解释1. “集群中的节点位置对等”与集群的关系这个概念描述的是集群内部节点的一种理想关系。 什么是对等? 功能对等:每个节点都运行着完全相同的一份代码或服务(例如,都部署了你的Web应用)。 身份对等:从负载均衡器的角度看,这些节点没有本质区别,任何一个节点都可以处理任何一个请求。它们通常是无状态的。 可替代性:如果其中一个节点宕机,其他节点可以立刻接管它的工作,用户不会感知到任何区别(除了可能的短暂性能波...
分布式详解3之负载均衡策略
1. 轮询法 原理:将请求按顺序轮流分配到后端服务器。 特点: 均衡对待所有服务器; 不考虑服务器实际负载或连接数。 将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。 即第n个请求对应第n个节点,很不现实,因为实际节点的配置不相同,配置高的节点收到很低的请求量实在浪费,配置低的节点收到过高请求量会崩溃。 2. 加权轮询法 原理:在轮询的基础上,为不同性能的服务器分配不同权重。 特点: 配置高、负载低的服务器权重更高,处理更多请求; 实现按能力分配负载,更灵活合理。 不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的前端;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。 实现:可以设置配置高的节点在轮询表中的节点数不止一个,如A1,A2的表示法,但是A节点的实际物理个数还是一个。 3. 随机法 原理:随机从服务器列表中选择一台处理请求...
基础漏洞总结3
拒绝服务拒绝服务指的是攻击者通过某种方式阻止合约正常执行其预期功能,使得合约无法继续服务合法用户。 简单来说,这是一种”我让你无法正常工作”的攻击方式。在智能合约中,DoS攻击通常通过操纵合约状态或利用执行限制来实现。 示例一个代币分发合约,负责收集投资并向投资者分发回报: 123456789101112131415161718192021contract DistributeTokens { address public owner; // gets set somewhere address[] investors; // array of investors uint[] investorBalances; // the amount investor gets bool public isFinalized = false; // ... function invest() public payable { investors.push(msg.sender); inves...
基础漏洞总结2
随机错觉(Entropy lllusion)随机错觉,也称为熵错觉,指的是开发者错误地认为在区块链上可以轻易地获得安全、不可预测的随机数。 简单来说,这是一种“我以为它是随机的,但实际上并非如此”的认知错误。 示例一个私有视图函数,用于根据一定的随机性条件判断是否执行空投。 123456789101112131415function airdrop() private view returns(bool){ uint256 seed = uint256(keccak256(abi.encodePacked( (block.timestamp).add (block.difficulty).add ((uint256(keccak256(abi.encodePacked(block.coinbase)))) / (now)).add (block.gaslimit).add ((uint256(keccak256(abi.encodePacked(msg.sender)))) / (now)).a...
基础漏洞总结1
之前学的比较乱,现在复习整理一下。 重入re-entrancy重入攻击是指在合约执行外部调用(通常是向外发送以太或调用另一个合约)时,接收方在该外部调用的执行流程中再次调用回原合约的某个函数,并借此在原合约未完成状态更新之前重复利用其尚未更新的状态,从而盗取资金或破坏状态一致性。 换句话说:合约 A 在执行到“对外调用”并等待返回时,被外部合约 B 回调回 A,利用 A 尚未完成的内部逻辑(比如余额未清零)重复触发受害逻辑。 示例漏洞合约 12345678910111213141516171819202122232425262728293031323334// SPDX-License-Identifier: MITpragma solidity ^0.8.0;contract EtherStoreVulnerable { uint256 public withdrawalLimit = 1 ether; mapping(address => uint256) public lastWithdrawTime; mapping(address...
关于Git 子模块(子文档)
问题发现&解决什么是子模块(子文档) 定义:Git 子模块(submodule)是一个嵌套在父仓库中的独立 Git 仓库。 作用:允许你在一个 Git 仓库中引用另一个仓库,并保持独立版本控制。 特点: 有自己的 .git 目录或由父仓库 .gitmodules 管理。 GitHub 上显示为 箭头文件夹,点击会跳转到子模块的远程仓库。 本地未初始化或更新时,会出现 in unpopulated submodule 报错。 如何发现文件夹被上传成子模块 GitHub 文件浏览器: 文件夹前有 箭头标记。 点击会跳到子模块对应的远程仓库,而不是显示普通文件列表。 本地操作: 执行 git status 或 git submodule status 可能显示子模块信息。 对未初始化的子模块操作文件会报错,例如: 1in unpopulated submodule 为什么文件夹会被识别为子模块 误操作添加子模块: 1git submodule add <repo_url> 子文件夹名 Git 会记录子模块信息在 .gitmodules...
分布式详解2
ZAB协议ZAB协议定义ZAB协议是为分布式协调服务Zookeeper专门设计的一种支持崩溃恢复的原子广播协议,实现分布式数据一致性。 ZAB协议组成部分消息广播 集群中所有的事务请求都由Leader节点来处理,其他服务器为Follower Leader将客户端的事务请求转换为事务Proposal,并且将Proposal分发给集群中其他所有的Follower 完成广播之后,Leader等待Follower反馈,当有过半数的Follower反馈信息后,Leader将再次向集群内Follower广播Commit信息 Commit信息就是确认将之前的Proposal提交 Leader节点的写入是一个两步操作:第一步是广播事务操作,第二步是广播提交操作 过半数指的是反馈的节点数 >=N/2+1,N是全部的Follower节点数量 崩溃恢复 在以下情况下会进入崩溃恢复模式: 初始化集群,刚刚启动的时候 Leader崩溃,因为故障宕机 Leader失去了半数的机器支持,与集群中超过一半的节点断连 此时开启新一轮Leader选举,选举产生的Leader会与过半的...
分布式详解1
CAP理论简述CAP理论 **数据一致性 (Consistency)**:如果系统对一个写操作返回成功,那么之后的读请求都必须读到这个新数据;如果返回失败,那么所有读操作都不能读到这个数据。对调用者而言数据具有强一致性。 **服务可用性 (Availability)**:所有读写请求在一定时间内得到响应,可终止、不会一直等待。 **分区容错性 (Partition Tolerance)**:在网络分区的情况下,被分解的节点仍能正常对外服务。 如果选择了CA而放弃了P,那么当发生分区现象时,为了保证C,系统需要禁止写入,当有写入请求时,系统返回error,这又和A冲突了,因为A要求返回no error和no timeout。因此,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。 反证:如果CAP三者可同时满足,由于允许P的存在,则一定存在节点之间的丢包,如此则不能保证C。因为允许分区容错,写操作可能在节点1上成功,在节点2上失败,这时候对于Client1(读取节点1)和Client2(读取节点2),就会读取到不一致的值,出现不一致的情况。如果要保持一致性,写操作必...
nvm 是如何在操作系统文件层面管理 Node.js 版本的?
nvm 是如何在操作系统文件层面管理 Node.js 版本的?很多人知道 nvm(Node Version Manager)可以一键切换 Node.js 版本,但它到底是如何在系统文件层做到“多版本共存、快速切换”的呢?下面用简单易懂的方式带你了解。 核心思路:把不同版本放在不同文件夹里nvm 不会把 Node.js 安装在系统默认目录(比如 /usr/local/bin 或 C:\Program Files),而是放到它自己的目录下。例如: 在 Linux / macOS:1234~/.nvm/versions/node/ ├── v14.21.3/ ├── v16.20.0/ └── v18.17.1/ 在 Windows(nvm-windows):1234D:\Program Files\nvm\ ├── v14.21.3\ ├── v16.20.0\ └── v18.17.1\ 每个版本都有一套完整的 Node 和 npm 文件,不互相覆盖。 一、切换版本时做了什么?当你运行: 1nvm use 16 nvm 的操作...








