网站首页 > 精选教程 正文
一台服务器的硬件配置总是有限的,当服务器上运行的资源超过服务器的承载能力时,必将导致该服务器崩溃。在生产环境中,多数企业会使用多台服务器搭建成一个集群来运行应用程序,这样不仅可以避免单点故障,还能提升服务器的承载能力。
腾讯的QQ软件在国内使用频繁,同时在线人数超过2亿,但我们很少发现它出现故障。这么大体量的应用,不可能在一台或者几台服务器上跑起来,而是有数以万计的服务器在QQ的后端支撑着。据不完全统计,仅QQ这项业务,几乎每天都会有若干台服务器出现故障,但这并没有影响到QQ的使用,这个技术其实就是集群。
集群从功能实现上分为两种:高可用集群和负载均衡集群。高可用,顾名思义,当一台服务器宕机不能提供服务了,还有另外的服务器顶替。就像我们刚刚提到的,QQ所使用的服务器虽然每天都有宕机的,但对于用户来讲是无感知的,并没有影响到使用。负载均衡集群,简单讲就是把用户的请求分摊到多台服务器上,QQ同时在线2亿多,它就是把众多用户分摊在了不同的服务器上,假如说一台服务器上可以承载一万人,那么一万台服务器上就可以承载1亿人。
1. 搭建高可用集群
高可用集群,即“HA集群”,也常称作“双机热备”,用于关键业务。常见实现高可用的开源软件有heartbeat和keepalived,其中keepalived还有负载均衡的功能。这两个软件类似,核心原理都是通过心跳线连接两台服务器,正常情况下由一台服务器提供服务,当这台服务器宕机,备用服务器顶替。
Keepalived 工作原理
在讲述keepalived工作原理之前,大家先来了解一个协议VRRP(Virtual Router Redundancy Protocol,虚拟路由冗余协议)。它是实现路由高可用的一种通信协议,在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master(主)角色和N(N>=1)个backup(备用)角色。工作时 master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
而keepalived就是采用这种VRRP协议实现的高可用。keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析; check模块负责健康检查;vrrp模块用来实现VRRP协议。
实操
目的
准备两个节点,操作系统为centos7.2-1511,关闭防火墙、selinux,修改主机名。都安装keepalived,并分别安装源码编译安装的nginx和yum安装的nginx使他们版本不相同方便后面测试keepalived功能。
准备
主机 | IP | 服务 |
master | 182.168.200.11 | keepalived+编译安装nginx |
slave | 182.168.200.12 | keepalived+yum安装nginx |
配置
# master节点修改配置,直接覆盖原配置
[root@master ~]# vim /etc/keepalived/keepalived.conf
global_defs { #全局配置标识,表明这个区域{}是全局配置
notification_email {
1820157360@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相关
interface eno16777736 #通过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
}
}
# master节点配置脚本 注意启动方式和自己的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
# 授权
[root@master ~]# chmod a+x /usr/local/sbin/check_ng.sh
# 启动服务。发现主节点IP会多一个浮动IP
[root@master ~]# systemctl start keepalived.service
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:33:f6:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.200.11/24 brd 192.168.200.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet 192.168.200.100/32 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe33:f6eb/64 scope link
valid_lft forever preferred_lft forever
# 测序是否会自动启动服务
[root@master ~]# service nginx stop
Stopping nginx (via systemctl): [ OK ]
[root@master ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1470/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2051/master
tcp6 0 0 :::22 :::* LISTEN 1470/sshd
tcp6 0 0 ::1:25 :::* LISTEN 2051/master
[root@master ~]# netstat -ntlp|grep nginx
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 17580/nginx: master
# 配置slave 不一样的地方主要有配置标识和权重
[root@backup ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
1820157360@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 eno16777736
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
#!/bin/bash
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
[root@backup ~]# chmod a+x /usr/local/sbin/check_ng.sh
# 启动服务
[root@backup ~]# systemctl start keepalived.service
[root@backup ~]# systemctl start nginx
[root@master ~]# curl -I 192.168.200.11
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Mon, 14 Feb 2022 15:02:04 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 14 Feb 2022 14:08:58 GMT
Connection: keep-alive
ETag: "620a627a-264"
Accept-Ranges: bytes
[root@master ~]# curl -I 192.168.200.12
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Mon, 14 Feb 2022 15:03:47 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes
测试
1、关闭master上的nginx服务
# 首先看VIP是否在master节点
[root@master ~]# curl -I 192.168.200.100
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Mon, 14 Feb 2022 15:08:13 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 14 Feb 2022 14:08:58 GMT
Connection: keep-alive
ETag: "620a627a-264"
Accept-Ranges: bytes
# 可以看到nginx版本是1.17的是master节点
# 故意关掉nginx ,发现很快nginx服务就会重启,不超过3秒
[root@master ~]# service nginx stop
Stopping nginx (via systemctl): [ OK ]
[root@master ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 33315/nginx: master
2、在master节点上增加iptables规则
[root@master ~]# iptables -I OUTPUT -p vrrp -j DROP
[root@master ~]# curl -I 192.168.200.100
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Mon, 14 Feb 2022 15:20:25 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 14 Feb 2022 14:08:58 GMT
Connection: keep-alive
ETag: "620a627a-264"
Accept-Ranges: bytes
[root@backup ~]# curl -I 192.168.200.100
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Mon, 14 Feb 2022 15:20:38 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes
# 确实已经有192.168.200.100这个VIP了,可见我们已经验证成功了,但是这并不完美,
因为在master上依旧有VIP,master上虽然被禁掉了VRRP协议,
但它并不认为自己宕机了,所以不会释放VIP资源。
如果master和backup都绑定了VIP,那么对外提供服务就会紊乱,这叫作“脑裂”,
这种情况是不允许发生的。
3、关闭master上的keepalived服务
[root@master ~]# systemctl stop keepalived.service
[root@master ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
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: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:33:f6:eb brd ff:ff:ff:ff:ff:ff
inet 192.168.200.11/24 brd 192.168.200.255 scope global eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe33:f6eb/64 scope link
valid_lft forever preferred_lft forever
[root@master ~]# curl -I 192.168.200.100
HTTP/1.1 200 OK
Server: nginx/1.20.1
Date: Mon, 14 Feb 2022 15:27:26 GMT
Content-Type: text/html
Content-Length: 4833
Last-Modified: Fri, 16 May 2014 15:12:48 GMT
Connection: keep-alive
ETag: "53762af0-12e1"
Accept-Ranges: bytes
# 发现VIP浮动到了slave
# 再启动master上的keepalived
# 发现还会浮动回来
[root@master ~]# systemctl start keepalived.service
[root@master ~]# curl -I 192.168.200.100
HTTP/1.1 200 OK
Server: nginx/1.17.8
Date: Mon, 14 Feb 2022 15:28:37 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 14 Feb 2022 14:08:58 GMT
Connection: keep-alive
ETag: "620a627a-264"
Accept-Ranges: bytes
# 如果一台机器宕机,keeplived服务必然会停掉,所以这样去验证keepalived的高可用是没有任何问题的。
- 上一篇: Docker实战004:配置docker开机自动启动
- 下一篇: jenkins+nginx自动发布一
猜你喜欢
- 2024-09-24 jenkins+nginx自动发布一
- 2024-09-24 Docker实战004:配置docker开机自动启动
- 2024-09-24 老何建议:关于Linux运行级别和独立服务的自启动
- 2024-09-24 centos codecombat配置数据库及web服务开机自启动
- 2024-09-24 Linux自定义开机自启动服务脚本
- 2024-09-24 搭建ECS云服务器(5)设置nginx+fastdfs+tomcat+redis开启自启动
- 2024-09-24 教程 |Windows使用WinSW实现开机自启动服务
你 发表评论:
欢迎- 最近发表
-
- java 服务之间调用(rpc)(java实现服务器)
- Java机器学习库(Java ML)(二、聚类)
- 「Java库」如何使用优秀的加密库Jasypt来保护你的敏感信息?
- GitHub精选 | 轻量级Android和Java日志库
- Java面试官:MySQL binlog 有什么作用?主从延迟的了解么?
- Excel函数核武器库:50个高频场景公式——第二弹
- Excel函数核武器库:50个高频场景公式——第一弹
- Spring Cache高性能缓存库 - Caffeine简介
- Java通过Kafka Streams库来实现数据流处理
- 一连问了好几个大佬,竟然都不知道Redis为什么默认16个数据库?
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)