Linux 实战技巧
介绍 Linux 相关的命令、Shell 编程、实用技巧、优化实战和系统架构相关知识。
介绍 Linux 相关的命令、Shell 编程、实用技巧、优化实战和系统架构相关知识。
ZooKeeper 是一个基于 Google Chubby 论文实现的一款解决分布式数据一致性问题的开源实现,方便了依赖 ZooKeeper 的应用实现 数据发布 / 订阅
、负载均衡
、服务注册与发现
、分布式协调
、事件通知
、集群管理
、Leader 选举
、 分布式锁和队列
等功能
一般的,在分布式系统中,构成集群的每一台机器都有自己的角色,最为典型的集群模式就是 Master / Slave
主备模式。在该模式中,我们把能够处理所有写操作
的机器称为 Master
节点,并把所有通过异步复制
方式获取最新数据、提供读服务
的机器称为 Slave
节点
而 ZooKeeper 中,则是引入了 领导者(Leader)
、跟随者(Follower)
、观察者(Observer)
三种角色 和 领导(Leading)
、跟随(Following)
、观察(Observing)
、寻找(Looking)
等相应的状态。在 ZooKeeper 集群中的通过一种 Leader 选举
的过程,来选定某个节点作为 Leader
节点,该节点为客户端提供读
和写
服务。而 Follower
和 Observer
节点,则都能提供读
服务,唯一的区别在于,Observer
机器不参与 Leader 选举
过程 和 写操作
的"过半写成功"
策略,Observer
只会被告知已经 commit 的 proposal。因此 Observer
可以在不影响写性能
的情况下提升集群的读性能
(详见下文 “性能优化 - 优化策略 - Observer 模式” 部分)
A Java Virtual Machine(JVM)is an abstract computing machine that enables a computer to run a Java program.
JVM 的存在,使得 Java 程序 能够轻易地在多平台上移植,基本上脱离了对硬件的依赖性(这也满足了 David Parnas 的 “信息隐藏” 准则)
因为底层 JIT 编译优化、高效 GC、JUC 对多线程并发编程的支持,以及社区中海量成熟的库 等优点,使得很多语言都开发出可运行在 JVM 上的版本
同时,多语言混合编程成为一种趋势,在需要快速开发、灵活部署 和 针对特定问题的 DSL 等场景下,选择恰当的 JVM-hosted language,可以最大化原有代码的价值
那么,在日常的开发过程中,究竟应该如何运用 JVM 的知识,来逐步提高实际编程水平呢? 上下而求索后,找到了以下几个层面作为出发点
他们各有什么区别,为什么会如此选型?
Paxos 是最先解决拜占庭将军问题的算法,利用过半选举的机制,保证了集群数据副本的一致性(微服务中服务注册与发现的场景,其实已经不再适用了)
Redis 使用 Raft 实现了自己的分布式一致性。Raft 本身和 Paxos 并没有场景上的区别。更多的是,协议上的简化、Term 概念的强化、Log 只会从 Leader 到 Follower 单向同步,使得实现起来会很方便
Hadoop 偏向于离线的海量数据处理,利用 ZooKeeper 来保证数据副本的一致性,是最为合适的
Elasticsearch 集群接收到为文档创建索引的请求时,需要选择在哪一个 shard(完整且独立的 Lucene 索引实例)上对文档进行索引。Elasticsearch 采用的是 djb2 哈希算法(俗称 times33),对要索引文档默认或指定的 key 进行哈希 hash(key)
,然后再对 Elasticsearch 集群中 shard 的数量 n 进行取模,即 $hash(key) \, mod \, n$
用于对数据存储进行负载均衡的算法。最新的进展,是在去年 Google 发表的一篇 有界负载的一致性 Hash 算法的论文。该算法保证了负载均衡一致性和稳定性的同时,在均匀性方面做出了实质性地改进。同时,Consistent Hashing with Bounded Loads 算法 也在 HaProxy 开源项目中得以应用,有效减少了其 8 倍的缓存带宽
Gossip 主要被 Cassandra 用于实现其分布式一致性。因为 Cassandra 框架,更看重 去中心化 和 容错 的特性,在不违背 CAP 定理的情况下,能够接受 最终一致性