• 负载均衡与高可用


    一、keepalived

    1、keepalived的三个进程

    在这里插入图片描述

    2、keepalived的工作原理
    keepalived正常启动的时候,共启动3个进程,一个是父进程,负责监控其子进程;一个是vrrp子进程;另外一个是checkers子进程
    两个子进程都被系统watchdog看管,两个子进程各自负责复杂自己的事。
    
    • 1
    • 2
    3、keepalived的两个功能
    1.HA(高可用)
    2.loadbalance(负载均衡)
    	keepalived实现负载均衡的功能是依靠lvs这个软件里实现的
    
    • 1
    • 2
    • 3
    4、负载均衡与高可用
    	负载均衡:将很多的请求分散到后端很多的服务器上  --》化解压力的一个软件
    	高可用: 有2个或者多个服务器(人)做相同的事情,互相备份。
    
    • 1
    • 2

    二、keepalived实现高可用(High Availability)

    1、vrrp协议:虚拟路由冗余协议
    1.VRRP通告:它使用IP多播数据包进行封装,组地址为224.0.0.18,有255个VRRP
    2.VRRP协议工作在网络层
    
    • 1
    • 2
    2、VRRP格式:

    在这里插入图片描述

    3、脑裂
    1.定义:就是两台或者多台LB上都有vip地址
    2.形成原因:
    	防火墙阻止了keepalived的VRRP消息的通告
    	virtual_router_id不一样的时候
    
    • 1
    • 2
    • 3
    • 4
    4、vip(virtual ip):虚拟ip地址
    为了避免单点故障,同时不对资源进行浪费,我们可以采用双vip的模式
    
    • 1
    5、双vip的配置
    双vip的配置文件
    第1台服务器上的配置
    	[root@LB-1 keepalived]# cat keepalived.conf 
    	! Configuration File for keepalived
    	global_defs {
    	   notification_email {
    	     acassen@firewall.loc
    	     failover@firewall.loc
    	     sysadmin@firewall.loc
    	   }
    	   notification_email_from Alexandre.Cassen@firewall.loc
    	   smtp_server 192.168.200.1
    	   smtp_connect_timeout 30
    	   router_id LVS_DEVEL
    	   vrrp_skip_check_adv_addr
    	   #vrrp_strict
    	   vrrp_garp_interval 0
    	   vrrp_gna_interval 0
    	}
    	
    	vrrp_instance VI_1 {
    	    state MASTER
    	    interface ens33
    	    virtual_router_id 199
    	    priority 110
    	    advert_int 1
    	    authentication {
    	        auth_type PASS
    	        auth_pass 123456
    	    }
    	    virtual_ipaddress {
    	        192.168.0.180
    	    }
    	}
    	
    	vrrp_instance VI_2 {
    	    state BACKUP
    	    interface ens33
    	    virtual_router_id 200
    	    priority 100
    	    advert_int 1
    	    authentication {
    	        auth_type PASS
    	        auth_pass 123456
    	    }
    	    virtual_ipaddress {
    	        192.168.0.181
    	    }
    	}2台上的
    	[root@LB-2 keepalived]# cat keepalived.conf 
    	! Configuration File for keepalived
    	global_defs {
    	   notification_email {
    	     acassen@firewall.loc
    	     failover@firewall.loc
    	     sysadmin@firewall.loc
    	   }
    	   notification_email_from Alexandre.Cassen@firewall.loc
    	   smtp_server 192.168.200.1
    	   smtp_connect_timeout 30
    	   router_id LVS_DEVEL
    	   vrrp_skip_check_adv_addr
    	   #vrrp_strict
    	   vrrp_garp_interval 0
    	   vrrp_gna_interval 0
    	}
    	
    	vrrp_instance VI_1 {
    	    state BACKUP
    	    interface ens33
    	    virtual_router_id 199
    	    priority 100
    	    advert_int 1
    	    authentication {
    	        auth_type PASS
    	        auth_pass 123456
    	    }
    	    virtual_ipaddress {
    	        192.168.0.180
    	    }
    	}
    	
    	vrrp_instance VI_2 {
    	    state MASTER
    	    interface ens33
    	    virtual_router_id 200
    	    priority 110
    	    advert_int 1
    	    authentication {
    	        auth_type PASS
    	        auth_pass 123456
    	    }
    	    virtual_ipaddress {
    	        192.168.0.181
    	    }
    	}
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    三、nginx实现负载均衡

    1、nginx实现四层负载均衡
    1.根据端口号进行转发
    2.在nginx.conf文件里配置负载均衡
    	[root@LB conf]# cat nginx.conf
    	#user  nobody;
    	worker_processes  1;
    	#error_log  logs/error.log;
    	#error_log  logs/error.log  notice;
    	#error_log  logs/error.log  info;
    	#pid        logs/nginx.pid;
    	events {
    	    worker_connections  1024;
    	}
    	#4层的负载均衡
    	stream {
    		#负载均衡器的定义web
    	    upstream scweb {
    	        server 192.168.0.163:80;
    	        server 192.168.0.161:80;
    	        server 192.168.0.162:80;
    	      }
    		#负载均衡器的定义dns
    	   upstream dns_servers {
    		hash   $remote_addr consistent;
    	        server 192.168.0.130:53;
    	        server 192.168.0.131:53;
    	        }
    	server {
    	        listen     80;
    	        proxy_pass scweb;
    	    }
    	}
    	http {
    	    include       mime.types;
    	    default_type  application/octet-stream;
    	    access_log  logs/access.log ;
    	    sendfile        on;
    	    keepalive_timeout  65;
    	}
    
    3.在数据转发这块仍然采用的是FULLNAt,不但修改了源ip和目的ip,同时还可以修改源端口和目的端口
    4.四层负载均衡需要用到ngx_stream_core_module模块,在编译安装的时候需要接--with-stream
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    2、dns域名负载均衡
    1.配置host文件
    	[root@www named]# host www.sc.com
    	www.sc.com has address 192.168.0.88
    	www.sc.com has address 192.168.0.92
    	www.sc.com has address 192.168.0.89
    
    • 1
    • 2
    • 3
    • 4
    • 5
    3、nginx4层负载均衡和7层负载均衡有什么区别
    1、支持的服务数量
    	七层:http服务
    	四层:http、Mysql、dns、ftp
    
    • 1
    • 2
    • 3
    4、lvs和nginx在做负载均衡上的区别
    1.层数:
    	lvs:4层
    	nginx:4层和72.效率:
    	lvs的效率更高,内核已经内置了
    3.从软件的发展层面来说
    	nginx被f5收购了,有源源不断的技术支持,
    	lvs缺乏持续的更新
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    5、负载均衡的调度算法
    1.轮询(round robin),基于域名的
    2、加权轮询,weight值越大权重越高,得到的请求数就越多,默认是1
    3、最小连接数(least connection)
    4、ip_hash,让同一个ip地址的所有请求都集中到一台服务器上
    	一般应用在需要保存会话信息的场景:像cookie和session
    5、random
    6、最短响应时间(least time)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    6、常用调度算法的配置案例
    1.轮询
    	 #定义上游服务器集群,定义一个负载均衡器
    	    upstream myweb1 {
    	        server  192.168.0.161;
    	        server  192.168.0.162;
    	        server  192.168.0.163;
    	        }
    	    server {
    	        listen       80;
    	        server_name  www.sc.com;
    	        location / {
    	                proxy_pass http://myweb1;
    	           }
    	    }
    2.加权轮询
    	 #定义上游服务器集群,定义一个负载均衡器
    	    upstream myweb1 {
    	        server  192.168.0.161 weight=1;
    	        server  192.168.0.162 weight=3;
    	        server  192.168.0.163 weight=6;
    	        }
    	    server {
    	        listen       80;
    	        server_name  www.sc.com;
    	        location / {
    	                proxy_pass http://myweb1;
    	           }
    	    }
    3.最小连接数
    	  #定义上游服务器集群,定义一个负载均衡器
    	    upstream myweb1 {
    	        least_conn;
    	        server  192.168.0.161;
    	        server  192.168.0.162;
    	        server  192.168.0.163;
    	        }
    	    server {
    	        listen       80;
    	        server_name  www.sc.com;
    	        location / {
    	                proxy_pass http://myweb1;
    	           }
    	    }       
    4.ip-hash
    	#定义上游服务器集群,定义一个负载均衡器
    	    upstream myweb1 {
    	        ip_hash;
    	        server  192.168.0.161;
    	        server  192.168.0.162;
    	        server  192.168.0.163;
    	        }
    	    server {
    	        listen       80;
    	        server_name  www.sc.com;
    	        location / {
    	                proxy_pass http://myweb1;
    	           }
    	    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    7、正向代理和反向代理
    1.正向代理--》代理用户:
    	类似于一个跳板机,代理内部机器去访问外部资源,vpn
    2.反向代理--》代理服务器:
    	实现负载均衡,解决用户访问过大问题、解决大并发问题
    
    • 1
    • 2
    • 3
    • 4
    8、健康检测

    1、主动检测(Active Health Checks )

    主动的健康检查,LB每隔一段时间就去检查下后端的real server的状态,不管是否有client发请求过来,都会去检查。
    需要购买安装nginx plus
    
    • 1
    • 2

    2、被动检查(Passive Health Checks)

    被动的健康检查: 当client发请求给LB,然后LB再去转发请求给后端的real server ,这个时候如果后端的服务器出现问题,LB就发现了。相当于被客户机逼着去检查后端的real server
    
    
    • 1
    • 2

    四、fullnat

    1、fullnat的作用
    修改了源ip和目的ip,同时还可以修改源端口和目的端口
    
    • 1
    2、real-ip的模块
    1.作用:当本机的nginx处于一个反向代理的后端时,获取到真实的用户ip
    2.给后端backend使用的
    
    • 1
    • 2
    3、realip问题:
    后端的real server不知道前端真正访问的ip地址,只是知道负载均衡的ip地址,如何让后端的real server知道前端真正的用户的ip地址?
    
    • 1
    4、解决realip问题的方法

    方法一:后端real server不使用realip模块

    1.步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X-Real-IP字段
    	  server {
    	        listen       80;
    	        server_name  www.sc.com;
    	        location / {
    	                proxy_pass http://myweb1;
    	                proxy_set_header   X-Real-IP        $remote_addr;
    	           }
    	    }
    将nginx内部的remote_addr这个变量的值,赋值给X-Real-IP这个变量,X-Real-IP这个变量会在http协议的请求报文里添加一个X-Real-IP的字段,后端的real server 服务器上的nginx就可以读取这个字段的值;X-Real-IP  这个变量名可以自己定义,随便取名,后面引用的时候,不区分大小写
    
    2.步骤2:在后端real server上使用这个x_real_ip这个字段
    		http {
    	    include       mime.types;
    	    default_type  application/octet-stream;
    	    log_format  main  '$remote_addr -  $HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
    	                      '$status $body_bytes_sent "$http_referer" '
    	                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法二:后端real server使用realip模块

    1.前提条件,需要在后端的backend服务器上在编译安装nginx的时候,需要接 --with-http_realip_module参数 开启这个功能
    2.步骤1:在负载均衡器上修改http请求报文头部字段,添加一个X_REAL_IP字段
    	  server {
    	        listen       80;
    	        server_name  www.sc.com;
    	        location / {
    	                proxy_pass http://myweb1;
    	                proxy_set_header   X-Real-IP        $remote_addr;
    	           }
    	    }
    3.步骤2:在后端real server上使用set_real_ip_from 192.168.0.160
    	server{
    	                listen 80;
    	                set_real_ip_from 192.168.0.160;
    			}
    set_real_ip_from 192.168.0.160; 告诉本机的nginx 192.168.0.160 是负载均衡器,不是真正的client
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 相关阅读:
    【LeetCode热题 100】三数之和
    分布式微服务架构-一起学习吧之架构
    给微软.Net runtime运行时提交的几个Issues
    北大C++课后记录:文件读写的I/O流
    【C++】C++ 引用详解 ① ( 变量的本质 - 引入 “ 引用 “ 概念 | 引用语法简介 | 引用做函数参数 | 复杂类型引用做函数参数 )
    JIRA 如何在项目之间移动 Issue
    Pascal面试考试题库和答案(命令式和过程式编程语言学习资料)
    基于C#的窗体阴影效果方案 - 开源研究系列文章
    工作队列模式(任务队列)| RabbitMQ系列(二)
    年薪30万,达到人生巅峰,入职字节一个月,我却被无情碾压
  • 原文地址:https://blog.csdn.net/weixin_47661174/article/details/126492990