庞大的业务访问量需要高性能、可靠的服务器框架支撑。高性能要求服务器在巨大压力下仍然高速运行,读写返回正确的业务信息,前端用户体验良好。可靠性要求服务器出现宕机、罢工等情况,可以及时恢复服务器正常工作状态,支持业务系统24小时健康运行。使用缓存、读写分离技术提高服务器访问资源速度,解决大访问量资源拥堵问题;使用负载均衡与高可用技术提高服务器响应速度以及服务器稳定性,解决服务器处理大用户量请求问题以及服务器宕机的及时恢复能力。
同时,需要部署运维监控平台,监控服务器上服务程序与资源使用情况,出现问题及时报警通知运维人员。服务器系统的安全加固问题也不能忽视,防范于未然。
按照上述需求,基础架构划分下面几个模块:负载均衡与代理、Web主站服务、APP接口服务、图片服务器、数据库与缓存服务。
客户端通过域名解析直接访问到负载代理服务器,后端全部访问与响应操作对用户透明。图片也可以单独开来,不经过负载均衡代理服务器,使用单独的域名进行图片读写。当图片服务数量上来了,也要配置单独的负载均衡代理服务器,组合服务器集群。而这里图片服务器与其他服务共用相同负载,这样负载压力大,容易出现问题,追溯问题源头工作也会变得复杂。所以说,不同的服务集群,最好使用不同域名、不同负载均衡进行代理。客户端直接通过负载访问相关服务,负载直接代理到服务子群,不再对服务进行判断划分。分工更加明确,出现问题也容易解决。
图片服务器也可以不需要存在与其他服务直接访问关系,他们只需要保存好访问图片对应关系,包括图片所属ID、路径、标识等。
负载均衡代理主要是两个作用:实现多台机器按照算法轮流工作,分担服务压力,当一台机器宕机或者罢工,其他机器也可以继续运行;代理隐藏服务内部真实结构,多台对外提供统一地址,运行相同业务系统。
负载代理服务器本身也需要支持高可用性能,主从备份机器,主服务器发生故障时,从服务器及时顶替继续运行负载代理服务。Keepalived可以支持高可用性能,更加可以配置Keepalived自动执行自定义检测脚本,检测服务器的心跳,自动递减服务器的优先级,实现服务自动偏移功能。
下面几个组合可以完成上述功能,各个组合侧重点有所不同,所处的网络层次也有不同。网络四层主要针对IP地址负载均衡,而网络七次针对URL,更有支持四层与七层的,侧重于TCP/IP协议栈。
LVS+Keepalived:LVS工作于网络四层结构,针对IP地址进行网络数据报转发,实现负载均衡代理功能,器配置相对复杂。性能稳定,支持超大访问量的集群负载。对外提供统一的虚拟IP,有三种工作模式,十种左右的轮询算法。
Nginx+Keepalived:Nginx工作与网络七层结构,配置相对简单,支持URL、目录等正则处理更加贴近实际生产需求,可以支持较大访问量的集群负载。
Haproxy+Keepalived:Haproxy工作网络四层与网络七层都可以,配置相对简单,负载均衡速度不亚于Nginx,值得一提的是Haproxy可以进行DDOS攻击防御,以后应该深入研究Haproxy。
主站框架是一个Web服务器(apache、tomcat、nginx等)集群,集群中全部机器运行相同业务系统。通过负载均衡代理与客户端通讯,每一次通讯只有一台机器为当前客户端服务。需要解决session共享问题,否则将会丢失用户的登录状态,在用户体验方面有逻辑错误。常见的共享session方法有数据库共享、cookie共享、内存共享。使用最多的是memcache共享方式,memcache把多个服务器的共享内存拼接成一块大的内存使用,保存用户的session信息。Tomcat服务集群可以简单配置memcache共享内存,PHP中也可以直接配置设置memcache共享内存。
Nginx负载解决session的方式:ip_hash、sticky。ip_hash根据IP保存响应服务器,在一张存储表单中,IP对应上次访问的服务器,以后来自于该IP的访问都使用这个这台服务器,解决session问题,存在局限性影响负载均衡的功能。Sticky使用cookie的方式解决session共享问题,其实是避开session共享。Sticky把cookie与服务器绑定,存储于客户端缓存当中,客户端再次访问时直接进入到cookie绑定的服务器,关闭客户端session也随之消失。
接口服务与主站服务功能大同小异,也是Web服务集群。在负载代理时候,通过七层代理转发正则匹配域名与目录,指向接口服务地址端口。对于划分更加细节的系统架构,接口服务也是单独的域名,启用四层负载代理连接集群,服务功能更加简单明了。
图片服务建立在分布式文件系统基础上,搭建Web服务主要支持图片访问上次下载功能。结合读写分离技术,图片上传划分一个子群,图片下载划分一个子群。前面搭建负载均衡服务器支持大量读写操作,两个子群建立在同一个文件系统,组成分布式文件系统。常见的文件系统有NFS、FastDFS、TFS、Hadoop等。
NFS是共享挂载方式,访问图片时仍然占用网络带宽,没有文件备份处理,出现故障不容易恢复。FastDFS是一个分布式同步文件系统,稳定性好可靠,提供各种语言客户端API便于开发。TFS是淘宝正在使用的图片服务器文件系统,支持海量图片读写操作,对于大文件存储能力欠佳。Hadoop是比较火的大数据平台,高容错高吞吐量,技术成熟,分布式文件系统非常好的选择。
如果服务访问量非常大,数据库是访问速度最重要的影响因素。数据的读写操作往往占用大部分时间,数据表上百万级别记录,update操作时间开销会很大。而且外面有一条几万的数据库操作队列,那是人不崩溃,机器已经崩溃。首先是CPU占满,数据库里面堆满上锁sql语句,导致前端反应速度跟不上蜗牛。
对数据库访问频繁数据记录数量巨大的表,进行分片操作,细化数据表提高sql执行速度。数据库服务器使用分布式架构部署,前面架设负载均衡服务器,结合数据库读写分离技术。常见数据库db2、oracle、mysql等,对于分布式mysql系统,可以使用MyCat中间件管理。
缓存可以提高服务的响应速度,处理及时性要求高的数据时,数据首先进入缓存,然后通过消息队列写入到数据库。从数据库查询出来的实时数据也可以保存在缓存中,在缓存中直接提供用户访问,执行用户操作数据请求,再把数据返回数据库。
Redis是一款出色的缓存服务器,内存级别的键值对数据库,支持丰富数据结构,数据库操作命令也是很齐全。最重要是Redis操作速度非常快,满足缓存服务器需求。Redis提供单机的分片集群,单机硬件性能要求比较高。Redis也可以进行分布式部署,搭建分布式缓存服务。
安全配置:隐藏常见系统服务信息、配置用户权限、开启防火墙、关闭无用系统服务、定期更新系统
风险评估:进行渗透测试、漏洞扫描
安全防御:配置IDS\IPS、进行源代码审计、DDOS防御、恶意代码检测
配置运维监控平台,实时监控服务器的健康状况。CPU、内存、磁盘、输入输出、网络性能等参数,配置报警规则,触发报警是立即调用API接口或者第三方回调,发送报警信息到邮箱、微信等。同时,自定监控数据项,检测Web服务、数据库服务、后台程序等运行状态,连续出现拒绝服务行为立刻报警,通知管理员。