Exploring
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
  • Docker

  • Maven

  • Nginx

    • nginx的作用
    • nginx的配置文件
    • nignx 的变量
    • location配置详解
    • nginx的map模块
    • nginx的日志模块
    • 反向代理
    • 负载均衡
    • 高可用
      • 高可用
      • Keepalived
        • 运行原理
        • 选举策略
      • 双机单播模式
        • 环境准备
        • 主机配置
        • 从机配置
        • nginx 探活脚本
        • nginx 测试配置
        • 测试
      • 其他的
  • Tomcat

  • Vagrant

  • Linux

  • DevOps
  • Nginx
unclezs
2021-03-19
0
目录

高可用

# 高可用

nginx 一台机器肯定是不够的,nginx 自身也需要集群与高可用机制。

# Keepalived

Keepalived 是运行在 LVS(Linux Virtual Server) 之上,是一个用于做双机热备(Hot Agent)的软件,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换,提高系统的可用性。

# 运行原理

keepalived 通过选举(看服务器设置的权重)挑选出一台热备服务器做 MASTER 机器,MASTER 机器会被分配到一个指定的虚拟 ip,外部程序可通过该 ip 访问这台服务器,如果这台服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等),keepalived 会从其他的备份机器上重选(还是看服务器设置的权重)一台机器做 MASTER 并分配同样的虚拟 IP,充当前一台 MASTER 的角色。

# 选举策略

选举策略是根据 VRRP 协议,完全按照权重大小,权重最大(0~255)的是 MASTER 机器,下面几种情况会触发选举

  1. keepalived 启动的时候
  2. master 服务器出现故障(断网,重启,或者本机器上的 keepalived crash 等,而本机器上其他应用程序 crash 不算)
  3. 有新的备份服务器加入且权重最大

# 双机单播模式

# 环境准备

虚拟 IP: 192.168.31.88

主机 IP: 192.168.31.31

从机 IP: 192.168.31.32

# 主机配置

global_defs {
   router_id MASTER_1
}

vrrp_script check_nginx {
        script "/etc/keepalived/nginx_check.sh"
        # 每 2 秒检测一次
        interval 2
        weight -20
}

vrrp_instance VI_1 {
		# 标识为主服务
    state MASTER
    # 绑定虚拟 IP 的网络接口,这个和你实际 ip 地址所在接口一致就行
    interface eth1
    # 虚拟路由 id,和从机保持一致
    virtual_router_id 88
    # 本机 ip
    mcast_src_ip 192.168.31.31
    # 权重,需要高于从机
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       # 执行 Nginx 监控的服务
       check_nginx
    }
    # 配置单播的源地址
    unicast_src_ip 192.168.31.31
    unicast_peer {
    	 # 配置单播的目标地址
       192.168.31.32
    }
    virtual_ipaddress {
       192.168.31.88/24
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# 从机配置

global_defs {
   router_id BACKUP_1
}

vrrp_script check_nginx {
        script "/etc/keepalived/nginx_check.sh"
        # 每 2 秒检测一次
        interval 2
        weight -20
}

vrrp_instance VI_1 {
		# 标识为从服务
    state BACKUP
    # 绑定虚拟 IP 的网络接口,这个和你实际 ip 地址所在接口一致就行
    interface eth1
    # 虚拟路由 id,和从机保持一致
    virtual_router_id 88
    # 本机 ip
    mcast_src_ip 192.168.31.32
    # 权重,需要高于从机
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       # 执行 Nginx 监控的服务
       check_nginx
    }
    # 配置单播的源地址
    unicast_src_ip 192.168.31.32
    unicast_peer {
       # 配置单播的目标地址
       192.168.31.31
    }
    virtual_ipaddress {
       192.168.31.88/24
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# nginx 探活脚本

#!/usr/bin/env bash
set -e

counter=$(ps -C nginx --no-heading | wc -l)
if ["$counter" -eq 0]; then
  /usr/local/nginx/nginx
  # sleep 的值必须要小于 keepalived.conf 配置文件中的 “vrrp_script check_nginx” 中的 interval 的值(2)
  sleep 1
  counter=$(ps -C nginx --no-heading | wc -l)
  if ["$counter" -eq 0]; then
    systemctl stop keepalived
  fi
fi
1
2
3
4
5
6
7
8
9
10
11
12
13

# nginx 测试配置

# 主机配置
location /api {
   echo "192.168.31.31";
}

# 从机配置
location /api {
   echo "192.168.31.32";
}
1
2
3
4
5
6
7
8
9

# 测试

# 测试虚拟 IP 是否生效

curl 192.168.31.88/api
----------
192.168.31.31
1
2
3

# 测试主机 nginx 挂了

能够正确热切到从节点

nginx -s stop
curl 192.168.31.88/api
----------
192.168.31.32
1
2
3
4

# 测试主机恢复了

重启主机的 nginx 后,请求再次切回到了主机,如果想要不自动会切只需要在 vrrp_instance 中加上 nopreempt 即可

nginx
curl 192.168.31.88/api
----------
192.168.31.31
1
2
3
4

# 其他的

还有组播模式等可以自行了解。可以看到 keepalived 不只是用于 nginx,其他任何需要高可用的都能使用 keepalived 实现。

在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11
负载均衡
Servlet3通过SPI进行注册组件

← 负载均衡 Servlet3通过SPI进行注册组件→

Theme by Vdoing | Copyright © 2018-2024 unclezs
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式