Nginx+keepalived双主配置(双机双主热备)

2023-10-27

简介

这种方案,使用两个VIP地址,前端使用2台机器,互为主备,同时有两台机器工作,当其中一台机器出现故障,两台机器的请求转移到一台机器负担,非常适合于生产架构环境。

一、网络拓扑

四台虚拟机如下所示:

为什么使用keepalived呢?

使用keepalived就用来做高可用的,提供虚拟VIP

二、配置

将两台机器上的/etc/keepalived/keepalived.conf配置文件修改成如下:

Nginx-A:

[root@Nginx-A src]# vim /etc/keepalived/keepalived.conf   !ConfigurationFilefor keepalived  
  
############################ 全局配置 #############################  
    
global_defs {# 定义管理员邮件地址,表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,可以有多个,每行一个  
    notification_email {#设置报警邮件地址,可以设置多个,每行一个。 需开启本机的sendmail服务   13020176132@163.com  
    }#keepalived在发生诸如切换操作时需要发送email通知地址,表示发送通知的邮件源地址是谁  
    notification_email_from 13020176132@163.com   
      
    #指定发送email的smtp服务器  
    smtp_server 127.0.0.1#设置连接smtp server的超时时间  
    smtp_connect_timeout 30#运行keepalived的机器的一个标识,通常可设为hostname。故障发生时,发邮件时显示在邮件主题中的信息。  
    router_id swarm01     
}############################ VRRPD配置 #############################  # 定义chk_http_port脚本,脚本执行间隔10秒,权重-5,检测nginx服务是否在运行。有很多方式,比如进程,用脚本检测等等  
vrrp_script chk_http_port {#这里通过脚本监测      
    script "/opt/chk_nginx.sh"#脚本执行间隔,每2s检测一次  
    interval 2#脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5     
    weight -5#检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)      
    fall 2#检测1次成功就算成功。但不修改优先级   
    rise 1}#定义vrrp实例,VI_1 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管  
vrrp_instance VI_1{#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,  #但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,  #那么他会就回抢占为MASTER     
    state MASTER#指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同,可通过ip addr 查看  
    interface ens33# 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,  #一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址      
    mcast_src_ip 192.168.182.110#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的  
    virtual_router_id 51#定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级     
    priority 101#设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒     
    advert_int 1#设置验证类型和密码。主从必须一样  
    authentication {#设置vrrp验证类型,主要有PASS和AH两种  
        auth_type PASS#设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信  
        auth_pass 1111}#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写  #设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定  
    virtual_ipaddress {192.168.182.156}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!  
    track_script {#引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。   
       chk_http_port                      
    }}#定义vrrp实例,VI_2 为虚拟路由的标示符,自己定义名称,keepalived在同一virtual_router_id中priority(0-255)最大的会成为master,也就是接管VIP,当priority最大的主机发生故障后次priority将会接管  
vrrp_instance VI_2{#指定keepalived的角色,MASTER表示此主机是主服务器,BACKUP表示此主机是备用服务器。注意这里的state指定instance(Initial)的初始状态,就是说在配置好后,这台服务器的初始状态就是这里指定的,  #但这里指定的不算,还是得要通过竞选通过优先级来确定。如果这里设置为MASTER,但如若他的优先级不及另外一台,那么这台在发送通告时,会发送自己的优先级,另外一台发现优先级不如自己的高,  #那么他会就回抢占为MASTER     
    state BACKUP#指定HA监测网络的接口。与本机 IP 地址所在的网络接口相同,可通过ip addr 查看  
    interface ens33# 发送多播数据包时的源IP地址,这里注意了,这里实际上就是在哪个地址上发送VRRP通告,这个非常重要,  #一定要选择稳定的网卡端口来发送,这里相当于heartbeat的心跳端口,如果没有设置那么就用默认的绑定的网卡的IP,也就是interface指定的IP地址      
    mcast_src_ip 192.168.182.110#虚拟路由标识,这个标识是一个数字,同一个vrrp实例使用唯一的标识。即同一vrrp_instance下,MASTER和BACKUP必须是一致的  
    virtual_router_id 52#定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级     
    priority 100#设定MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒     
    advert_int 1#设置验证类型和密码。主从必须一样  
    authentication {#设置vrrp验证类型,主要有PASS和AH两种  
        auth_type PASS#设置vrrp验证密码,在同一个vrrp_instance下,MASTER与BACKUP必须使用相同的密码才能正常通信  
        auth_pass 1111}#VRRP HA 虚拟地址 如果有多个VIP,继续换行填写  #设置VIP,它随着state变化而增加删除,当state为master的时候就添加,当state为backup的时候则删除,由优先级决定  
    virtual_ipaddress {192.168.182.157}#执行nginx检测脚本。注意这个设置不能紧挨着写在vrrp_script配置块的后面(实验中碰过的坑),否则nginx监控失效!!  
    track_script {#引用VRRP脚本,即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级,并最终引发主备切换。   
       chk_http_port                      
    }}

Nginx-B:

[root@Nginx-B src]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived    
  
global_defs {
    notification_email {13020176132@163.com
    }
      
    notification_email_from 13020176132@163.com  
    smtp_server 127.0.0.1                    
    smtp_connect_timeout 30                 
    router_id swaram02                 
}
  
vrrp_script chk_http_port {         
    script "/opt/chk_nginx.sh"   
    interval 2                      
    weight -5                       
    fall 2                   
    rise 1}
  
vrrp_instance VI_1 {            
    state BACKUP           
    interface ens33            
    mcast_src_ip 192.168.182.111
    virtual_router_id 51        
    priority 90               
    advert_int 1               
    authentication {            
        auth_type PASS         
        auth_pass 1111}
    virtual_ipaddress {192.168.182.156}
 
    track_script {                     
       chk_http_port                 
    }}
 
vrrp_instance VI_2 {            
    state MASTER           
    interface ens33            
    mcast_src_ip 192.168.182.111
    virtual_router_id 52        
    priority 100               
    advert_int 1               
    authentication {            
        auth_type PASS         
        auth_pass 1111}
    virtual_ipaddress {192.168.182.157}
 
    track_script {                     
       chk_http_port                 
    }}

然后修改两台机器上的nginx首页

[root@Nginx-A html]# vim  /usr/local/nginx/html/index.html 
<!DOCTYPE html><html><head><title>Welcome to Nginx-Master!</title><style>
        body {
                width: 35em;
                margin: 0 auto;
                font-family: Tahoma, Verdana, Arial, sans-serif;
         }
 </style></head><body><h1>Welcome to Nginx-A!</h1><h1><b>Nginx-A:192.168.182.110</b></h1><p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p><p>For online documentation and support please refer to <ahref="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <ahref="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>
 
[root@Nginx-B html]# vim  /usr/local/nginx/html/index.html 
<!DOCTYPE html><html><head><title>Welcome to Nginx-Master!</title><style>
        body {
                width: 35em;
                margin: 0 auto;
                font-family: Tahoma, Verdana, Arial, sans-serif;
         }
 </style></head><body><h1>Welcome to Nginx-B!</h1><h1><b>Nginx-B:192.168.182.111</b></h1><p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p><p>For online documentation and support please refer to <ahref="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <ahref="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p></body></html>

chk_nginx.sh脚本也不用改,然后重启keepalived

[root@Nginx-A keepalived]# systemctl start keepalived.service
[root@Nginx-A keepalived]# systemctl status keepalived.service
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2018-05-29 14:46:25 CST; 4s ago
  Process: 10590 ExecStart=/usr/local/keepalived/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 7396 (keepalived)
    Tasks: 6
   Memory: 3.0M
   CGroup: /system.slice/keepalived.service
           ├─  7396 /usr/local/keepalived/sbin/keepalived -D
           ├─  7397 /usr/local/keepalived/sbin/keepalived -D
           ├─  7398 /usr/local/keepalived/sbin/keepalived -D
           ├─ 99999 nginx: master process /usr/local/nginx/sbin/nginx
           ├─100001 nginx: worker process
           └─100002 nginx: worker process
 
5月 29 14:46:25 Nginx-A systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 14:46:25 Nginx-A Keepalived[10590]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 14:46:25 Nginx-A Keepalived[10590]: Unable to resolve default script username
 
[root@Nginx-B conf]# /etc/init.d/keepalived status
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since 二 2018-05-29 14:45:34 CST; 4min 17s ago
  Process: 5770 ExecStart=/usr/local/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 2771 (keepalived)
    Tasks: 3
   Memory: 960.0K
   CGroup: /system.slice/keepalived.service
           ├─2771 /usr/local/sbin/keepalived -D
           ├─2772 /usr/local/sbin/keepalived -D
           └─2773 /usr/local/sbin/keepalived -D
 
5月 29 14:45:34 Nginx-B systemd[1]: Starting LVS and VRRP High Availability Monitor...
5月 29 14:45:34 Nginx-B Keepalived[5770]: Starting Keepalived v1.3.5 (03/19,2017), git commit v1.3.5-6-g6fa32f2
5月 29 14:45:34 Nginx-B systemd[1]: Started LVS and VRRP High Availability Monitor.

三、keepalived+nginx的高可用测试

3.1 查看服务器上的IP地址

查看Nginx-A的地址:

[root@Nginx-A keepalived]# ip addr1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet 192.168.182.156/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.182.157/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

查看Nginx-B的地址:

[root@Nginx-B keepalived]# ip addr
1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:25:44:71 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.111/24 brd 192.168.182.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::2818:83f9:1989:3130/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::3064:9b6a:9819:180a/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever

会多出两个虚拟IP

    inet 192.168.182.156/32 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.182.157/32 scope global ens33

首先通过两个VIP地址访问如下:

3.2、关闭Nginx-A上的nginx,keepalived将在2s内将它重新启动

[root@Nginx-A keepalived]# /usr/local/nginx/sbin/nginx -s stop

3.3、关闭Nginx-A上的keepalived,VIP会切换到Nginx-B上

[root@Nginx-A keepalived]# service keepalived stop

不管访问的是:http://192.168.182.157/ 还是http://192.168.182.156/ 都将导到Nginx-B上去。

同时会发现Nginx-A上的虚拟IP会消失

[root@Nginx-A keepalived]# ip addr1: lo:<LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33:<BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:e0:69:a0 brd ff:ff:ff:ff:ff:ff
    inet 192.168.182.110/24 brd 192.168.182.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::3064:9b6a:9819:180a/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

作者:技术灭霸

链接:https://www.jianshu.com/p/f1c18c0c6a44

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nginx+keepalived双主配置(双机双主热备) 的相关文章

随机推荐

  • TCP的拥塞控制(详解)

    在某段时间 若对网络中某一资源的需求超过了该资源所能提供的可用部分 网络性能就要变坏 这种情况就叫做网络拥塞 在计算机网络中数位链路容量 即带宽 交换结点中的缓存和处理机等 都是网络的资源 若出现拥塞而不进行控制 整个网络的吞吐量将随输入负
  • 【6 GoldenEye渗透笔记】

    1 前言 本文仅用于技术讨论与研究 不做任何导向 对于所有笔记中复现的这些终端 服务器或者实验环境 均为自行搭建的公开靶场 请勿在现实环境中模仿 操作 本文涉及到的工具仅就用到的方面做简要描述 如果想了解更详细的信息 请自行参阅其他技术资料
  • Java的多态性

    Java的多态性多态性严格来讲有两种描述形式 一 方法的多态性 1 方法的重载 同一个方法名称 会根据传入参数的类型及个数不同执行不同的方法体 2 方法的覆写 同一个方法名称 会根据子类的不同 实现不同的功能 二 对象的多态性 指的是发生在
  • 51Nod 2094 前缀和

    题目链接 https www 51nod com Challenge Problem html problemId 2094 include
  • unity3D简答题2

    游戏对象运动的本质 游戏对象运动的本质是对象Transform属性的变化 position决定位置 rotation决定旋转角度 请用三种方法以上方法 实现物体的抛物线运动 如 修改Transform属性 使用向量Vector3的方法 第一
  • canvas drawbitmap不出现_用Flutter做桌上弹球?聊聊绘图(Canvas&CustomPaint)API

    本文是Flutter中Canvas和CustomPaint API的使用实例 首先看一下列出最终目标 在程序运行后 显示一个小球 每次程序启动后 小球的样式均发生随机性变化 体现在大小 颜色和位置三点 小球运行的规律参考桌球或三维弹球游戏
  • Convolutional Pose Machine - 卷积姿态网络

    Convolutional Pose Machine 卷积姿态网络 论文主要解决 单人单目 RGB图像姿态估计问题 本篇论文也是现在非常火热的openpose开源项目的核心之一 这篇来自CMU的论文为单人姿态估计方面研究注入新的思路 论文网
  • Flutter初体验

    背景 今天在 lt 极客 gt APP上看到一个 使用Flutter快速构建集美观与高性能于一体的移动应用 的介绍 瞬间想试试 于是找到了Flutter官网 https flutter cn 并按步骤实操起来 手册 安装和环境配置 Flut
  • Docker部署单机Zookeeper

    配置Zookeeper安装目录 在宿主机配置zookeeper安装目录 docker develop zookeeper 并且在文件夹创建 data 和logs 目录 mkdir p docker develop zookeeper dat
  • 运行paddle-gpu相关项目报错

    报错1 RuntimeError PreconditionNotMet Cannot load cudnn shared library Cannot invoke method cudnnGetVersion Hint cudnn dso
  • JS 对象 Key使用变量代替

    JS 对象 Key使用变量代替 let key aa let data key value 普通 的对象类型数据中 直接用变量名填写key 最后 key会变成变成变量名的字符串 let data key value 使用中括号 以后 就会将
  • 实现点击img图片标签触发上传文件input按钮

    点击图片上传文件 简单有效 在网上找的一些文章都是A抄B B抄C 还都没啥用 自己蠢了 其实很简单 记录一下 Html 代码 div style width 30 margin left 3 height 1 img src images
  • Kendo UI开发教程(7): Kendo UI 模板概述

    Kendo UI 框架提供了一个易用 高性能的JavaScript模板引擎 通过模板可以创建一个HTML片段然后可以和JavaScript数据合并成最终的HTML元素 Kendo 模板侧重于UI显示 支持关键的模板功能 着重于性能而不是语法
  • 并发编程系列之线程的启动终止

    前言 上节我们对线程有了个基本的概念和认识 从线程状态转变过程我们也已经知道了线程通过调用start方法进行启动 直到run方法执行线程结束 今天我们就来详细的说说启动和终止线程的细节 OK 让我们开始今天的并发之旅吧 创建线程 在使用一个
  • 云解析DNS“免费版”与“付费版”的功能对比!新手引导

    阿里云域名DNS解析是免费的 阿里云云解析DNS是付费的 那么同样是DNS解析免费版和付费版有什么区别 aliyun网分享免费版DNS和云解析DNS的区别 DNS免费版和云解析DNS付费版的区别参数分类 参数项 参数值 免费版基础配置 最低
  • 如何将电子签名透明化处理

    如何将电子签名透明化处理 1 在纸上写上自己的名字 2 用拍照设备 如手机 拍下自己的签名 3 用 WPS图片 打开图片 点击图片 将图片转为png格式保存到一个地方 图1 4 打开word 我用的是win10自带的word 点击 插入 g
  • 告诉你什么是优雅的代码(11)----html5 之XXOO棋

    项目结项后的一星期又两天后 我又有了写些优雅代码的欲望 在我的记忆中 AI 在这个领域 我已近乎白痴 剪枝与寻路两种剑法 就在我离开校园之后 连同那蓝天碧草 相忘于江湖 江湖中只有 SSH 只有 SQL 只有汽车尾气 只有路人甲 在计算机语
  • 语雀实现收藏网页的功能(借助印象笔记)

    我是从印象笔记转为语雀的 之前在印象笔记上积累了1500条笔记 本来想全部搬迁至语雀 导出时发现内存达2 4GB 后来只迁移了一部分 现在两个软件都在用 一主一辅 迁移过程中意外发现 语雀导入html可以完美解决之间遇到的无法收藏网页的问题
  • your password has expired.To log in you must change itusing a client that supports expired passwords

    学java当然就少不了要跟mySQL打交道 终于经历了2小时的恶心安装后 舒舒服服的敲了一天demo 第二天再来的时候发现居然mySQL又特么出幺蛾子 无法连接上了 仔细看了一下错误原因 your password has expired
  • Nginx+keepalived双主配置(双机双主热备)

    简介 这种方案 使用两个VIP地址 前端使用2台机器 互为主备 同时有两台机器工作 当其中一台机器出现故障 两台机器的请求转移到一台机器负担 非常适合于生产架构环境 一 网络拓扑 四台虚拟机如下所示 为什么使用keepalived呢 使用k