一、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层和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