Keepalived简介html
Keepalived的做用是检测服务器的状态,若是有一台web服务器宕机,或工做出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其余服务器代替该服务器的工做,当服务器工做正常后Keepalived自动将服务器加入到服务器群中,这些工做所有自动完成,不须要人工干涉,须要人工作的只是修复故障的服务器。python
keepalived工做原理nginx
keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。web
虚拟路由冗余协议,能够认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其余机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就须要根据VRRP的优先级来选举一个backup当master。这样的话就能够保证路由器的高可用了。json
keepalived主要有三个模块,分别是core、check和vrrp。core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析。check负责健康检查,包括常见的各类检查方式。vrrp模块是来实现VRRP协议的。bash
keepalived三个主要功能服务器
管理LVS负载均衡软件网络
实现LVS集群节点的健康检查中app
做为系统网络服务的高可用性(failover)负载均衡
PS:本次主要介绍高可用功能
Keepalived安装配置
安装环境查看
本次试验使用yum安装
yum -y install keepalived
查看版本
配置文件为/etc/keepalived/keepalived.conf
全局配置文件
lobal_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 lb01 vrrp_skip_check_adv_addr # vrrp_strict vrrp_garp_interval 0 vrrp_gna_interval 0 }
用来配置router_id(全局惟一) 以及邮箱等信息
PS:配置邮件用于出现故障发送邮件,工做中这个工做通常交由监控软件zabbix等负责,能够不配置
vrrp配置部分
vrrp_instance VI_1 { state MASTER #设备状态是主 interface eth0 #绑定的网络接口是eth0 virtual_router_id 55 #虚拟路由ID 主备这个ID必须一致 priority 150 #优先级数值越高优先级越高,备的优先级需低于此数值 advert_int 1 #主备同步间隔单位是秒 authentication { auth_type PASS auth_pass 1111 #主备认证方式,主备密码须要一致 } virtual_ipaddress { #虚拟IP地址以及绑定的网卡 192.168.56.22/24 dev eth0 label eth0:1 } }
用于配置主备状态,接口,优先级,认证方式IP信息等
高可用服务单实例实战
图示
192.168.56.11的keepalived配置
! Configuration File for keepalived global_defs { notification_email { liuym@abc.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb01 # vrrp_strict } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 55 priority 150 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.56.22/24 dev eth0 label eth0:1 } }
192.168.56.12的keepalived配置
! Configuration File for keepalived global_defs { notification_email { liuym@abc.com } notification_email_from Alexandre.Cassen@firewall.loc smtp_server 127.0.0.1 smtp_connect_timeout 30 router_id lb02 # vrrp_strict } vrrp_instance VI_1 { state BACKEND interface eth0 virtual_router_id 55 priority 100 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.56.22/24 dev eth0 label eth0:1 } }
说明:router_id不同
主备状态不同(一台是MASTER一台是BACKEDN在配置文件里必须是大写)
优先级不同
PS:vrrp_strict是默认的配置须要注释,不然会致使VIP不通
启动keepalived验证两台主机均启动
systemctl start keepalived
192.168.56.11生产了虚拟IP
192.168.56.12没有虚拟IP
中止主keepalived责备机接管虚拟VIP
主节点没有了虚拟VIP
主节点再次启动keepalived 由于主节点优先级别高又会自动接管虚拟VIP
keepalived+nginx实现高可用集群
图示以下
1,对外提供的VIP是192.168.56.22
2,其中正常工做是由11提供服务
3,11宕机的状况VIP会漂移至22主机,用户无感知
11和12主机分别安装nginx并设置反向代理,这里为了方便仅仅反向代理一台主机,生产中是有多台主机的
nginx.conf配置以下(两台主机nginx配置同样反向代理了11的8080生产中是其余应用的多台主机)
worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format access_log_json '{"user_ip":"$http_x_forwarded_for","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_rqp":"$request","http_code":"$status","body_bytes_sent":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}'; sendfile on; keepalive_timeout 65; upstream www_server_pools { server 192.168.56.11:8080; } server { listen 192.168.56.22:80; server_name www.liuym.com; access_log /data/logs/nginx/http-access.log access_log_json; error_log /data/logs/nginx/http-error.log; location / { proxy_pass http://www_server_pools; proxy_set_header Host $host; proxy_set_header x-Forwarded-For $remote_addr; } } }
注意这里server_name指定了VIP加端口进行绑定,其余配置为nginx基础知识
客户端设置hosts指向的ip是VIP192.168.56.22 生产中是DNS地址
web界面经过域名访问(这里使用一个8080端口启动的jenkins做为示例)
测试VIP漂移
在master中止keepalived客户端仍是能够继续访问该页面
PS:备节点nginx配置了VIP绑定,可是实际主机并无该VIP在启动nginx的时候会报错
解决办法,修改内核参数/etc/sysctl.conf增长一条
net.ipv4.ip_nonlocal_bind = 1
执行生效
sysctl -p
默认状况下是keepalived软件是在对方宕机或者keepalived中止状况下才接管业务,假如是主节点的Nginx业务有问题呢
能够写一个脚本监控Nginx若是nginx中止服务就中止keepalived
check_nginx.sh
#!/bin/bash while true do if [ ` netstat -lntup|grep nginx|wc -l` -ne 1 ];then systemctl stop keepalived fi sleep 5 done
检测若是nginx宕机则中止keepalived
后台运行便可
sh check_nginx.sh &