介绍
keepalived
keepalived是一个使用C语言编写的路由软件,设计目的是为Linux系统和基于Linux的虚拟架构提供简单而强大的负载均衡和高可用设施。负载均衡依赖于广泛使用的LIinux虚拟服务器(IPVS)内核模块,提供四层的负载均衡;keepalived实现了一组检查程序,可以根据其运行状态动态的自适应地维护和管理负载均衡服务器池。另一方面,VRRP(虚拟路由冗余协议)实现了高可用性协议。
keepalived常用来检测服务的状态,实现多种服务的高可用性:如果有一台web服务器宕机,或者出现故障,无法正常对外提供服务,keepalived将会检测到该故障,并且将故障的服务器从系统中去除,同时使用其他的服务器代替该服务器的工作,当服务器被人工修复之后,keepalived会自动将其加入集群。
haproxy
HAProxy也是使用C语言开发的基于TCP和HTTP的应用程序代理软件。HAProxy适合于负载较大的web站点,这些站点通常会需求会话保持机制和七层的报文请求处理,HAProxy则是同时兼顾了这两项功能。HAProxy可以支持很高的并发连接处理,配置简单,结构清晰。还可以保护web站点不会直接暴露在互联网上。
HAProxy是基于事件驱动,单一进程的模型,能够支持非常大的并发连接数。现在众多站点都在使用HAProxy,例如: GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti等。
varnish
varnish是一款高性能的开源HTTP缓存加速器,同时还提供反向代理功能。varnish是基于内存缓存的,内存读写效率远远高于硬盘,重启后数据会丢失;支持精确的缓存时间设定;VCL的配置和管理都比较灵活;管理功能强大。
varnish处理请求过程
1.varnish在获取客户端请求之后,由vcl_recv状态引擎进行处理,无法识别的请求会通过pipe提交给vcl_pipe状态引擎,需要查找缓存的请求用过lookup参数交给vcl_hash状态引擎处理,无需缓存的数据则是通过pass交给vcl_pass状态引擎。
2.vcl_hash状态引擎在接收到请求后会从缓存中查找数据,查询结果会返回hit缓存命中或者是miss缓存未命中。
3.vcl_hit状态引擎将命中的缓存数据通过参数deliver交给vcl_deliver引擎,待数据处理完成之后最终将数据返回给客户端。
4.vcl_miss引擎将未命中的结果通过参数fetch交给vcl_fetch,vcl_fetch会从数据库中查找数据。
5.vcl_fetch将从数据库中找到的结果,返回给vcl_deliver引擎。
6.vcl_deliver状态引擎将结果返回给master进程,进而返回给客户端。
实验构建
设计架构
前端代理层使用HAProxy进行代理,同时使用keepalived实现代理层的高可用;之后的缓存层,使用varnish进行缓存页面,这里可以使用多台varnish,在HAProxy中配置基于uri的调度的一致性哈希算法;后端web层,采用了nginx+php-fpm的设计,nginx相对httpd更加轻量,同硬件配置下可以提供更多的并发请求处理;数据库采用mysql;站点文件则是放置于NFS服务器上,通过nfs挂载到众多web服务器上。
设计图如下
设计环境介绍
部署软件 | 系统环境 | |
---|---|---|
192.168.99.130 | HAProxy+keepalived | CentOS7.4 |
192.168.99.131 | HAProxy+keepalived | CentOS7.4 |
192.168.99.132 | Varnish | CentOS7.4 |
192.168.99.133 | Nginx+PHP-FPM | CentOS7.4 |
192.168.99.134 | Nginx+PHP-FPM | CentOS7.4 |
192.168.99.135 | NFS | CentOS7.4 |
192.168.99.136 | Mariadb-server | CentOS7.4 |
实验搭建
一.mysql与NFS的配置
1.在192.168.99.136上安装数据库软件
yum install mariadb-server -y
systemctl start mariadb
2.创建供wordpress站点使用的数据库和用户
#登陆数据库,初始可以直接使用mysql命令登陆,设置密码后要使用mysql -u(用户名) -p(密码) -h(数据库所在机器的ip)一般在本机登陆不使用-h
mysql
#创建数据库wp
MariaDB [(none)]> create database wp;
#授权用户和可访问的ip段
MariaDB [(none)]> grant all on wp.* to wp_admin@'192.168.99.%' identified by 'centos';
# 刷新授权信息
MariaDB [(none)]> flush privileges;
3.在192.168.99.135上部署nfs服务
yum instlal nfs-utils -y
4.创建共享目录,修改配置文件
mkdir /share
#修改配置文件
vim /etc/exports
/share 192.168.99.0/24(rw,async,no_root_squash)
#解压wordpress并修改配置,创建检查页
tar xvf wordpress-4.9.4-zh_CN.tar.gz
#重命名示例配置文件
mv wordpress/wp-config.sample.php wordpress/wp-config.php
#编辑配置文件
vim wordpress/wp-config.php
#在share目录下创建一个隐藏的php信息页,方便varnish检查服务是否允许正常
vim /share/.check.php
systemctl start nfs
#查看对应主机的共享目录
showmount -e 192.168.99.135
#检查无误后nfs配置结束
二.web站点搭建
在192.168.99.133和192.168.99.134上部署nginx和php-fpm,由于2台机器部署完全相同,所以我这里仅仅展示其中一台的部署过程。
1.安装nginx,php-fpm和nfs-utils(挂载目录使用)
yum install nginx php-fpm nfs-utils -y
2.修改nginx配置文件,由于nginx和php未分离,所以php的配置文件基本无需修改。
#修改nginx默认配置文件。
vim /etc/nginx/nginx.conf
#创建站点根目录方便稍后挂载
mkdir /web
#编辑自定义配置文件
vim /etc/nginx/conf.d/vhost.conf
server {
#设置默认访问站点
listen 80 default_server;
server_name www.douma.com;
#web站点根目录
root /web;
index index.php index.html;
#配置php转发规则
location ~* \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /web$fastcgi_script_name;
}
location / {
}
}
mount -t nfs 192.168.99.135:/share /web
4.启动nginx和php-fpm服务
systemctl start nginx php-fpm
三.varnish配置
1.安装varnish程序
yum install varnish -y
2.修改默认端口
vim /etc/varnish/varnish.params
vim /etc/varnish/default.vcl
vcl 4.0;
#导入调度器模块
import directors; # load the directors
#配置健康状态检查信息
probe phpcheck {
.url = "/.check.php";
.timeout = 3s;
.interval = 2s;
.window = 3;
.threshold = 2;
}
#设置后端主机信息
backend default1 {
.host = "192.168.99.133";
.port = "80";
.probe = phpcheck;
}
backend default2 {
.host = "192.168.99.134";
.port = "80";
.probe = phpcheck;
}
#配置代理后端服务器的调度方法,这里使用了round_robin轮询
sub vcl_init {
new phpweb = directors.round_robin();
phpweb.add_backend(default1);
phpweb.add_backend(default2);
}
sub vcl_recv {
if (req.url ~ "^/$") {
unset req.http.cookie;
}
}
#强制取消匹配资源的cookie信息并设置缓存时间方便缓存
sub vcl_backend_response {
if (bereq.url ~ "(?i)\.(jpg|jpeg|png|gif|css|js)$") {
unset beresp.http.Set-Cookie;
set beresp.ttl = 3600s;
}
}
#显示是否能够命中缓存
sub vcl_deliver {
if (obj.hits>0) {
set resp.http.X-Cache = "HIT via" + " " + server.ip;
} else {
set resp.http.X-Cache = "MISS from " + server.ip;
}
}
#varnish的数据全保存在内存中,一旦重启服务,缓存会全部丢失,所以尽量不要重服务,可以采用其他防范清理不用的缓存。
systemctl start varnish
四.keepalived高可用HAProxy
1.安装HAProxy和keepalived
#psmisc是为了使用killall监控haproxy进程状态
yum install keepalived haproxy psmisc -y
2.编辑haproxy的配置文件
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local2
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
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
frontend nginx
bind :80
default_backend varnish
#配置监控页面和对应的访问账号密码
listen stats
bind :9091
stats enable
stats auth admin:admin
stats admin if TRUE
#配置基于uri的一致性哈希调度算法,由于机器有限,仅做了一台varnish,构建varnish集群的时候,采用uri的一致性哈希有助于使得不同的varnish机器可以均衡的负担站点的热区数据而不造成大量重复缓存。
backend varnish
balance uri
hash-type consistent
server nginx1 192.168.99.132:80 check
3.启动HAProxy服务
systemctl start haproxy
#另一台主机同样配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalivedlocalhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAProxy
vrrp_skip_check_adv_addr
vrrp_mcast_group4 224.0.99.66
}
#检测haproxy状态,haproxy停止后会降低权重,ip游离
vrrp_script chk_haproxy {
script "killall -0 haproxy && exit 0 || exit 1"
interval 1
weight -5
fall 2
rise 1
}
#定义具体实例
vrrp_instance VI_1 {
state MASTER #在从节点要设置为BACKUP
interface ens33
virtual_router_id 66
priority 100 #从节点权重要低一点,方便ip游离
advert_int 1
authentication {
auth_type PASS
auth_pass douma123
}
virtual_ipaddress {
192.168.99.200/24 dev ens33 label ens33:1
}
track_script {
chk_haproxy
}
#配置警信息记录keepalived的状态转换
notify_master "/etc/keepalived/notice.sh master"
notify_backup "/etc/keepalived/notice.sh backup"
notify_fault "/etc/keepalived/notice.sh fault"
}
#notice.sh实例
#!/bin/bash
notify() {
echo "haproxy1 is $1" >> /root/haproxy.log
echo `date +%F-%T` >> /root/haproxy.log
echo >> /root/haproxy.log
}
case $1 in
master)
notify master
;;
backup)
notify backup
;;
fault)
notify fault
;;
*)
echo "Usage: $(basename $0) {master|backup|fault}"
exit 1
;;
esac
下面放备用节点的配置
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from keepalivedlocalhost
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id HAProxy
vrrp_skip_check_adv_addr
vrrp_mcast_group4 224.0.99.66
}
vrrp_script chk_haproxy {
script "killall -0 haproxy && exit 0 || exit 1"
interval 1
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 66
priority 98
advert_int 1
authentication {
auth_type PASS
auth_pass douma123
}
virtual_ipaddress {
192.168.99.200/24 dev ens33 label ens33:1
}
track_script {
chk_haproxy
}
notify_master "/etc/keepalived/notice.sh master"
notify_backup "/etc/keepalived/notice.sh backup"
notify_fault "/etc/keepalived/notice.sh fault"
}
6.启动keepalived
systemctcl start keepalived
简单性能测试
环境:
1核cpu 512M内存(虚拟机性能渣简单测测)
测试命令
#依赖于httpd-tools工具包
ab -c100 -n2000 http://192.168.99.133/.check.php
直接访问nginx+php-fpm的测试
直接访问varnish服务器的测试
总结
使用了varnish缓存可以明显看出有很大的提升,因此针对不常变化的静态资源使用缓存可以明显提高用户的访问速度。同时也可以大大减轻后端web服务器的压力。
ansible剧本
随着部署机器的数量越来越多,单纯的手工配置将会花费大量的时间,因此使用自动化运维工具变得越来越迫切,这里提供了一个简单配置本实验的剧本,作为新手不太会写,只是提个思路
共享地址
https://pan.baidu.com/s/1tfNdVQWhrkxM-7rLtM6_Bw