当服务器的规模发展到一定程度时,必须考虑的问题就是web服务器的扩展问题。
负载均衡
在服务器扩展中首要面临问题就是负载均衡,负载均衡的实现方式有如下几种:
1. HTTP重定向
2. DNS负载均衡(常见调度策略有rr或者智能解析,性能一般优于重定向节省了主站点便于管理)
3. 反向代理负载均衡,反向代理对http的请求调度体现在转发上,可以按照权重来制定自己的调度策略,整个调度策略的制定更加灵活。可以采用粘滞对话的方式来防止rr造成的对话内容缓存效率低下。本层次的负载均衡主要体现在http层上。
4 IP负载均衡,DNAT提供ip层的负载均衡,由NAT服务器来决定内部网络与外部网络连接之间的负载均衡,(之前搭建过的pptp服务器就属于采用了nat的方式来进行地址转换数据包转发)
共享文件系统
在多台服务器在一起协同工作之后,不同服务器上文件的一致性与协同性就显得十分重要。共享文件系统主要是通过网络来连接数据库服务器与web服务器,它只是定义了文件在网络传输中的传输协议与组织格式,常用的共享文件系统由NFS与Samba。
NFS
NFS基于RPC协议,工作在应用层,性能更多取决于传输层TCP/UDP,优点是方便搭建减少数据冗余但不适合作为I/O密集型文件的共享方案(多进程模型,并发请求数多时,进程会严重不足)。
内容分发与同步
共享文件系统不强调分发的概念,当站点规模扩大时,我们就需要考虑将文件分发同步到多台服务器上。
首先将文件服务器的内容分发复制到多台服务器上时,我们可以采用ssh,scp,sftp等方式进行传输,为了更高效的传输可以采用多级分发的方式对文件进行分发。另一种分发方式时利用WebDAV基于http1.1协议来对web服务器进行文件操作。rsync是另一种被动同步方式,与以上其他方式不同由接收方主动向发送方发起同步请求。除此之外反向代理服务器也可以应用到文件复制领域中。
分布式文件系统
在经过以上多种方式实现多台服务器协同工作之后,可以发现其中依然存在许多问题,为了能够更加方便的对文件进行复制,对文件系统进行管理,于是分布式文件系统也就应运而生。
在分布式文件系统中例如hadoop,mogileFS,所有文件都存储在被称为存储节点的地方,可以用多台服务器创造多个存储节点或者一台服务器建立多个存储节点,文件会在这些存储节点之间自行复制。多个存储节点之间的调度由追踪器(tracker)来完成。追踪器要实现以下功能:
- 维护节点存储信息,哪些文件存储在哪些节点之上
- 监听特定的端口,与客户端和存储节点之间进行通信
- 控制文件复制
- 实现存储节点负载均衡
- 实现存储节点的故障转移。
异步复制,MogileFS采用了异步复制的方式来实现文件复制,一旦应用程序将某个文件提交到追踪器指定的某个存储节点后,其他复制工作将在后台异步进行,不会阻塞应用程序。
数据库扩展
除去web服务器扩展之外,数据库要同样要跟上发展的速度进行扩展,其也要考虑负载均衡,数据复制,数据分离等操作。
数据库中的读写分离是一件十分重要的事情,对于所有的写操作让其指向主服务器,而读操作指向从服务器即可。垂直分区将不同的数据分布在不同的服务器上对写也进行了分离,让数据按照内容来进行分区隔离这样可以更好的提高数据库的读写速率。而水平分区是指将统一数据表中的记录按照特定算法进行分离分别保存在不同的数据表中。是一个逻辑层面的划分。如何对数据库进行分区是一个非常重要的点。
分布式计算
除去拆分数据分散用户请求之外,我们呢还可以将计算进行分布式操作。比如分布式消息队列(采用了异步计算的方式,将耗时计算分别分布于不同的服务器上),而并行计算可以让我们比异步计算更快的得到结果(Map/Reduce)。