一、keepalived
1、keepalived的三个进程

zk内置的负载均衡器是什么 负载均衡keepalive_运维

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格式:

zk内置的负载均衡器是什么 负载均衡keepalive_负载均衡_02

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层和7层
2.效率:
	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