一、前言
这篇博客简单介绍传统网站的访问数据流。再客户端与数据库服务器之间往往还会涉及Web服务器和负载均衡设备。作为一个开发者,需要清楚数据是如何再客户端和服务器之间进行传递的,下面简单说明一下客户端访问数据库服务中间经过的环节。
二、访问过程
1、访问DNS服务器
用户再浏览器的地址栏输入网址域名,浏览器会查询这个域名与IP的对应关系是否已经存在与本机的host文件中,如果没有,则会把请求发送给本机指定的域名系统(DNS)服务器。
什么是是域名系统服务器呢?
计算机世界中是以IP地址来定位服务器或者PC的,DNS这项服务的目的就是将域名翻译成IP,使用户可以更加方便的访问互联网。DNS服务器又一定的层级,如果某个DNS服务器不知道如何翻译,就会访问另外一个,再不知道,就再访问下一个,这样就会有一个递归的过程。幸运的是,DNS可以缓存查询结果,这样我们就不需要经历重复冗长的过程去查找一个域名映射IP地址。
DNS系统中,常见的资源记录类型又如下两种。
- 主机记录(A记录):用于名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址上。
- 别名记录(CNAME记录):用户将某个别名指向到某个A记录上,这样的好处就是修改IP地址的时候改A记录就好了,对于拥有大量子域名的网站可以简化操作、统一维护域名指向。
DNS的查询有两种方式:递归和迭代。
DNS客户端设置使用的DNS服务器一般都是递归服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。而DNS服务器之间一般采用迭代查询的方式。
TTL(Time To Live)
简单的说,它表示的是一条域名解析记录在DNS服务器上的缓存时间。当一个递归域名服务器查询权威域名服务器获取某个域名的映射时候,它会将改记录缓存上一定的时间,这个时间就是TTL指定的时间(以秒为单位)。如果在一台Linux机器上反复允许命令,就会发现这个缓存时间在减少,为什么呢?因为在你的DNS缓存中,这笔记录能够保存的时间开始倒数,如果TTL没有归零缓存服务器会简单地用已经缓存的记录答复查询请求。若是这个数字归零之后,下次再有人重新搜索这笔记录时,你的DNS就需要从权威域名服务器重新获取记录。也就是说,如果更改了域名的指向,那么最长需要TTL时间才会完全生效。
2、经过负载均衡软硬件设备
经过负载均衡软硬件设备如F5、Haproxy、LVS后,再把请求转发给后端的网络服务。
负载均衡(Load Balance),即负载(工作任务)进行平衡、分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器等,从而共同完成工作任务,当后端的一台服务器宕机或者过载,负载均衡软件设备将不再发流量到这台服务器,转而发送到备用的服务器上,从而实现自动故障冗余切换。
3、经过反向代理服务
反向代理是代理服务器的一种,比如Squid、Vanish等。它根据客户端的需求,从后端的服务器上获取资源,然后再将这些资源返回给客户端。常用的代理服务器为Squid,它可以作为缓存服务器,可以过滤流量保证网络安全,也可以作为代理服务器链中的一环,向上级服代理转发数据或者直接连接互联网,一些网站往往再前端增加Squid反向代理加速响应、提高吞吐量。Squid可以缓存内容,特别是一些静态的数据,比如图片和文件,如果反向代理靠近用户的网络,那么用户就会得到延时很低的高质量访问,这正是CDN技术的核心。
4、到达Web服务器
Web服务器包括Nginx、Apache、Lighttpd、Tomcat、Resin等。在常见的网络架构中,Nginx往往配合php-fpm使用,Nginx负责处理静态请求,把PHP等动态请求抛给后端php-fpm处理。或者Nginx处理前端的静态请求,把Apache放在后端处理一些动态请求。所以各种Web服务器之间可能也有一定的层次关系或者功能分工,这点需要了解清楚。
5、调用应用服务器
客户端不直接和数据库打交道,如果需要处理逻辑需要访问数据,则由应用服务器或者Web服务器访问数据库,获取数据。
以上结构是比较普通的三层/四层架构,架构中也可能由一个缓存服务,以减轻数据库的压力。Web服务器、应用服务器到数据库中间可能存在数据中间件,但是更加常规的做法是通过在Web服务器、应用服务器程序配置文件里指定IP或者内网域名来配置数据路由。
三、总结
生产环境里,如果出现了性能问题,研发人员往往第一时间就会怀疑是数据库出现了性能问题,但事实往往并非如此,从上面的叙述可知,用户的访问请求经过了许多的环节,由DNS、负载均衡设备、Web服务器,而且长距离的网络中的数据物理上还需要经过许多设备,如路由器、交换机等,由于国内网络的特殊性和复杂性,有时会碰到网络丢包,丢包也可能会导致性能问题。所以,如果出现了性能问题或者访问异常,研发、运维人员就需要仔细甄别到底是那个环节出现问题,配合各种监控和日志记录,是有可能快速定位到问题的所在的。