Web

应用层数据分布路由算法

应用层数据分布路由算法主要用于分布式系统中,将数据或请求分配到多个节点(服务器、存储设备或服务实例)上,以实现负载均衡、高可用性和扩展性。常见的有: 哈希取模(Modulo Hashing)、随机路由 (Random Routing)、一致性哈希(Consistent Hashing)等等。 随机路由 (Random Routing) 原理:随机选择一个节点处理请求。 特点: 简单直观,但不能保证均匀分布。 不适合高负载系统,因为可能导致数据倾斜。 应用:用于初步负载均衡或测试场景。 哈希取模(Modulo Hashing) 原理:使用简单的哈希函数对节点数量取模,将请求分配到相应节点。 公式:节点 = Hash(Key) % N,其中 N 是节点数量。 特点:简单高效,易于实现。 缺点:节点增减时,所有数据都需要重新分配,无法满足动态性要求。 应用:适用于小规模系统或节点数固定的场景。 一致性哈希(Consistent Hashing) 原理:将节点和数据映射到一个逻辑环上,数据存储在与其哈希值最接近的节点中。 特点: 高动态性:节点增减时,仅影响邻近的节点,减少数据迁移量。 负载均衡:通过虚拟节点均衡数据分布。 应用: 分布式缓存(如 Memcached、Redis)。 分布式存储(如 Cassandra、Amazon Dynamo)。 微服务负载均衡。 一致性哈希算法实现 一致性Hash首先构建一个Hash 环的结构。环的大小是 0 到2^32-1,也就是无符号整型的取值范围,0 和最后一个 2^32-1 首尾相连,构成一个 Hash 环。将每个缓存服务节点 hash值放到环上。每次一次进行服务器查找路由计算的时候,都是根据key 的hash 值顺时针查找距离它最近的服务器节点。通过这种方式,key 不变的情况下找到的总是相同的服务器。但是,Hash 值是一个随机值,把一个随机值放到一个环上以后,可能是不均衡的,也就是某两个服务器节点在环上的距离可能很近,而和其它的服务器节点距离很远。这会导致有些服务负载压力特别大,有些服务器的负载压力特别小。在实践中,需要使用虚拟节点对方法进行改进,把一个服务节点放到环上时,把它虚拟成200个虚拟节点,然后把 200 个虚拟节点随机放到环上。key 依然是按照顺时针查找距离它最近的虚拟节点,再根据映射关系找到真正的物理节点。 Java 代码实现如下: public class Consistent { SortedMap<Long, PhysicalNode> ring; int virtualNodeCount; public Consistent(int virtualNodeCount) { ring = new TreeMap(); this.

多租户

多租户架构概述与实现 多租户(Multi-tenancy) 是一种软件架构模式,允许多个客户(租户)共享同一个应用实例和底层资源,同时保障租户数据的隔离与安全。租户可以是企业、部门或个人用户。其目标是在优化资源利用效率的同时,满足租户对个性化、安全性和成本效益的需求。 多租户的背景与优势 背景 云计算的普及:随着云计算技术的发展,SaaS(软件即服务)模式迅速崛起,多租户架构成为共享资源和优化成本的关键技术。 资源利用效率需求:通过在同一物理或逻辑服务器上运行多个租户应用,提高资源利用率并降低运营成本。 个性化和隔离需求:满足租户定制化的同时,确保数据安全与隔离。 降低运维成本:多租户架构显著减少了软件升级与补丁管理的复杂性。 优势 低成本:通过共享资源,显著降低基础设施和维护费用。SaaS多租户软件通常以订阅形式提供,租户分担运营成本。 可伸缩性:租户可根据需求灵活扩展,只需调整订阅配置。 无代码定制化:无需复杂的开发,租户即可通过配置满足特定业务需求。 持续更新与维护:软件提供商统一管理更新与补丁,租户自动获得改进,无需额外操作。 提高生产率:租户可专注于核心业务,无需管理基础设施或软件。 多租户架构的实现方式 根据隔离程度和成本,不同场景下的多租户实现方式如下: 1. 共享数据库 + 共享架构 所有租户共享一个数据库实例与数据库架构,租户数据通过租户标识(如租户ID)区分。 优点: 成本低:资源利用率高,节约硬件与运维成本。 开发简单:实现复杂度较低。 适合中小规模租户:支持批量操作。 缺点: 安全性较低:需严格控制租户间的数据隔离。 扩展性有限:租户增长可能引发性能瓶颈。 适用场景:小型SaaS应用,租户间数据隔离需求较低。 2. 独立数据库 + 共享架构 每个租户拥有独立的数据库,但共享数据库架构。 优点: 数据隔离性好:提升安全性。 扩展性强:可独立扩展租户数据库。 缺点: 成本较高:需分配单独数据库实例。 运维复杂度提升:需管理多个数据库实例。 适用场景:中型SaaS应用,数据隔离需求高。 3. 独立数据库 + 独立架构 每个租户拥有独立的数据库与架构,支持更高的定制化。 优点: 高度隔离:数据、性能、定制化完全独立。 灵活性高:满足复杂业务需求。 缺点: 成本高:需为每个租户单独配置资源。 开发与运维复杂度高:架构需逐一维护。 适用场景:大型企业级应用,少量租户但数据敏感且需求复杂。 4. 容器化隔离 通过容器技术(如Docker),为每个租户提供独立的容器化服务。 优点: 部署灵活:每个容器的环境可独立配置。 高扩展性:便于弹性伸缩。 强隔离性:容器内外环境相互独立。 缺点: 运维复杂:需管理容器编排工具(如Kubernetes)。 成本:资源分配灵活性可能引发一定浪费。 适用场景:需要高度隔离和动态扩展的中大型应用。 特殊技术:命名空间与多租户 Linux命名空间 Linux命名空间是一种操作系统层面的资源隔离技术,可以将全局资源划分为命名空间范围内的资源。命名空间隔离涵盖主机名、用户权限、文件系统、网络、进程等,支撑了容器技术(如Docker)。 命名空间通过为每个租户创建独立的资源视图来实现隔离。与Cgroups(控制组)结合使用时,可以进一步限制每个租户对CPU、内存和I/O的使用,从而实现资源的公平分配。例如,网络命名空间可以为每个租户分配独立的虚拟网络接口和IP地址,进而避免资源争夺。 在多租户架构中,Linux命名空间的典型应用包括:

HTTPS 单向/双向认证

HTTPS HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,不适合用来传输隐私信息。默认 80 端口。 Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了 SSL(Secure Sockets Layer) 协议用于对 Http 协议传输的数据进行加密,保证会话过程中的安全性。默认 443 端口。 SSL 包含对称加密和非对称加密,在建立传输链路时,SSL 首先使用非对称加密的方式对对称加密密钥进行加密,建立链路后,使用对称加密的方式对传输内容进行加密。非对称加密有更高的安全性,在这个基础上使用对称加密可以获得更快的速度,提高传输效率。 单向认证 客户端校验服务端证书 client hello 客户端发起一条到服务端的连接,包含客户端支持的 TLS 版本、支持的加密套件(即加密算法)以及客户端随机数。 server hello 服务端回应,包含服务端 SSL 证书、选择的加密套件以及服务端随机数。 authentication 客户端向颁发证书的 CA 验证服务端的 SSL 证书,以确认服务端是它声称的那个身份,从而保证客户端与域名真正的所有者通信。 send premaster key 客户端发送另一个随机数 “premaster key”,并对它使用服务端的公钥(从服务端 SSL 证书中获取得到)进行加密。 decrypt premaster key 服务端解密 premaster key create session key 客户端和服务端各自使用客户端随机数、服务端随机数以及 premaster key 来计算 “session key”,即对称加密密钥,两边计算得出同样的结果并各自保留。 client send finished 客户端使用 session key 加密一条 finished 消息并发送给服务端。