Gossip实现
一篇关于gossip描述的很好的论文,NoSQL 数据库中的分布式算法
Gossip protocol
目标是向全世界传播消息
分布式传递消息的灵感来源于
- 感染病传播
- 人类八卦
- 社交网络
Gossip的强度 - 可伸展性
一个节点不会等待消息被确认,然后他也不会重新发送消息即使这个消息没有接受到 - 容错性
有能力在网络中进行不规则和未知的链接。他们在这些情况下工作得很好,因为当我们要让一个节点共享相同的信息几次到不同的节点是,所以如果一个节点不能被接受,信息就会通过一个不同的节点被共享,换一句话来说就是信息可以有多种渠道从源头流向目的地 - 鲁棒性
没有一个节点在网络中又特殊的地位。所以失败的节点不会阻止其他的节点的继续发送信息。
每一个节点可以随意的加入或者离开,而不会严重的干扰整体系统的服务。
并不是在所有的情况下都很鲁棒, - 收敛一致性
Gossip协议实现了以指数的方式散布信息,所以在一个新的时间发生之后会以指数级别的速度快速收敛到一个全局一直的状态,传播新的信息到所有的节点的时间会受到系统大小的对数影响 - 极度的去中心化
gossip 提供了一个极度的去中心画的信息发现机制,而且他的延迟是可以接受的如果信息不需要被马上用到。
Gossip协议在概念上很简单而且很好去编码。基本的思想就是:一个节点需要向其他的一些节点分享一些信息,然后周期性的随机从一个节点集合中选择一个节点,然后交换信息。
fanout:在一个循环中需要gossip的节点数,当一个节点需要传播一个信息,它会选着t节点,并且把消息发送给他们。
一点历史,复制数据库的流行算法:
复制数据库维护的流行算法。
有些问题我们需要解决的
- 我们尝试构建一个目录,一个可查询的数据库
- 网络是不可以依靠的
- 没个更新都会被注入一个站点,然后传播到所有的站点或者没更新给取代
- 数据库在数以千计的几点上复制
- 在没有更新之后,副本变得一致
节点的状态:
- 易感染的
一个有更新的节点愿意共享 - 易受到感染的
一个节点还没有被感染 - 移除
一个节点已经收到了更新,但是不愿意去共享它
移除是最棘手的操作,决定哪一个节点应该被移除不是一件容易得事情。理想情况下,当所有的节点都连接到了更新之后,节点就应该停止共享。但是这就意味着节点必须了解其他节点的状态。
之后我们会看到不同的算法,都是用来标记一个节点被移除(Removed)的方法
分析算法
分析了三种传播更新的方法
直接邮寄法: 他们一开始的时候,没一个更新都会从他们的入口地点发送到所有的其他的地点,但是会有一些问题:1.发送节点的瓶颈就是n(O).2.每个节点都必须被传播到所有的节点,所以每个节点必须知道系统中其他所有的节点。3.当节点长时间没有响应或者队列溢出的时候消息可能会被丢弃
反熵法:每个节点都定期的选择另外一个站点,并通过交换收哭的内容来解决两个节点之间的差异。他与直接邮寄法或者谣言散布法一起使用,并且运行以纠正为交付的更新,这是一个钟备份系统(backup system)。想象一下,那些直接邮寄法没有达到的节点,反熵应该修正。
谣言散布发: 一开始site是什么都不知道的。当一个site接受到更新的时候,他变成了“hot rumor”,当一个site上有一个“hot rumor”。他会周期性随机的选择另外一个site,并确保其他的站点看到了更新。当一个站点视图一个已经被其他很多站点都看过的“hot rumor”,这个站点就不再把这个rumor 视为 hot的,然后再不再传播这个更新并且保持更新。
最后两种是流行的八卦算法。让我们看看这些算法更加一般的描述。
Gossip的种类
- 反熵(SI模型):简单的流行病,一个节点总是为易感染的和感染的两种状态
- 谣言散布模型(SIR 模型):复杂一点的流行病,一个节点不仅有反熵的两种状态,还多了一个种移除的状态。
反熵这个名字的由来是因为这个算法被用来减少副本的熵,换句话来说就是增加了两个节点的相似度。
在反熵(SI 模型)中,一个具有感染信息的节点试图在每一轮循环中分享它。一个节点不仅共享了更新,而且还共享了整个数据库,有一些技术像校验和,(最新更新列表),merkle树等,容许节点在发送数据前得知两个节点是否存在差异,从而保证了最终完美的传播。
而且没有终止,所以它发送了无界的消息数量。
谣言传播的周期比反熵周期更加的频繁,因为他们需要更加少的资源,因为节点只发送一个行的更新或者一个感染更新的列表。谣言散布算法的传播速度很快,而且网络流量很低。
在某个点上的谣言被标记为 移除 ,不再共享,因此,消息的数量是有限的,并且更新不会到达所有站点的可能,尽管这个概率可以被变为任意小,我们稍后会看到。首先,让我们了解一下如何决定一个节点应该是被删除的状态。
移除状态/失兴(失去兴趣)
(基于Mark Jelasity的描述)
- Removal算法用来决定一个节点是否应该被置为移除的状态
- Coin/random:每次不成功的尝试之后,以1/k的概率被移除。
常识解释
ftp:正好我们计网学到了这个协议,ftp(file transport protocol)文件传输协议,顾名思义。ftp和http有很多的共同点,比方说他们都运行在TCP上。
用户通过一个ftp用户代理与ftp交互。该用户首先提供远程的主机的主机名,使本地的ftp客户端进程建立一个到远程足迹ftp服务器进程的tcp连接。该用户接着提供用户表示和口令,作为ftp命令的一部分在该tcp连接上传输。http: 超文本传输协议是一种应用协议用于分布式,写作和草媒体信息系统,是一种请求-响应 协议。
https:HTTP的改进,用于通过计算机网络进行安全的通信。在HTTPS,改通信协议被加密的安全套接层(TLS),或他的前身(SSL)加密。
-
HTTP 2.0: HTTP / 2 是HTTP 1.1 以来的第一个新版本。旨在解决http 1.0和1.1存在的问题
- 1,但链接多资源的方式,减少服务端的链接压力,内存占用更加小,链接的吞吐量更加大
- 2,不支持首部压缩
http2.0的优点: - 1、多路复用允许同时通过单一的HTTP/2 链接发起多从的请求-响应消息,不用依赖多个TCP链接。 HTTP/2 吧 HTTP 协议通信基本单位缩小为一个一个的帧,这些帧对应着逻辑刘中的信息。并行的在同一个TCP 链接上双向交换信息。从而使得拥塞状态得以改善。
- 2、首部压缩减少了数据的大小
- 3、HTTP/2 中,服务器可以对客户端的一个请求发送多个响应
PHP 是最好的语言:这个梗的来源已经无法考证了。但我不知道为何自己对PHP的印象不是很好,有一个原因就是因为我们学校但凡做项目铁定用的是PHP,而且学校的技术又特别的落后,所以技术落后就和PHP在我心中就绑定在一起了(我并不是黑它)。然后我在Quora上找了一下答案:这其实是一个强加的一个笑话,PHP并不是一门最好的语言,这句话使用来讽刺那些只懂点PHP皮毛而不深入下去的PHP开发者。PHP还是一门完美秀发编程语言(prefect hair programming),所以是想保住一头秀发的程序员的不二编程语言选择。
-
gzip压缩
- 把文件压缩为.gz 格式,或者解压
-
nginx/cgi/uWSGI/php-fpm/fastcgi
- 俗语解释
- nginx: 一个性能很高的web服务器
- uWSGI:一个给python进程的web服务器.WSGI是一种Web服务器网关的接口。它是一种Web服务器与web应用通信的一种规范
- cgi:cgi是网页表单和你写程序之间通信的一种协议。可以用任何语言写一个cgi脚本,这些语言智能接受输入输出的信息,读取环境变量。所以,几乎所有编程语言都能写一个CGI脚本。
- php-fpm:全称是php fastcgi process manager即为php fastcgi进程管理器,相比fastcgi静态的唤起 cgi进程和销毁以达到动态的调整cgi的数量,这样可以有效的使用内存,其他优点:fpm还可以平滑的重载php配置;不用再配置cgi短裤;有更好的状态输出,和slowlog日志,502的时候能给出更多的错误细节
- 俗语解释
-
高阶函数/函数克里化
- 高阶函数就是,从一个函数映射到另外一个函数。也就是一个函数返回另外一个函数
- 函数克里化是指的讲原来接受多个参数的函数编程行的只接受一个函数的过程,类似闭包,比方说python 的 partial库
函数式编程: 一种编程范式,属于一种结构化编程,把运算过程写出一系列的嵌套函数
-
bcd/mit licenses
MIT License:相对宽松的授权条约
BCD License: 比GPL许可证和MPL许可证宽松,但是比MIT严格
MIT License:MIT许可是一个宽容的自由软件许可证起源于美国麻省理工学院(MIT)。它只对重用限制非常有限,MIT许可证允许在私有软件中重复使用,前提是许可软件的所有副本均包含MIT许可条款和版权声明的副本。
BCD License:对使用和重新分配涵盖的软件施加最小的限制,BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对商业集成很友好的协议。但前提是
1、如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
2、如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
3、不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。
cocoa
苹果的一套用来写Mac OS X应用程序的面向对象的框架
cocoa是苹果公司为Mac OS X所创建的原生面向对象的API,用于苹果设备的应用程序
主要开发工具:Xcode,Interface Buildermvc模式
Model报数程序的核心(数据库), View显示数据 和 Controller用于处理数据-
装饰者/装饰器模式
包装,给一个对象在外部添加一些功能,动态的位对象添加功能,即从一个对象外部给对象添加功能。他并不必改变原类文件,动态的扩展一个对象的功能,主要是通过创建一个装饰器来包装对象。- eg: python的装饰器
-
socket/websocket
- socket 网络数据交换的接口。socket本质就是编程接口API,对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所需要的结构,这就是Socket编程接口。
- websocket
websocket协议
再简单点来说,它就好像将Ajax和Comet技术的特点结合到了一起,只不过性能要高并且使用起来要方便的多(当然是之指在客户端方面。。)
RFC草案中已经说明,WebSocket的目的就是为了在基础上保证传输的数据量最少。
这个协议是基于Frame而非Stream的,也就是说,数据的传输不是像传统的流式读写一样按字节发送,而是采用一帧一帧的Frame,并且每个Frame都定义了严格的数据结构,因此所有的信息就在这个Frame载体中。(后面会详细介绍这个Frame)
特点- 基于TCP协议
- 具有命名空间
- 可以和HTTP Server共享同一port
- ws的一些首部
Sec-WebSocket-Key : 客户端给服务器的
Sec-WebSocket-Accept :服务器给客户端的
客户端发送请求到服务端,客户端的请求头中包含有
upgrade : websocket
set-websocket-key : xxxxx==
服务端收到这个来自客户端的请求之后
对其进行sha1哈希加密,然后再进行base64编码,生成resKey
然后服务端开始够着相应头,相应头中的具体内容会有
'HTTP/1.1 101 Switching Protocols',
'Upgrade: websocket’,
'Connection: Upgrade',
'Sec-WebSocket-Accept: ' + resKey
resKey为服务端生成的resKey
ws有PingPong机制,
设置
pingTimeout:多少毫秒没有收到pong就自动把连接断开
pingInterval: 多少毫秒后发送一个发送一个新的ping包
-
opengl/opencv
- OpenGL是一个3D图像库(2D也能写),著名的建模软件C4D就有这个OpenGL编程模块,是指定了一个跨编程语言,跨平台的编程的接口规格的专业图像程序接口。他用于三维二维图像,是一个功能强大,调用方便的底层图像库。
- OpenCV:是一系列C函数少量的C++类构成,同时提供了Python、Ruby、MATLAB的语言的接口,实现了图像处理和计算机视觉方面的汗多通用的算法,还设计一些机器学习的算法
- opencv是图像到数据,而opengl是数据到图像
-
多态
- 只不同的类的帝乡对同一个消息做出的响应。即同一个消息可以根据发送对象的不同而采用多种不同的方式。
-
像素/尺寸/px/分辨率/ppi
- 像素是指在有一个数字序列标书图像的最小单位。每一个像素点一般为3个颜色的小灯组成,在一般的显示器上一个小灯有256中亮度,但是在监视器上这个数会大几倍
- 尺寸屏幕对角线的长度,一般以寸做单位
- 分辨率: 入1080 * 1920我的大屏就是
- ppi:屏幕像素密度(PPI)就是没英寸屏幕所拥有的像素数。kindle就是用ppi做单位。ppi可以通过分辨率和屏幕的尺寸换算出来
-
如何计算sin(1),e^x, log(x), sqrt(x)快速,精准
- 不知道233333
-
全加器/半加器/超前进位加法器
这个在大一的计算思维课程里讲过- 半加器: 加数和被加数为输入,和数与进位为输出的装置为半加器。
- 全加器: 若加数、被加数与低位的进位数为输入,而加数与进位的输出为全加器。
- 超前进位加法器:是多普通的全加器进行改良而设计成的并行加法器,主要是针对普通全加器串联时互相进位产生延迟进行了改良
-
编译原理/代码运行原理
- 编译:把高级计算机语言编译成计算机能识别的机器语言
- 编译 + 执行 代码就跑起来了
-
mysql/mongodb/sql/NoSql
- 通俗解释: 各种数据库
- 专业解释: 组织、存储、管理数据的仓库
-
cookies/session
- cookies: 网站为了人认证用户存储在本地的数据库,存储在客户端,不是很安全,别人可以分析存储在本地的cookie进行cookie欺骗
- session:储存客户的信息在服务器上,但是当访问增多时候,会占用你的服务器性能,所以有一个更加好的解决方法,json web token实现单点登录
-
git/svn/版本控制
- 这个就不说了,天天在用的,版本控制管理工具,虽然我的使用还停留在小学生阶段
-
ssh
- 建立在应用层的基础上的安全协议,专门为远程登录会话和其他网路服务提供安全性的协议,所有的传输的数据都会被加密。telnet与ssh类似,ssh就是多了一个ssl层
1、基于口令的认证:每次登录到远程主机都要输入密码
2、基于密钥的安全认证:你不虚创建一对密钥,公钥放在服务器上,这样其他的服务器就无法冒充真正的服务器,但是登录时间较慢。
- 建立在应用层的基础上的安全协议,专门为远程登录会话和其他网路服务提供安全性的协议,所有的传输的数据都会被加密。telnet与ssh类似,ssh就是多了一个ssl层
-
ORM
- 关系型数据库和业务实体对象之间作为一种映射,具体操作值需要简单的属性和方法。反正就是不要写sql你就可以愉快的操作数据库
- 但是性能很差,而且灵活性不够。