要求: 每个人准备 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
第六步:在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