前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >nginx+keepalived 双机热备

nginx+keepalived 双机热备

作者头像
随心助手
发布于 2019-10-15 02:54:51
发布于 2019-10-15 02:54:51
1.6K0
举报
文章被收录于专栏:nginx遇上redisnginx遇上redis

双机热备是指两台机器都在运行,但并非两台机器同时在提供服务。

当提供服务的一台出现故障的时候,另外一台会马上自动接管并且提供服务,且切换的时间非常短。

测试环境如下:

ip

vip

master

192.168.174.135

192.168.174.140

backup

192.168.174.137

192.168.174.140

修改配置文件(nginx.conf)

userwww-data;

worker_processes4;

pid/run/nginx.pid;

events{

worker_connections 1024;

}

http{

sendfile on;

tcp_nopush on;

tcp_nodelay on;

keepalive_timeout 65;

types_hash_max_size 2048;

include /etc/nginx/mime.types;

default_type application/octet-stream;

access_log /var/log/nginx/access.log;

error_log /var/log/nginx/error.log;

server {

listen 80 default_server;

server_name test;

charset utf-8;

location / {

root html;

index index.html index.htm;

proxy_set_header X-Real_IP$remote_addr;

client_max_body_size 100m;

}

}

}

文件/usr/share/nginx/html/index.html

在192.168.174.135上加上 <h1>Welcome to nginx! 135 </h1>

在192.168.174.137上加上<h1>Welcome to nginx! ***137*** </h1>

keepalived

安装

下载keepalived-1.2.19.tar.gz

tar–zxvf keepalived-1.2.19.tar.gz

cdkeepalived-1.2.19

./configure--prefix=/usr/local/keepalived

make

sudomake install

启动

sudokeepalived -D -f /usr/local/keepalived/etc/keepalived/keepalived.conf

关闭

sudokillall keepalived

配置(keepalived.conf):

global_defs{

router_id NODEA

}

vrrp_instanceVI_1 {

state MASTER

interface eth0 #监测网络接口

virtual_router_id 50 #主、备必须一样

priority 100 #优先级:主>备

advert_int 1

authentication {

auth_type PASS #VRRP认证,主备一致

auth_pass 1111 #密码

}

virtual_ipaddress{

192.168.174.140/24 #VRRP HA虚拟地址

}

}

备用节点的配置

global_defs{

router_id NODEB

}

vrrp_instanceVI_1 {

state BACKUP

interface eth0

virtual_router_id 50

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.174.140/24

}

}

测试

双击热备

两台机子均启动nginx和keepalived,浏览器各自访问

浏览器访问:http://192.168.174.140/,显示的是MASTER的页面。

同样用ipappr可以验证:

135机器:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueuestate UNKNOWN group default

link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft foreverpreferred_lft forever

inet6 ::1/128 scope host

valid_lft foreverpreferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UP group default qlen 1000

link/ether 00:0c:29:39:d4:88 brdff:ff:ff:ff:ff:ff

inet 192.168.174.135/24 brd 192.168.174.255scope global eth0

valid_lft foreverpreferred_lft forever

inet 192.168.174.140/24 scopeglobal secondary eth0

valid_lft foreverpreferred_lft forever

inet6 fe80::20c:29ff:fe39:d488/64 scope link

valid_lft foreverpreferred_lft forever

137机器:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueuestate UNKNOWN group default

link/loopback 00:00:00:00:00:00 brd00:00:00:00:00:00

inet 127.0.0.1/8 scope host lo

valid_lft forever preferred_lftforever

inet6 ::1/128 scope host

valid_lft foreverpreferred_lft forever

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdiscpfifo_fast state UNKNOWN group default qlen 1000

link/ether 00:0c:29:cf:23:62 brdff:ff:ff:ff:ff:ff

inet 192.168.174.137/24 brd 192.168.174.255scope global eth0

valid_lft foreverpreferred_lft forever

inet6 fe80::20c:29ff:fecf:2362/64 scope link

valid_lft foreverpreferred_lft forever

现在关闭135机器的keepalived。

但当nginx宕掉或整个机子宕机后,这种情况不行了——通过浏览器访问192.168.174.140访问不到资源。

nginx宕掉/机器宕掉热备

为了解决上一问题,可以利用脚本,当检测到nginx进程宕掉后,自动关闭keepalived进程,从而实现热备份。

主节点的配置

global_defs {

router_id NODEA

}

vrrp_script chk_http_port {

script "/home/jimite/keepalived/chk_nginx_pid.sh"

interval 2

weight 2

}

vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 50

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_http_port

}

virtual_ipaddress {

192.168.174.140/24

}

}

备用节点的配置:

global_defs {

router_id NODEB

}

vrrp_script chk_http_port {

script "/home/jihite/keepalived/chk_nginx_pid.sh"

interval 2

weight 2

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

virtual_router_id 50

priority 90

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

track_script {

chk_http_port

}

virtual_ipaddress {

192.168.174.140/24

}

}

其中/home/jimite/keepalived/chk_nginx_pid.sh为:

#!/bin/bash

A=`ps -C nginx --no-header |wc -l`

if [ $A -eq 0 ]

then

echo 'nginx server is died'

sudo killall keepalived

fi

问题:杀死keepalived进程后,可以实现vip的偏移,但是原机器的vip无法自动删除

原因:VRRP协议原理是:只有MASTER对外发送消息。各BACKUP接受消息,当接受不到消息时会在剩下的BACKUP机器中选出新的MASTER。

之前用kill -9 pid 或killall pid杀死keepalived进程,导致安装keepalived不能发送信息,BACKUP收不到信息升级为MASTER,但是由于进程被杀死【非正常关闭】,导致keepalived没有能力自己删除vip。

解决方案:关闭keepalived时用命令

service keepalived stop 或 kill -15 pid(注:只删除第一个进程号)

存在问题:

非正常关闭keepalived。 禁止使用kill -9 或killall杀死keepalived。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 nginx遇上redis 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
b代码构成2-标识符
用户7865723
2023/10/18
2430
《Java从入门到失业》第三章:基础语法及基本程序结构(3.2-3.5):标识符、关键字、注释、变量及常量
       上面我们知道我们自定义一个类,需要一个类名。在Java中,还有很多需要命名的组成部分,例如方法名,变量名等。标识符的命名需要遵循Java的规范,总结如下:
用户7801119
2020/09/27
3970
Java学习之基础语法
任何一种计算机语言都离不开标识符和关键字,因此下面将详细介绍 Java 的标识符、关键字和保留字。
李小白是一只喵
2022/03/21
5240
Java学习之基础语法
Java基础-标识符Identifier
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
cwl_java
2019/11/12
5420
java标识符与关键字_4、Java标识符和关键字
标识符:Java对各种变量,方法和类等要素命名时使用的字符序列称为标识符。(凡是自己可以起名的地方都叫标识符,都遵循标识符的规则)
全栈程序员站长
2022/09/08
3100
java标记符_java标识符的书写规则
1.可以由字母,数字,下划线,美元符号组成,但是不能包含@,%,空格等其它特殊字符,不能以数字开头。
全栈程序员站长
2022/09/08
6490
【C语言】标识符大通关!
标识符是编程语言中的基本元素之一。在C语言中,标识符用于命名变量、函数、类型、标签等。正确理解和使用标识符对于编写可读性强、易维护的代码至关重要。
LuckiBit
2024/12/11
2370
Java 基础教学:基础语法 - 注释、标识符与关键字
Java是一种广泛使用的编程语言,它的语法规则和结构为编程提供了清晰的框架。为了编写出易于理解和维护的代码,必须掌握Java的基本语法元素,包括注释、标识符和关键字。本文档将详细介绍这些概念,并提供示例以帮助初学者了解和应用。
世间万物皆对象
2024/10/22
1640
java语言基础(关键字,标识符,命名规则)
Java标识符定义(标识符:凡是直接可以命名的地方) 1、 包名、类名、方法名、参数名、变量名等,这些符号被称为标识符。 2、 标识符可以由字母、数字、下划线(_)和美元符号($)组成 3、 标识符不能以数字开头,不能是java中的关键字。例如:
一个风轻云淡
2022/11/13
1.1K0
java语言基础(关键字,标识符,命名规则)
Java程序设计(基础)- 基本语法
标识符:给接口(interface)、变量(variables)、类(class)和方法(method)命名。
全栈程序员站长
2022/06/30
3420
Java程序设计(基础)- 基本语法
JAVA合法标识符
Java语言中,对于变量,常量,函数,语句块均有名字,我们统统称之为Java标识符.
全栈程序员站长
2022/09/08
1.2K0
Java基础入门篇(二)——Java注释、关键字和标识符
前面几篇文章用Java带大家一起了解了几个游戏小项目,感兴趣的小伙伴可以点击文章观摩下,手把手教你用Java打造一款简单故事书(上篇)、手把手教你用Java打造一款简单故事书(下篇)、手把手教你用Java打造一款简单考试系统(上篇)、手把手教你用Java打造一款简单考试系统(下篇)接下来的几篇文章是关于Java基础的,希望对大家的学习有帮助,欢迎大家在讨论区留言。
Java进阶者
2021/01/22
5420
java 标识符,分隔符,关键字[通俗易懂]
Java语言中,对于变量,常量,函数,语句块也有名字,我们统统称之为Java标识符. 标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。
全栈程序员站长
2022/09/08
8040
JavaNote[001] - 注释、标识符、关键字、变量
Java学习的基础知识,因为之前学习过了就2倍速快速过了一下,下面是一些简单的笔记?,顺手就记录下来了。 1 注释 注释不会出现在字节码中,也就是说Java编译器编译的时候会忽略我们的注释内容,这样子
Sam Gor
2020/05/28
5360
【Java学习笔记之二】java标识符命名规范
什么是标识符 就是程序员在定义java程序时,自定义的一些名字。标识符可以应用在类名、变量、函数名、包名上。 标识符必须遵循以下规则 标识符由26个英文字符大小写(a~zA~Z)、数字(0~9)、下划线(_)和美元符号($)组成。 不能以数字开头,不能是关键字 严格区分大小写 标识符的可以为任意长度 Java中的标识符命名规范 1.  包名 多个单词组成时所有字母小写(例:package  com.baidu) 2.  类名和接口 多个单词组成时所有单词的首字母大写(例:HelloWorld) 3.   变
Angel_Kitty
2018/04/09
7270
java标识符是什么_Java 标识符「建议收藏」
标识符就是程序员在编写 Java 程序时,自定义的一些名字。例如第一个Java 程序里关键字 class 后跟的 HelloWorld,就是我们自定义的类名。类名就属于标识符的一种。
全栈程序员站长
2022/09/08
8680
【Python】标识符 ( Python 标识符命名规则 - 强制性 | 内容限定 | 大小写敏感 | 非关键字 | Python 标识符命名规范 - 建议性 | 下划线命名法 | 英文字母全小写 )
关键字大小写敏感 , 如果改变了关键字的大小写 , 就变成了标识符 , 不再是关键字了 ;
韩曙亮
2023/04/07
1.5K0
【Python】标识符 ( Python 标识符命名规则 - 强制性 | 内容限定 | 大小写敏感 | 非关键字 | Python 标识符命名规范 - 建议性 | 下划线命名法 | 英文字母全小写 )
上手python之数据类型转换和标识符
数据类型之间,在特定的场景下,是可以相互转换的,如字符串转数字、数字转字符串等 那么,我们为什么要转换它们呢?
一个风轻云淡
2022/11/15
8050
上手python之数据类型转换和标识符
JAVA自学-标识符、变量的来源
文章开始前,先问大家一个问题,你觉得什么方式能够让你更快接受、学习一门新的语言?
IT学习日记
2022/09/13
5770
JAVA自学-标识符、变量的来源
1.2 标识符与命名规则
小驼峰命名法:方法名、参数名、成员变量、局部变量;(receiptMessage)
ha_lydms
2023/08/09
3300
1.2 标识符与命名规则
推荐阅读
相关推荐
b代码构成2-标识符
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档