nginx+keepalived实现双机热备高可用性

搭建准备:

机器两台 ip分别为192.168.100.128 192.168.100.129(可以用虚拟机测试,虚拟机网络模式为NET模式,且为静态ip)

另外需要准备一个虚拟ip对外提供服务,即通过该ip访问web程序。(keepalive会将虚拟ip绑定到两台机器上)keepalived的核心原理是vrrp协议,英文好可以查看最新协议RFC3768。

1.nginx安装

两台机器都需要安装,可以参考我的上篇博文 Linux tar包安装Nginx http://blog.csdn.net/caicongyang/article/details/46388845

2.安装keepalived (两台机器都要安装,并且都要做如下操作!)

下载最新版本的keepalived-1.2.17.tar.gz 下载地址:http://www.keepalived.org/download.html

将文件上传到/usr/local/目录下

[plain]  view plain  copy
  1. #tar -zxvf keepalived-1.2.17.tar.gz  

将解压出来的文件夹重命名

[plain]  view plain  copy
  1. #mv keepalived-1.2.17 keeplived  

进入文件夹,编译安装

[plain]  view plain  copy
  1. #cd keepalived  
  2. #./configure --prefix=/usr/local/keepalived  
  3. #make && make install  

修改配置文件 /usr/local/keepalived/etc/keepalived/keepalived.conf

主机器配置文件如下:

[plain]  view plain  copy
  1. global_defs {  
  2. notification_email {  
  3. [email protected]               #接收警报的email地址,可以添加多个  
  4. }  
  5. notification_email_from [email protected]   ###发件人地址  
  6. smtp_server 127.0.0.1          ###发送邮件的服务器  
  7. smtp_connect_timeout 30      ###超时时间  
  8. router_id LVS_DEVEL      ####load balancer 的标识 ID,用于email警报  
  9. }  
  10. vrrp_script chk_http_port {  
  11. script “/opt/nginx_pid.sh” ####检测nginx状态的脚本路径  
  12. interval 2  
  13. weight -20  
  14. }  
  15. vrrp_instance VI_1 {  
  16. state MASTER ############ 辅机为 BACKUP  
  17. interface eth0 ####HA 监测网络接口  此项默认为eth0,因为本人在虚拟机下做测试所以将其改为eth2,可以用ifconfing  
  18. virtual_router_id 51 #主、备机的 virtual_router_id 必须相同  
  19. mcast_src_ip 192.168.100.128 ###本机IP地址  
  20. priority 100 ########### 权值要比 back 高  
  21. advert_int 1 #主备之间的通告间隔秒数  
  22. authentication {  
  23. auth_type PASS ###默认配置 主备切换时的验证   
  24. auth_pass 1111  
  25. }  
  26. track_script {  
  27. chk_http_port ### 执行监控的服务  
  28. }  
  29. virtual_ipaddress {  
  30. 192.168.100.133/24 ####虚拟ip,vip的地址  
  31. }  
  32. }  

backup机器配置文件

[plain]  view plain  copy
  1. global_defs {  
  2. notification_email {  
  3. [email protected]               #接收警报的email地址,可以添加多个  
  4. }  
  5. notification_email_from [email protected]   ###发件人地址  
  6. smtp_server 127.0.0.1          ###发送邮件的服务器  
  7. smtp_connect_timeout 30      ###超时时间  
  8. router_id LVS_DEVEL      ####load balancer 的标识 ID,用于email警报  
  9. }  
  10. vrrp_script chk_http_port {  
  11. script “/opt/nginx_pid.sh” ####检测nginx状态的脚本路径  
  12. interval 2  
  13. weight -20  
  14. }  
  15. vrrp_instance VI_1 {  
  16. state BACKUP ############ 辅机为 BACKUP  
  17. interface eth2 ####HA 监测网络接口 注意,此项默认为eth0,因为本人在虚拟机下做测试所以将其改为eth2,可以先查看自己的网络端口  
  18. virtual_router_id 51 #主、备机的 virtual_router_id 必须相同  
  19. mcast_src_ip 192.168.100.129 ###本机IP地址  
  20. priority 90 ########### 权值要比 back 高  
  21. advert_int 1 #主备之间的通告间隔秒数  
  22. authentication {  
  23. auth_type PASS ###主备切换时的验证  
  24. auth_pass 1111  
  25. }  
  26. track_script {  
  27. chk_http_port ### 执行监控的服务  
  28. }  
  29. virtual_ipaddress {  
  30. 192.168.100.133/24 ####虚拟ip,vip的地址  
  31. }  
  32. }  
将keepalived安装成Linux系统服务

[plain]  view plain  copy
  1. #cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/   
  2.   
  3. #cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/   
  4.   
  5. #mkdir /etc/keepalived   
  6.   
  7. #cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/   
  8.   
  9. #cp /usr/local/keepalived/sbin/keepalived /usr/sbin/  

设置开机启动服务

[plain]  view plain  copy
  1. # chkconfig --level 2345 keepalived on  

在/opt/下编写校验脚本,/opt/nginx_pid.sh(已配置在keepalived.conf中)

nginx_pid.sh :如果nginx停止运行,尝试启动,如果无法启动杀死本机keepalived进程,keepalied将虚拟ip绑定到备用机器上

建议脚本用vi或者vim在linux下编辑,因为linux的换行符和windows的不同,如果在windowsx下编辑,在传上去可能没法用!

[plain]  view plain  copy
  1. #!/bin/bash  
  2. A=`ps -C nginx -–no-header |wc -l`  
  3. if [ $A -eq 0 ];then  
  4. /usr/local/nginx/sbin/nginx ##这个地方写你nginx启动命令的路径  
  5. sleep 3  
  6. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  
  7. killall keepalived  
  8. fi  
  9. fi  

测试:

分别启动两台机器上nginx 和 keepalived

利用命令查看虚拟ip是否绑定成功

[plain]  view plain  copy
  1. #ip a  

主机的结果是

[plain]  view plain  copy
  1. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN   
  2.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
  3.     inet 127.0.0.1/8 scope host lo  
  4.     inet6 ::1/128 scope host   
  5.        valid_lft forever preferred_lft forever  
  6. 2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000  
  7.     link/ether 00:0c:29:ff:ca:24 brd ff:ff:ff:ff:ff:ff  
  8.     inet 192.168.100.128/24 brd 192.168.100.255 scope global eth1  
  9.     <span style="color:#ff6666;">inet 192.168.100.133/32 scope global eth1</span>  
  10.     inet6 fe80::20c:29ff:feff:ca24/64 scope link   
  11.        valid_lft forever preferred_lft forever  

可以看到 虚拟IP 192.168.100.133已经绑定到128的机器上了

另外可以利用杀死主服务的nginx进程,访问192.168.100.133是否依然能够访问web页面,再次利用#ip a 命令查看备用机器虚拟ip是否绑定成功!


也可以用下面的命令查看keepalived启动过程日志

[plain]  view plain  copy
  1. #tail -f /var/log/messages  


后记:双机热备模式虽然可用性高,但是有一台机器处于被分在状态,资源有点浪费。楼主将在下篇文章配置双机互为双主的模式。


不懂运维的程序员,不是好的工程师!


猜你喜欢

转载自blog.csdn.net/dingyang0315/article/details/79107169