架构集群解析:高并发高可用角度架构演进
疑问
- 数据库集群通过主从来实现数据一致性问题,如果数据库服务器很多,应用程序是怎么指向那个数据库的?通过负载均衡SLB分流指向还是在程序中指向
高并发高科用角度架构演进
单机应用(WebSite)
渐渐的随着用户量的增加, 问题:一台服务器已经不够用了,服务器不稳定。挑战:高可用/高并发。 解决方式:于是我们将准备两台服务器搭成集群
简单集群(WebSite)
搭完集群之后,假如原来十个用户访问一台服务器,现在平均开,五个人访问上面的服务器,五个人访问另一个服务器。 用户的体验就会稍微好一点。
好处:简单高可用,假如其中一台服务器挂了,是不影响用户访问的,因为用户可以访问另一台好的服务器
问题:这样做有一个局限性,就是同时存在两个服务器,就会同时存在两个外网IP/域名 。 解决方式:于是我们增加了一个代理服务器,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以
负载均衡集群(WebSite)
增加代理服务器后,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以了。由代理服务器来负责分发用户是访问服务器A还是访问服务器B。用户具体是访问服务器A还是访问服务器B,我们可以通过nginx里面的权重设置来决定的。
好处:服务器高可用,户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以
问题:这样做不少局限性,数据的存储问题,服务器缺少角色分工,如磁盘损坏,数据是不安全的。
解决方式:于是这里我们使用了JAVA的MVC设计思想,我们将数据进行了抽取,服务器A和服务器B仅负责动态代理的分发,而不负责数据的存储,具体的数据放到数据服务器当中,数据库分离
MVC集群(WebSite)
增加代理服务器后,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以了。由代理服务器来负责分发用户是访问服务器A还是访问服务器B。用户具体是访问服务器A还是访问服务器B,我们可以通过nginx里面的权重设置来决定的。
好处:服务器高可用,户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以
问题:用户通过代理服务器分发到应用服务器,而应用服务器负责从数据库服务器进行数据的读取和写入。
解决方式:这里是关系型数据库,是遵循原子性、一致性、隔离性、持久性四大特性的;这时候是业务层分离的,即主服务器负责写,从服务器负责读,这就是数据的一致性和主从库读写分离。
数据库集群(DataBase)
用户通过代理服务器分发到应用服务器,而应用服务器负责从数据库服务器进行数据的读取和写入;那么此时数据库服务器A和数据服务器B是两台服务器,假如数据通过应用服务器A存放到数据服务A,那么这是写入,但是读取数据的时候,可能用户被分发到应用服务器B了,但是数据是在数据服务器B,那么就要保证数据的一致。
好处:这里是关系型数据库,是遵循原子性、一致性、隔离性、持久性四大特性的;这时候是业务层分离的,即主服务器负责写,从服务器负责读,这就是数据的一致性和主从库读写分离
问题:如果碰到例如双十一这样的大型网络促销活动,用户访问量猛增,这样数据服务器A和数据服务器B就都满足不了用户的访问了,因为这个时候用户的并发量是特别特别大。
解决方式:那么这样的话,有一些数据就不存到数据库了,而是直接存到缓存文件;但是缓存数据是有有效期的,如果到期了就将数据放到数据库里面
消息队列架构?
面向服务(SOA)架构?
完整服务集群(WebSite)
真正的集群是防火墙后面的应用服务器集群和数据库服务器集群。
负载:是指将请求负载到不同的服务器; 均衡:指的是平分服务器的请求次数。
热备:指的是它可以自动的根据定时任务或者数量容量大小去备份数据库,而不需停止数据库。
好处:即用户通过(外网)代理服务器去访问(内网)应用服务器,这个内网允许哪个外网网段进来取决于防火墙,而这个防火墙只允许代理服务器的外网IP进来;那么这样的话应用服务器就安全了。 前面两台代理服务器并非集群,一台是正在使用的负载均衡代理服务器,另一台是备用的负载均衡代理服务器
小型公司服务器架构
通过ip访问相当于用户直接访问输入的ip所指向的服务器,而通过域名访问,是用户输入域名之后,请求先被发送到域名管理者所控制的DNS服务器中,DNS服务器中有一个数据库,数据库中存有这个域名所对相应的ip地址,DNS服务器当了一个中间人,将请求转发到这个ip地址对应的服务器,就实现了通过域名访问,因此,通过域名访问本质上还是通过ip访问。那么,狗子公司的架构图就应该是下面这样。
中型公司服务器架构
三个服务器同时运行相同的代码,在代码页设置三个用户入口,如果用户进入一个入口发现进不去,就选择另一个入口,每个入口对应一台服务器。
1.负载均衡. 2. redis缓存 3. 读写分离。
大型公司服务器架构1
公司虽然体量很大,开发的产品越来越多,功能越来越全面。服务器架构越来越复杂。
1.负载均衡. 2. redis缓存 3. 读写分离。
此架构过度复杂,是“中型公司服务器架构”的演进版,推荐使用下面的:“大型公司服务器架构2”
大型公司服务器架构2
中台封装
解释起来可能一上来比较难于接受,我们先来看,刚刚我们的架构图中的产品实际上可以看成一整个系统,假设这个系统叫做系统A。那么,我们现在开发出来了其它的各种产品或者各种页面,也可以看作是新的系统B和系统C。现在,系统ABC之间有很多重复的部分,于是,我们想到了将这些重复的部分放到一起,供三个系统同时调用。那么实际上,这个重复的部分就是被封装起来的微服务,微服务是一种模块化开发,把产品的功能提炼成多个模块,在开发时把模块拼接起来,就可以省去大量的工作。为了实现一个模块,模块中也需要带有服务器集群等东西
K8S集群
一个K8S集群由两部分构成 master节点和node节点。
master节点主要负责集群的控制,对pod进行调度,已经令牌管理等等功能。
node节点主要是负责干活,启动容器、管理容器。 master节点和node节点一般不要部署在一台机器上。
上面这个架构图,举例是一个master节点和2个node节点。但实际生产上,从高可用考虑,是需要部署多个master节点的
K8S高可用集群
集群的高可用 Kubernetes 集群,在生产环境,必须实现高可用: 实现Master节点及其核心组件的高可用;如果Master节点出现问题的话,那整个集群就失去了控制
具体实现:
本文版权归作者和博客园共有,欢迎转载,但必须在文章页面给出原文链接,否则保留追究法律责任的权利。