查看: 302|回复: 7

[Keepalived] keepalived简介、安装及配置

[复制链接]

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
发表于 2017-5-9 18:19:51 | 显示全部楼层 |阅读模式
keepalived提供高可用的时候使用的是VIP和VMAC,多台提供服务时状态如下:
162442pttgh33fmgrhwjb3.png
为了避免单台负载过重和如果keepalived有多台的情况下,会造成不必要的浪费。那么我们就需要考虑开通多个群集的功能,来避免造成的不必要的浪费和减轻前端的服务器的负载:
162102tu2d6dpjzda2lhl0.png
那么如果有一台down的情况下,那么前端的负载就会变成如下状态:
164552xdi3f5fqcd5aohxq.png
所有的VIP和Vmac全都会转移到一个keepalived+nginx服务器上。仍然能够实现nginx转发功能的高可用!

思考:
如果像上图那样开启了多条虚拟路由规则,keepalived是怎么判断对方所发送的通告信息是属于哪个虚拟路由的呢?
这个时候就需要使用到了VRID,我们称之为VID。也就是这里我们可以使用VID来对进行区分。并且VID也是我们vmac的最后一个字段。

为了防止正在运行的前端转发群集中受到末授权机转发服务器的影响,我们可以提供认证的方式。keepalived支持明文字符串的认证方式,也支持md5的加密方式。

注:此处的nginx只做转发使用,不是用做web服务!后端有另外的WEB服务器!!
选一人白头,择一城终老
回复

使用道具 举报

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
 楼主| 发表于 2017-5-9 18:20:19 | 显示全部楼层
从Centos6.4之后我们就可以使用yum的方式进行安装keepalived了!
  1. [root@ifshell.com ~]# yum install -y keepalived
复制代码
主配置文件:/etc/keepalived/keepalived.conf
修改之前请先备份哦!!
  1. cd /etc/keepalived/
  2. cp keepalived.conf keepalived.conf.bak
复制代码
注:运维守则,操作之前必先备份!
主keepalived配置实例:
  1. global_defs {
  2.    notification_email {
  3.         root@localhost
  4.    }
  5.    notification_email_from keepalived@locahost
  6.    smtp_server 127.0.0.1
  7.    smtp_connect_timeout 30
  8.    router_id LVS_DEVEL
  9. }

  10. vrrp_instance VI_1 {
  11.     state MASTER
  12.     interface eth0
  13.     virtual_router_id 51
  14.     priority 100
  15.     advert_int 1
  16.     authentication {
  17.         auth_type PASS
  18.         auth_pass 1111
  19.     }
  20.     virtual_ipaddress {
  21.        10.20.10.199
  22.     }
  23. }
复制代码
备keepalived配置实例:
  1. global_defs {
  2.    notification_email {
  3.         root@localhost //收件相
  4. }
  5.    notification_email_from keepalived@localhost //发件人地址
  6.    smtp_server 127.0.0.1 //smtp邮件服务器地址
  7.    smtp_connect_timeout 30 //连接超时时间
  8.    router_id LVS_DEVEL
  9. }

  10. vrrp_instance VI_1 {
  11.     state BACKUP //虚拟路由状态
  12.     interface eth0 //宣告从哪个网卡发布
  13.     virtual_router_id 51 //虚拟路由ID
  14.     priority 98 //优先级
  15.     advert_int 1 //格多长时间宣告一次
  16.     authentication {
  17.           auth_type PASS //验证方式,有三种,加密、明文,不验证
  18.           auth_pass 1111 //验证密码
  19.     }
  20.     virtual_ipaddress {
  21.           10.20.10.199 //vip地址
  22.      }
  23. }
复制代码
然后别忘记了防火墙,在学习的过程中关闭防火墙可不是一个好的习惯哦!
在主(10.20.10.200)上面运行:
  1. iptables -I INPUT -d 10.20.10.201-j ACCEPT
  2. iptables -I INPUT -p vrrp -j ACCEPT
  3. service iptables save
复制代码
在备(10.20.10.201)上面运行:
  1. iptables -I INPUT -d 10.20.10.200-j ACCEPT
  2. iptables -I INPUT -p vrrp -j ACCEPT
  3. service iptables save
复制代码
然后使用如下命令观察keepalived的主备变化:
  1. tail -f /var/log/messages
复制代码
然后接下来启动keepalived服务:
  1. service keepalived start
复制代码
启动之后可以看到如下提示:
[root@localhost keepalived]# tail -f /var/log/messages
Jul  2 21:42:42 localhost Keepalived_healthcheckers[2566]: Configuration is using : 6982 Bytes
Jul  2 21:42:42 localhost Keepalived_vrrp[2567]: Using LinkWatch kernel netlink reflector...
Jul  2 21:42:42 localhost Keepalived_healthcheckers[2566]: Using LinkWatch kernel netlink reflector...
Jul  2 21:42:42 localhost Keepalived_vrrp[2567]: VRRP sockpool: [ifindex(2), proto(112), fd(10,11)]
Jul  2 21:42:42 localhost Keepalived_vrrp[2567]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jul  2 21:42:43 localhost Keepalived_vrrp[2567]: VRRP_Instance(VI_1) Entering MASTER STATE
Jul  2 21:42:43 localhost Keepalived_vrrp[2567]: VRRP_Instance(VI_1) setting protocol VIPs.
Jul  2 21:42:43 localhost Keepalived_healthcheckers[2566]: Netlink reflector reports IP 10.20.10.199 added
Jul  2 21:42:43 localhost Keepalived_vrrp[2567]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.20.10.199
Jul  2 21:42:48 localhost Keepalived_vrrp[2567]: VRRP_Instance(VI_1) Sending gratuitous ARPs on eth0 for 10.20.10.199

可以使用如下命令查看keepalived的vip:               
[root@ifshell ~]# ip a 或使用ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:eb:23:64 brd ff:ff:ff:ff:ff:ff
    inet 10.20.10.200/24 brd 10.20.10.255 scope global eth0
    inet 10.20.10.199/32 scope global eth0
    inet6 fe80::20c:29ff:feeb:2364/64 scope link
       valid_lft forever preferred_lft forever


选一人白头,择一城终老
回复 支持 反对

使用道具 举报

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
 楼主| 发表于 2017-5-9 18:21:39 | 显示全部楼层

使用之前请先安装sendmail,否则不能发送通知邮件哦:
  1. yum install -y sendmail
复制代码
如果输入"mail"命令,提示没有此命令的话,请运行如下命令:
  1. yum install -y mail
复制代码
当然,我们可以使用一个脚本来判断并发送所有状态改变的通知,也可以使用多个角本来进行通知,此外我们介绍一下使用一个脚本来进行通知的实例,我们在/etc/keepalived.conf下编辑一下通知脚本,假设就叫"notify.sh"。脚本内容如下所示:
  1. #!/bin/bash
  2. #This shell from ifshell.com
  3. #2014.7.5 16:51


  4. vip=10.20.10.199
  5. contact='root@localhost'
  6. host_ip=`ifconfig | grep "inet addr:" |awk '{print $2}'| awk -F: '{print $2}' |grep -v "127"`

  7. notify(){
  8.         mailsubject="`hostname` to be $1:$vip floating"
  9.         mailbody="`date '+%F %H:%M:%S'`:vrrp transition, `hostname`(IP:$host_ip) changed to be $1"
  10.         echo $mailbody |mail -s "$mailsubject" $contact
  11. }

  12. case "$1" in
  13.         master)
  14.                 notify master
  15.                 /etc/rc.d/init.d/nginx start
  16.                 exit 0
  17.                 ;;
  18.         backup)
  19.                 notify backup
  20.                 /etc/rc.d/init.d/nginx restart
  21.                 exit 0
  22.                 ;;
  23.         fault)
  24.                 notify fault
  25.                 exit 0
  26.                 ;;
  27.         *)
  28.                 echo 'Usage: `basename $0`{master|backup|fault}'
  29.                 exit 1
  30.                 ;;
  31. esac
复制代码
编辑完成之后,可以使用如下方式进行测试脚本是否正确:
  1. chmod +x notify.sh
  2. ./notify.sh master
  3. ./notify.sh backup
  4. ./notify.sh fault
复制代码
然后查看是否有收到邮件通知:

   2 root   Sat Jul  5 16:37  23/913   "ifshell to be master:10.20.10.199 floating"
>U  3 root  Sat Jul  5 16:40  23/910   "ifshell to be fault:10.20.10.199 floating"
U  4 root  Sat Jul  5 16:40  23/911   "ifshell to be backup:10.20.10.199 floating"

在keepalived的配置文件中进行如下编辑:
  1. ! Configuration File for keepalived  
  2.   
  3. global_defs {  
  4.    notification_email {  
  5.          root@ifshell.com #此处需修改
  6.    }  
  7.    notification_email_from kanotify@ifshell.com
  8.    smtp_connect_timeout 3  
  9.    smtp_server 127.0.0.1  
  10.    router_id LVS_DEVEL  
  11. }   

  12. vrrp_instance VI_1 {  
  13.     interface eth0  
  14.     state MASTER  # BACKUP for slave routers
  15.     priority 101  # 100 for BACKUP
  16.     virtual_router_id 51
  17.     garp_master_delay 1
  18.   
  19.     authentication {  
  20.         auth_type PASS  
  21.         auth_pass password  
  22.     }  
  23.         
  24.     virtual_ipaddress {  
  25.         172.16.100.1
  26.     }  

  27.     notify_master "/etc/keepalived/notify.sh master"  
  28.     notify_backup "/etc/keepalived/notify.sh backup"  
  29.     notify_fault "/etc/keepalived/notify.sh fault"  
  30. }
复制代码
非常重要:由于keepalived自身没有完善的配置文件检测机制,如果配置文件有语法错误也没有任何提示。而track_script的时候一定要注意,“track_script”和“{”之间是有空格的!如果不打空格是不会进行track_script的!
最后试验证明,如果直接停keepalived服务的话,在备的上面会有邮件通知:
Mon Jul  7 02:24  22/983   "localhost.localdomain to be master: 10.20.30.1 floating"

而主的上面没有,而重新启动服务的话主、备上面都会有一封通知邮件的。



选一人白头,择一城终老
回复 支持 反对

使用道具 举报

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
 楼主| 发表于 2017-5-9 18:22:03 | 显示全部楼层
keepalived.conf中LVS配置实例如下:
  1. virtual_server 172.16.100.1 80 {
  2.     delay_loop 6
  3.     lb_algo rr
  4.     lb_kind DR
  5.     persistence_timeout 50
  6.     protocol TCP

  7. #    sorry_server 192.168.200.200 1358

  8.     real_server 10.20.10.200 80 {
  9.         weight 1
  10.         HTTP_GET {
  11.             url {
  12.               path /
  13.               status_code 200
  14.             }
  15.             connect_timeout 3
  16.             nb_get_retry 3
  17.             delay_before_retry 3
  18.         }
  19.     }

  20.     real_server 10.20.10.201 80 {
  21.         weight 1
  22.         HTTP_GET {
  23.             url {
  24.               path /
  25.               status_code 200
  26.             }
  27.             connect_timeout 3
  28.             nb_get_retry 3
  29.             delay_before_retry 3
  30.         }
  31.     }
  32. }
复制代码
由于LVS课程还没有看,所以暂时先不做总结,只做备注!


选一人白头,择一城终老
回复 支持 反对

使用道具 举报

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
 楼主| 发表于 2017-5-9 18:22:35 | 显示全部楼层
在真实的生产环境中,我们推荐的nginx+keepalived的方式是在所有的备节点上nginx都是启动的。如果发生问题飘的只有VIP和Vmac而不是太推荐使用nginx Service + VIP的漂移方式。所以在此篇文档中,我们也没有什么需要赘述的。只需要在各keepalived节点上配置好nginx并启动,保证各节点的配置文件一样,就可以了!那么我们重点来看一下nginx的监控及措施,不推荐监控nginx的进程然后来确定VIP的漂移是否。更推荐使用Crul来直接访问网页来确定网站是否可以访问,从而来确定VIP的漂移与否,当然我们也会给出几种监控方式,供大家选择。第一种,通过判断nginx的端口是否有开启:
  1. #!/bin/sh
  2. # check nginx server status
  3. NGINX=/usr/local/nginx/sbin/nginx
  4. PORT=80

  5. nmap localhost -p $PORT | grep "$PORT/tcp open"
  6. #echo $?
  7. if [ $? -ne 0 ];then
  8.     $NGINX -s stop
  9.     $NGINX
  10.     sleep 3
  11.     nmap localhost -p $PORT | grep "$PORT/tcp open"
  12.     [ $? -ne 0 ] && /etc/init.d/keepalived stop
  13. fi
复制代码
第二种、确定nginx的进程是否存在:
  1. !/bin/bash  
  2.   
  3. # try to start nginx if nginx process is dead                                                                     
  4. # shutdonw keepalived process if start nginx failed                                         
  5.   
  6. pid=`ps -C nginx --no-header |wc -l`  
  7. if [ $pid -eq 0 ];then  
  8.     service nginx start  
  9.     sleep 3  
  10.     if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  
  11.         service keepalived stop  
  12.     fi  
  13. fi  
复制代码
第三种、通过curl来确定是网站是否可以正常访问:
  1. !/bin/bash
  2. #try nginx web server

  3. curl -I http://ifshell.com |grep 200
  4. [ ! $? -eq 0 ] && service keepalived stop
复制代码
选择其中一种,然后我们放置在check_nginx.sh中,并给予可执行权限:
  1. chmod +x check_nginx.sh
复制代码
在keepalived.conf中添加如下script_check:
  1. vrrp_script chk_http_port {  
  2.     script "/etc/keepalived/check_nginx.sh"                                          
  3.     interval 2               
  4.     weight 2  
  5. }
复制代码
并在vrrp_instance中进行追踪:
  1. track_script {  
  2.     chk_http_port  
  3.     }  
复制代码
接下来定义nginx中的web群集:
  1. upstream myServer {   
  2.                 server 10.20.30.4:8080;
  3.                 server 10.20.30.5:8080;
  4.                 ip_hash;
  5.         }
复制代码
并修改service中的listen(根据需要进行修改)、server_name:
  1. listen       8080;
  2.         server_name  10.20.30.1;
复制代码
以及定义转发规则(在server中):
  1. location / {
  2.             proxy_pass http://myServer;
  3.             proxy_set_header X-Real-IP $remote_addr;
  4.             proxy_set_header Host $host;
  5.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  6.             proxy_redirect off;
  7.         }
复制代码
然后确认两边的配置文件是同步的就可以了!
选一人白头,择一城终老
回复 支持 反对

使用道具 举报

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
 楼主| 发表于 2017-5-9 18:22:54 | 显示全部楼层

在看的过程中,我在思考两个问题,但是我还没有尝试,在些先做记录,待尝试过之后再做总结:
一、如果两个我都设置成了master,而优先级不一样,那么会怎样?
      会根据优先级进行选举主从关系
二、如果我设置成了master,但是优先级低的话他会成为master吗?
       不会的
三、“virtual_router_id 51 //虚拟路由ID号,此号码还是虚拟MAC的最后一位,默认情况下不要大于255”,那么如果我把51改200的话虚拟MAC是怎样的?
         虚拟MAC是需要设置的,否则vip的mac地址就是所在网卡的物理mac地址!

四、keepalived支持smtp认证吗?
       暂不支持吧.......

五、如何设置keepalived不工作在抢占模式下?
       如何使keepalived工作在非抢占模式  http://ifshell.com/forum.php?mod=viewthread&tid=87&fromuid=1

六、我使用以上这个脚本进行管控keepalived服务,和直接service keepalived stop有什么区别?
        一样的!
七、为什么多台多群集的keepalived的情况下,有一台宕机的情况下,为什么不用考虑会话保持?那比如说,我登录之后,突然转发我的请求的服务器挂了,然后VIP和vmac都飘了,那我的登录在新的转发keepalived服务器上还会有效果吗?可我的登录会话还会有保持吗?
    keepalived只是提供高可用服务的,而会话保持是nginx或lvm的工作,所以keepalived不用考虑
选一人白头,择一城终老
回复 支持 反对

使用道具 举报

0

主题

8

帖子

65

积分

注册会员

Rank: 2

积分
65
发表于 2017-5-17 00:42:12 | 显示全部楼层
楼主换工作啦?不搞虚拟化了?
祝贺高就
回复 支持 反对

使用道具 举报

415

主题

603

帖子

4607

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
4607
 楼主| 发表于 2017-5-18 09:49:44 | 显示全部楼层
卖兜的兜 发表于 2017-5-17 00:42
楼主换工作啦?不搞虚拟化了?
祝贺高就

虚拟化还要搞呀,只是多方面发展嘛!
选一人白头,择一城终老
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

!jz_fbzt! !jz_sgzt! !jz_xgzt! 快速回复 !jz_sctz! !jz_fhlb!
快速回复 返回顶部 返回列表