这是我参与「第五届青训营 」伴学笔记创作活动的第 11 天
网络与部署
接入
使用域名系统
Host 管理
- 流量和负载:用户规模指数级增长,文件大小越来越大,统一分发引起较大的网络流量和 CPU 负载
- 名称冲突:无法保证主机名称的唯一性,同名主机添加导致服务故障
- 时效性:分发靠人工上传,时效性太差
使用域名系统
- 使用域名系统替换 hosts 文件
-
关于域名空间
- 域名空间被组织为树形结构
- 域名空间通过划分 zone 的方式进行分层授权管理
- 全球公共域名空间仅对应一棵树
- 根据名服务器:查询起点
- 域名组成格式:[a-zA-Z0-9_-],以点划分 label
域名购买与配置迁移
- 修改配置:清空 /etc/hosts
- 配置 /etc/resolv.conf 中nameservers为公共 DNS 迁移原配置,通过控制台添加解析记录
开放外部用户访问
- 租赁一个外网 ip,专用于外部用户访问门户网站,将该 ip 绑定到一台物理机上,并发布公网 route,用于外部用户访问
自建 DNS 服务器
问题背景
- 内网域名的解析也得到公网去获取,效率低下
- 外部用户看到内网 ip 地址,容易被 hacker 攻击
- 云厂商权威 DNS 容易出故障,影响用户体验
- 持续扩大公司品牌技术影响力,使用自己的 DNS 系统
DNS 记录类型
- A / AAAA:IP 指向记录,用于指向 IP,前者为 IPv4记录,后者为 IPv6 记录
- CNAME:别名记录,配置值为别名或主机名,客户端根据别名继续解析以提取 IP 地址
- TXT:文本记录,购买证书时需要
- MX:邮件交互记录,用于指定哪台服务器对于该域名解析
- SOA 记录:起始授权机构记录,每个 zone 有且仅有唯一的一条 SOA 记录,SOA 是描述 zone 属性以及主要权威服务器的记录
接入 HTTPS 协议
对称加密和非对称加密
- 对称加密:一份密钥
- 非对称加密:公钥和私钥
SSL 的通信过程
-
client random
-
server random
-
premaster secret
-
加密算法协商
- 堆成密钥 session key
证书链
-
Server 端发送是带签名的证书链
-
Client 收到会仍然需要验签
- 是否是可信机构颁布
- 域名是否与实际访问一致
- 检查数字签名是否一致
- 检查证书的有效期
- 检查证书的撤回状态
接入全站加速
问题背景
- 源站容量低,可承载的并发请求数低,容易被打垮
- 报文经过的网络设备越多,出问题的概率越大,丢包,劫持,mtu 问题
- 自主选路网络链路长,时延高
解决方案
-
源站容量问题
- 增加后端机器扩容
- 静态内容,使用静态加速缓存
-
网络传输问题
- 动态加速 DCDN
-
全站加速
- 静态加速 + 动态加速
静态加速 CDN
- 解决服务器端的第一公理问题
- 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响
- 减轻了各省的出口带宽压力
- 优化了网上热点内容的分布
动态加速 DCDN
- 针对 POST 等非静态请求等不能在用户边缘缓存的业务,基于智能选路技术,从众多回源线路中择优选择一条线路进行传输
4 层负载均衡
- 基于 IP + 端口,利用某种算法将报文转发给某个后端服务器,实现负载均衡落地到后端服务器上
常见的调度算法原理
- RR 轮询: Round Robin,将所有的请求平均分配给每个真实服务器 RS
- 加权 RR 轮询:给每个后端服务器一个权值比值,将请求按照比例分配
- 最小连接:把新的连接请求分配到当前连接数最小的服务器
- 五元组 hash:根据 sip、sport、proto、dip、dport 对静态分配的服务器做散列取模
- 一致性 hash:只影响故障服务器上的连接 session,其余服务器上的连接不受影响
4 层负载均衡特点
- 大部分都是通过 dpdk 技术实现,技术成熟
- 纯用户态协议栈、kernel bypass,消除协议栈瓶颈
- 五缓存,零拷贝,大页内存(减少 cache miss)
- 仅针对 4 层数据包转发,小包转发可达到限速,可承受高 cps
7层负载均衡
Nginx
-
最灵活的高性能 WEB SERVER,应用最广的 7 层反向代理
-
模块化设计,较好的扩展性和可靠性
-
基于 master / worker 架构设计
-
支持热部署:可在线升级
-
不停机更新配置文件、更换日志文件、更新服务器二进制
-
较低的内存消耗:1 万个 keep-alive 连接模式下的非活动连接仅消耗 2.5M 内存
-
事务驱动;异步非阻塞模型、支持 aio、mmap(内存映射)
-
代理服务器功能
- Keepalive
- 访问日志
- url rewrite 重写
- 路径别名
- 基于 ip 的用户访问控制
- 限速及并发连接数控制
异步非阻塞
-
传统服务器
- 一个进程/线程处理一个连接/请求阻塞模型、依赖OS实现并发
-
Nginx
- 一个进程/线程处理多个连接/请求异步非阻塞模型、减少OS进程切换
提升 CPU 使用效率
-
合适的 worker 进程数
- worker 进程数 = CPU 核数
-
CPU 亲和
- 每个worker 程绑定一个 CPU 核,提升缓存命中率
-
减少 CPU 开销
- multi_accpet 允许worker 同时接受新连接
- accept_mutex 解决惊群问题
- reuseport 监听同端口,内核负载均衡
提升网络效率
-
连接复用
- 减少 upstream 建联
-
使用 Cache
- 超市时间对业务的影响
-
gzip 压缩
- 会增加 CPU 开销,需要平衡使用
-
开启 proxy_buffering
- 谨慎设置 proxy_buffer 的大小、磁盘 io 读写