web高可用-基于keepalived和nginx

一.体系架构

在Keepalived + Nginx高可用负载均衡架构中,keepalived负责实现High-availability (HA) 功能控制前端机VIP(虚拟网络地址),当有设备发生故障时,热备服务器可以瞬间将VIP自动切换过来,实际运行中体验只有2秒钟切换时间,DNS服务可以负责前端VIP的负载均衡。
nginx负责控制后端web服务器的负载均衡,将客户端的请求按照一定的算法转发给后端Real Server处理,而Real Server将响应直接返回给客户端。


应用架构拓扑图

二. 优点

1.实现了可弹性化的架构,在压力增大的时候可以临时添加web服务器添加到这个架构里面去;
2.upstream具有负载均衡能力,可以自动判断后端的机器,并且自动踢出不能正常提供服务的机器;
3.相对于lvs而言,正则分发和重定向更为灵活。而Keepalvied可保证单个nginx负载均衡器的有效性,避免单点故障;
4.用nginx做负载均衡,无需对后端的机器做任何改动。
5.nginx部署在docker容器里,即大量地节约开发、测试、部署的时间,又可以在出现故障时通过镜像快速恢复业务。

三. 系统环境

两台负载机器安装:centos7.2+docker+nginx+keepalived,分别命名为:NGINX_MASTER,NGINX_BACKUP。
后端web服务器,可以是提供web服务的任何架构,分别命名为:WEB_1,WEB_2。
后端数据库机器可任意架构,只要能提供数据库服务即可。

服务器 操作系统 IP地址 安装软件
NGINX_MASTER Centos 7.2 64位 10.141.1.32 docker+nginx+keepalived
NGINX_BACKUP Centos 7.2 64位 10.141.9.2 docker+nginx+keepalived
WEB_1 Centos 7.2 64位 10.141.3.73 docker+web
WEB_2 Centos 7.2 64位 10.141.26.218 docker+web
虚拟IP 10.141.1.33

四. 搭建环境

1. 主机准备

全部主机执行命令

setenforce 0 #关闭selinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
systemctl stop firewalld #关闭防火墙
systemctl stop iptables #关闭iptables

2. docker安装(全部主机执行命令)

a. 在线安装

参考: (https://docs.docker.com/install/linux/docker-ce/centos/#uninstall-old-versions)

yum install docker

b. 离线二进制安装:

参考:(https://www.jianshu.com/p/46b9a351f749)

3. 准备web服务器

a. 启动服务

web1和web2执行,这里使用python启动一个simplehttpserver

touch 123.txt  #在web1执行
touch 456.txt  #在web2执行
python -m SimpleHTTPserver #web1,web2都执行

b. 检查

curl 10.141.3.73:8000  #返回123.txt
curl 10.141.26.218:8000  #返回456.txt

4. 安装nginx进行负载均衡,在master和backup执行

a. 拉镜像

docker pull nginx

b. vim nginx.conf ,增加 upstream和server

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;
    upstream linuxidc { 
      server 10.141.3.73:8000; 
      server 10.141.26.218:8000; 
    }
    server {

        listen       80;
        server_name  localhost;

         location / {
            root  html;
            index  index.html index.htm;
            proxy_pass http://linuxidc;
       }
   }
    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

c. 启动nginx

docker run -it -d -p 80:80 -v /${PWD}/nginx.conf:/etc/nginx/nginx.conf nginx

d. 验证

curl localhost #返回123.txt 或者返回456.txt

5. 搭建keepalived进行热备(在master和backup执行)

a. 安装keepalived

yum install -y keepalived
systemctl start keepalived
systemctl enable keepalived

b. 修改配置文件/etc/keepalived/keepalived.conf

这里使用的是单播模式,解决脑裂问题,云主机(比如阿里云,腾讯云。亚信云等)需要单独申请VIP并绑定主机,否则不能访问VIP

! 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_skip_check_adv_addr
   #vrrp_strict #单播模式要注释掉
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script chk_port {     #检测服务是否在运行。有很多方式,比如进程,用脚本检测等等
    script "/root/chk_server.sh"   #这里通过脚本监测
    interval 2                   #脚本执行间隔,每2s检测一次
    weight -10                    #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -10
    fall 2                    #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
    rise 1                    #检测1次成功就算成功。但不修改优先级
}

vrrp_instance VI_1 {
    state MASTER  #backup主机填写BACKUP
    unicast_src_ip  10.141.1.32  #写本机地址
    unicast_peer {
                 10.141.9.2   #填写另外一台keepalived主机地址
    }
    interface eth0 #网卡
    virtual_router_id 58 #默认51,可以换一个地址,避免冲突,主备id要一样
    priority 100 #权重,backup修改为95,检查失败后优先级变90,低于95会将vip转移到slave
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.141.1.33 #虚拟ip
    }
    track_script {
      chk_port
    }
}

chk_server.sh脚本

counter=$(netstat -na|grep "LISTEN"|grep "80"|wc -l)
if [ "${counter}" -eq 0 ]; then
    exit 0
fi

c. 验证

systemctl restart keepalived

ip a查看master中绑定VIP,backup没有绑定
master上执行systemctl stop keepalived,可以发现VIP漂流到backup上

curl 10.141.1.33 #返回结果为123.txt或者456.txt
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容