综合架构--8--高可用服务--37
1.访问一个网站,用户访问的终端不同显示网站页面也不同 nginx如何配置?(根据访问终端不同显示页面不同)
需求讲解
最终实现结果:
手机端 www.it.com iphone 10.0.1.146 (手机端集群)
谷歌 www.it.com Google 10.0.1.147 web2集群
ie
#步骤
环境
虚拟化
nginx(均衡服务器) 10.0.1.134
web1 10.0.1.146 (手机端集群)
web2 10.0.1.147 (pc端集群)
web3 10.0.1.144 (默认集群)
一、准备三台web服务器(状态:正常访问)
nginx mysql php或java (lnmp环境+博客/论坛)
web1 10.0.1.146 (手机端集群)
web2 10.0.1.147 (pc端集群)
web3 10.0.1.144 (默认集群)
#二、配置nginx(负载均衡)网站配置文件(10.0.1.134)
cd /usr/local/nginx/conf/vhost
vim www.conf
upstream web {
server 10.0.1.147:80;
}
upstream mobile {
server 10.0.1.146:80;
}
upstream default {
server 10.0.1.144:80;
}
#定义了一个组,组成员共有三个后端服务器,upstream web: 当Nginx决定将请求转发给web组时,请求会被送到10.0.1.147主机的80端口。upstream mobile: 类似地,当选择mobile组时,请求会被送到10.0.1.146主机的80端口。upstream default: 若未匹配到前面的条件,或出现异常情况时,请求会被转发到10.0.1.144主机的80端口。
server {
listen 80;
server_name www.it.com;
location / {
if ($http_user_agent ~* iphone) {
proxy_pass http://mobile;
}
if ($http_user_agent ~* Chrome) {
proxy_pass http://web;
}
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
#配置注解:这个配置实现了根据不同类型的访问者智能地将请求分配给不同的后端服务器集群,确保了服务质量和用户体验。
upstream web {
server 10.0.1.147:80;
}
upstream mobile {
server 10.0.1.146:80;
}
upstream default {
server 10.0.1.144:80;
}
#定义了一个组,组成员共有三个后端服务器,
upstream web: 当Nginx决定将请求转发给web组时,请求会被送到10.0.1.147主机的80端口。
upstream mobile: 类似地,当选择mobile组时,请求会被送到10.0.1.146主机的80端口。
upstream default: 若未匹配到前面的条件,或出现异常情况时,请求会被转发到10.0.1.144主机的80端口。
web1
10.0.1.146
web2
10.0.1.147
web3
10.0.1.144
效果如下
pc端访问
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387059/t_240327093002_pcGoogle.png
手机端访问
2.keepalived学习和使用场景---原理(面试题)
高可用软件
避免服务器出现单点故障
2台nginx 均衡 5台 Tomcat
01 nginx 02 nginx
keepalived工作原理?
故障切换是通过vrrp协议(虚拟路由冗余协议)
keepalived工作的时候,主master节点不断向备份节点发送心跳信息,用来告诉从库 我还活着
当主master发生故障的时候,就无法发送心跳信息了,备份节点就无法检测主库心跳,这时从库就开始调用自身的管理程序,接管主ip 资源 服务之类的
3.实战--搭建两台nginx高可用(keepalived)
#步骤
精简版配置:
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_instance it {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100/24
}
}
第二版:
! Configuration File for keepalived
global_defs {
router_id lb01
}
vrrp_script check_web {
script "/server/scripts/check_web.sh"
interval 3
weight 2
}
vrrp_instance it {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.0.100/24
}
track_script {
check_web
}
}
#!/bin/bash
nginxpid=`ps -C nginx --no-header | wc -l`
if [ $nginxpid -eq 0 ];then
systemctl stop keepalived
pkill -9 keepalived
fi
nginx1 nginx2 web1 web2 web3
环境:
虚拟机
主nginx1 10.0.1.134
备nginx2 10.0.1.153
web1 10.0.1.146
web2 10.0.1.147
web3 10.0.1.144
一.做一个架构图
二.服务器环境准备好
三.负载均衡两台环境都要一模一样 (lnmp)
mysql php nginx 这些版本都要一模一样 模块组件一个都不能少
四.测试主nginx1 备nginx2 web1 web2 web3(状态)
http://10.0.1.146/upload/ web1
http://10.0.1.147/upload/ web2
http://10.0.1.144/upload/ web3
启动nginx
nginx
启动php
/etc/init.d/php-fpm start
#tips:数据库 网站源码 数据库账号密码 都要一模一样
五.主nginx1 安装keepalived nginx2 安装keepalived
yum -y install keepalived
systemctl start keepalived #两台都要启动
systemctl status keepalived
#tips:没有更新yum源的话,可以看下面操作更新一下
1. 备份
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2. 下载新的 CentOS-Base.repo 到 /etc/yum.repos.d/
2.1各版本
centos8
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
centos6
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
CentOS 7
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
或者
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
3.各版本epel源
3.1 备份(如有配置其他epel源)
mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup
mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup
3.2 下载新repo 到/etc/yum.repos.d/
epel(RHEL 8)
1)安装 epel 配置包
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
2)将 repo 配置中的地址替换为阿里云镜像站地址
sed -i 's|^#baseurl=https://download.example/pub|baseurl=https://mirrors.aliyun.com|' /etc/yum.repos.d/epel*
sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*
epel(RHEL 7)
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
epel(RHEL 6) (epel6官方源已下线,建议切换epel-archive源)
wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-archive-6.repo
4.更新缓存和软件
yum clean all
yum makecache
yum update
#tips:建议在这里设置一下虚拟机快照,不然每次都要这样,会很耽误时间
六.配置keepalived(主库+从库)
cd /etc/keeplived
vim keepalived.conf
主库配置:
! Configuration File for keepalived
global_defs {
router_id lb01 #高可用集群标识 不能冲突
}
vrrp_instance it { #家族名字
state MASTER #身份
interface eno16777736 #网卡名称 这里要与你的网卡名要一样
virtual_router_id 51 #身份信息 两台要一致
priority 150 #优先级 数字越高 等级越大
advert_int 1 #组播发送间隔时间
authentication { #人证过程
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.100/24 #配置虚拟vip
}
}
配置是否成功如何检查,有虚拟vip?
[root@master keepalived]# 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:4c:25:86 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.134/24 brd 10.0.1.255 scope global dynamic eno16777736
valid_lft 1259sec preferred_lft 1259sec
inet 10.0.1.100/24 scope global secondary eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe4c:2586/64 scope link
valid_lft forever preferred_lft forever
此时在浏览器输入 10.0.1.100 看一下是不是这个本机ip10.0.1.134的页面,一模一样就是成功的
http://10.0.1.134/
从库配置:
cd /etc/keeplived
vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02 #高可用集群标识 不能冲突
}
vrrp_instance it { #家族名字
state BACKUP #身份 是主是从?这里可以命名区分
interface eth0 #网卡名称 这里要与你的网卡名要一样
virtual_router_id 51 #身份信息 两台要一致
priority 100 #优先级 数字越高 等级越大
advert_int 1 #组播发送间隔时间
authentication { #人证过程
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.100/24 #配置虚拟vip
}
}
配置完成之后,重启一下配置,看一下有没有成功,这里因为是主库还在运行,所以他不会出现vip的
[root@master keepalived]# systemctl restart keepalived
[root@master keepalived]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:76:af:f7 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.153/24 brd 10.0.1.255 scope global dynamic eth0
valid_lft 1352sec preferred_lft 1352sec
inet6 fe80::20c:29ff:fe76:aff7/64 scope link
valid_lft forever preferred_lft forever
七、配置域名解析
C:\Windows\System32\drivers\etc
10.0.1.100 www.it.com
八.测试
当主库宕机时,会发生什么?
方式1.可以把主库关机(生产环境中不建议做)
方式2.停止keepalived服务 看从库的vip是否出现
如下图所示
主库正常时
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240327121440_主库正常.png
主库宕机时-从库状态
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240327122033_从库2.png
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240327122104_从库状态.png
4.脑裂问题解决--(面试题)
一.什么是脑裂?
两台服务器都出现vip
主库
[root@master ~]# ip a
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:4c:25:86 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.156/24 brd 10.0.1.255 scope global dynamic eno16777736
valid_lft 1450sec preferred_lft 1450sec
inet 10.0.1.100/24 scope global secondary eno16777736
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe4c:2586/64 scope link
valid_lft forever preferred_lft forever
从库
[root@master keepalived]# systemctl start firewalld
[root@master keepalived]# ip a
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:76:af:f7 brd ff:ff:ff:ff:ff:ff
inet 10.0.1.153/24 brd 10.0.1.255 scope global dynamic eth0
valid_lft 1407sec preferred_lft 1407sec
inet 10.0.1.100/24 scope global secondary eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe76:aff7/64 scope link
valid_lft forever preferred_lft forever
一.什么是脑裂?
两台服务器都出现vip
二.出现脑裂的原因?
1.高可用备用服务器-不能接受主服务器组播包
主要原因:
2.线路问题(道路问题)
3.防火墙问题(安全策略)
三.如何解决脑裂?
关闭keepalived服务 systemctl stop keepalived
#补充:当keepalived出现脑裂(Split-Brain)现象时,网站可能会出现以下几种状态:
1. 服务不可用:
- 两个或多个节点都认为自己是活动主节点(MASTER),并同时尝试绑定虚拟IP地址(VIP)。由于VIP只能在一个节点上绑定,所以会导致VIP实际上无法正常响应客户端请求,从而造成对外提供服务的VIP地址不可达,网站因此变得不可访问。
2. 流量丢失:
- 在脑裂状态下,一部分流量可能仍旧被路由到原主节点,而另一部分流量可能被路由到误以为自己是主节点的备份节点,这种不一致的流量分配会导致部分请求得不到正确响应。
3. 数据不一致:
- 如果脑裂涉及的不仅仅是负载均衡器,而是整个集群系统,还可能出现数据不一致的问题,因为多个主节点可能都在进行写操作,没有统一的协调机制。
4. 潜在的并发写冲突:
- 如果脑裂导致两个节点都开始处理请求,尤其在数据库等场景下,可能会引发并发写入冲突,严重时甚至导致数据损坏。
5. 恢复困难:
- 当脑裂状况解除后,如何安全地恢复服务并确保数据一致性也是一个挑战,可能需要人工干预或者利用keepalived的健康检查机制和配置的仲裁策略来进行自动恢复。
为了避免脑裂带来的问题,keepalived通常会配合各种健康检查和仲裁机制来确保在高可用集群中只有一个节点处于活动状态。当发生通信故障时,配置合适的故障转移策略可以有效地避免脑裂发生。例如,可以设置优先级、权重、监视脚本等方式,确保只有在主节点真正失效时,备份节点才会接管服务。
4.1实时脑裂报警通知脚本
ip a |grep 10.0.1.100
echo $? #上一条命令执行的情况 成功为0 其他失败
#!/bin/bash
ip a |grep 10.0.1.100
if [ $? -eq 0 ]
then
echo "出现脑裂"
echo "出现脑裂" | mail -s "脑裂警告" [email protected]
fi
#步骤
1.选择目录,新建check.sh脚本
2.给予权限
3.配置邮件服务(提前做好)
具体演示过程
关于echo $? 的作用演示
[root@master ~]# ip a |grep 10.0.1.100
inet 10.0.1.100/24 scope global secondary eno16777736
[root@master ~]# echo $?
0
命令失败执行
[root@master ~]# mysq
-bash: mysq: command not found
[root@master ~]# echo $?
127
cd /mnt/
vim check.sh
#!/bin/bash
ip a |grep 10.0.1.100
if [ $? -eq 0 ]
then
echo "出现脑裂"
echo "出现脑裂" | mail -s "脑裂警告" [email protected]
fi
chmod +x check.sh
#脚本注解
比较运算符
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
运行结果
[root@master mnt]# bash check.sh
inet 10.0.1.100/24 scope global secondary eno16777736
出现脑裂
配置脑裂脚本邮件通知--效果
https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2386487/t_240327131416_脑裂邮件通知.png
5.nginx挂了自动切换(脚本)
#步骤
推导
ps aux |grep nginx
ps aux |grep -c nginx
[root@master mnt]# ps aux|grep -c nginx
3
[root@master mnt]# ps aux|grep -c nginx
1
#tips:此操作说明nginx正常状态时,显示了4,不正常显示1
正常是4 不正常是1
实现方式
第一种(手动)
1.编写一个nginx状态脚本
mkdir -p /server/sh
vim web.sh
#!/bin/bash
pid=`ps aux |grep -c nginx`
echo $pid
if [ $pid -lt 3 ]
then
systemctl stop keepalived
fi
chmod +x web.sh
bash web.sh
#tips:这个脚本主库和从库都必须要有,我们下面自动挡需要
第二种(自动)
2.修改配置文件(主库+从库)
主库:
cd /etc/keepalived
vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb01 #高可用集群标识 不能冲突
}
vrrp_script web {
script "/server/sh/web.sh" #定义的脚本和目录
interval 3 #执行脚本间隔时间
weight 2 #执行权重
}
vrrp_instance it { #家族名字
state MASTER #身份
interface eno16777736 #网卡名称 这里要与你的网卡名要一样
virtual_router_id 51 #身份信息 两台要一致
priority 150 #优先级 数字越高 等级越大
advert_int 1 #组播发送间隔时间
authentication { #认证过程
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.100/24 #配置虚拟vip
}
track_script {
web #调用上面定义的脚本
}
}
systemctl restart keepalived
重启一下,检查上面的语法是不是正确的
从库:
cd /etc/keepalived
vim keepalived.conf
! Configuration File for keepalived
global_defs {
router_id lb02 #高可用集群标识 不能冲突
}
vrrp_script web {
script "/server/sh/web.sh"
interval 3
weight 2
}
vrrp_instance it { #家族名字
state BACKUP #身份
interface eth0 #网卡名称 这里要与你的网卡名要一样
virtual_router_id 51 #身份信息 两台要一致
priority 100 #优先级 数字越高 等级越大
advert_int 1 #组播发送间隔时间
authentication { #人证过程
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.0.1.100/24 #配置虚拟vip
track_script {
web
}
}
}
systemctl restart keepalived
重启一下,检查上面的语法是不是正确的
测试:如果此时nginx状态死了,此时再看一下keepalived的状态是不是也挂了,如果是,那就成功了
标签:10.0,00,架构,--,37,keepalived,repo,lft,com
From: https://www.cnblogs.com/nwq1101/p/18100472