一致性算法——Raft
几天前更新的文章里降到了一致性算法,也详细地写了 Paxos 算法的内部原理,今天我们继续学习分布式一致性算法的其他两种,由于篇幅有限,所以一篇博客写一个算法。
关于 Raft 算法Raft 是工程上使用较为广泛的强一致性、去中心化、高可用的分布式协议。在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的 Paxos。
Paxos 算法是分布式系统领域最重要的一致性算法,同时也是公认的极为艰深难懂的算法。为了解决这个晦涩难懂的问题,斯坦福大学的Diego Ongaro、John Ousterhout教授以容易理解(Understandability)为目标设计了这个新的一致性算法:Raft,并在2013年发布了论文:《In Search of an Understandable Consensus Algorithm》。为了验证这个容易理解的特性,他们分别在斯坦福大学和加州大学伯克利分校的分布式计算课程上,使用了Raft和Paxos两种算法,采用视频教学的方式来传授给学生,之后采用小测验的方式来验证。结果表明 Raft 比 Paxos 容易理解很多。
Raft 和 Paxo ...
一致性算法——Paxos
在正式学习一致性算法之前,先来看一个问题。
基于前面对分布式系统环境下一致性与共识算法的基础理论,在分布式系统中进行节点通信大部分采用基于消息传递通信模型,不可避免的会发生如进程可能会变慢、被杀死或者重启等问题,会对分布式系统中各节点对某一值达成一致性产生问题。
如何解决这一问题,这就要引出今天的主角——Paxos。
关于 PaxosPaxos 算法是 Leslie Lamport(莱斯利·兰伯特open in new window)在 1990 年提出了一种分布式系统 共识 算法。这也是第一个被证明完备的共识算法(前提是不存在拜占庭将军问题,也就是没有恶意节点)。
为了介绍 Paxos 算法,兰伯特专门写了一篇幽默风趣的论文。在这篇论文中,他虚拟了一个叫做 Paxos 的希腊城邦来更形象化地介绍 Paxos 算法。
不过,审稿人并不认可这篇论文的幽默。于是,他们就给兰伯特说:“如果你想要成功发表这篇论文的话,必须删除所有 Paxos 相关的故事背景”。兰伯特一听就不开心了:“我凭什么修改啊,你们这些审稿人就是缺乏幽默细胞,发不了就不发了呗!”。
于是乎,提出 Paxos 算法的那篇论 ...
分布式系统——理论基础
关于分布式系统相关的内容, 在之前的博客里面也提到过不少,主要包括一致性算法、分布式存储等相关的内容,但是对于分布式系统,并没有一个清晰的概念。今天主要来看一下分布式系统的基础概念和理论基础,分布式系统涉及很多的技术、理论和协议,很多人也说,分布式系统是“入门容易,深入难”,我之前的学习也只算是管中窥豹,只见得其中一斑。
在网上搜索“如何学习分布式系统”,看完之后还是觉得云里雾里,不进行记录不太容易理清楚这里边的内容。本系列的博客主要关注一些实际应用场景中的技术实现,偏向于算法方向,更多的还是作为了解的内容。
什么是分布式系统?
一个分布式系统是一些独立的计算机集合,但是对这个系统的用户来说,系统就像一台计算机一样。
首先需要明确的是,只有当单个节点的处理能力无法满足日益增长的计算、存储任务的时候,且硬件的提升(加内存、加磁盘、使用更好的CPU)高昂到得不偿失的时候,应用程序也不能进一步优化的时候,我们才需要考虑分布式系统。因为,分布式系统要解决的问题本身就是和单机系统一样的,而由于分布式系统多节点、通过网络通信的拓扑结构,会引入很多单机系统没有的问题,为了解决这些问题又会引入更多的机 ...
腾讯面试(三)
腾讯二面,没想到上次面试还有下文,隔了四天,周日晚上约今天的面试,那时我还躺在南昌酒店的床上享受着美好的假期生活。腾讯是真给机会啊,面完的感受,觉得还是差太多了,面试官问的问题我甚至都没听懂,不知道为什么,感觉很奇怪。面试时间不长,面试官也没开摄像头,没有自我介绍,直接开始拷打项目,但是也没有问什么深入的内容,就让自己介绍、有什么收获、重做一遍会有什么改进、做了多长时间等等,后面问一些八股,答得也不好,二十五分钟结束面试。反问项目组用什么语言、做什么内容,主要用 Go 和 C++,做一些关于大数据的内容(这不刚好吗,我可是千年学府、百年名校的湖南大学的第二届大数据学生)。
由于问题并不是很多,而且问题好像也不是很难,只是我没懂面试官的意思,脑子坏掉了,我就说我总是关键时刻掉链子。所以就简单记录一下都问了什么问题吧。
挑一个项目介绍一下。
传统项目了,果断挑选博客系统,巴拉巴拉介绍完。
介绍一下项目里用到的数据结构和技术选型。
太专业了,脑子没转过来也不知道怎么回答了,就讲了一下GET、POST请求,想继续讲登录操作,被打断了,可能是我太啰嗦了。
项目里前端和后端是怎么通信的, ...
I/O多路复用:select/poll/epoll
很久很久以前(三天前),我被问到一个熟悉又陌生的问题,了解I/O多路复用吗?我回答,了解但是还没开始学?是的,我学习的领域就是这么广泛又浅显,名词我都了解,但是就是不知道具体是什么。
说到 I/O多路复用,我学习的博客都把他归到了操作系统一类里面,我也学过操作系统啊,为什么就不知道这是什么呢?我问了我周围的同学,好像都不知道,应该是当时老师没讲,也可能是讲了我们都没听。我知道这个算法是在学习 Redis 的时候,我们在 Redis 为什么这么快 那篇博客里提到了 多路复用 这个算法,今天我们就来看一看 I/O多路复用的前世今生。
最基础的 Socket 模型要想客户端和服务器能在网络中通信,那必须得使用 Socket 编程,它是进程间通信里比较特别的方式,特别之处在于它是可以跨主机间通信。
Socket 的中文名叫做插口,乍一看还挺迷惑的。事实上,双方要进行网络通信前,各自得创建一个 Socket,这相当于客户端和服务器都开了一个“口子”,双方读取和发送数据的时候,都通过这个“口子”。这样一看,是不是觉得很像弄了一根网线,一头插在客户端,一头插在服务端,然后进行通信。
创建 Socke ...
十大经典排序算法大揭秘
从刚开始找实习,我就一直说要重学算法,还是老毛病,拖延症。每次面试到了算法环节就只能讲自己的思路,因为代码实现不出来,题倒也做了不少,可惜就是没什么收获,还是慢慢重新学习吧。
学习算法的第一站,我选择排序算法,主要原因还是因为昨天晚上的面试打击到我了,要先把之前一直拖着没总结的东西重新学习并总结一下。
排序算法排序算法(sorting algorithm)用于对一组数据按照特定的顺序进行排序。排序算法有着广泛的应用,因为有序数据通常能够被更高效地查找、分析和处理。
排序算法中的数据类型可以是整数、浮点数、字符或字符串等。排序的判断规则可根据需求设定,如数字大小、字符 ASCII 码顺序或自定义规则。
评价维度运行效率:我们期望排序算法的时间复杂度尽量低,且总体操作数量较少(时间复杂度中的常数项变小)。对于大数据量的情况,运行效率显得尤为重要。
就地性:顾名思义,原地排序通过在原数组上直接操作实现排序,无须借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。
稳定性:稳定排序在完成排序后,相等元素在数组中的相对顺序不发生改变。
稳定排序是多级排序场 ...
什么是一致性哈希算法?
一致性哈希算法,一个躺在我书签里两周的知识点,之前就一直说要看要看,结果一直拖,拖到昨天被面试官问了,只能回答说不会。
一致性哈希算法、一致性算法,这两个内容我一直以为是一样的,所以刚开始决定放在一起学,刚刚得知,两个不是一个东西。露出尴尬的笑容,那就先学一致性哈希算法吧。
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。
一致性哈希算法是一种常用的分布式算法,其主要用途是在分布式系统中,将数据根据其键(key)进行散列(hash),然后将散列结果映射到环上,再根据数据节点的数量,将环划分为多个区间,每个节点负责处理环上一定区间范围内的数据。
按照老传统,我们逐步进行学习。
如何分配请求?大多数网站背后肯定不是只有一台服务器提供服务,因为单机的并发量和数据量都是有限的,所以都会用多台服务器构成集群来对外提供服务。
但是问题来了,现在有这么多个节点,要如何保证分配客户 ...
Golang中的闭包,你真的了解吗?
Go 语言从设计上对函数进行了优化和改进,让函数使用起来更加方便。
因为Go语言的函数本身可以作为值进行传递,既支持匿名函数和闭包,又能满足接口,所以 Go 语言的函数属于一等公民。
本文将由一道题引出 Go 中的闭包。这是 Go 语言爱好者周刊第 90 期的一道题目。以下代码输出什么?
12345678910111213141516171819package main import "fmt"func app() func(string) string { t := "Hi" c := func(b string) string { t = t + " " + b return t } return c}func main() { a := app() b := app() a("go") fmt.Println(b("All"))}
思考一下,这里会输出什么,如果再加上一行代码 fmt.Println(a("A ...
腾讯面试——血与泪的教训(二)
没想到啊,这个标题下的内容还能成为连续剧。
我终于明白我为什么找不到实习了,给我机会我不中用,我哭死,腾讯不愧是大公司,还给了我第四次面试机会,结果我还是没有把握住。有三分之一的问题没有回答出来,结果几乎全是之前就已经看过但是只是扫了一眼或者压根就只是躺在我的收藏夹里没动过。
还是借此机会,拾起来重新学吧。
今天的面试问题主要集中在两个方向,Go 语言基础的知识和数据库的一些底层内容。
Golang中哪些不能作为map类型的key?在 Go 语言中,map 的 key 可以是任意使用 == 或 != 运算符进行比较的类型。这意味着一下类型可以作为 map 的键:
基本类型:int、float、bool、string
接口类型
指针类型
数组类型(数组中的元素必须是能作为键的类型)
然而,以下类型不能作为 map 的键:
slice
map
function
包含上述类型的结构体
这是因为 slice、map 和 function 等类型的值不是固定的(它们在内存中的表示可能会改变),因此不能用于比较。例如,两个包含相同元素的 slice 在使用 == 运算符进行比较时会产生编 ...
Java八股文——基础篇(三)
今天是 Java 基础八股文的第三篇,本文内容包括异常、泛型、反射、注解、SPI、I/O等,内容很杂也是一些重要内容,一两个问题讲不清的后面还是要单独来学习吧。
异常Java 异常类层次结构图概览:
Exception 和 Error 有什么区别在 Java 中,所有的异常都有一个共同的祖先 java.lang 包中的 Throwable 类。 Throwable 有两个重要的子类:
Exception :程序本身可以处理的异常,可以通过 catch 来进行捕获。Exception 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。
Error:Error 属于程序无法处理的错误 ,不建议通过catch捕获 。例如 Java 虚拟机运行错误(Virtual MachineError)、虚拟机内存不够错误(OutOfMemoryError)、类定义错误(NoClassDefFoundError)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
Checked Exc ...