DNS是如何做负载均衡的呢?
DNS是通过域名做轮询的,也就是DNS服务器帮我们做,有一定的随机性,不受我们的控制。实现方式就是将一个域名可以解析成多个IP地址。
DNS的记录类型:
在阿里云服务器上将一个域名绑定多个IP地址:
检验效果:
连续两次ping这一个域名,但是解析出来的IP地址是不相同的
[root@xieshan conf]# ping sg.sanchuangedu.cn
PING sg.sanchuangedu.cn (119.13.100.79) 56(84) bytes of data.
64 bytes from ecs-119-13-100-79.compute.hwclouds-dns.com (119.13.100.79): icmp_seq=1 ttl=40 time=57.4 ms
64 bytes from ecs-119-13-100-79.compute.hwclouds-dns.com (119.13.100.79): icmp_seq=2 ttl=40 time=56.7 ms
^C
--- sg.sanchuangedu.cn ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1007ms
rtt min/avg/max/mdev = 56.781/57.093/57.405/0.312 ms
[root@xieshan conf]# ping sg.sanchuangedu.cn
PING sg.sanchuangedu.cn (81.68.81.238) 56(84) bytes of data.
64 bytes from 81.68.81.238 (81.68.81.238): icmp_seq=1 ttl=51 time=24.5 ms
^C
--- sg.sanchuangedu.cn ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 24.523/24.523/24.523/0.000 ms
科普小知识:CDN
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
cdn(content delivery network)内容分发网络,在各个省都有服务器来分发数据,给用户加速,各个服务器里面有缓存
通过nginx的ngx_http_upstream_module模块也可以实现负载均衡
官网中nginx的基本调度算法有:
1.轮询算法(包括加权轮询)
round-robin — requests to the application servers are distributed
in a round-robin fashion,
http {
#默认负载均衡算法,轮询
upstream scapp{ #定义一个负载均衡器名为scapp,转发到以下两台机器上
server 192.168.2.33;
server 192.168.2.34;
}
#负载均衡算法,加权轮询
upstream scapp{ #定义一个负载均衡器名为scapp,转发到以下两台机器上,第二台机器的出现次数会比第一台机器多,因为权重大
server 192.168.2.33 weight=1;
server 192.168.2.34 weight=3;
}
2.最少连接数算法(适合于资源分配不均匀的场合)
least-connected — next request is assigned to the server with the
least number of active connections,
3.IP-hash算法,可以将同一个IP地址的访问集中到同一台服务器上,可以保存用户会话信息(例如保存用户的账号密码),适合解决那种session共享的问题
ip-hash — a hash-function is used to determine what server should
be selected for the next request (based on the client’s IP address).
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
}
4.generic hash(又称为url_hash,按照访问的url的hash结果分配请求,每个请求的url会指向后端固定的某个服务器,可以在nginx作为静态服务器的情况下提高缓存效率。同样要注意Nginx默认不支持这种调度算法,要使用的话需要安装nginx的hash软件包)
Generic Hash – The server to which a request is sent is determined from a user‑defined key which can be a text string, variable, or a combination.
upstream backend {
hash $request_uri consistent;
server backend1.example.com;
server backend2.example.com;
}
5.least time(最短响应时间,也就是能者多劳的意思,需要使用nginx plus版本才有的功能)
Least Time (NGINX Plus only) – For each request, NGINX Plus selects the server with the lowest average latency and the lowest number of active connections
upstream backend {
least_time header;
server backend1.example.com;
server backend2.example.com;
}
6.Random(随机)
Random – Each request will be passed to a randomly selected server.
upstream backend {
random two least_time=last_byte;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com;
server backend4.example.com;
}
7.fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配,响应时间短处理效率高的服务器分配到请求的概率高,响应时间长处理效率低的服务器分配到的请求少;结合了前两者的优点的一种调度算法。但是需要注意的是Nginx默认不支持fair算法,如果要使用这种调度算法,请安装upstream_fair模块
8.SERVER WEIGHT(服务器权值)
By default, NGINX distributes requests among the servers in the group according to their weights using the Round Robin method. The weight parameter to the server directive sets the weight of a server; the default is 1(服务器会按照权重轮询转发给backend1和backend2,如果backend1和backend2都挂了,就会转到192.0.0.1服务器上,相当于一个备份功能):
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com;
server 192.0.0.1 backup;
}
keepalived不仅可以做高可用,还可以实现负载均衡的功能,那么keepalived又是如何实现负载均衡的呢?
keepalived实现负载均衡,底层是依赖于LVS(Linux Virtual Server),LVS目前已经嵌入Linux内核了,不需要额外安装,Linux系统本身就有(章文嵩是LVS开源软件的创始人)
如果你还是不理解keepalived的关系,我给你打个比喻:
你应该学过iptables和netfilter模块吧?iptables只是netfilter的一个传参工具,真正对数据进行过滤,起到防火墙作用的是netfilter模块
同理,keepalived也只是LVS的一个传参工具,真正起到负载均衡作用的是LVS
官方对于LVS的介绍:
The Linux Virtual Server is a highly scalable and highly available server built on a cluster of real servers, with the load balancer running on the Linux operating system. The architecture of the server cluster is fully transparent to end users, and the users interact as if it were a single high-performance virtual server.
LVS是一个建立在真实服务器集群上的高度可扩展和高度可用的服务器,其负载平衡器运行在Linux操作系统上。服务器集群的结构对终端用户是完全透明的,用户的互动就好像是一个单一的高性能虚拟服务器。
LVS负载均衡器的模式有:NAT、DR、TUNNET(隧道模式)、Fullnat(snat和dnat)
其中,DR模式性能好,数据出去的时候不需要再经过负载均衡器;Fullnat模式可以跨网段
1.lvs的性能要好,抗负载能力强,因为lvs有多种模式,DR和tunnel模式,而nginx就是LVS中的NAT模式,数据的进出都要经过负载均衡器
2.lvs支持的协议多,nginx支持web和邮件,而lvs支持web、ftp、视频、dns等,绝大部分的TCP和UDP的协议
3.在网络中工作的层数(也就是几层负载均衡),nginx默认工作在osi协议的第七层–》应用层 ,可以对http协议进行操作,但是nginx也可以进行四层负载均衡,需要使用nginx plus模块或者最新版本的nginx进行额外配置),lvs可以工作在第四层以及以下,网络层、传输层、数据链路层和物理层
4. 调度算法不同,nginx支持的调度算法前面列出来的那几种,很多还是需要使用nginx plus才能使用的,但是lvs的调度算法更多,有轮询,加权轮询,最少链接,加权最少链接,基于局部性的最少连接,源地址散列,目标地址散列,最少队列调度
LVS:是基于四层的转发
HAproxy:是基于四层和七层的转发,是专业的代理服务器
Nginx:是 WEB 服务器,缓存服务器,又是反向代理服务器,可以做七层的转发
区别:
LVS 由于是基于四层的转发所以只能做端口的转发,而基于 URL 的、基于目录的这种转发 LVS 就做不了
工作选择:
HAproxy 和 Nginx 由于可以做七层的转发,所以 URL 和目录的转发都可以做。
在很大并发量的时候我们就要选择 LVS,如果并发量没那么大选择 HAproxy 或者 Nginx 足已,由于 HAproxy 由是专业的代理服务器,配置简单,所以中小型企业推荐使用 HAproxy