设为首页 收藏本站
查看: 1571|回复: 0

keepalived+haproxy+varnish+lnmp企业级架构测试

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-12-6 11:02:08 | 显示全部楼层 |阅读模式


要求: 每个人准备 4 台虚拟机, 并还原到初始安装状态(检测到未还原的机器则视为无效)。 配置 yum 为教
室 172.17.0.1 上的 yum 服务,关闭 selinux,所有软件 yum 安装。以下题目全部做完后将 haproxy、varnish、
nginx 配置文件、 和所涉及到的脚本, 以及四台机器的 history 文件以角色名命名, 并打包为命名为姓名+
学号, 进行作业提交。
准备的四台机器角色分别是:
1、 haproxy-master
2、 haproxy-backup
3、 web-server1
4、 web-server2
目标: 每人准备的 4 台虚拟机中, 其中两台用 haproxy 做负载均衡并能实现 keepalived 主备, 另两台用
nginx+php-fpm 做 web server, 同时这两台机器需要配置缓存服务, 通过 varnish 实现缓存功能。(缓存和
webserver 同一机器不同端口实现), 为了避免资源浪费, 负载均衡备用服务器 haproxy-backup 用来提供
web server 的数据库服务(需安装数据库) 和数据存储服务, web server 两台应用的数据库配置需指向负
载均衡备用服务器上配置的数据库。
1、 要求画出四台机器的架构示意图, 精确到每台机器上服务对应的进程和请求的端口以及通信的方向箭
头。(10 分)
解析:

2、 要求在负载均衡备用服务器实现 dns server 服务, 每台机器的主机名设置为角色-学号.magedu.com 如
(haproxy-master-37.magedu.com), 并能通过 dns 服务正确解析。(10 分)
解析:这里就是把backup当成一个dns正向解析服务器
第一步:yum install bind
第二步:vim /etc/named.conf

allow-query     { any; };

第三步:vim /etc/named.rfc1912.zones

    zone "dnsserver" IN {
                    type master;
                    file "dnsserver.zone";
                    allow-update { none; };
    };

第四步:vim /var/named/dnsserver.zone

    $TTL  1D
    @  IN    SOA         dns1 mail.dnsserver  (0 1d 1h 1w 2h)
            NS         dns1
    dns1     A           172.17.254.238   本机当做dns服务器,一般都是仅主机模式,桥接会干扰
    web-server1-22.magedu.com      A        172.17.254.181
    web-server2-22.magedu.com       A       172.17.252.196
    haproxy-master-22.magedu.com    A       172.17.254.171

第五步: vim /etc/resolv.conf 所有的客户端都需要把dns指向backup的dns服务器。
nameserver 172.17.254.238
第六步:systemctl start named
3、 在两台 webserver 实现基于小米电子商务网站 nginx 和 php-fpm 配置, 源代码放到/data/webapps 目录
下, 两台机器的数据库在 haproxy-backup 从服务器上。 配置完成可正常访问, 进修改网站标题为 magedu-
学号(10 分)
解析:这一题和第七题可以一起做,把数据库放在backup上,把网站代码存放的路径共享出来,实现数据同步,任意网站修改数据能实现同步。如果已经在nginx网站上存放的网站的代码,再搬迁过去就行了。
第一步:webserver上安装nginx,php-fpm,php-mysql,具体更改的东西就不说了。还需要建立一个共享目录挂载点,
修改权限。

mkdir  /data/webapps    chown nobody.nobody  -R /data/webapps

第二步:在backup上安装mariadb。
1.注意需要更改目录权限nobody
2.vim config.php
/ 数据库主机 3306为默认主机端口,如不是默认也需要修改

$db_host   = "172.17.254.238:3306";
// 数据库名称

$db_name   = "xiaomi";
// 数据库用户名

$db_user   = "root";
// 数据库密码

$db_pass   = "123456";

第三步:mysql -uroot

create  database xiaomi
grant all on *.* to  root@'172.17.254.181' identified by '123456';
grant all on *.* to  root@'172.17.254.20' identified by '123456';
grant all on *.* to  root@'172.17.252.196' identified by '123456';

第四步:就可以登录网站进行数据初始化。
第五步:需要搭建nfs.

    yum intstall nfs-utils
    Systemctl start nfs
    vim /etc/exports
        /data/webapps (rw)   建立共享目录
    exportfs   查看共享目录
    /data/webapps   <world>

第六步:在webserver上把共享目录挂载在本机上

mount  172.17.254.238:/data/webapps/  /data/webapps/  

4、 两台 webserver 搭建 varnish 缓存服务, 监听端口为 6000, 存储方式为 file, 大小为 5G, varnish 服
务可从这两台 webserver 取资源, 算法为 random, 对图片缓存时间为 3600s, 对 js,css 缓存时间为 7200s,
(10 分)
解析:静态资源访问缓存,动态资源直接交给后端服务器。

第一步:vim  /etc/varnish/varnish.params
        VARNISH_LISTEN_PORT=6000
        # Admin interface listen address and port
        VARNISH_ADMIN_LISTEN_ADDRESS=127.0.0.1
        VARNISH_ADMIN_LISTEN_PORT=6082
        # Shared secret file for admin interface
        VARNISH_SECRET_FILE=/etc/varnish/secret
        # Backend storage specification, see Storage Types in the varnishd(5)
        # man page for details.
        VARNISH_STORAGE="file,/data/cache,5G"
第二步:
    vcl 4.0;
    import directors;
    probe backend_healthcheck {
        .url = "/index.html";
        .window = 5;
        .threshold = 2;
        .interval = 3s;
        .timeout  = 1s;
    }
    backend web1 {
        .host = "192.168.253.150";
        .port = "80";
        .probe = backend_healthcheck;
    }

    backend web2 {
        .host = "192.168.253.159";
        .port = "80";
        .probe = backend_healthcheck;
    }

    sub vcl_init {
        new web_cluster = directors.random();
        web_cluster.add_backend(web1,5);
        web_cluster.add_backend(web2,10);
    }

    acl purgers {
            "127.0.0.1";
            "172.17.0.0"/16;
    }

    sub vcl_recv {

        if (req.method == "GET" && req.http.cookie) {
            return(hash);
    }
        if (req.url ~ "index.php") {
            return(hash);
        }
        if (req.method == "PURGE") {
            if (client.ip ~ purgers) {
              #  return(synth(405,"Method not allowed"));
              return(purge);
            }
        }
        if (req.http.X-Forward-For) {
            set req.http.X-Forward-For = req.http.X-Forward-For + "," + client.ip;
        } else {
            set req.http.X-Forward-For = client.ip;
        }
    }

    sub vcl_hash {
         hash_data(req.url);
    }

    sub vcl_backend_response {
        if (bereq.url ~ "\.(jpg|jpeg|gif|png)$") {
            set beresp.ttl = 3600s;
      }
        if (bereq.url ~ "\.(css|js)$") {
            set beresp.ttl = 7200s;
        }
            return(deliver);
    }

    sub vcl_deliver {
        if (obj.hits > 0) {
            set resp.http.X-Cache = "HIT from " + server.ip;
        } else {
            set resp.http.X-Cache = "MISS";
        }
    }

5、 前端两台负载均衡实现 keeaplived 高可用, 可实现当主的 haproxy 进程挂掉之后, 进行主从切换。 切
换后在/tmp/keepalived_status.log 文件中写下切换时间和当前状态(10 分)
解析:在两台负载均衡器配置keepalived

第一步:backup
vim  /etc/keepalived/keepalived.conf
    vrrp_instance VI_1 {
        state BACKUP
        interface eth0
        virtual_router_id 22
        priority 98
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass magedu
        }
        virtual_ipaddress {
            172.17.110.22
    }
    notify_backup "/etc/keepalived/notify.sh backup"
    notify_master "/etc/keepalived/notify.sh master"
    notify_fault "/etc/keepalived/notify.sh fault"
    }
vim /etc/keepalived/notify.sh
    #!/bin/bash
    notify() {
             state="$(date +'%F %T'):vrrp change,$(hostname) chaged to be $1"
             echo  "$state"  >> /tmp/keepalived_status.log
    }     
    case $1 in
    master)
            notify master
    ;;
    backup)
            notify backup;
    ;;
    fault)
            notify fault;
    ;;
    *)
            echo "Usage: $(basename $0) {master|backup|fault}"
            exit 1
    ;;
    esac
第二步:master
vim  /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 22
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass magedu
    }
    virtual_ipaddress {
        172.17.110.22
}
notify_backup "/etc/keepalived/notify.sh backup"
notify_master "/etc/keepalived/notify.sh master"
notify_fault "/etc/keepalived/notify.sh fault"
}
vim /etc/keepalived/notify.sh
    #!/bin/bash
    notify() {
             state="$(date +'%F %T'):vrrp change,$(hostname) chaged to be $1"
             echo  "$state"  >> /tmp/keepalived_status.log
    }     
    case $1 in
    master)
            notify master
    ;;
    backup)
            notify backup;
    ;;
    fault)
            notify fault;
    ;;
    *)
            echo "Usage: $(basename $0) {master|backup|fault}"
            exit 1
    ;;
    esac

6、 前端负载均衡可实现对于图片和静态资源的请求, 代理到后端 webserver 缓存 varnish 服务上, 对于动
态请求, 直接代理到后端 web 服务。 后端健康监测基于/index.html(需手动创建), 监测连续 3 次监测通
过, 视为 ok, 连续 5 次监测失败, 视为 fall。(10 分)
第一步:配置haproxy,实现动静分离,静态连接缓存服务器,动态交给webserver,主从配置都一样。

cat  /etc/haproxy/haproxy.cfg
log         127.0.0.1 local2  日志文件需要在rsyslog中配置,建立远程连接,然后在这里引用。
    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon
# turn on stats unix socket
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
    mode                    http
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close
    option forwardfor       except 127.0.0.0/8
    option                  redispatch
    retries                 3
    timeout http-request    10s
    timeout queue           1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check           10s
    maxconn                 3000
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
#frontend  main *:5000
#    acl url_static       path_beg       -i /static /images /javascript /stylesheets
#    acl url_static       path_end       -i .jpg .gif .png .css .js
#
#    use_backend static          if url_static
#    default_backend             app
listen stats
mode http
bind 0.0.0.0:1080
stats  enable
stats uri  /haproxyadmin
stats  auth  admin:admin
stats  admin  if TRUE
frontend  web
bind     :80
acl url_static       path_beg       -i /static /images /javascript /stylesheets
acl url_static       path_end       -i .jpg .gif .png .css .js
use_backend static_servers          if url_static
default_backend dynamic_servers
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static_servers
    balance     roundrobin
    server     imgserv1  192.168.253.150:6000 check inter  3000  rise 3 fall 5
    server     imgserv2  192.168.253.159:6000  check inter  3000  rise 3 fall 5
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
#backend app
#    balance     roundrobin
#    server  app1 127.0.0.1:5001 check
#    server  app2 127.0.0.1:5002 check
#    server  app3 127.0.0.1:5003 check
#    server  app4 127.0.0.1:5004 check
backend  dynamic_servers
balance   roundrobin
option   httpchk  GET          /index.html
server     lnmp1  192.168.253.150:80 check inter  3000  rise 3 fall 5
server     lnmp2   192.168.253.159:80 check inter  3000  rise 3 fall 5

7、 在 haproxy-backup 机器上配置 nfs 服务, 可供后端两台 web-server 使用, 在后端两台 webserver 用脚
本实现, 每天夜里 3 点半, 用 tar 备份/data/webapps 目录下所有文件, 并以主机名+备份完的时间命名,
上传至 haproxy-backup 服务器的/backup 目录。(10 分)
解析:
第一步:配置计划任务

vim  /etc/crontab
30 3  *  *  *   root    /root/bin/backup.sh
第二步:编写脚本

vim  backup.sh
tar -jcvf  /backup/`hostname``date +%F_%T`.tar.gz     /data/webapps/* &> /dev/null && scp /backup/`hostname``date +%F_%T`.tar.gz  172.17.254.238:/backup

8、 这四台机器都可实现互相之间 root 账号无密码的 ssh 登陆, 所有机器都启动防火墙策略, 对于 ssh 服
务, 仅允许你的 windows 和其他三台进行连接。(10 分)
解析:首先要允许自己访问

iptables  -A INPUT  -s   172.17.254.20  -p tcp -dport 22 -j ACCEPT
iptables  -A INPUT  -s   172.17.254.181  -p tcp -dport 22 -j REJECT
iptables  -A INPUT  -s   172.17.254.238  -p tcp -dport 22 -j REJECT
iptables  -A INPUT  -s   172.17.252.196  -p tcp -dport 22 -j REJECT
iptables  -A INPUT  -s  -p tcp -dport 22 -j REJECT      

9、 开启 haproxy-backup 数据库二进制日志和慢查询日志, 并实现备份策略, 要求每周日夜里三点对数据
库所有文件进行 lvm 快照, 并打包放到/backup/mysql 目录下以时间命名。 周一到周六夜里 2 点, 对二进
制日志进行打包备份, 放到/backup/mysql 目录下。(10 分)
解析:
第一步:首先自己先做个快照挂载
1、 添加硬盘, 并划分磁盘类型为lvm类型
fdisk /dev/sdb
n——t——8e
2、 partx -a /dev/sdb 使内核识别新磁盘
3、 pvcreate /dev/sdb1 添加物理卷
4、 vgcreate myvg /dev/sdb1 添加卷组
5、 lvcreate -n mydata -L 5G myvg 添加逻辑卷
6、 mkfs.ext4 /dev/mapper/myvg-mydata 格式化逻辑卷
7、 挂载mount /dev/mapper/myvg-mydata /lvm_data 使用
8、 修改Mysql配置, 使得数据文件在逻辑卷上 datadir=/lvm_data
注意这一步之前先停掉mariadb服务,然后把数据库文件移到/lvm_data下
9、 service mysqld restart 启动Mysql服务
10、 创建数据库, 进行操作
11、 mysql> FLUSH TABLES WITH READ LOCK; #锁定表
12、 lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvg-mydata #创建快照卷 Logical volume "mydata-snap" created.
13、 mysql> UNLOCK TABLES; #解锁所有表
14、 mount /dev/myvg/mydata-snap /lvm_snap/ #挂载snap
第二步:计划任务
vim /etc/crontab

  * 3   *  *   0    root /root/bin/lvm.sh
  * 2   *  *   1-6  root   /root/bin/binlog.sh     

第三步:编写脚本
1、vim /root/bin/lvm.sh

#!/bin/bash
mysql -uroot -e "FLUSH TABLES WITH READ LOCK"
tar -jcvf  /backup/mysql/`date +%F_%T`.tar.gz     /data/webapps/* &> /dev/null
mysql -uroot -e "UNLOCK TABLES"
2、 vim  /root/bin/binlog.sh
mysql -uroot -e "FLUSH TABLES WITH READ LOCK"
mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 > /backup/mysql/`date +%F_%T`.sql
mysql -uroot -e "UNLOCK TABLES"

10、 用压测工具 ab 压测网站/index.php, 每次增加 1000 并发, 观察和记录不同压测并发时, 负载均衡和
webserver1 以及 webserver2 上的 load, 内存, 网卡流量, 缓存命中率等指标。(10 分)
解析:ab是httpd包自带的软件,想要大并发还需要修改内核参数,因为每个连接都需要打开一个套接字,缓存需要用varinish stats工具查看。
ulimit -n 65535
或者

vim  /etc/security/limits.conf
*            soft         nproc           65535
*            hard         nproc           65535
*            soft         nofile          65535
*            hard         nofile          65535




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-421192-1-1.html 上篇帖子: LAMP环境的介绍 下篇帖子: LAMP介绍与基本安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表