双点服务器HA架构介绍(实现高可用)
需求
随着用户量增多,单台WEB服务器,压力越来越大。虽然单台WEB服务器,目前可以完成工作任务。但是如果一旦宕机,用户就完全失去服务了,用户体验特别不好。需要备用一台服务器进行使用,主服务器宕机之后,快速切换为备用服务器
模拟运维设计方案
第一步:在单台web服务的架构中,先将数据库服务器迁移
第二步:针对web服务器单点故障,升级为主备服务器架构
高可用服务搭建介绍
HA高可用
高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指通过设计,减少系统服务不可用的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为0.876个小时。
描述 | 通俗叫法 | 可用性级别 | 年度停机时间 |
---|
基本可用性 | 2个9 | 99% | 87.6小时 | 较高可用性 | 3个9 | 99.9% | 8.8小时 | 具有故障自动恢复能力的可用性 | 4个9 | 99.99% | 53分钟 | 极高可用性 | 5个9 | 99.999% | 5分钟 |
实现高可用的核心点:
备份服务器:
实现热备,引入VIP的切换,通过VIP的方式,切换主备服务器:
常用来单独实现高可用的软件:
keepalived 软件介绍
Keepalived 软件起初是专为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能。因此,Keepalived 除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx、Haproxy、MySQL等)的高可用解决方案软件
keepalived组成和原理
Keepalived软件主要是通过VRRP协议实现高可用功能的。
VRRP是Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当个别节点宕机时,整个网络可以不间断地运行。
虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。
Keepalived的功能体系结构,大致分两层:用户空间(user space)和内核空间(kernel space)。
内核空间:Kernel Space
- 主要包括IPVS(IP虚拟服务器,用于实现网络服务的负载均衡)和NETLINK(提供高级路由及其他相关的网络功能)两个部份。
用户空间:User Space
-
WatchDog :负载监控checkers和VRRP进程的状况,如果他两以外挂掉会重启他们 -
VRRP Stack :负载均衡器之间的失败切换FailOver,如果只用一个负载均衡器,则VRRP不是必须的。 -
Checkers :负责真实服务器的健康检查healthchecking,是keepalived最主要的功能。换言之,可以没有VRRP Stack,但健康检查healthchecking是一定要有的。 -
IPVS wrapper :用户发送设定的规则到内核ipvs代码 -
Netlink Reflector :用来设定vrrp的vip地址等。
keepalived主要使用三个模块,分别是core、check和vrrp:
安装配置启动keepalived
master和backup都需要进行安装,也就是server_01和server_02机器 keepalived需要使用的目录和文件:
文件或者目录 | 作用 |
---|
/etc/keepalived/keepalived.conf | 生效的配置文件 | /etc/init.d/keepalived | 服务器管理脚本 | /var/log/messages | 日志信息 |
keepalived 配置文件说明:
! 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_instance VI_1 { => vrrp协议的配置
state MASTER => 工作模式,分为master和backup 两种模式
interface eth0 => 监听的网卡,主要是VIP在哪张网卡上
virtual_router_id 51 => 虚拟路由id 需要和备服务器一致,id数字一样就行
priority 100 => 权重 优先级,1-255,数字越大权重越高,即如果有两台备,当主宕机,权重大的备成为新的master
advert_int 1 => vrrp包的发送周期 1s,主需要向备发送包,确认主是存活的,备就不会启用
#
authentication { => 权限验证,一般不用动
auth_type PASS
auth_pass 1111
}
#
virtual_ipaddress { => 需要绑定切换的VIP,这个VIP用于用户访问,VIP在哪个Web 服务器上就是那个服务器提供服务
192.168.200.16
192.168.200.17
192.168.200.18
}
}
实现Web 服务高可用前置部署
两台Web 服务安装的配置参数需要一致,迁移的数据库可以是不同版本,但需要根据具体需求决定
LNMP环境搭建
配置要求:
服务器主机 | IP | 角色 |
---|
server_01.com (Web) | 10.1.1.101 | MASTER | server_02.com (Web) | 10.1.1.102 | SLAVE | mysql_01.com | 10.1.1.201 | MySQL |
第一步:将主 Web服务器的数据库文件备份,导入数据库服务
MySQL数据库学习导航
主Web 服务器:
#l [root@server_01 ~]# mysqldump --databases tp5shop > /root/tp5shop.sql -p => 备份
#l [root@server_01 ~]# scp /root/tp5shop.sql mysql01:/root/ => 将数据发送到数据库服务器
#l [root@server_01 ~]# rm -rf /usr/local/mysql => 可以删除MySQL
MySQL 服务器:
# mysql> source /root/tp5shop.sql; => 导入数据
创建用于Web 服务器远程连接用户
# mysql> create user 'tp5shop'@'10.1.1.%' identified by 'Abc123$'; => 创建用户
# mysql> grant all on tp5shop.* to 'tp5shop'@'10.1.1.%'; => 配置权限
第二步:两台Web 服务器修改一下项目配置文件数据库接口文件
主备都要修改:
# vim /usr/local/nginx/html/tp5shop/application/database.php
return [
'type' => 'mysql',
'hostname' => '10.1.1.201', => 数据库服务器 IP
'database' => 'tp5shop', => 要连接的数据库名称
'username' => 'tp5shop', => 上面创建的用户名称
'password' => 'Abc123$', => 密码
'hostport' => '3306',
第三步:keepalived 软件的安装及配置
主Web 服务器:
安装及备份:
#l [root@server_01 ~]# yum -y install keepalived => 安装
#l [root@server_01 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
=> 备份一下配置文件
修改配置文件:
#l [root@server_01 ~]# 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_instance VI_1 {
state MASTER
interface ens33 => 网卡更改为自己的网卡
virtual_router_id 51
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.210 => 设定VIP
}
}
备Web 服务器:
安装及备份:
#l [root@server_02 ~]# yum -y install keepalived => 安装
#l [root@server_02 ~]# cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
=> 备份一下配置文件
修改配置文件:
#l [root@server_02 ~]# 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_instance VI_1 {
state BACKUP => 修改为backup
interface ens33 => 网卡更改为自己的网卡
virtual_router_id 51
priority 100
advert_int 3
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.1.1.210 => 设定VIP,主备设定的VIP 要一致
}
}
第四步:启动keepalived
分别按照顺序启动主服务器和备服务器的keepalived:
#l [root@server_01 ~]# systemctl start keepalived
#l [root@server_02 ~]# systemctl start keepalived
# ip a 命令可以查看VIP 在哪,
客户端解析vip10.1.1.210 www.shop.com,访问就可以访问到,当主宕机,vip就会切换到备上去
第五步:编写Nginx 服务监测脚本
通过keepalived可以直接实现主服务器整机不可用,实现VIP的切换。保证用户可以通过VIP进行访问服务。但是实际情况下,往往并不是服务器整机不可用,只是对应的服务或者软件不可用。
比如说:nginx提供的web服务,nginx进程意外关闭,就需要检测到当nginx不可用时,能够切换VIP
实现过程分析:
主备都要编写:
在keepalived下编写:
# vim /etc/keepalived/check_nginx.sh
#!/bin/bash
nginx_status=`ps -C nginx --no-header | wc -l`
if [ $nginx_status -eq 0 ];then
systemctl stop keepalived
fi
说明:当监测到nginx 进行没有,即等于0的时候,就关闭keepalived
# chmod +x /etc/keepalived/check_nginx.sh
第六步:在keepalived 配置文件中配置定时触发Nginx检测脚本
主备都要:
- 就可以实现每3秒检查Nginx 服务是否可用,不可以就关闭keepalived,vip就会转移
# vim /etc/keepalived/keepalived.conf
vrrp_script check_nginx { => 定义一个执行,在vrrp_instance外上面定义
script /etc/keepalived/check_nginx.sh => 调用脚本地址
interval 3 => 检测间隔时间
}
#
track_script { => 在vrrp_instance里调用
check_nginx => 上面定义的名称
}
到此完成
keepalived的配置补充
脑裂(裂脑):
- vip出现在了多台机器上。网络不通畅,禁用了数据包,主备服务器没法通讯,造成备服务器认为主服务器不可用,绑定VIP,主服务器VIP不会释放。
- 因为实际生产情况下防火墙是禁用组播的,不接受组播的数据包,所以主发送的vrrp包被禁掉了导致备接受不到而启用vip 导致脑裂发生
解决方案:
非抢占模式和权重的补充
抢占模式: 即备拿到了vip,但是主又重新开启,那么主就会抢占vip。keepalived 默认是抢占模式,这样容易形成脑裂(实操过程中有可能没有发生抢占)
非抢占模式: 在主备服务器的配置文件,vrrp_instance段中,加上nopreempt 。这样他们就不会抢占了。
主备都要加上:
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
...
nopreempt => 在这段中加上
...
}
多备设置:
- 即没有主,全是备,通过优先级
priority 来确定先启用哪台Web,数字越大优先级越高 - 两个keepalived节点都启动后,默认都是BACKUP状态,双方在发送组播信息后,会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt,所以MASTER从故障中恢复后,不会抢占vip。这样会避免VIP切换可能造成的服务延迟。
主备都要加上:
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state BACKUP => 都设置成BACKUP
nopreempt
priority 100 => 根据情况设置不同的数字,数字越大优先级越高
单播模式
一些特定环境下不允许发送组播,造成备服务器无法收到vrrp包,可能会造成脑裂现象。可以通过单播的方式解决
单播示例配置:注意此语法在keepalived1.2.11版本以上支持
unicast_src_ip 10.1.1.101 => (本地IP地址)
unicast_peer {
10.1.1.102 => (对端IP地址),即发送vrrp包给其他备机器,有多台就添加上去就行
}
server01配置:
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
unicast_src_ip 10.1.1.101 => server01自己的ip
unicast_peer {
10.1.1.102 => server02备的ip,向它发送单播vrrp包
}
}
server02配置:
# vim /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
unicast_src_ip 10.1.1.102 => server02自己的ip
unicast_peer {
10.1.1.101 => server01备的ip,向它发送单播vrrp包
}
}
vrrp包组播: 配置后vrrp单播:
|