首页 > 代码库 > haproxy+keepalived双主模型及动静分离的实现

haproxy+keepalived双主模型及动静分离的实现

实验目标:
1、haproxy统计页面的输出机制;
2、haproxy动静分离机制;
3、基于keepalived的高可用实现;


wKiom1Nk6F-DrQq_AAC8eJoOYbw122.jpg

wKioL1Nk6Dug-IDRAACF1wpKryI319.jpg


环境: vm8虚拟机
操作系统: centos 6.4
内核版本: 2.6.32-358.el6.x86_64
注:
(1) 每个haproxy各有两块网卡,外网网卡选择Bridge,内网网卡选择Vmnet2;
(2) 内部两台web服务器的网卡都是选择Vmnet2;


一、准备工作:
1、各节点IP地址相关设置
node1:  ifconfig eth1 192.168.16.15/24 up
node2:  ifconfig eth1 192.168.16.16/24 up
node3:  ifconfig eth0 192.168.16.17/24 up
route add default gw 192.168.16.15
node4:ifconfig eth0 192.168.16.18/24 up
            route add default gw 192.168.16.15

2、设置主机名
1) 临时设置主机名,即时生效
node1:  hostname node1.ja.com
node2:  hostname node2.ja.com
node3:  hostname node3.ja.com
node4:  hostname node4.ja.com
2) 确保主机重启之后,主机名仍保持不变
node1:  sed -i ‘s/\(HOSTNAME=\).*/\1node1.ja.com/‘ /etc/sysconfig/network
node2:  sed -i ‘s/\(HOSTNAME=\).*/\1node2.ja.com/‘ /etc/sysconfig/network
node3:  sed -i ‘s/\(HOSTNAME=\).*/\1node3.ja.com/‘ /etc/sysconfig/network
node4:  sed -i ‘s/\(HOSTNAME=\).*/\1node4.ja.com/‘ /etc/sysconfig/network

3、添加主机名称解析,在各节点执行如下操作:
cat >ed.txt<<EOF
\$a\172.16.16.15  node1.ja.com
\$a\192.168.16.15 node1.ja.com
\$a\192.168.16.16 node2.ja.com
\$a\192.168.16.17 node3.ja.com
\$a\192.168.16.18 node4.ja.com
EOF
sed -i -f ed.txt /etc/hosts

4、配置各节点与控制端的互信
# ssh-keygen -t rsa -P ‘‘
# ssh-copy-id -i .ssh/id_rsa.pub node2.ja.com
# ssh-copy-id -i .ssh/id_rsa.pub node3.ja.com
# ssh-copy-id -i .ssh/id_rsa.pub node4.ja.com
测试主机互信是否成功
# for i in `seq 2 4`;do ssh node$i.ja.com ‘date‘ &>/dev/null;done

5、各节点时间的时间同步
1) 命令行同步,立即生效:
ssh node2.ja.com ‘ntpdate 172.16.0.1‘;ntpdate 172.16.0.1
2) 设置定时任务,永久有效:
echo ‘*/5 * * * * /usr/sbin/ntpdate 172.16.0.1 &>/dev/null;/sbin/hwclock -s‘ >>/var/spool/cron/root


二、各节点的软件安装与配置
1、haproxy的安装与配置
node1:
==========================================================================================
# yum -y install haproxy
# cd /etc/haproxy/
# cp haproxy.cfg{,.ori}
# egrep -v ‘^$|^[[:space:]]*#‘ /etc/haproxy/haproxy.cfg
global
   log         127.0.0.1 local2
   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   user        haproxy
   group       haproxy
   daemon
   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 webserver
   bind *:80
   acl url_static       path_beg       -i /static /images /javascript /stylesheets
   acl url_static       path_end       -i .jpg .gif .png .css .js .html
   acl host_static      hdr_beg(host)  -i img. video. download. ftp. imgs. image. videos.
   acl url_php         path_end    -i .php
   use_backend static         if url_static or host_static
   use_backend dynamic           if url_php
   default_backend            dynamic
backend static
    balance     roundrobin
    server      node3 192.168.16.17:80  check maxconn 3000
backend dynamic
   balance     roundrobin
   server      node4 192.168.16.18:80 check maxconn 1000
==========================================================================================


2、定义haproxy日志记录
==========================================================================================
# vim /etc/haproxy/haproxy.cfg
   global
      log     127.0.0.1 local2    将自己的日志交给本机的rsyslog去管理
# vim  /etc/rsyslog.conf
启用下面几项(UDP或TCP其中之一即可),将rsyslog.conf作为日志服务器来工作
第一步:启动可以帮助服务器记录日志的功能
     # Provides UDP syslog reception
        $ModLoad imudp
        $UDPServerRun 514
    # Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514
第二步:定义记录日志的设施
       local2.*        /var/log/haproxy.log
保存退出并重启rsyslog,haproxy 查看是否开始记录日志了
# service rsyslog restart
# service haproxy reload
在浏览器访问测试,然后查看日志,看是否记录日志了
# tail /var/log/haproxy.log

保持node1,node2上haproxy.cfg配置文件内容保持一致
在node1上操作:
# cd /etc/haproxy/
# scp -p haproxy.cfg node2.ja.com:/etc/haproxy/
在node2上操作:
编辑node2的/etc/rsyslog.conf,启用或添加内容同node1
至此,haproxy基本配置完毕!!!
==========================================================================================


3、WEB服务器配置
==========================================================================================
1) node3:  使用nginx处理静态页面
yum源中没有nginx,epel源中有nginx,所以需要先安装epel源
# rpm -ivh nginx-release-centos-6-0.el6.ngx.noarch.rpm
# yum -y install nginx
# echo "node3.ja.com" >/usr/share/nginx/html/index.html
# service nginx start
# chkconfig nginx on
查看nginx是否可以正常提供的web服务
# curl http://172.16.16.17

2) node4: 使用apache处理动态页面
# yum -y install httpd php php-mysql
# echo "node4.ja.com" >/var/www/html/index.php
# service httpd start
# chkconfig httpd on
查看nginx是否可以正常提供的web服务
# curl http://172.16.16.18

3) 通过浏览器直接访问node3,node4上的web服务,看是否可以web服务器是否工作正常
wKioL1Nk6RPABWoiAABiay9-7j4076.jpg


4) 分别为node3,node4提供动静测试页
node3:
# cd /usr/share/nginx/html/
# for i in `seq 10`;do echo "<h1>node3.test$i</h1>" >test$i.html;done
# vim /usr/share/nginx/html/index.php
Welcome to node3.jacom
<?php
      phpinfo();
?>

node4:
# cd /usr/share/nginx/html/
# for i in `seq 10`;do echo "<h1>node4.test$i</h1>" >test$i.html;done
# vim /usr/share/nginx/html/index.php
Welcome to node4.jacom
<?php
      phpinfo();
?>
==========================================================================================


实现第一个目标:haproxy统计页面的输出机制
============================================================================================
在浏览器输入http://www.ja.com:7007/hpadmin?stats并回车,即会弹出如下身份验证的窗口,此时只需输入在haproxy中设置的用户名和密码即可

wKiom1Nk6X2AvjGYAAB1nCVp1hs436.jpg


如下截图:即为成功登陆后,看到的内容

wKioL1Nk6cSwQH9nAAjsTkjiFo4462.jpg


实现第二个目标: haproxy动静分离机制
============================================================================================

wKioL1Nk6l-htptXAACEW-rjE_U004.jpg

wKiom1Nk6o_QcXreAAENDr4QgCg506.jpg


============================================================================================


实现第三个目标: 基于keepalived的高可用实现
============================================================================================
node1: 模拟node1上的haproxy服务意外关闭,看haproxy服务是否能够实现故障转移
# service haproxy stop
# service haproxy status
haproxy is stopped
浏览器访问测试,验证高可用效果

我们在浏览器请求某一图片资源,依然可以得到相应,就表示我们前端至少还有一个haproxy仍在工作着,及haproxy实现了高可用

wKiom1Nk65OBP0PhAABm7STjShM840.jpg

wKioL1Nk6xyRJoVLAAGfcS8EQbI988.jpg

wKiom1Nk60-TOEfgAAES8X5xTgM160.jpg





本文出自 “Enjoy the process” 博客,请务必保留此出处http://1757513075.blog.51cto.com/8607255/1405834