首页 > 其他分享 >综合架构--8--高可用服务--37

综合架构--8--高可用服务--37

时间:2024-03-27 22:34:53浏览次数:26  
标签:10.0 00 架构 -- 37 keepalived repo lft com

综合架构--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

手机端访问

https://images.cnblogs.com/cnblogs_com/blogs/816085/galleries/2387059/t_240327093455_手机端10.0.1.134.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

相关文章

  • R语言贝叶斯INLA空间自相关、混合效应、季节空间模型、SPDE、时空分析野生动物数据可
    全文链接:https://tecdat.cn/?p=35518原文出处:拓端数据部落公众号在统计建模过程中,经常会遇到空间自相关性的问题。空间自相关性是指相近位置的观测值往往比远离位置的观测值更相似。在尝试估计参数或进行预测时,空间自相关性可能会导致结果产生偏差。INLA(IntegratedNestedLapla......
  • 2007 年考研英语真题 - 阅读 4 解析
    2007 年考研英语真题 - 阅读 4 解析Itneverrainsbutitpours.[1]  翻译:祸不单行。1.Itneverrainsbutitpours. 基本含义是:不雨则已,一雨倾盆;主要指事情(尤其是坏事), 不来则已,一来就接二连三地来(祸不单行);也有含义是:不鸣则已,一鸣惊人。Justasbossesandboa......
  • 后处理 - 亮度,饱和度,对比度
    效果 c#代码usingUnityEngine;publicclassMyBrightnessSaturationAndContrast:MonoBehaviour{publicShaderm_Shader;publicMaterialm_Material;[Range(0.0f,3.0f)]publicfloatm_brightness=1.0f;[Range(0.0f,3.0f)]publ......
  • SpringBoot整合Redis:面试必考题-缓存击穿--逻辑过期解决
    ......
  • 2007 年考研英语真题 - 翻译题解析
    2007 年考研英语真题 - 翻译题解析ThestudyoflawhasbeenrecognizedforcenturiesasabasicintellectualdisciplineinEuropeanuniversities.[1]                  翻译:几个世纪以来,欧洲的各所大学一直认为法学学习是一门基础知识学科。1.......
  • ssm框架学习总结
    SSM框架的定义SSM框架是spring、springMVC、和mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。pojo层PlainOrdinaryJavaObject,也有人称其为model、domain、bean等,pojo层是对应的数据库表的实体类。持久......
  • 24.park和unpark方法
    1.park方法可以暂停线程,线程状态为wait。2.unpark方法可以恢复线程,线程状态为runnable。3.LockSupport的静态方法。4.park和unpark方法调用不分先后,unpark先调用,park后执行也可以恢复线程。publicclassParkDemo{publicstaticvoidmain(String[]args){......
  • vcf文件可以用excel打开吗?四种解决方案
    vcf文件可以用excel打开吗?当然可以。一、VCF文件简介VCF(vCard)文件是一种用于存储联系人信息的文件格式。它通常包含姓名、电话号码、电子邮件地址、地址等详细信息。VCF文件在多种设备和操作系统中广泛使用,特别是在电子邮件客户端和移动通讯应用中。二、VCF文件与Excel......
  • 23.异步模式-生产者、消费者
    1.与保护性暂停GuardedObject不同,不需要产生结果与消费结果的线程一一对应。2.消费队列可以用来平衡生产和消费的线程资源。3.生产者负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据。4.消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据。5.jdk......
  • C语言关键字——static和extern
    大家好,今天和大家分享C语言中的两个关键字以及作⽤域和⽣命周期的有关知识,创作不易,三连支持一下吧!一、作用域和生命周期在了解static和extern之前,我们先了解一下作用域和生命周期。1.作用域作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤......