上线流程
DNS->tcp->tls->http
dns
代理
分布式服务器(负载均衡)
- 如可以每个服务器都搞一个nginx代理到不同的mysql服务器
服务中间件
- http
- rpc
域名
- 将域名和服务器绑定,注册到域名服务器
- 根据域名访问域名系统得到ip
- 根据ip访问
HOST
example公司 主机表 Host->ip映射
缺点:
随着example公司业务规模和员工数量的增长,使用该方式面临诸多问题:
- 流量和负载:用户规模指数级增长,文件大小越来越大,统一分发引起较大的网络流量和Cpu
- 负载名称冲突:无法保证主机名称的唯一性,同名主机添加导致服务故障
- 时效性:分发靠人工上传,时效性太差
DNS
域名系统
购买域名:买一个(第三方域名)服务器绑定服务器ip,加入到公共域名服务器
域名备案:防止在网上从事非法的网站经营活动,打击不良互联网信息的传播,一般在云厂商处即可进行实名认证并备案
修改配置:清空/etc/hosts配置/etc/resolv.conf中nameservers.为公共DNS迁移原配置,通过控制台添加解析记录即可
使用第三方域名服务器
自建DNS服务器
- 不再使用第三方的域名解析,直接根域名服务器到自建DNS服务器
dig domain + trace 查看域名解析过程
内网域名的解析也得出公网去获取,效率低下
外部用户看到内网ip地址,容易被hacker攻击
云厂商权威DNS容易出故障,影响用户体验
持续扩大公司品牌技术影响力,使用自己的DNS系统
从公有云托管->构建自己的DNS系统
DNS服务器架构
- 权威
- localDNS
HTTPS
页面出现白页/出现某些奇怪的东西返回了403的页面 搜索不了东西 搜索问题带了小尾巴,页面总要闪几次页面弹窗广告 搜索个汽车就有人给我打电话推销4s店和保险什么的
- http明文传输
- 证书
全站加速
静态CDN
- 最近的cdn节点并缓存静态资源
解决服务器端的“第一公里”问题 缓解甚至消除了不同运营商之间互联的瓶颈造成的影响 减轻了各省的出口带宽压力 优化了网上热点内容的分布
动态DCDN
针对POST等非静态请求等不能在用户边缘缓存的业务,基于智能选路技术,从众多回源线路中择优选择一条线路进行传输。
机房分布
这个到核心访问数据:动态加速路径 DCDN
访问静态资源:静态加速即可 CDN
- RTT:访问一个服务器的时间
1、用户首次登录抖音,注册用户名手机号等用户信息 动态加速DCDN 2、抖音用户点开某个特定的短视频加载后观看 静态加速CDN 3、用户打开头条官网进行网页浏览 静态加速CDN+动态加速DCDN
四层负载均衡
现状:直接找一个物理机,ifconfig将网卡配上这个IP,起server监听即可
应用多,起多个server监听不同的端口即可
租多个公网p(数量有限)
- 端口冲突
- 终端挂掉
三个主要功能: 1.解耦vip和rs:动态分配,使用vip加入公网,进行负载均衡分配到各个rs
-
RR轮询:Round Robin,将所有的请求平均分配给每个真实服务器RS
-
加权RR轮询:给每个后端服务器一个权值比例,将请求按照比例分配
-
最小连接:把新的连接请求分配到当前连接数最小的服务器
-
五元组hash:根据sip、sport、.proto、dip、dporty对静态分配的服务器做散列取模
缺点当后端某个服务器故障后,所有连接都鱼新计算,影响整个hash环
-
一致性hash:只影响故障服务器上的连接session,其余服务器上的连接不受影响
2.反向代理
3.net防攻击:syn proxy,相当于nat路由器不会暴露物理地址
实现
就相当于:使用了一个服务器作为nat路由器?,可以更好的实现某些功能?
- cip:客户端ip
- vip:服务器公网ip
- lip:负载均衡的服务器的虚拟ip(相当于路由器的ip)
- rs:目标服务器ip
大部分都是通过dpdk技术实现,技术成熟,大厂都在用
纯用户态协议栈,kernel bypass,消除协议栈瓶颈
无缓存,零拷贝,大页内存(减少cache miss) 仅针对4层数据包转发,小包转发可达到限速,可承受高Cps
7层负载均衡
🉑 和4层的关系就是osi模型的关系
4层的问题
SSL卸载:业务侧是http服务,用户需要用https访问
请求重定向:刘览器访问toutiao,.com自动跳转www.toutiao.com
路由添加匹配策略:完全、前缀、正则
Header编辑
跨域支持
协议支持:websocket、grpc、quic
- 代理:如 (请求 <-> socket5) <-> 服务器
- 反向代理: 请求 <-> (代理服务器 <-> 服务器)
nginx
-
事件驱动
- 不是使用监听事件发生(查询)
- 使用的是事件队列,但是cpu的进程调用(中断)
模块化设计,较好的扩展性和可靠性 基于master/worker架构设计 支持热部署;可在线升级 不停机更新配置文件、更换日志文件、更新服务器二进制 较低的内存消耗:1万个keep-alive连接模式下的非活动连接仅消耗2.5M内存 事件驱动:异步非阻塞模型、支持aio,mmap(内存映射)
nginx快速入门
1、work 进程 与 master 进程
2、反向代理(代理服务器接收请求) 和 负载均衡(访问nginx服务器 ——> 分发给各个服务器)
- nginx -s reload 加载配置文件
- server1 : 127.0.0.1/app -> 分发给各个服务器(127.0.0.1:8000、127.0.0.1:8001、127.0.0.1:8002)
http{
upstream backend {
# 同一个ip到同一个服务器(可以解决session问题): ip_hash;
# 权重三个服务(器),否则使用轮询进行分配
server 127.0.0.1:8000 weight=3;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
}
# 一个服务网站
server {
# 三个服务挂到同一个服务网站的域名:http://域名(127.0.0.1)/app
location /app { # 所有访问/app路径的请求会被反向代理到上游的三个服务器(backend变量)中的一个。
proxy_pass http://backend;
}
}
}
负载平衡:
默认使用轮询算法时,NGINX会按照服务器列表中的顺序逐个将请求分配给后端服务器,然后按照相同的顺序循环处理下一个请求。
这意味着每个服务器在一轮中都会被赋予处理请求的机会,从而在相对均匀地分配负载的同时,实现了基本的负载平衡。
- 操作系统的进程调度也有一个
轮询算法一致(就是时间片轮询)- 计算机中的 I/O(输入/输出)
接口轮询与操作系统中的进程调度轮询是不同的概念。I/O 接口轮询指的是一种方式,通过该方式计算机系统可以周期性地检查外部设备或接口,以了解是否有新的数据或事件需要处理。
反向代理:
- 假设你有一个 Nginx 服务器,其 IP 地址为
ip_ng,而你的 Nginx 配置中有一个代理块,用于处理访问http://ip_ng/app的请求,这时客户端可以通过访问http://ip_ng/app来访问你后端的三个服务。 - 客户端只需要知道 Nginx 服务器的 IP 地址,而后端服务器的细节则由 Nginx 处理,也就是对客户端透明,但是其实也是可以直接敲具体的服务器的ip来访问的
- dns:假如要dns绑定ngnix服务器即可,然后配置域名,其他服务器的ip直接在ngnix服务器上配
3、https组件
4、虚拟主机:一个服务器同时有多个网站(域名)
- 一个server {} : 就是一个网站