- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
1. 概述 。
对于分布式系统,人们首先对现实中的分布式系统进行高层抽象,然后做出各种假设,发展了诸如CAP, FLP 等理论,提出了很多一致性模型,Paxos 是其中最璀璨的明珠。我们对分布式系统的时序,复制模式,一致性等基础理论特别关注.
在共识算法的基础上衍生了选举算法,并且为分布式事务提供了部分的支持。本文从常见的几种分布式存储系统看看实践中的分布式系统设计细节。理论结合实际,能更好地帮助我们加深理解.
2.分片 。
先来看看分片的定义:
The word “Shard” means “a small part of a whole“. Hence Sharding means dividing a larger part into smaller parts . In DBMS, Sharding is a type of DataBase partitioning in which a large database is divided or partitioned into smaller data and different nodes 。
分片是分布式存储系统绕不开的话题,分片提供了更大的数据容量,能够提升读写效率,提升数据可用性.
分布式存储系统 | 分片 | 备注 |
elasticsearch | 每个index 进行分片,即 shard | shard计算,shard = hash(routing) % number_of_primary_shards |
kafka | 每个topic分析分片,即 partition | 根据key来选择partition,也可以根据自定义partition算法实现 同一的user发送到同一 的partition |
redis-cluster | 对所有数据进行分片,hash slot 16384(2^14) | hash tags 确保数据分配到同一个slot:{123}:profile and user:{123}:account |
3.复制 。
复制提升了数据的可靠性,复制分片还可以用来做read。在分布式系统重,有两种复制模式:
分布式存储系统 | 复制 | 备注 |
elasticsearch | primary 复制数据到 in-sync copies,同步复制 | |
kafka | 主分片复制数据到 ISR (in sync replica) | producer 可以配置 acks 和 min.insync.replicas 来调整一致性 |
redis-cluster | 采用redis 的复制机制,异步复制 | redis对性能非常敏感,所以采用的都是异步复制 |
4.一致性 。
不同的复制策略带来了不同的一致性,常见的一致性有 。
根据Ryan Barrett在 Google I/O 2009 - Transactions Across Datacenters 中的定义,elasticsearch/kafka/redis-cluster 都采用了 primary-backup model,primary-backup model 的特点是最终一致性, 但是具体细节有所不同.
分布式存储系统 | 写入一致性 | NWR 模型 | 备注 |
elasticsearch | 最终一致性 (较强) | w(all write) , r(1) | 需要refresh 到文件系统缓存才可见,flush操作到磁盘 |
kafka | 最终一致性 (可调) | w(ack writes) , r(1) | ack = 0 最弱,ack = all 最强 |
redis-cluster | 最终一致性 (较弱) | w(1) , r(1) |
5.选举算法 。
选举算法的基础是共识算法,paxos是其中最璀璨的明珠,paxos在共识算法中的地位可以用这样表述:
Either Paxos, or Paxos with cruft, or broken 。
paxos 最早应用于google 的 Chubby (lock manager),zk是 Chubby的开源版本.
分布式存储系统 | 选举算法 | 备注 |
elasticsearch | bully/类raft | bully算法比较简单,谁大就选谁 |
kafka | zookeeper(zab)/kraft(raft) | |
redis-cluster | 类raft |
由于paxos算法晦涩难懂,并且如果要应用到实际过程中需要做很多调整,所以开发了一个易于理解的版本 raft算法 ,raft算法分为 leader election, log replication, safety, and membership changes 等模块,相比于paxos 所有节点都是平等的,raft 进行leader 选举,并且通过log replication进行数据同步,safety 确立了raft算法的完备性,membership changes 处理节点变更的情形。log replication 表示了raft底层的数据结构,对我们设计类似系统大有裨益.
6.事务支持 。
存储系统中,事务是非常重要一部分,我们来看看各类组件是否支持分布式事务,以及他们是如何实现的:
分布式存储系统 | 事务支持 | 备注 |
elasticsearch | 不支持 | |
kafka | 支持事务,基于2PC | |
redis-cluster | 不支持跨节点的事物,支持单节点的事物 | 使用multi/exec/watch 来实现 |
7.总结 。
本文从分布式系统的几个方面探讨了elasticsearch,kafka,redis-cluster的细节,他们有很多共性,但是在许多方面也有很多不同。鉴于笔者对分布式系统的研究还不是很深入,如果错误,请指正.
8.参考 。
https://book.mixu.net/distsys/single-page.html 。
https://www.youtube.com/watch?v=srOgpXECblk 。
https://snarfed.org/transactions_across_datacenters_io.html 。
http://harry.me/blog/2014/12/27/neat-algorithms-paxos/ 。
https://ramcloud.atlassian.net/wiki/download/attachments/6586375/raft.pdf 。
最后此篇关于分布式存储系统举例剖析(elasticsearch,kafka,redis-cluster)的文章就讲到这里了,如果你想了解更多关于分布式存储系统举例剖析(elasticsearch,kafka,redis-cluster)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我的 Django 应用程序在生产过程中变得非常缓慢。可能是由于某些复杂或未索引的查询。 是否有任何类似 django 的方法来分析我的应用程序? 最佳答案 试试 Django Debug Toolb
我正在使用GDownloadUrl将客户端数据发送到服务器。这里是我使用的sode GDownloadUrl( dwnld_url, function(data) {
我一直在尝试开始分析我的 CherryPy 网络服务器,但文档缺乏关于如何设置它的详细信息。我知道我应该能够使用 cherrypy.lib.profiler 作为中间件来安装我的初始服务器。现在,我有
是否有任何 HashMap 实现公开了用于分析 Map 性能的钩子(Hook)方法(平均链长度、最佳/最差/平均访问时间、#rehashes 等)。 在 ~O(1) 访问时间方面使用 HashMap
我想知道是否有可用的技术或工具可以告诉您执行特定方法需要多少时间。 类似于数学/计算机科学中的大 O 符号,可以让您了解算法的复杂性,我想知道代码分析是否有类似的东西。 最佳答案 Profiling是
前面,我们说Ruby没有函数,只有方法.而且实际上有不止一种方法.这一节我们介绍访问控制(accesscontrols). 想想当我们在"最高层"而不是在一个类的定义里定义一个
我有一个用 Visual Basic 编写的大型应用程序6,我需要分析它。有没有类似 ANTS Profiler 的东西但对于 COM应用程序? 最佳答案 我以前用 VBWatch .我对它有很好的体
我做了两个实现来解决 Shikaku 难题。一个使用顶部、左侧、宽度和高度 (TLWH) 作为每个矩形的参数,另一个使用顶部、左侧、底部、右侧 (TLBR)。 出于某种原因,使用 TLBR 的速度要快
如果重要的话,我正在使用 Very Sleepy CS 进行分析。 IPP(Intel's Integrated Performance Primitives)在我的项目中使用,基本上是单次调用: i
我想弄明白这个排列算法是如何工作的: def perm(n, i): if i == len(n) - 1: print n else: for j i
如果 C++ 项目的物理结构有利于编译速度,您将如何获得某种客观的衡量标准?有些人说你应该避免使用模板以获得更好的编译速度,但是如果模板生成大量非冗余目标代码,即使行/秒编译速度不是很好,那也不是很糟
摘自 Robert Sedgewick 和 Kevin Wayne 算法第 4 版 在递归部分基本情况代码是 if(end start) { mid = (start+end
有没有一种简单的方法可以计算一段标准 C 代码实际执行的乘法次数?我想到的代码基本上只是做加法和乘法,主要兴趣是乘法,但也可以计算其他操作的数量。 如果这是一个选项,我想我可以四处用“multiply
我正在编写一个 Netty 应用程序。该应用程序运行在 64 位八核 linux 机器上 Netty 应用程序是一个简单的路由器,它接受请求(传入管道),从请求中读取一些元数据并将数据转发到远程服务(
我希望能得到一些帮助来弄清楚这个异常消息到底对我说了什么。我能够使用调试器将问题缩小到代码中的特定行。但是,我认为更多信息可以更好地找出代码中的实际问题。 public static List
我有一个存储在 USB 拇指驱动器上的 mysql 数据库,该数据库已不可挽回地丢失了其文件分配表。因此,我无法访问整个 ibdata1 文件。不过,我可以找到使用十六进制编辑器使用的记录页面。 所有
我正在使用 jQuery 在单击时显示图像。通过将图像源存储到像这样的变量中,这可以很好地工作.. var theSrc = $(event.target).attr('src'); 然后我可以将这张
我是 R 的新手,但不是 C 的新手。我想看看是否可以为 friend 加速一个包。通常使用 C 我会编译一个设置了 -pg 标志的应用程序,然后将 gmon.out 文件传递给 gprof。 我
在分析我的代码以找出运行缓慢的地方时,我有 3 个功能显然会永远占用,这就是非常困的说法。 这些函数是: ZwDelayExecution 20.460813 20.460813 19.
我正在分析一个应用程序并注意到 52% (195MB) 的内存被 char[] 使用,20% 被 String 使用。这是一个有很多依赖项的大型项目,我刚刚看到它,所以我有几个相关的问题可以帮助我开始
我是一名优秀的程序员,十分优秀!