这是我参与「第三届青训营 -后端场」笔记创作活动的的第8篇笔记.
- 在/etc/hosts中进行host管理
- 使用域名系统替换hosts文件
- 在公有云厂商购买域名
- 租赁外网ip,将域名解析到外网ip,将ip绑定在一台物理机上,发布公网route,专用于外部用户访问门站 但是这种情况下。
- 内网域名的解析也要出公网获取,效率低
- 外部用户看到内网ip,容易被攻击
- 云厂商权威DNS容易出故障
自建DNS服务器
dig {domain} trace
DNS记录类型
共同实现DNS分布式数据库的所有DNS服务器存储了资源记录Resource Record.RR提供了主机名到ip地址的映射。每个DNS回答报文包含了一条或多条资源记录。资源记录是四元组:
{Name,Value,Type,TTL} TTL是记录的生存时间,决定了资源记录应当从缓存中删除的时间。
- Type=A,Name是主机名,Value是主机名对应的ip地址。一条记录类型为A的资源记录提供了标准的主机名到ip地址的映射。
- Type=NS,Name是个域(foo.com),value是知道如何获得该域中主机ip地址的权威DNS服务器的主机名。这个记录用于沿着查询链来路由DNS查询。
- TYPE=CNAME,Value是别名为Name的主机对应的规范主机名,该记录能向查询的主机提供一个主机名对应的规范主机名。
- Type=MX,VALUE是别名为Name的邮件服务器的规范主机名。MX记录允许邮件服务器主机名具有简单的别名。通过使用MX记录,一个公司的邮件服务器和其他服务器可以使用相同别名。为了获得邮件服务器的规范主机名,DNS客户应当请求一条MX记录;为了获得其他服务器的规范主机名,DNS客户应当请求CNAME记录。
全站加速
- 静态加速 CDN
访问过程静态文件是相同的。主要还是缓存。
第一公里-》在用户附近的链路进行优化。 - 动态加速 DCDN 对非静态内容。针对POST等非静态请求不能再用户边缘优化,基于智能选路技术,从众多回源线路择优选择一条链路传输。
四层负载均衡
基于ip+port均衡的将请求报文落到后端服务器。
- 解耦vip+rs
- NAT
- syn proxy 避免将ip直接暴露在公网 避免sync攻击
常见的调度算法
- RR
- 加权RR
- 最小链接
- 五元组hash 「sip,sport,proto,dip,dport」对静态服务器取模
- 缺点:后端某个服务器故障,所有连接需重新计算
- 一致性hash:只影响故障服务器的连接session
实现方式 FULLNAT
- 使用dpdk实现
- 纯用户态协议栈,kernel bypass,消除协议栈瓶颈
- 无缓存,零拷贝,大页内存,减少cache的miss率
- 仅针对四层数据报转发,小包转发可达到限速
七层负载均衡
解决七层协议配置。
Nginx
- 模块化设计
- 基于worker/master
- 支持热部署
Nginx内部架构
内核网络参数
- fs.filemax=999999
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_keepalive_time=600
- net.ipv4.tcp_fin_timeout=30
- net.ipv4.tcp_max_tw_buckets=5000
- net.ipv4.tcp_max_sync.backlog=1024
- net.ipv4.tcp_syncookie=1
- net.ipv4.ip_local_port_range=10246100 提高cpu效率
- 合理的worker进程==cpu核数
- 每个worker进程绑定一个cpu核 提高网络效率
- 连接复用
- 使用cache
- gzip压缩
- 开启proxy_buffering 促进磁盘io读写
Q&A
- DNS污染和DNS劫持的区别 DNS报文的加密处理无法进行监听和监测,因此是明文传输,可以被中间商看到。因此容易被抓包和劫持。
- DNS的ttl时间越短越好? 决定了local dns缓存权威dns的结果,设置过短,local dns的优势不明显。但是过大无法及时同步。