nginx+keepalived实现集群高可用&&LNMP架构常见问题
目录
nginx高可用服务介绍说明
避免负载均衡服务出现单点问题
keepalived高可用对之间是通过VRRP通信的:
(1)VRRP,全程Virtual Router Redundancy Protocol,中文名为虚拟路由冗余协议,VRRP的出现是为了解决静态路由的单点故障。
(2)VRRP是通过一种竞选协议机制来将路由任务交给某台VRRP路由器的。
(3)VRRP用IP多播的方式(默认多播地址(224.0.0.18))实现高可用对之间通信。
(4)工作时主节点发包,备节点接包,当备节点接收不到主节点发的数据包的时候,就启动接管程序接管主节点的资源。备节点可以有多个,通过优先级竞选,但一般Keepalived系统运维工作中都是一对。
(5)VRRP使用了加密协议加密数据,但Keepalived官方目前还是推荐用明文的方式配置认证类型和密码。
keepalived服务工作原理:
keepalived高可用对之间是通过VRRP进行通信的,VRRP是通过竞选机制来确定主备的,主的优先级高于备,因此,工作时主会优先获得所有的资源,备节点处于等待状态,当主挂了的时候,备节点就会接管主节点的资源,然后顶替主节点对外提供服务。
在keepalived服务对之间,只有作为主的服务器会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时,即备监听不到主发送的广播包时,就会启动相关服务接管资源,保证业务的连续性。接管速度最快可以小于1秒。
keepalived高可用工作原理:
keepalived服务的三个重要功能
1.管理LVS负载均衡软件
早期的LVS软件,需要通过命令行或脚本实现管理,并且没有针对LVS节点的健康检查功能。为了解决LVS的这些使用不便的问题,Keepalived就诞生了,可以说,Keepalived软件起初是专为解决LVS的问题而诞生的。因此,Keepalived和LVS的感情很深,他们的关系如同夫妻一样,可以紧密地结合,愉快的工作。Keepalived可以通过读取自身的配置文件,实现通过更底层的接口直接管理LVS的配置以及控制服务的启动、停止等功能,这使得LVS的应用更加简单方便了。
2.实现对LVS集群节点健康检查功能(healthcheck)
keepalived可以通过在自身的keepalived.conf文件里配置LVS的节点IP和相关参数实现对LVS的直接管理;除此之外,当LVS集群中的某一个甚至是几个节点服务器同时发生故障无法提供服务时,Keepalived服务会自动将失效的节点服务器从LVS的正常转发队列中清除出去,并将请求调度到别的正常节点服务器上,从而保证最终用户的访问不受影响;当故障的节点服务器被修复以后,Keepalived服务又自动地把他们加入到正常转发队列中,对客户提供服务。
3.作为系统网络服务的高可用功能(failover)
Keepalived可以实现任意两台主机之间,例如Master和Backup主机之间的故障转移和自动切换,这个主机可以是普通的不能停机的业务服务器,也可以是LVS负载均衡、Nginx反向代理这样的服务器。
Keepalived高可用功能实现的简单原理为,两台主机同时安装好Keepalived软件并启动服务,开始正常工作时,由角色为Master的主机获得所有资源并对用户提供服务,角色为Backup的主机作为Master主机的热备;当角色为Master的主机失效或出现故障时,角色为Backup的主机将自动接管Master主机的所有工作,包括接管VIP资源及相应资源服务;而当角色为Master的主机故障修复后,又会自动接管回它原来处理的工作,角色为Backup的主机则同时释放Master主机失效时它接管的工作,此时,两台主机将恢复到最初启动时各自的原始角色及工作状态。
高可用keepalived服务部署流程
第一个历程:准备高可用服务架构
10.0.0.5 lb01
10.0.0.6 lb02 # 使用10.0.0.5克隆的机器
grep '5' /etc/sysconfig/network-sccripts/ifcfg-eth[01]
sed -i 's#5#6#g' /etc/sysconfig/network-sccripts/ifcfg-eth[01]
systemctl restart network
10.0.0.7 web01
10.0.0.8 web02
10.0.0.9 web03
第二个历程:安装部署keepalived软件(lb01 lb02) # keepalived服务日志在/var/log/messages文件中
yum install -y keepalived
第三个历程:编写keepalived配置文件
man keepalived.conf # 查看配置文件的使用说明
GLOBAL CONFIGURATION --全局配置部分
VRRPD CONFIGURATION --VRRP协议配置部分
LVS CONFIGURATION --LVS服务管理配置部分
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs { # --全局配置部分
notification_email { #--设置发件邮件信息的收件人
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc #--设置连接的邮件服务器信息
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL #---高可用集群主机身份标识(集群中主机身份标识名称不能重复;)
#vrrp_skip_check_adv_addr
#vrrp_strict
#vrrp_garp_interval 0
#vrrp_gna_interval 0
}
# -- Vrrp相关配置(vrrp实例配置-- 一个服务可以启动多个主进程)
vrrp_instance VI_1 { # ---Vrrp协议家族 clobotics
state MASTER # --- 标识所在家族中的身份(MASTER/BACKUP)
interface eth0 # ---指定虚拟IP地址出现在什么网卡上
virtual_router_id 51 # ---标识家族身份信息 多台高可用服务配置一致
priority 100 # ---设定优先级 优先级越高,就越有可能成为主
advert_int 1 # ---定义组播包发送的间隔时间(秒),主和备配置一样
authentication { # ---实现通讯需要又认证过程
auth_type PASS # ---配置虚拟IP地址信息
auth_pass 1111
}
virtual_ipaddress {
192.168.200.16
192.168.200.17
192.168.200.18
}
}
# lb01机器的keepalived.conf文件配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance clobotics {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/24
}
}
# lb02机器的keepalived.conf文件配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02
}
vrrp_instance clobotics {
state BACKUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/24
}
}
第三历程:启动keepalived服务
systemctl start keepalived
由于MASTER priority优先级高,所以在lb01 作为高可用负载均衡的主
现在关闭主keepalived,vip会漂移到BACKUP上,在lb02上,ip a 发现这个虚拟的IP已经移动到这里了。当重启lb01的keepalived的时候,vip又会重新漂移到lb01上。。。。。
第四历程:修改域名和IP地址解析关系 # 在windows主机配置
192.168.1.200 www.clobotics.com bbs.clobotics.com blog.clobotics.com
并在浏览器访问 www.clobotics.com/clobo.html
当MASTER(ls01)所在主机宕机,并不会影响我们高可用集群的负载,vip会立马漂移到BACKUP上,继续为负载均衡提供服务。
高可用服务企业应用
1.高可用服务常见异常问题---脑裂问题
出现原因:高可用备服务器接收不到主服务器发送的组播包,备服务器上会自动生成VIP地址
为什么收不到组播包?
网络原因导致备收不到主的组播包;主服务器或keepalived进程死了;或者备的防火墙再开着,导致主罚的包,备无法收到。
可以将备的防火墙打开,来模拟;这这时备也将启用VIP地址
物理原因:
高可用集群之间通讯线路出现问题
逻辑原因:
有安全策略阻止
如何解决脑裂问题:
01.进行监控,发出告警
备服务器出现VIP地址的原因:
a.主服务器出现故障
b.出现脑裂问题
02.直接关闭一台服务器的keepalived服务
写一个监控脚本,当主VIP不存在,或者从VIP出现时,发送告警邮件到指定用户:
在192.168.1.104机器上:
#!/bin/bash
/usr/sbin/ip a s ens33|grep "192.168.1.200">/dev/null
if [ $? -ne 0 ];then
echo "啦啦啦!你好!主服务器$(hostname)的keepalived服务的VIP无法获取,请进行检查" | mail -s 异常告警keepalived 11*****041@qq.com
fi
# 在192.168.1.106机器上:
vim /root/shell_script/check_naolie.sh
#!/bin/bash
/usr/sbin/ip a s ens33| grep "192.168.1.200">/dev/null
if [ $? -eq 0 ];then
echo "啦啦啦!你好!备用服务器$(hostname)的keepalived服务已竞选为主,请查看原主keepalived是否异常" | mail -s 异常告警keepalived 11*****041@qq.com
fi
crontab -e
1 * * * * bash /root/shell_script/check_naolie.sh >/dev/null 2>/root/shell_script/out.txt #在192.168.1.104机器的定时任务
1 * * * * bash /root/shell_script/check_naolie.sh >/dev/null 2>/root/8shell_script/out.txt #在192.168.1.106机器的定时任务
现在关闭主(192.168.1.104机器)上的keepalived进程,等一下11*****041邮箱会收到lb01和lb02机器的各一封keepalived告警邮件。
2.实现keepalived服务自动释放vip地址资源:
nginx(皇帝)+ keepalived(妃子):nginx服务停止(皇帝死了),keepalived页必须停止(殉情)
第一个历程:编写监控nginx服务状态监控
# 192.168.1.104(主)
vim /root/shell_script/check_web.sh
#!/bin/bash
num=`ps -ef | grep -c nginx`
if [ $num -lt 3 ]
then
systemctl stop keepalived
fi
3.实时监控nginx服务状态---kepalived配置文件:
vrrp_script check_web {
script "/root/shell_script/check_web.sh" # 定义需要监控脚本(脚本要有执行权限)
interval 2 # 执行脚本的间隔时间(秒)
weight 2 #
}
track_script {
check_web # 调用执行你的脚本信息
}
放置位置如下图。。。
nginx服务停止,keepalived服务也自动停止;nginx服务启动,keepalived服务自动恢复?? ---weight
weight参数:权重值参数,主要用于和优先级进行运算
求和运算:weight数值必须是整数 weight + priority 自动提升优先级,使主机可以成为主服务器;
求差运算:weight数值必须是负数 weight + priority 自动降低优先级,使主机可以成为备服务器;
运行一个脚本,执行脚本结束之后,脚本的执行结果可以为真,看脚本执行返回值 $?==0
运行一个脚本,执行脚本结束之后,脚本的执行结果可以为假,看脚本执行返回值 $?<>0
#!/bin/bash
num=`ps -ef | grep -c [n]ginx`
if [ $num -lt 2 ]
then
exit 0 # 返回为真
else
exit 1 # 返回为假 exit后可以指定任意数字,返回值被 $?接收,可以 echo $? 获得返回值
fi
权重值为正数:
1.脚本运行后为真: weight + priority
2.脚本运行后为假: priority
权重值为负数:
1.脚本运行后为真: priority
2.脚本运行后为假: weight - priority
#!/bin/bash
num=`ps -ef | grep -c [n]ginx`
if [ $num -lt 2 ]
then
exit 1 # 这时nginx服务挂了,需要可以根据求差的运算结果MASTER小于备服务器上的优先级,自动切换VIP到备服务器上
else
exit 0 # 不做减法运算,还是等于原来主的优先级
fi
如何高可用集群双主配置
第一历程:编写lb01(192.168.1.104)服务器keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance clobotics {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/32
}
}
vrrp_instance clobotics_wind {
state BACKUP
interface ens33
virtual_router_id 52
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.201/32
}
}
第二历程:编写lb02(192.168.1.106)服务器keepalived配置文件
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance clobotics {
state BACKCUP
interface ens33
virtual_router_id 51
priority 80
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.200/32
}
}
vrrp_instance clobotics_wind {
state MASTER
interface ens33
virtual_router_id 52
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.201/32
}
}
之后重启lb01和lb02的keepalived服务:
systemctl reload keepalived
lb01(192.168.1.104)的192.168.1.200的VIP是主,客户端访问时,解析到这个VIP上的客户流量都走到lb01 192.168.1.104的网卡上;lb02(192.168.1.106)的192.168.1.201的VIP是主,客户端访问时,解析到这个VIP上的客户流量都走到lb02 192.168.1.106的网卡上;这样互为主备的配置方式,在流量来的时候根据不同的域名,解析成不同的VIP,走不同的机器,可以分担压力,并且在一台机器挂的时候,这台机器的主VIP可以瞬间漂移到另外一台机器上去,流量这时虽然都转到这一台机器上了,但是并不影响客户端的访问。
lb01:
lb02:
lb01上VIP是192.168.1.200:
lb02上VIP是192.168.1.201:
分别在lb01和lb02上,先使用当前主机网卡IP是否能访问后端服务:
curl -H:host www.clobotics.com 192.168.1.104 # 使用-H选项指定域名,并解析到只指定的IP,就不需要再在/etc/hosts文件中配置解析
curl -H:host www.clobotics.com 192.168.1.106
第三个历程:编写域名和IP地址解析信息
192.168.1.200 www.clobotics.com
192.168.1.200 bbs.clobotics.com
192.168.1.201 bbs.clobotics.com
www.clobotics.com和bbs.clobotics.com都解析到192.168.1.200 VIP上,这个VIP的主在192.168.1.104上,所以访问这浏览器两个域名的流量都走到92.168.1.104虚拟机上。。。。
可以使用抓包工具查看具体的请求过程:
www.clobotics.com -->192.168.1.200
192.168.1.2(客户端)-->192.168.1.200
192.168.1.104(lb01)-->192.168.1.102(192.168.1.105)
192.168.1.102-->192.168.1.104
192.168.1.200-->192.168.1.2
bbs.clobotics.com -->192.168.1.201
192.168.1.2(客户端)-->192.168.1.201
192.168.1.106(lb02)-->192.168.1.102(192.168.1.105)
192.168.1.102-->192.168.1.106
192.168.1.201-->192.168.1.2
高可用服务安全访问配置(负载均衡服务)
为了实现安全访问,可将除了入口(VIP)以外的其它机器全部换成内网IP,并且不配置外网网卡。这样,攻击者就无法直接访问其它主机。但是,这里有一类机器必须是外网IP,是哪一类呢?就是负载均衡的机器,不然VIP无法转发到负载均衡的机器上。那既然是外网IP,那攻击者就能通过这个外网IP直接访问web应用(直接跳过VIP访问负载均衡机器)?这该怎么处理呢?
第一个历程:修改nginx负载均衡配置文件
# 192.168.0.104(lb01)机器
vim /etc/nginx/conf.d/lb01.conf
upstream clobotics {
server 192.168.1.102;
server 192.168.1.105;
}
server {
listen 192.168.1.200:80; # 192.168.1.104(lb01)机器的网卡上有此VIP,基于虚拟主机的配置成功;
server_name www.clobotics.com;
location / {
proxy_pass http://clobotics;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 192.168.1.201:80; # 此VIP在192.168.1.106虚拟机上,所以nginx -t检测语法会报错;需要修改内核参数,net.ipv4.ip_nonlocal_bind = 1;并且重启nginx服务,reload不会生效 如下图1
server_name bbs.clobotics.com;
location / {
proxy_pass http://clobotics;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 192.168.1.201:80;
server_name blog.clobotics.com;
location / {
proxy_pass http://clobotics;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
# 192.168.0.106(lb02)机器 与lb01 的配置一样
vim /etc/nginx/conf.d/lb02.conf
upstream clobotics {
server 192.168.1.102;
server 192.168.1.105;
}
server {
listen 192.168.1.200:80; # 此VIP在192.168.1.104虚拟机上,所以nginx -t检测语法会报错;需要修改内核参数,net.ipv4.ip_nonlocal_bind = 1;并且重启nginx服务,reload不会生效
server_name www.clobotics.com;
location / {
proxy_pass http://clobotics;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 192.168.1.201:80; # 192.168.1.106(lb02)机器的网卡上有此VIP,基于虚拟主机的配置成功;
server_name bbs.clobotics.com;
location / {
proxy_pass http://clobotics;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
server {
listen 192.168.1.201:80; # 192.168.1.106(lb02)机器的网卡上有此VIP,基于虚拟主机的配置成功;
server_name blog.clobotics.com;
location / {
proxy_pass http://clobotics;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
第三个历程:重启nginx负载均衡服务
systemctl restart nginx
01.如何设置监听网卡上没有的地址?# 默认不论是ssh、nginx或其它服务只能监听本地网卡上有的地址。如下图2
解决:需要修改内核信息
方式一:# 持久化修改,永久有效
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p
方式二:# 临时修改
echo "1" >/proc/sys/net/ipv4/ip_nonlocal_bind
方式三:# 临时有效,使用sysctl命令
sysctl net.ipv4.ip_nonlocal_bind = 1
sysctl -a 打印全部支持修改的内核参数
图1:
图2:
192.168.1.104(lb01)机器:
192.168.1.106(lb02)机器:
测试是否lb01和lb02虚拟机的nginx只监听在VIP上:
高可用服务总结
1)负载均衡服务扩展补充
根据用uri信息进行负载均衡(动静分离架构)
根据user_agent信息进行负载均衡(手机用户和浏览器访问用户页面信息可以不一致)
2)高可用服务作用(避免出现单点故障)
3)keepalived高可用服务
管理LVS负载均衡服务
实现高可用功能(vrrp原理)
4)keepalived服务配置文件
5)keepalived服务企业应用
1.可能出现脑裂问题 ---编写脚本
2.如何实现自动释放资源 ---脚本(监控web服务) 修改keepalived文件
3.如何实现双主配置 ---编写keepalived配置文件 编写多个vrrp实例
4.如何实现负载均衡安全访问 ---编写负载均衡nginx配置文件,配置监听vip地址信息
LNMP架构常见问题
1)LNMP架构常见问题
如何实现web服务器和存储服务器建立关系
# web+nfs
(1)找到网站数据存储的本地目录
(2)如果本地存储目录有数据,需要进行迁移备份
(3)编写查看nfs服务器配置参数(xxx_squash)
(4)实现挂载操作(实现开机自动挂载,避免机器关机重启,由于时间过长,记不得挂载目录)
# web+mysql
(1)将本地数据库数据进行备份 mysqldump --all-database
(2)将备份数据进行迁移
(3)将数据进行还原
(4)修改代码文件,连接新的数据库服务