之前聊了Redis很基础的一些东西,今天稍微聊点作为一个想要晋级为中级程序猿必须掌握的东西----Redis的集群。任何一个高并发的系统都一定绕不开Redis,而作为一个高并发的系统设计初期就一定会思考如何在保证吞吐的情况下提高自己记得容灾能力,对就是我们今天要聊的集群。先补充一句,没有最好的技术,只有最适合自己项目的技术。我们的目的是为了让项目在尽量少出Bug的情况下稳定运行,不是造缝合怪,一股脑的往项目里堆看起来最牛x的技术会增加很多不必要的维护成本。
一.为什么要集群
1.集群可以避免单节点故障
单节点的应用总会有单点故障的问题,当你的机器宕机,整个系统不可被访问,一般我们可以通过集群的方式来解决单节点故障,提高系统的可用性。
2.集群可以提高并发作业能力
单个机器(应用)的作业能力是有限的,在某些高业务量(并发)的应用中,我们也可以通过集群的手段来提升应用的作业能力。我之前闲来无聊试了一下,我8核16线程在开着不少进程的情况下依然跑出了九十多万的吞吐,如果换在Linux再优化一下跑一二百万的吞吐我觉得都没什么问题,关于Redis压测的文档官方也有,我贴在下面有兴趣的小伙伴可以自己去玩一下。
虽然在生产过程中我们遇到这么高QPS的情况相对罕见,但是什么也无法阻止我们学习的脚步,万一哪天我在的公司或者我写的程序就突然火了呢,哈哈哈哈。就算用不到,学个思想也是好的。况且集群就算Redis比较罕见存在需要进一步提升并发能力,但是集群依然可以预防单节点故障。且同样适用于其他的应用,比如我几年前写的代码,如果需要面临高并发的环境的话可能就需要大量的集群。
Redis压测官方文档
二.什么是集群
前面说了集群是为了提升应用的容灾能力和并发作业能力,这里的集群指的是把应用进行复制多个相同的应用一起工作来提高作业能力,多个应用做的是相同的事情。就如同我们生活中的场商场收银台,一个柜台不足以支撑超市大量客户的结账流程,所以需要多个收银台同时工作,多个收银台都是做的相同的收银工作,这就是集群。集群可以分为数据库集群,应用集群和功能集群等
集群就是多个应用分散在不同的服务器,每个应用跑的是同一套代码做的是相同的工作,以提高系统的整体性能,如果其中一个服务崩溃了,并不会影响集群内其他服务继续正常运行。
那么问题来了,既然两个程序执行完全一致的功能,那我请求来了是发给谁了呢,如果发给同一个程序的话不就是去了集群的意义吗。当我们为我们的程序做了集群之后作业能力得到提升,能够处理更高的并发请求,同时产生了一个新的问题,就是客户端的请求应该如何相对平局的分发到集群中的多个应用呢?这就需要负载均衡器了。
为了方便理解我们来再看我们的收银台案例:假如收银台排队的客户比较多,我们多设置几个收银台,当你拿着东西出来结账时是不是会去排在最短的那一队。
在我们的应用程序中也是这样,当我们的应用做了集群,那么就会存在多个应用节点,多个应用将会暴露多个访问地址(ip:port),那客户端是不知道该访问哪个应用