文档章节

大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

em_aaron
 em_aaron
发布于 07/22 13:13
字数 3392
阅读 130
收藏 10

    上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享keepalived+nginx(多主多活)高可用架构体系的相关技术以及配置过程。

    由于前面的文章已经介绍了keepalived、nginx的安装过程,本节就不再重复累赘,直接开始讲多活的配置以及自动化脚本监控内容。

配置步骤(本次以三台nginx服务器的三主配置为例):

一、先按照前一章节安装好keepalived、nginx等软件

二、keepalived修改配置文件

 (2.1)第一台服务器

   keepalived.config配置文件(目录/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {
}

vrrp_script chk_nginx {
    #script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"
    script "/usr/local/keepalived/sbin/check_ng_pid.sh"
    interval 1    #每隔1秒执行上述的脚本,去检查用户的程序ngnix
    weight -10
}
vrrp_instance VI_1 {
    state MASTER   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 52   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 200   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.191/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}


vrrp_instance VI_2 {
    state BACKUP   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 53   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 150   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.192/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}


vrrp_instance VI_3 {
    state BACKUP   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 54   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 100   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.193/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}

 

(2.2)第二台服务器

 keepalived.config配置文件(目录/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {
}

vrrp_script chk_nginx {
   #script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"
    script "/usr/local/keepalived/sbin/check_ng_pid.sh" 
    interval 1    #每隔1秒执行上述的脚本,去检查用户的程序ngnix
    weight -10
}
vrrp_instance VI_1 {
    state BACKUP   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 52   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 100   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.191/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}


vrrp_instance VI_2 {
    state MASTER   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 53   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 200   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低 
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.192/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}


vrrp_instance VI_3 {
    state BACKUP   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 54   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 150  #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.193/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}

(2.3)第三台服务器

 keepalived.config配置文件(目录/etc/keepalived/keepalived.conf)

! Configuration File for keepalived

global_defs {
}
vrrp_script chk_nginx {
   #script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1"
    script "/usr/local/keepalived/sbin/check_ng_pid.sh" 
    interval 1    #每隔1秒执行上述的脚本,去检查用户的程序ngnix
    weight -10
}
vrrp_instance VI_1 {
    state BACKUP  #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 52   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 150   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.191/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}


vrrp_instance VI_2 {
    state BACKUP   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 53   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 100  #主节点的优先级(1-254之间),备用节点必须比主节点优先级低 
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.192/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}


vrrp_instance VI_3 {
    state MASTER   #指定A节点为主节点 备用节点上设置为BACKUP即可
    interface eth0    #绑定虚拟IP的网络接口
    virtual_router_id 54   #VRRP组名,在同一个instance中一致,在整个vrrp中唯一,以指明各个节点属于同一VRRP组
    priority 200   #主节点的优先级(1-254之间),备用节点必须比主节点优先级低
    advert_int 1  #组播信息发送间隔,两个节点设置必须一样
    authentication {    #设置验证信息,两个节点必须一致
        auth_type PASS
        auth_pass 1111
    }
    track_script {
        chk_nginx
    }
    virtual_ipaddress {    #指定虚拟IP,同一个instance中一致,整个vrrp中唯一
        192.168.29.193/24    #如果两个nginx的ip分别是192.168.33.61,,...62,则此处的虚拟ip跟它俩同一个网段即可
    }
    notify_master "/usr/local/keepalived/sbin/notify.sh master"
    notify_backup "/usr/local/keepalived/sbin/notify.sh backup"
    notify_fault "/usr/local/keepalived/sbin/notify.sh fault"
}

 

(2.4)每台服务器上都需要的脚本,所有脚本都需要有执行权限:chmod 777  /usr/local/keepalived/sbin/notify.sh

通知脚本配置/usr/local/keepalived/sbin/notify.sh

#!/bin/bash
case "$1" in
    master)
        /usr/local/nginx/sbin/nginx
        exit 0
    ;;
    backup)
        /usr/local/nginx/sbin/nginx -s stop
        /usr/local/nginx/sbin/nginx
        exit 0
    ;;
    fault)
        /usr/local/nginx/sbin/nginx -s stop
        exit 0
    ;;
    *)
        echo 'Usage: notify.sh {master|backup|fault}'
        exit 1
    ;;
esac

nginx服务检查脚本/usr/local/keepalived/sbin/check_ng_pid.sh

#监控nginx进程,若nginx主进程不存在则启动nginx
# 若5s后nginx进程还是不存在的话kill掉keepalived进程,防止nginx没运行该主机的keepalived还接管虚拟IP
#!/bin/bash
SERVER=127.0.0.1
PASSWORD=hadoop
#获取ssh公钥
get_rsa(){
	expect -c "set timeout -1;
		spawn ssh-keygen -t rsa;
		expect {
			*Enter* {send -- \r;exp_continue;}
                        {Overwrite (y/n)*} {send -- n\r;exp_continue}
			eof        {exit 0;}
		}";
}

auto_ssh_copy_id() {
    expect -c "set timeout -1;
        spawn ssh-copy-id $1;
        expect {
            *(yes/no)* {send -- yes\r;exp_continue;}
            *assword:* {send -- $2\r;exp_continue;}
           # *ERROR: No identities found* {get_rsa;ssh_copy_id_to_all ;exp_continue; }
            eof        {exit 0;}
        }";
}

ssh_copy_id_to_all() {
    auto_ssh_copy_id $SERVER $PASSWORD
}
#在远程主机上执行delay_stop.sh  
execute_sh(){  
    expect -c "set timeout -1;  
        spawn ssh root@$SERVER nohup /usr/local/keepalived/sbin/delay_stop.sh > /dev/null 2>&1  &
        expect {  
            *(yes/no)* {send -- yes\r;exp_continue;}  
            *password:* {send -- $1\r;exp_continue;}  
            eof        {exit 0;}  
        }";  
}  
  
get_rsa
ssh_copy_id_to_all


c1=`netstat -antp |grep -v grep |grep nginx |wc -l`

if [ $c1 -eq 0 ]; then

    #/usr/local/nginx/sbin/nginx

    #sleep 2

    c2=`netstat -antp |grep -v grep |grep nginx |wc -l`

    if [ $c2 -eq 0 ]; then
       execute_sh $PASSWORD

       #	ssh   root@$SERVER  > /dev/null 2>&1 <<eeooff
           #nohup  service keepalived stop &
       #     nohup /usr/local/keepalived/sbin/delay_stop.sh > /dev/null 2>&1  &
       #     exit
#eeooff



exit 0
       # ssh root@$SERVER "/etc/init.d/keepalived stop" > /usr/local/keepalived/sbin/a.txt
       # service keepalived stop
       # killall keepalived
       # /etc/init.d/keepalived stop
       #ps -ef | grep keepalived | grep -v grep | awk '{print $8}' | xargs kill
 
    else

        exit 0

    fi

else

    exit 0

fi

关闭keepalived服务,实现vip飘移的脚本/usr/local/keepalived/sbin/delay_stop.sh

#bin/bash
sleep 3
ssh   root@127.0.0.1  service keepalived stop
#service keepalived stop

(2.5)配置好,检查openssh-server、openssh-clients、expect(自动化脚本中使用命令)是否已经安装

#安装ssh
rpm -qa|grep openssh  查看openssh组件是否已经安装
yum list|grep openssh 列出yum库中可用于安装的openssh软件包
yum install -y openssh-server 使用yum安装
yum install -y openssh-clients 使用yum安装
#安装expect
rpm -qa|grep expect
yum list|grep expect
yum install -y  expect

(2.6)启动ssh服务,命令service sshd start,检查root用户是否可用连接

           ssh root@127.0.0.1  如果报权限限制,需要改vi /etc/ssh/sshd_config,将PermitRootLogin yes 这行的注释”#“去掉;

           注意:此处博主偷懒就直接使用root用户了,在生产环境一般会使用专门的用户来做自动化脚本的执行。

  (2.7)  测试keepalived+nginx的高可用多主多活集群是否可用

          a.停掉三台服务器上的防火墙 :service iptables stop         

          b.启动三台服务器上的keepalived命令(keepalived会自动启动nginx):service keepalived start  

       

          c.查看三台服务器网卡地址vip是否绑定正常

            d.关闭其中一台服务器上的nginx服务执行命令:killall nginx,查看网卡vip绑定变化是否改变,

             vip已经不在此台服务器上,

              e.访问vip飘逸的那台机器的虚拟vip:http://192.168.29.191,发现是可以访问到nginx的,说明vip已经漂移到其他机器(可通过ip addr命令查看)

              f.检查关闭nginx的这台服务器的keepalived进程,keepalived已经自动关闭完成漂移

 

              g.重启关闭的这台keepalived,并检查vip绑定是否回到本机

            h.检查该vip虚拟机,nginx是否可访问:http://192.168.29.191

             i.vip漂移,重新绑定都顺利完成,教程结束

 

        最后总结:由于本章节博主在录制教程的时候,花费了太多时间,此处就不配置防火墙了。博主在编写脚本时遇到很多问题,都通过shell脚本调试工具解决:sh -vx  check_ng_pid.sh;如果大家配置中,遇到问题,通过shell调试命令执行一次即可完成。以上是nginx多主多活架构搭建的全过程,如果大家觉得博主的文章还不错,请点赞;如果您对博主其它服务器技术或者博主本人感兴趣,请关注博主博客,并且欢迎随时跟博主沟通交流。

© 著作权归作者所有

共有 人打赏支持
em_aaron
粉丝 65
博文 80
码字总数 124810
作品 3
黄浦
高级程序员
私信 提问
大数据教程(2.12):keepalived+nginx(主备)高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
07/17
0
2
应对数据安全“黑天鹅”,金融级数据库的多活架构实践

作者介绍 王涛,巨杉数据库联合创始人之一,目前担任SequoiaDB的CTO与总架构师,负责SequoiaDB产品的架构设计与开发。曾是北美IBM DB2 Lab核心研发成员,有着超过十年数据库核心架构设计、数...

王涛
08/13
0
0
postgresql 高可用集群搭建资料

多种方案,含zookeeper方案 :PostgreSQL 流行 HA 方案 1. 自己实现高可用集群 有实例 有讲解!postgresql 高可用集群搭建 :PostgreSQLHAwithprimarystandby_2vip 2. pgpool 实现高可用集群...

刘阳0292
2017/10/12
0
0
服务器状态监测 Keepalived

keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Kee...

凯文加内特
2015/03/27
0
0
利用keepalived实现高可用nginx(修改正)

实验拓扑图 (1)本次基于VMware Workstation搭建一个四台Linux(CentOS 7.5)系统所构成的一个服务器集群,其中两台nginx做前端调度服务器(一台为主机,另一台为备机),另外两台作为真实的...

hansonwong
11/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hashtable 为什么不叫 HashTable?

前几天在写《HashMap 和 Hashtable 的 6 个区别》这篇文章的时候,差点把 Hashtable 写成了 HashTable,后来看源码证实了是:Hashtable,小写的 "t"able,不符合驼峰命名规则。 什么是驼峰命...

Java技术栈
15分钟前
2
0
Position属性四个值:static、fixed、absolute和relative的区别和用法

静下心来慢慢读,读完一定会有所收获的 static(静态定位):默认值。没有定位,元素出现在正常的流中(忽略 top, bottom, left, right 或者 z-index 声明)。 relative(相对定位):生成相...

简心
17分钟前
1
0
Confluence 6 为一个空间应用一个主题

主题允许你对 Confluence 的外表和显示进行自定义。你的 Confluence 空间管理员可以到 The Atlassian Marketplace 上下载主题。 一旦一个主题被安装到 Confluence 后,这个主题可以应用到全站...

honeymose
17分钟前
0
0
python利用os.system执行多条系统命令

先看代码(正确代码): def UpdateCNSubAllInd(): os.system("cd spiders && scrapy runspider CN_UpdateSubIndex.py")def UpdateSSESubAllInd(): os.system("cd spiders && sc......

fang_faye
27分钟前
0
0
容器技术系列汇总

docker docker - 在centos7和windows10安装 docker - 镜像加速器 docker - 构建一个简单的docker镜像 docker - 调试Dockerfile docker - 常用命令 docker - Dockerfile常用指令 docker - doc......

细肉云吞
33分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部