keepalived是一个使用C语言编写的路由软件,设计目的是为Linux系统和基于Linux的虚拟架构提供简单而强大的负载均衡和高可用设施。负载均衡依赖于普遍使用的LIinux虚拟服务器(IPVS)内核模块,提供四层的负载均衡;keepalived实现了一组检查程序,能够根据其运行状态动态的自适应地维护和管理负载均衡服务器池。另外一方面,VRRP(虚拟路由冗余协议)实现了高可用性协议。
keepalived经常使用来检测服务的状态,实现多种服务的高可用性:若是有一台web服务器宕机,或者出现故障,没法正常对外提供服务,keepalived将会检测到该故障,而且将故障的服务器从系统中去除,同时使用其余的服务器代替该服务器的工做,当服务器被人工修复以后,keepalived会自动将其加入集群。
php
HAProxy也是使用C语言开发的基于TCP和HTTP的应用程序代理软件。HAProxy适合于负载较大的web站点,这些站点一般会需求会话保持机制和七层的报文请求处理,HAProxy则是同时兼顾了这两项功能。HAProxy能够支持很高的并发链接处理,配置简单,结构清晰。还能够保护web站点不会直接暴露在互联网上。
HAProxy是基于事件驱动,单一进程的模型,可以支持很是大的并发链接数。如今众多站点都在使用HAProxy,例如: GitHub、Bitbucket、Stack Overflow、Reddit、Tumblr、Twitter和 Tuenti等。
css
varnish是一款高性能的开源HTTP缓存加速器,同时还提供反向代理功能。varnish是基于内存缓存的,内存读写效率远远高于硬盘,重启后数据会丢失;支持精确的缓存时间设定;VCL的配置和管理都比较灵活;管理功能强大。
html
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服务器上。
设计图以下
mysql
部署软件 | 系统环境 | |
---|---|---|
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 |
1.在192.168.99.136上安装数据库软件nginx
yum install mariadb-server -y systemctl start mariadb
2.建立供wordpress站点使用的数据库和用户web
#登录数据库,初始能够直接使用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服务redis
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 <?php phpinfo(); ?>
5.启动nfs服务,并查看共享目录sql
systemctl start nfs #查看对应主机的共享目录 showmount -e 192.168.99.135 #检查无误后nfs配置结束
在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.配置完成,另外一台依次配置便可
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.验证访问
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
屡次测试后,取了较为稳定的结果
屡次测试后,取了较为稳定的结果
使用了varnish缓存能够明显看出有很大的提高,所以针对不常变化的静态资源使用缓存能够明显提升用户的访问速度。同时也能够大大减轻后端web服务器的压力。
随着部署机器的数量愈来愈多,单纯的手工配置将会花费大量的时间,所以使用自动化运维工具变得愈来愈迫切,这里提供了一个简单配置本实验的剧本,做为新手不太会写,只是提个思路
共享地址
https://pan.baidu.com/s/1tfNdVQWhrkxM-7rLtM6_Bw