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

[经验分享] keepalived高可用haproxy+varnish+lnmp实现站点搭建与ansible实现

[复制链接]

尚未签到

发表于 2018-12-28 13:20:22 | 显示全部楼层 |阅读模式
介绍
    

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



5.启动nfs服务,并查看共享目录


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 / {
}
}


3.挂载nfs共享文件


mount -t nfs 192.168.99.135:/share /web
  4.启动nginx和php-fpm服务

systemctl start nginx php-fpm
  5.检查是否能够正常访问

6.配置完成,另一台依次配置即可
  

三.varnish配置
    
1.安装varnish程序

yum install varnish -y
  2.修改默认端口

vim /etc/varnish/varnish.params


3.添加默认配置


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;
}
}


4.启动varnish


#varnish的数据全保存在内存中,一旦重启服务,缓存会全部丢失,所以尽量不要重服务,可以采用其他防范清理不用的缓存。
systemctl start varnish
  5.验证访问


    

四.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
#另一台主机同样配置
  4验证



5.配置keepalived

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
  7.在主节点上关闭haproxy查看ip游离状态



  

简单性能测试
    

环境:
    
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




运维网声明 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-656909-1-1.html 上篇帖子: Keepalived与LVS 下篇帖子: CentOS 7.0 安装keepalived-12163069
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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