用不同的视角看负载均衡

序言

    总喜欢买相同的袜子,七双一模一样的,形状颜色均相同;总喜欢买黑色的衬衫,七件一模一样的,这样,你就不知道我是换了还是没换了,哈哈。。。


    一模一样的功能,一模一样的结构,这就是复杂均衡,为什么要买奇数件呢,因为这样可以防止脑裂(不用去考虑要穿什么样的衣服,不用去想要穿什么样的袜子,对于这一切,我都无需关心,我只要发送请求,那么就必然会得到响应,强一致性!!!)。

负载均衡

    忘记了负载均衡的通俗含义,只记得主要的功能了。。。所谓负载均衡,就是将负载进行平均,然后在后端的机器或者是其他的上面进行均衡,主要的功能也就是平摊服务器的各种压力,IO压力,请求压力,网络压力等。。。


    负载均衡,有的人叫它LB,load banlance,有的人叫它SLB,service load balance。反正都是同样的意思,只是叫法不同,每个人都有每个人的习惯。


    负载均衡,说起负载均衡,一般都会想到httpd和nginx,这两个都是最常用来做负载均衡的软件,http语法复杂,nginx语法清晰明了,http模块众多,nginx能应付更多的大并发请求,各有各的优点,各有各的长处。


    此种负载均衡主要用来提供更大的并发能力,业务刚上线的时候,只有100个用户,那么2C2G的VM就能应付了;业务高峰了,有一万个用户了,怎么办?提供更好的服务器?向上扩展,并不好,服务器的价格那么贵。。。那么就横向扩展吧,加100个2C2G的VM,前端给一个VIP,做负载均衡,让后端的100台VM来分担请求的压力。这就是负载均衡的由来。。。。


    而这个文章并不准备从这个角度来讲述负载均衡。。。从分布式存储的角度来聊聊负载均衡。。。


用不同的视角看负载均衡


    在分布式存储中,我们经常听到的一个词叫分片,一片一片又一片。。。其实,这种也可以叫做副本,在容器中,也能看到副本的影子,在k8s的管理平台中,一个pod,两个pod,慢慢的这种pod就可以是副本了,也就是replica。。。


    在分布式存储中,一般默认的情况下都有三个分片,存储的内容一模一样,可能有的分布式存储中,会将元数据存储在此处,但是忽略,此处主要讲述具有master控制节点的分布式存储系统。


    提到这种副本的概念,一直认为是为了高可用而高可用,但是好像还没想过这种居然还有负载均衡的作用,一直以为是热备,三个副本,再也不怕各种底层硬件的损坏了,三个副本,再也不怕各种服务器宕机,各种磁盘损坏了。


    多个副本,还能提供负载均衡的作用,当客户端来进行访问的时候,请求发送到master主控节点,主控节点返回客户端相关的元数据信息,然后客户端再次发送请求到存储节点也就是chunk server进行查询数据,然后取出数据,如果有大量的并发,那么master可以进行负载均衡,可以按照轮训将读请求分到几个副本上,将写请求分到一个副本上。。。


    那么,写请求,大量的客户端写请求来了怎么办?我写了一个副本,啪,服务器断了,没写完,其他的几个副本数据不一样了,怎么办。。。大量的请求来临了,几个客户端修改的是同一个数据,那么顺序怎么办,会不会错乱,那个客户端改了数据,这个客户端也改了同样的一份数据,会不会几个副本里面的数据是不一致的,是顺序读写,还是怎么办?


    强一致性,客户端发送来一个写请求,怎么处理?master接收了请求,将数据写入一个副本,再写入一个副本,直到最后一个副本写完,然后反馈客户端成功,一个失败,全部回滚。。。。


    最终一致性,客户端发送一个写请求,master接受请求,将数据写入了一个副本之后,立刻发送通知客户端,写入成功,然后master会调度后台线程,慢慢的将剩余的副本数据同步到其他的副本,在这个过程中,当有客户端来查询数据的时候,可能就会查询到过期的数据,但是随着时间的流逝,总有一天数据会一模一样的。。。时间很短的 。。。哈哈,不会很久


    其实一致性还有很多,什么弱一致性啊,单调读一致性啊,。。。很多的感觉。。


    还有一个就是在做副本的时候,考虑到大并发写入的场景,多个客户端都在写一个文件,发送到master端,这个时候,也有各种策略,感觉,表面用起来很简单,实现起来很复杂很复杂。。。各种系统的实现均不一样。。。很好玩的感觉。。


    还有,master主控端,一个够不够,要高可用,要高可靠,所以一般是三个,防止脑裂,便于选举,看看各种协议,paxos,并不懂。。。看看etcd的raft算法,这种也是强一致性的,raft算法理解起来容易多了。。


    master发送请求的时候,有数据流,有控制流,为啥要分开,双向链路,更加便于处理大量的数据。。。每一件事的做法,后面必然有其原因。。。


    

用户视角

    在用户视角看分布式存储,其实就简单多了,不需要考虑各种底层实现,只要使用一个接口api就可以了,管他行不行。。。


    这就是为什么程序员在写代码的时候,拿到一个SDK,啪啪啪,就写了一个类,就开始疯狂的奔跑。。。


    这就是为什么我写一个代码的时候,总要拿各种模块进行比较,要考虑什么样什么样的底层实现。。。最后,我就放弃了写代码。。。


    有的人说,分布式存储能支持高并发,来,并发数一千试试,哎哟,真可以哦,上生产吧。。。在下佩服。。。


    有人说,分布式存储那么可靠,来,发送一千万个请求,你错一个试试,你错一个连接,你的存储就不可靠。。。心累,只能送几个字呵呵哒。。。


    总有人分布式存储那么可靠,报错了我就不捕获异常。。。你就必须提高你的可靠性,不到百分百就算你赢。。。我只能说fuck。。。就你脸大。。。


    我怂故我在。。。。


总结

    

    我有七双袜子,你猜我穿的是哪双。。。负载均衡看起来很酷,但是当你使用lvs进行四层负载均衡的时候,不会记录日志。。so,有的问题追查起来头疼。。。


    我有七件衬衫,你猜我哪件是最新的。。。副本看来很可靠,很容易线性扩展,但是当数据需要强一致性的时候,就会损耗时间来换取一致性。。。


    所有的策略,算法。。。都是一种权衡。。。这就是八面玲珑的由来???


    

        扫描二维码,欢迎关注转发。。。风不来。。。

用不同的视角看负载均衡

    扫描二维码,欢迎评论讨论。。。。梦里寻。。。