linux集群
一、搭建高可用
高可用集群,即“HA集群”,也常称作“双机热备”,用于关键业务。常见实现高可用的开源软件有heartbeat和keepalived,其中keepalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机,备用服务器顶替。
准备
节点 | 作用 | 网卡 | IP |
master | 主节点 | NAT | 192.168.200.10 |
backer | 备用节点 | NAT | 192.168.200.21 |
安装nginx
安装nginx教程连接:nginx - 花花de代码生活 - 博客园 (cnblogs.com)
两个节点都需要安装nginx
安装keepalived
VRRP协议有1个master角色和至少1个backup角色,所以做本实验需要准备至少两台Linux机器。这里我们拿两台Linux虚拟机(20和21,其中20作为master,21作为backup)来完成以下操作。
# yum install -y keepalived
CentOS默认的yum源里就有keepalived包,安装keepalived很简单,但重点在于配置,下面我们拿一个实际案例来阐述 keepalived的高可用功能。
修改keepalived配置文件
master节点
编辑master(192.168.200.20)的keepalived配置文件:红色:注意事项
[root@master ~]# vim /etc/keepalived/keepalived.conf //内容如下 global_defs { #全局配置标识,表明这个区域{}是全局配置 notification_email { 1615134@qq.com #表示发送通知邮件时邮件源地址是谁 } notification_email_from root@aaaaa.com #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个 smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现 smtp_connect_timeout 30 #连接smtp连接超时时间 router_id LVS_DEVEL #机器标识 } vrrp_script chk_nginx { script "/usr/local/sbin/check_ng.sh" #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态 interval 3 #检查时间间断是3秒 } vrrp_instance VI_1 { #VRRP配置标识 VI_1是实例名称 state MASTER #定义master相关 MASTER为主 BACKUP为备 interface ens33 #通过vrrp协议去通信、去发广播。此为网卡名 virtual_router_id 51 #定义路由器ID ,配置的时候和从机器一致 priority 100 #权重,主角色和从角色的权重是不同的,一般主比从大 advert_int 1 #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒 authentication { #认证相关信息 auth_type PASS #认证类型 auth_pass 5201314>g #密码的形式是一个字符串 } virtual_ipaddress { #设置虚拟IP地址 (VIP),又叫做漂移IP地址 192.168.200.100 } track_script { #加载脚本 chk_nginx } } 【小技巧】全部删除下面的时候:按123然后接着按dd后面的就全删除了 !!!只做高可用的话先下面的必须删掉 !!!只做高可用的话先下面的必须删掉 !!!只做高可用的话先下面的必须删掉 virtual_server 192.168.200.100 443 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.201.100 443 { weight 1 SSL_GET { url { path / digest ff20ad2481f97b1754ef3e12ecd3a9cc } url { path /mrtg/ digest 9b3a0c85a887a256d6939da88aabd8cd } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.2 1358 { delay_loop 6 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP sorry_server 192.168.200.200 1358 real_server 192.168.200.2 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.3 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334c } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } virtual_server 10.10.10.3 1358 { delay_loop 3 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 192.168.200.4 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } real_server 192.168.200.5 1358 { weight 1 HTTP_GET { url { path /testurl/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl2/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } url { path /testurl3/test.jsp digest 640205b7b0fc66c1ea91c463fac6334d } connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } }
keepalived要实现高可用,监控Nginx服务是必不可少的,它本身没有这个功能,需要借助自定义脚本实现,所以接下来我们还需要定义一个监控Nginx服务的脚本,如下:
[root@master ~]# vim /usr/local/sbin/check_ng.sh //添加如下内容
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
编辑完监控Nginx服务的脚本,还需要给它x权限,否则无法被keepalived调用,命令如下:
[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh
完成以上操作,就可以启动master上的keepalived了,如果没有启动Nginx服务,它会帮我们自动拉动起来,并监听VIP:
[root@master ~]# systemctl start keepalived
[root@master ~]# ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f8:e3:b9 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.200.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::a709:f89:6e2d:666a/64 scope link noprefixroute
valid_lft forever preferred_lft forever
inet6 fe80::f47a:43ff:375e:c80/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
backup节点
[root@backup ~]# vim /etc/keepalived/keepalived.conf //内容如下
global_defs {
notification_email {
1615134@qq.com
}
notification_email_from root@aaaaa.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 5201314>g
}
virtual_ipaddress {
192.168.200.100
}
track_script {
chk_nginx
}
}
!!!下面的也要删掉
编辑监控脚本,如下:
[root@backup ~]# vim /usr/local/sbin/check_ng.sh //内容如下
d=`date --date today +%Y%m%d_%H:%M:%S`
n=`ps -C nginx --no-heading|wc -l`
if [ $n -eq "0" ]; then
systemctl start nginx
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
编辑完监控Nginx服务的脚本,还需要给它x权限,否则无法被keepalived调用,命令如下:
[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh
启动nginx跟keepalived
[root@backup ~]# nginx
[root@backup ~]# systemctl start keepalived
[root@backup ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:58:3f:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.21/24 brd 192.168.200.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.200.100/32 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::af2f:833c:2874:5380/64 scope link noprefixroute
valid_lft forever preferred_lft forever
开始测试
这是测试的master节点开启keepalived的时候的样子(下面这个master节点的是我改了nginx页面后呈现的,nginx的html在:/usr/local/nginx/html/index.html)
关闭master节点关闭keepalived
[root@master ~]# systemctl stop keepalived
关闭后出现的页面
从中得出的结论就是,关闭master节点的keepalived,那么backup节点的就会顶上去
二、LVS高并发集群
LVS了解
LVS就是Linux虚拟服务器,Linxu virtual server,是由章文嵩博士主导开发的负载均衡项目。该项目在Linux内核中实现了基于IP的数据请求负载均衡调度方案,其体系结构如图1所示,终端互联网用户从外部访问公司的外部负载均衡服务器,终端用户的Web请求会发送给LVS调度器,调度器根据自己预设的算法决定将该请求发送给后端的某台Web服务器。
负载均衡
- 负载均衡(Load Balance):负载均衡集群为企业需求提供了可解决容量问题的有效方案。负载均衡集群使负载可以在计算机集群中尽可能平均地分摊处理。
- 负载通常包括应用程序处理负载和网络流量负载,每个节点都可以承担一定的处理负载,并且可以实现处理负载在节点之间的动态分配,以实现负载均衡。------原文链接:https://blog.csdn.net/hanjinjuan/article/details/120274878
负载均衡集群技术的实现
- 负载均衡技术类型:基于 4 层负载均衡技术、基于 7 层负载均衡技术
- 负载均衡实现方式:硬件负载均衡设备、软件负载均衡
- 硬件负载均衡产品:F5 、深信服 、Radware
- 软件负载均衡产品: LVS(Linux Virtual Server)、 Haproxy、Nginx、Ats(apache traffic server) ------原文链接:https://blog.csdn.net/hanjinjuan/article/details/120274878
四层负载和七层负载
第四层:传输层
第七层:应用层
所谓四层就是基于IP+端口的负载均衡,主要代表有LVS。
七层负载也称内容交换,就是基于URL等应用信息的负载均衡,主要代表有nginx。
NAT模式LVS搭建
准备
节点 | 作用 | 网卡 | IP |
dir | LVS服务 | NAT网卡/仅主机网卡 | 192.2168.200.130/192.168.100.128 |
rs1 | web服务1 | NAT网卡 | 192.168.200.131 |
rs2 | web服务2 | NAT网卡 | 192.168.100.132 |
LVS服务器必须要有两张网卡,一张网卡用来模拟外网(仅主机),一张网卡连接内网(NAT)。LVS服务器的作用就是以仅主机网卡,通信NAT网卡进入内网。所以clinet节点只需要有外网网卡即可(仅主机)。而web服务器只需要内网网卡(NAT)。
dir节点
#启动路由功能
[root@dir ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
#安装LVS
[root@dir ~]# yum install ipvsadm -y
[root@dir ~]# ipvsadm -A -t 192.168.100.128:80 -s rr
上一行代码解释:-A:暴露对外的虚拟服务器、-t:使用TCP协议、IP是仅主机的IP地址(外网IP)、-s:是使用此策略、rr:是轮巡回策略
[root@dir ~]# ipvsadm -a -t 192.168.100.128:80 -r 192.168.200.131:80 -m
[root@dir ~]# ipvsadm -a -t 192.168.100.128:80 -r 192.168.200.132:80 -m
上一行代码解释:-a:对内暴露真实服务器、-t:使用TCP协议、第一个IP是仅主机IP(外网IP)、-r:连接到真是服务器
rs1节点
rs2节点也是这样
#下载httpd
[root@rs1 ~]# yum install httpd -y
#启动httpd
[root@rs1 ~]# systemctl start httpd
#设置httpd自启
[root@rs1 ~]# systemctl enable httpd
[root@rs1 ~]# route add -net 192.168.100.0/24 gw 192.168.200.130
上一行代码解释:route add:添路由、-net:设置网段、第一个IP是仅主机IP、gw:写网关、最后一个IP是dir的内网IP
开始访问。以下图为标准这就是成功了。
如果不是这样的你可以看看你三个虚拟机的防火墙和SElinux是否关着。
keepalived+LVS
节点 | 服务 | IP |
dir | keepalived+LVS | 192.168.200.130 |
rs1 | httpd | 192.168.200.131 |
rs2 |
httpd | 192.168.200.132 |
dir节点
[root@dir ~]# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.200.110
rs1=192.168.200.131
rs2=192.168.200.132
#注意这里的网卡名字
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev ens33:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
[root@dir ~]# yum install -y keepalived ipvasdm
[root@dir ~]# vim /etc/keepalived/keepalived.conf //添加内容如下
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.200.110
}
}
virtual_server 192.168.200.110 80 { #VIP
delay_loop 10 #每隔10秒查询realserver状态
lb_algo wlc #lvs算法
lb_kind DR #DR模式
persistence_timeout 60 #(同一IP的连接60秒内被分配到同一台realserver)
protocol TCP #用TCP协议检查realserver状态
real_server 192.168.200.131 80 { #真实服务器ip
weight 100 #权重
TCP_CHECK {
connect_timeout 10 # 10秒无响应超时(连接超时时间)
nb_get_retry 3 #失败重试次数
delay_before_retry 3 #失败重试的间隔时间
connect_port 80 #连接的后端端口
}
}
real_server 192.168.200.132 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
#ipvsadm规则清空
[root@dir ~]# ipvsadm -C
[root@dir ~]# systemctl start keepalived
[root@dir ~]# systemctl enabe keepalived
rs节点
rs1跟rs2一样操作
[root@rs1 ~]# vim /usr/local/sbin/lvs_rs.sh //两台rs上添加的内容一致
#/bin/bash
vip=192.168.200.110
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档www.cnblogs.com/lgfeng/archive/2012/10/16/2726308.html
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
[root@rs1 ~]# bash /usr/local/sbin/lvs_rs.sh
[root@rs2 ~]# bash /usr/local/sbin/lvs_rs.sh
测试:
[root@dir ~]# ipvsadm -ln