1. 说到高可用的话要提一下redis,用过的都知道redis是一个具备数据库特征的nosql,正好弥补了PHP的瓶颈,个人认为PHP的 瓶颈在于数据库,像Apache和Nginx的高级web服务器在承受并发量上面都各有千秋,apache的最大承受并发数可以到三四千个,nginx要是它的10倍,但apace的三四千个是实打实的三四千个,nginx的并发数是要依靠缓存的。(哈哈~好久没写博客这下感觉自己还写得挺6的,呵呵~,可不是我自恋哦接下来有你好看),高可用高性能系统这些就要求对mysql的掌握程度相当高,包括memcached,这会大大提高PHP的可扩展性。
之前模拟过一个高并发的单进程模型(这个对PHP的其它备用缓存的掌握程度有一定要求,有兴趣的可以自己也试下哦!),在并发数达到一定峰值,PHP的某些小小的缺点就会暴露出来,例如异步并发时数据库反应时间不能及时响应导致PHP的处理时间超时问题,swoole的出现对于PHP来说无异于如虎添翼,再将字符串的值放进redis的队列通过点对点的响应进行异步处理来模拟整个过程,其实也不是特别的简单啦,Linux的强大就在于此处,只要你有想法就一切就可以满足你!
好啦,话不多说,我们来分析分析高兴能高可用的系统。
简而言之,采用分布式系统,分布式应用和服务,分布式数据和存储,分布式静态资源,分布式计算,分布式配置和分布式锁。
负载均衡,故障转移,实现高并发。
高可用:
主要是利用冗余数据的原理,应用和服务器部署在多台机器上,数据存储部署在多台机器上,在多台机器上利用mysql的主从分离实现多态服务器数据相互备份,万一有一台服务器宕机,直接转移另外一台数据服务器上读取数据。也不会导致数据丢失。
对于应用服务器,可以通过nginx负载均衡实现设备组成一个集群,如果有服务器宕机,就需要把请求切换到其他服务器上,这样级可以实现高可用,但是,在应用服务器上不能保存请求的会话信息,服务器宕机,会话丢失,即使将用户请求转发到其他服务器上也无法完成业务处理。
对于存储服务器,它是存储数据,数据需要实时备份,当服务器宕机时,只需要将请求转移到其他可用的服务器上即可。
集群:可伸缩性
伸缩性是指可以动态的向集群服务器中添加一个节点或者减少一个节点。
但是,对于缓存服务器,添加节点或者减少节点都会导致数据不可读,虽然可以通过从新访问数据库获得数据,但是,如果应用已经严重依赖缓存,读取那些无法访问的数据,也会导致整个网站瘫痪,所以要改进路由算法来保证缓存数据的可读性。
异步:各个系统之间越独立,它们之间关系越少,越好
单一服务器可以通过多线程实现共享内存队列的方式实现异步,将处在业务前面的线程将输出写入队列,后面的线程将从队列中读取数据进行处理。在分布式系统中,多个服务器集群通过分布式消息队列实现异步,分布式消息可以看成是内存队列的分布式部署。
1.松耦合,异步架构是典型的消费者和生产者模式,两者之间不存在直接调用,只要保持数据结构一致,彼此功能可以随意改动没有任何影响,可扩展性高。
2.提高可靠性,一旦消费者服务器发声故障,数据会在消费者消息队列中堆积,不会影响生产者可以继续处理业务请求,系统整体表现无故障,消费者服务器恢复后,继续处理消费者消息队列数据。
3.加快网页反应速度,处在业务处理前的生产者将消息传递给消息队列后,不需要等待消费者返回消息就可以直接返回,响应延迟减少。比如:秒杀业务等。
4.消除并发访问高峰,双11等活动高峰,可能会造成网站并发量大,负载过重,响应延迟,严重甚至宕机,使用消息队列就会将请求数据的消息放入消息队列中,等服务器依次处理,就不会造成服务器压力大,负载过重等情况。
冗余:
利用服务器冗余运行,数据冗余备份,这样当某台服务器宕机的时候,可以将其上的服务和数据访问转移到其他服务器上。访问和负载很小的服务也必须部署至少两台服务器构成的一个集群,其目的就是通过冗余实现高可用。数据库除了定期备份,实现冷备份外,为了保证在线业务高可用,还需要对数据库进行主从分离(ameba),实时同步实现热备份。
分层
分层是企业应用系统中最常见的一种架构模式,将系统在横向维度上切分成几个部分,每个部分负责一部分相对简单并比较单一的职责,然后通过上层对下层的依赖和调度组成一个完整的系统。
在网站的分层架构中,常见的为3层,即应用层、服务层、数据层。应用层具体负责业务和视图的展示;服务层为应用层提供服务支持;数据库提供数据存储访问服务,如数据库、缓存、文件、搜索引擎等。
分层架构是逻辑上的,在物理部署上,三层架构可以部署在同一个物理机器上,但是随着网站业务的发展,必然需要对已经分层的模块分离部署,即三层结构分别部署在不同的服务器上,是网站拥有更多的计算资源以应对越来越多的用户访问。
所以虽然分层架构模式最初的目的是规划软件清晰的逻辑结构以便于开发维护,但在网站的发展过程中,分层结构对网站支持高并发向分布式方向的发展至关重要。
分隔
如果说分层是将软件在横向方面进行切分,那么分隔就是在纵向方面对软件进行切分。
网站越大,功能越复杂,服务和数据处理的种类也越多,将这些不同的功能和服务分隔开来,包装成高内聚低耦合的模块单元,不仅有助于软件的开发维护也便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
大型网站分隔的粒度可能会很小。比如在应用层,将不同业务进行分隔,例如将购物、论坛、搜索、广告分隔成不同的应用,有对立的团队负责,部署在不同的服务器上。
分布式
对于大型网站,分层和分隔的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。分布式意味着可以使用更多的计算机完同样的工作,计算机越多,CPU、内存、存储资源就越多,能过处理的并发访问和数据量就越大,进而能够为更多的用户提供服务。
在网站应用中,常用的分布式方案有一下几种.
分布式应用和服务:将分层和分隔后的应用和服务模块分布式部署,可以改善网站性能和并发性、加快开发和发布速度、减少数据库连接资源消耗。
分布式静态资源:网站的静态资源如JS、CSS、Logo图片等资源对立分布式部署,并采用独立的域名,即人们常说的动静分离。静态资源分布式部署可以减轻应用服务器的负载压力;通过使用独立域名加快浏览器并发加载的速度。
分布式数据和存储:大型网站需要处理以P为单位的海量数据,单台计算机无法提供如此大的存储空间,这些数据库需要分布式存储。
分布式计算:目前网站普遍使用Hadoop和MapReduce分布式计算框架进行此类批处理计算,其特点是移动计算而不是移动数据,将计算程序分发到数据所在的位置以加速计算和分布式计算。
安全
网站在安全架构方面有许多模式:通过密码和手机校验码进行身份认证;登录、交易需要对网络通信进行加密;为了防止机器人程序滥用资源,需要使用验证码进行识别;对常见的XSS攻击、SQL注入需要编码转换;垃圾信息需要过滤等。
自动化
具体有自动化发布过程,自动化代码管理、自动化测试、自动化安全检测、自动化部署、自动化监控、自动化报警、自动化失效转移、自动化失效恢复等。
缓存
缓存目的就是减轻服务器的计算,使数据直接返回给用户。在现在的软件设计中,缓存已经无处不在。具体实现有CDN、反向代理、本地缓存、分布式缓存等。
使用缓存有两个条件:访问数据热点不均衡,即某些频繁访问的数据需要放在缓存中;数据在某个时间段内有效,不过很快过期,否在会因为数据过期而脏读,影响数据的正确性。