互联网集群架构搭建手记及高并发处理方案

在早期部署项目的时候采取的是单机应用,项目部署到服务器上,用户是直接访问服务器,并且这台服务器是台外网(即广域网)的服务

渐渐的随着用户量的增加,

问题:一台服务器已经不够用了,

解决方式:于是我们将准备两台服务器搭成集群

搭完集群之后,假如原来十个用户访问一台服务器,现在平均开,五个人访问上面的服务器,五个人访问另一个服务器,这样用户的体验就会稍微好一点,这样做还有个好处是假如其中一台服务器挂了,是不影响用户访问的,因为用户可以访问另一台好的服务器,这两台服务器还同时在外网(广域网)中。

解决方式:于是我们增加一个代理服务器,用户不需要记住两个服务器的IP或域名了,只要记住一台(代理服务器)IP就可以了。由代理服务器来负责分发用户是访问服务器A还是访问服务器B;那么用户具体是访问服务器A还是访问服务器B,我们通过是实现的方式nginx,通过nginx里面的权重设置来决定的。

那么既然代理服务器放在外网,于是我们把服务器A和服务器B等均放在内网,放在内网的目的是为了网络安全考虑,放在外网是可以被攻击的,而这里就变成内网域名了,外网是访问不到的。这样的话,用户是不能直接访问服务器的,必须借助代理服务器来实现;

问题:这种方式还有个局限性,就是数据的存储问题,原来的数据都是存放到磁盘文件当中的,这样有个问题就是数据量越来越大,数据盘就会越来越大,还有个问题就是万一哪天磁盘损坏了,那么数据就没了。那么这样的话数据是不安全的。

解决方式:于是这里我们使用了JAVA的MVC设计思想,我们将数据进行了抽取,服务器A和服务器B仅负责动态代理的分发,而不负责数据的存储,具体的数据放到数据服务器当中,这里的数据库指的是关系型数据库

关系型数据库具有的四大特性,原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

原子性:多个事情组成一个单元,要么同时成功或失败,不能只运行其中一个

一致性:事务处理要将数据库从一种状态转变为另一种状态。一旦提交了修改数据,那么其它人读取这个数据,也是被修改后的数据

隔离性:在事务处理提交之前,事务处理的效果不能由系统中其它事务处理。多个用户,不能同时读写同一个数据,应该有先后顺序,在数据库中是一个一 个事件地运行,如果事件的条件不满足,后续事件就回滚

持久性:事件一旦提交成功,数据就发生了变化

这样有出现了一个问题,于是我们搭建了数据库的集群,也就是下面这种模式

问题:用户通过代理服务器分发到应用服务器,而应用服务器负责从数据库服务器进行数据的读取和写入;那么此时数据库服务器A和数据服务器B是两台服务器,假如数据通过应用服务器A存放到数据服务A,那么这是写入,但是读取数据的时候,可能用户被分发到应用服务器B了,但是数据是在数据服务器B,那么就要保证数据的一致性了,我们常用的互联网应用数据库是MySQl,这时我们就要保证Mysql数据集群服务器的数据一致性了。这里会用到多线程里面的一个是流线程一个是写线程。这两个线程就解决了数据的一致性。

解决方式:这里是关系型数据库,是遵循原子性、一致性、隔离性、持久性四大特性的;这时候是业务层分离的,即主服务器负责写,从服务器负责读,这就是数据的一致性和主从库读写分离;

那么这时候,如果碰到例如双十一这样的大型网络促销活动,用户访问量猛增,这样数据服务器A和数据服务器B就都满足不了用户的访问了,因为这个时候用户的并发量是特别特别大的;这时候我们选择将数据放到缓存文件服务器;而不是直接请求数据服务器,因为关系型数据库服务器总会用延迟的磁盘文件相当于我们的内存,读内存比读服务器要快很多很多,因为CPU是直接支持它的,那么这样的话就取决于硬件配置了,硬件配置越高可接受的请求次数就越大,支持的负载量就会越大;

解决方式:那么这样的话,有一些数据就不存到数据库了,而是直接存到缓存文件;但是缓存数据是有有效期的,如果到期了就将数据放到数据库里面。

这样做的目的是用户访问读取数据时不从数据库服务器读取了,而是直接从缓存服务器读取;解决了访问速度的问题;

哪些数据可以放到缓存中:一种是读取次数比较频繁的数据;第二种是安全性不高的数据,如用户购物车的数据;

当前企业常用的集群方式;

即用户通过(外网)代理服务器去访问(内网)应用服务器,这个内网允许哪个外网网段进来取决于防火墙,而这个防火墙只允许代理服务器的外网IP进来;那么这样的话应用服务器就安全了;

前面两台代理服务器并非集群,一台是正在使用的负载均衡代理服务器,另一台是备用的负载均衡代理服务器,如果某天正在使用的负载均衡代理服务器突然挂了,那么备用的负载均衡代理服务器则自动顶上来作为代理服务器。主要使用的是ELB技术。

真正的集群是防火墙后面的应用服务器集群和数据库服务器集群。

负载:是指将请求负载到不同的服务器;

均衡:指的是平分服务器的请求次数。

热备:指的是它可以自动的根据定时任务或者数量容量大小去备份数据库,而不需停止数据库。

如果数据库正在写入,数据热备服务器在一直备份,没有写完,那么这个进程是一直开着的,发现IO流进程不起动,说明这个地方没操作;

图片缓存服务器:最常见的就是电商网站,因为上面会有大量的图片,一般商品页的左边会有一个放大镜,也就是一张小图对应着一张大图,一般我们为了加载速度,会将这个图片放到缓存图片服务器。

总结在集群演进过程中遇到的问题:

1、为了应对用户访问量的增加,我们使用了应用服务器集群的方式。

2、为了解决用户需要记住多个应用服务器IP和应用服务器的安全问题,我们使用了将应用服务器放在内网,使用负载均衡代理服务器进行分发用户请求的方式;

3、为了应对数据量越来越大的问题,我们采用了数据库专用服务器,而应用服务器仅负责接受动态代理的分发,而不负责存储数据,具体的数据放到(关系型)数据库服务器当中。

4、随着用户访问量和数据读写频率的增加,我们使用了(关系型)数据库集群以及读写分离的方式。

5、为了应对高并发量的问题,我们采用了数据库缓存服务器和图片文件缓存服务器的方式,将使用较为高频的数据和文件放到缓存服务器。

6、为了应为数据库可能因意外丢失的问题,采用数据热备服务器对数据服务器的数据进行备份。

7、为了解决负载均衡代理服务器可能出现突发故障的问题,采用备用负载均衡服务器在负载均衡服务器出现故障时自动切换的方式解决。

点击原文也可阅读哦,顺手点个赞吧

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180924G1CXDX00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券