Nginx负载均衡实现高可用
dns的作用
正向解析;将域名解析成IP地址
反向解析:将IP地址解析成域名
keepalived高可用软件
nginx+keepalived实现负载均衡高可用
单点+keepalived(keepalived专门制作高可用)
高可用硬件
- F5(硬件)
- keepalived(软件)
- heartbeat(软件)
keepalived实现高可用的原理
协议 端口
ssh:// 22
ftp:// 21
rsync:// 873
telnet:// 23
http:// 80
https:// 443
tcp/ip
icmp:// 命令:ping
Mysql 3306
redis 6379
## web服务 http:// http://
nginx
apache
tomcat
weblogic
IIS
keepalived高可用协议:VRRP协议
keepalived软件是基于VRRP协议实现的,VRRP虚拟路由冗余协议,主要用于解决单点故障问题
# arp映射表
一个ip映射一个物理地址(mac地址)
keepalived部署
环境准备
主机名 | WanIP | LanIP | 应用 | 角色 |
---|---|---|---|---|
web01 | 10.0.0.7 | 172.16.1.7 | nginx+php | web |
web02 | 10.0.0.8 | 172.16.1.8 | nginx+php | web |
lb01 | 10.0.0.5 | 172.16.1.5 | nginx+keepalived | 负载均衡、master |
lb02 | 10.0.0.6 | 172.16.1.6 | nginx+keepalived | 负载均衡、backup |
keepalived核心概念
1.投票选举方式(优先级)
2.抢占式、非抢占式
3.如果两台服务器都有vip都认为自己是master(脑裂)
web配置(web01-02)
# 编写配置文件
vim /etc/nginx/conf.d/keep.conf
server{
listen 80;
server_name _;
location / {
root /code/web;
index index.html;
}
}
# 检测语法
nginx -t
# 创建站点目录
mkdir -p /code/web
# 部署代码
vim /code/web/index.html
abc
# 重启nginx
systemctl restart nginx
部署负载均衡(lb01)
# 编写nginx配置文件
vim /etc/nginx/conf.d/lb.conf
upstream keeps {
server 10.0.0.7;
server 10.0.0.8;
}
server{
listen 80;
server_name xxx.keeps.com;
location / {
proxy_pass http://keeps;
include /etc/nginx/proxy_param;
}
}
# 编写代理文件
vim /etc/nginx/proxy_param
# 在代理服务器的请求头中,加上域名,携带域名去访问后端的web
proxy_set_header Host $host;
# 在代理服务器的请求头重,透传用户的真实IP给web01
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# lb01链接web01的超时时间(代理服务器链接后端服务的超时时间)
proxy_connect_timeout 30;
# 后端服务器回传代理服务器的超时时间
proxy_send_timeout 60;
# lb01代理服务器读取web01返回数据的超时时间
proxy_read_timeout 60;
# 开启代理服务器的缓冲区
proxy_buffering on;
# 开启存放头部信息的缓冲区大小 32k
proxy_buffer_size 32k;
# 开启4个128k存放数据主体的缓冲区
proxy_buffers 4 128k;
# 检测语法
nginx -t
# 域名解析
10.0.0.5 xxx.keeps.com
部署keepalived(lb01-02)
# 安装keepalived
yum install -y keepalived
# 修改keepalived配置文件
### 主节点配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
### 备节点配置文件
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
nopreempt
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
配置文件区别
Keepalived配置区别 | Master节点配置 | Backup节点配置 |
---|---|---|
route_id(唯一标识) | router_id:lb01 | router_id:lb02 |
state(角色状态) | state MASTER | state BACKUP |
priority(竞选优先级) | priority 150 | priority 100 |
## 查看VIP
ip a
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:78:c4:6e brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
----inet 10.0.0.3/32 scope global eth0
valid_lft forever preferred_lft forever---------------
inet6 fe80::20c:29ff:fe78:c46e/64 scope link
valid_lft forever preferred_lft forever
keepalived非抢占式
###前提
1.两边的角色都必须是BACKUP
2.两个节点都必须加上配置 nopreempt
3.其中一个节点的优先级必须要高于另外一个节点的优先级。
### 主节点配置
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
ljy
}
}
### 备节点配置
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb02
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
}
# 重启keepalived
systemctl restart keepalived
VIP漂移原因:keepalived服务停止,导致VIP漂移
关联nginx和keepalived
检测nginx状态,如果nginx停止了,就把keepalived停掉
注意:如果想要检测某个服务是否存活,脚本名,一定不要带服务名
# 编写nginx进程监测脚本
vim check_web.sh
#!/bin/bash
nginx_status=`ps -ef|grep [n]ginx|wc -l`
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
# 配置keepalived自动执行检测nginx脚本(lb01)
vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01
}
vrrp_script ljy {
script "/root/check_web.sh"
interval 1
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 50
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
ljy
}
}
# 授权执行脚本
chmod +x /root/check_web.sh
# 重启keepalived.
systemctl restart keepalived
VIP漂移实践
1.尝试keepalived是不是只能在两台机器之间漂移
不是
2.如果不是,怎么配置在3台机器之间漂移VIP
global_defs {
router_id lb03
}
vrrp_script ljy {
script "/root/check_web.sh"
interval 1
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 50
priority 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
ljy
}
}
global_defs {
router_id {{ ansible_hostname }}
}
vrrp_script check_web {
script "/root/check_web.sh"
interval 1
}
vrrp_instance VI_1 {
{% if ansible_hostname == 'lb01' %}
state MASTER
priority 150
{% else %}
state BACKUP
priority 100
{% endif %}
nopreempt
interface eth0
virtual_router_id 50
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.3
}
track_script {
check_web
}
}