负载均衡与高可用

一、keepalived

1、keepalived的三个进程

在这里插入图片描述

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

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

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

在这里插入图片描述

3、脑裂
1.定义:就是两台或者多台LB上都有vip地址
2.形成原因:
	防火墙阻止了keepalived的VRRP消息的通告
	virtual_router_id不一样的时候
4、vip(virtual ip):虚拟ip地址
为了避免单点故障,同时不对资源进行浪费,我们可以采用双vip的模式
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
	    }
	}

三、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
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
3、nginx4层负载均衡和7层负载均衡有什么区别
1、支持的服务数量
	七层:http服务
	四层:http、Mysql、dns、ftp
4、lvs和nginx在做负载均衡上的区别
1.层数:
	lvs:4层
	nginx:4层和72.效率:
	lvs的效率更高,内核已经内置了
3.从软件的发展层面来说
	nginx被f5收购了,有源源不断的技术支持,
	lvs缺乏持续的更新
5、负载均衡的调度算法
1.轮询(round robin),基于域名的
2、加权轮询,weight值越大权重越高,得到的请求数就越多,默认是1
3、最小连接数(least connection)
4、ip_hash,让同一个ip地址的所有请求都集中到一台服务器上
	一般应用在需要保存会话信息的场景:像cookie和session
5、random
6、最短响应时间(least time)
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;
	           }
	    }
7、正向代理和反向代理
1.正向代理--》代理用户:
	类似于一个跳板机,代理内部机器去访问外部资源,vpn
2.反向代理--》代理服务器:
	实现负载均衡,解决用户访问过大问题、解决大并发问题
8、健康检测

1、主动检测(Active Health Checks )

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

2、被动检查(Passive Health Checks)

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

四、fullnat

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

方法二:后端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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340