一 keepalived /heartbeat简介
Keepalived是Linux下一个轻量级别的高可用解决方案。高可用(High Avalilability,HA),其实两种不同的含义:广义来讲,是指整个系统的高可用行,狭义的来讲就是指主机的冗余和接管,
它与HeartBeat RoseHA 实现相同类似的功能,都可以实现服务或者网络的高可用,但是又有差别,HeartBeat是一个专业的、功能完善的高可用软件,它提供了HA 软件所需的基本功能,比如:心跳检测、资源接管,检测集群中的服务,在集群节点转移共享IP地址的所有者等等。HeartBeat功能强大,但是部署和使用相对比较麻烦,
与HeartBeat相比,Keepalived主要是通过虚拟路由冗余来实现高可用功能,虽然它没有HeartBeat功能强大,但是Keepalived部署和使用非常的简单,所有配置只需要一个配置文件即可以完成,
1.2、Keepalived是什么?
Keepalived起初是为LVS设计的,专门用来监控集群系统中各个服务节点的状态,它根据TCP/IP参考模型的第三、第四层、第五层交换机制检测每个服务节点的状态,如果某个服务器节点出现异常,或者工作出现故障,Keepalived将检测到,并将出现的故障的服务器节点从集群系统中剔除,这些工作全部是自动完成的,不需要人工干涉,需要人工完成的只是修复出现故障的服务节点。
后来Keepalived又加入了VRRP的功能,VRRP(Vritrual Router Redundancy Protocol,虚拟路由冗余协议)出现的目的是解决静态路由出现的单点故障问题,通过VRRP可以实现网络不间断稳定运行,因此Keepalvied 一方面具有服务器状态检测和故障隔离功能,另外一方面也有HA cluster功能,下面介绍一下VRRP协议实现的过程。
1.3、VRRP协议与工作原理
在现实的网络环境中。主机之间的通信都是通过配置静态路由或者(默认网关)来完成的,而主机之间的路由器一旦发生故障,通信就会失效,因此这种通信模式当中,路由器就成了一个单点瓶颈,为了解决这个问题,就引入了VRRP协议。
熟悉网络的学员对VRRP协议应该不陌生,它是一种主备模式的协议,通过VRRP可以在网络发生故障时透明的进行设备切换而不影响主机之间的数据通信,这其中涉及到两个概念:物理路由器和虚拟路由器。
VRRP可以将两台或者多台物理路由器设备虚拟成一个虚拟路由,这个虚拟路由器通过虚拟IP(一个或者多个)对外提供服务,而在虚拟路由器内部十多个物理路由器协同工作,同一时间只有一台物理路由器对外提供服务,这台物理路由设备被成为:主路由器(Master角色),一般情况下Master是由选举算法产生,它拥有对外服务的虚拟IP,提供各种网络功能,如:ARP请求,ICMP 数据转发等,而且其它的物理路由器不拥有对外的虚拟IP,也不提供对外网络功能,仅仅接收MASTER的VRRP状态通告信息,这些路由器被统称为“BACKUP的角色”,当主路由器失败时,处于BACKUP角色的备份路由器将重新进行选举,产生一个新的主路由器进入MASTER角色,继续提供对外服务,整个切换对用户来说是完全透明的。
每个虚拟路由器都有一个唯一的标识号,称为VRID,一个VRID与一组IP地址构成一个虚拟路由器,在VRRP协议中,所有的报文都是通过IP多播方式发送的,而在一个虚拟路由器中,只有处于Master角色的路由器会一直发送VRRP数据包,处于BACKUP角色的路由器只会接受Master角色发送过来的报文信息,用来监控Master运行状态,一一般不会发生BACKUP抢占的情况,除非它的优先级更高,而当MASTER不可用时,BACKUP也就无法收到Master发过来的信息,于是就认定Master出现故障,接着多台BAKCUP就会进行选举,优先级最高的BACKUP将称为新的MASTER,这种选举角色切换非常之快,因而保证了服务的持续可用性。
1.4、Keepalvied的工作原理
(了解网络的七层协议)
7 应用层 6 表示层 5 会话层 4 传输层 3 网络层 2 数据链路层 1 物理层 ;其中高层(即7、6、5、4层)定义了应用程序的功能,下面3层(即3、2、1层)主要面向通过网络的端到端,点到点的数据流。
上面我们介绍了Keepalived通过VRRP实现高可用性的工作原理,而Keepalived作为一个高性能集群软件,它还能实现对集群中服务器运行状态的监控以及故障隔离,下面我们介绍一下Keepalived对服务器运行状态和故障隔离的工作原理。
Keepalived工作在TCP/IP 参考模型的 三层、四层、五层,也就是分别为:网络层,传输层和应用层,根据TCP、IP参数模型隔层所能实现的功能,Keepalived运行机制如下:
在网络层:我们知道运行这4个重要的协议,互联网络IP协议,互联网络可控制报文协议ICMP、地址转换协议ARP、反向地址转换协议RARP,在网络层Keepalived在网络层采用最常见的工作方式是通过ICMP协议向服务器集群中的每一个节点发送一个ICMP数据包(有点类似与Ping的功能),如果某个节点没有返回响应数据包,那么认为该节点发生了故障,Keepalived将报告这个节点失效,并从服务器集群中剔除故障节点。
在传输层:提供了两个主要的协议:传输控制协议TCP和用户数据协议UDP,传输控制协议TCP可以提供可靠的数据输出服务、IP地址和端口,代表TCP的一个连接端,要获得TCP服务,需要在发送机的一个端口和接收机的一个端口上建立连接,而Keepalived在传输层里利用了TCP协议的端口连接和扫描技术来判断集群节点的端口是否正常,比如对于常见的WEB服务器80端口。或者SSH服务22端口,Keepalived一旦在传输层探测到这些端口号没有数据响应和数据返回,就认为这些端口发生异常,然后强制将这些端口所对应的节点从服务器集群中剔除掉。
在应用层:可以运行FTP,TELNET,SMTP,DNS等各种不同类型的高层协议,Keepalived的运行方式也更加全面化和复杂化,用户可以通过自定义Keepalived工作方式,例如:可以通过编写程序或者脚本来运行Keepalived,而Keepalived将根据用户的设定参数检测各种程序或者服务是否允许正常,如果Keepalived的检测结果和用户设定的不一致时,Keepalived将把对应的服务器从服务器集群中剔除
Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。
为什么使用集群
1. 防止单点故障;
2. 负载均衡;
3. 高并发;
4. 高可靠;
在两台nginx服务器上安装keepalived,如果一台服务器出故障,另外一台可以继续工作。192.168.153.222在这里叫做虚ip,有可能在第一台服务器上,也有可能在第二台服务器上。
虚IP:就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚IP,使用这两个IP中的 任意一个都可以连接到这台主机,所有项目中数据库链接一项配置的都是这个虚IP,当服务器发生故障无法对外提供服务时,动态将这个虚IP切换到备用主机
二 安装 keepalived-2.0.10
在 /usr/java下面创建keepalived文件夹
下载keepalived安装包
wget https://www.keepalived.org/software/keepalived-2.0.10.tar.gz
[root@localhost keepalived]# tar -zxvf keepalived-2.0.10.tar.gz
[root@localhost keepalived]#
yum -y install popt-devel libnl libnl-devel libnfnetlink-devel net-tools
[root@localhost ~]# cd keepalived-2.0.10
[root@localhost keepalived-2.0.10]#
./configure --prefix=/usr/java/keepalived
安装执行
[root@localhost keepalived-2.0.10]# make && make install
三 配置keepalived
将脚本文件复制到/etc/init.d 文件夹里
cp /usr/java/keepalived/keepalived-2.0.10/keepalived/etc/init.d/keepalived /etc/init.d/
在etc里面创建 一个文件夹 keepalived
mkdir /etc/keepalived
将配置文件拷贝到刚才创建的文件夹里面
cp /usr/java/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
将keepalived的文件信息存放到/etc/sysconfig/里面
cp /usr/java/keepalived/keepalived-2.0.10/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
将可执行的文件存放到sbin文件夹里面
cp /usr/java/keepalived/sbin/keepalived /usr/sbin/
四 启动与验证keepalievd
[root@os004 keepalived-2.0.10]# systemctl start keepalived
[root@os004 keepalived-2.0.10]# systemctl status keepalived
[root@os004 keepalived-2.0.10]# ps -aux|grep keepalived
五 环境准备
1 两台虚拟机,centos7
虚拟ip:192.168.159.34
192.168.159.35
Keppalived1:主34Nginx(34:Tomcat 8080,34:Tomcat 8081)
Keppalived2:从35Nginx
2 配置keepalived
主服务器修改192.168.159.34的配置文件/etc/keepalived/keepalived.conf
# 全局配置
global_defs {
notification_email {
123@qq.com #设置报警邮件地址,可以设置多个,可以不设置
}
notification_email_from master@qq.com #发送通知邮件时邮件源地址
smtp_server 127.0.0.1 # 发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
smtp_connection_timeout 30 #连接smtp连接超时时间
router_id 192.168.159.34 #定义路由标识信息,相同局域网唯一
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #最后手动执行下此脚本,以确保此脚本能够正常执行
interval 2 #(检测脚本执行的间隔,单位是秒)
weight -2 #当检查失败后,将vrrp_instance的priority减小2
fall 3 #连续监测失败3次,才认为真的健康检查失败。并调整优先级
rise 2 #连续监测2次成功,就认为成功。但不调整优先级
}
# 虚拟ip配置 vrrp
vrrp_instance VI_1 {
state MASTER # 指定keepalived的角色,MASTER为主,BACKUP为备,大写
interface ens32 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
mcast_src_ip 192.168.159.34 #发送心跳包的源IP,可使用绑定的网卡IP
virtual_router_id 51 # 虚拟路由编号,主从要一直0-255
priority 100 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.159.100 # 定义虚拟ip(VIP),可多设,每行一个
}
}
备用服务器修改192.168.159.35的配置文件/etc/keepalived/keepalived.conf
# 全局配置
global_defs {
notification_email {
123@qq.com #设置报警邮件地址,可以设置多个,可以不设置
}
notification_email_from master@qq.com #发送通知邮件时邮件源地址
smtp_server 127.0.0.1 # 发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
smtp_connection_timeout 30 #连接smtp连接超时时间
router_id 192.168.159.35 #定义路由标识信息,相同局域网唯一
}
vrrp_script chk_http_port {
script "/usr/local/src/check_nginx_pid.sh" #最后手动执行下此脚本,以确保此脚本能够正常执行
interval 2 #(检测脚本执行的间隔,单位是秒)
weight -2 #当检查失败后,将vrrp_instance的priority减小5
fall 3 #连续监测失败3次,才认为真的健康检查失败。并调整优先级
rise 2 #连续监测2次成功,就认为成功。但不调整优先级
}
# 虚拟ip配置 vrrp
vrrp_instance VI_1 {
state BACKUP # 指定keepalived的角色,MASTER为主,BACKUP为备,大写
interface ens32 # 当前进行vrrp通讯的网络接口卡(当前centos的网卡)
mcast_src_ip 192.168.159.35 #发送心跳包的源IP,可使用绑定的网卡IP
virtual_router_id 51 # 虚拟路由编号,主从要一直
priority 98 # 优先级,数值越大,获取处理请求的优先级越高
advert_int 1 # 检查间隔,默认为1s(vrrp组播周期秒数)
authentication {
auth_type PASS #设置验证类型和密码,MASTER和BACKUP必须使用相同的密码才能正常通信
auth_pass 1111
}
track_script {
chk_http_port #(调用检测脚本)
}
virtual_ipaddress {
192.168.159.100 # 定义虚拟ip(VIP),可多设,每行一个
}
}
以下是针对nginx状态进行检测的脚本,第一次nginx服务死掉时,会重新启动,如果Nginx服务无法正常启动,则杀掉keepalived进程
vim /usr/local/src/check_nginx_pid.sh
#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
killall keepalived
fi
fi
chmod a+x /usr/local/src/check_nginx_pid.sh
修改nginx.conf
vi /usr/local/nginx/conf/nginx.conf
修改nginx.conf文件
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
upstream aaa
{
#添加服务器到负载均衡
server 192.168.109.33:8080 weight=1;
#设置该服务器在负载均衡中的权重 默认为1;越高则访问的频次越大
server 192.168.109.35:8081 weight=2;
}
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name 192.168.109.35;
location / {
root html;
index index.html index.htm;
#反向代理的地址
proxy_pass http://aaa;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
设置keepalived开机自启动(7.0)
# 配置开机自启动
systemctl enable keepalived
4 测试keepalived的抢占模式
修改192.168.159.34的配置文件/etc/keepalived/keepalived.conf
重启keepalived服务,通过ssh 192.168.159.100(虚拟ip)发现虚拟ip在主机192.168.159.34上。
关闭192.168.159.34机器,通过ssh 192.168.159.100(虚拟ip)发现虚拟ip切换到备机192.168.159.35上。
启动主机192.168.159.34,通过ssh 192.168.159.100(虚拟ip)发现虚拟ip切换回主机192.168.159.34上。
访问http://192.168.159.100/一切正常,无论是tomcat机器还是nginx都避免了单点故障。
五 nginx的工作原理
Nginx默认采用多进程工作方式,Nginx启动后,会运行一个master进程和多个worker进程。其中master充当整个进程组与用户的交互接口,同时对进程进行监护,管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。worker用来处理基本的网络事件,worker之间是平等的,他们共同竞争来处理来自客户端的请求。
worker是如何工作的
一个master多个worker的好处
- 每个 woker 是独立的进程,如果有其中的一个 woker 出现问题,其他 woker 独立的, 继续进行争抢,实现请求过程,不会造成服务中断
设置多少个 woker 合适
worker 数和服务器的 cpu 数相等是最为适宜的
连接数 worker_connection
第一个:发送请求,占用了 woker 的几个连接数?
答案:2 或者 4 个
第二个:nginx 有一个 master,有四个 woker,每个 woker 支持最大的连接数 1024,支持的
最大并发数是多少?
普通的静态访问最大并发数是: worker_connections * worker_processes /2,
l而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections *
worker_processes/4
------------------------------------------------------------------------------------
修改nginx配置文件nginx/conf/nginx.conf
server_name 虚拟ip地址
nginx集群的搭建
tomcat的启动/关闭脚本
#! /bin/sh
l=`ps -ef|grep -v grep|grep -w tomcat|awk '{print $2}'`
##echo ${#l[*]} #获取l的长度
if [[ $l == "" ]] #使用[[]]的原因是$l为“”的话就会变成[ ==""
then
echo "-------tomcat没有启动,开始启动tomcat--------"
starts=`find /usr/java/tomcat -name startup.sh`
for start in $starts
do
sh $start
done
echo "--------tomcat启动成功----------"
else
echo "*******tomcat已经启动了,开始关闭tomcat********"
for stop in $l
do
kill -9 $stop
done
echo "*******tomcat关闭成功**********"
fi