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

[经验分享] Lvs+keepalived+lanmp搭建web框架

  [复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-3-22 09:47:26 | 显示全部楼层 |阅读模式
一、LVS-Linux Virtual Server:
二、LVS的作用:
三、LVS体系架构:
四、LVS负载均衡机制:
五、项目架构图:
六、 基础准备工作:
七、搭建-lanmp-两台web服务器:
1)Web框架:
2)搭建方式:
3)所需源码包:
4)安装开发环境:
5)编译mariadb:
6)编译apache-tomcat:
7)编译php:
8)配置apache与php:
9)编译nginx:
10)配置nginx:
11)编辑realserver脚本文件:
12)两台web服务器添加index.php用于测试:
八、配置lvs-master:
九、配置lvs-slave:
十、故障测试:





一、LVS-Linux Virtual Server:
iyunv.com-2017-3-2236.png
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。现在LVS已经是 Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

二、LVS的作用:
LVS主要用于服务器集群的负载均衡。它工作在网络层,可以实现高性能、高可用的服务器集群技术。它廉价,可把许多低性能的服务器组合在一起形成一个超级服务器。它易用,配置非常简单,且有多种负载均衡的方法。它稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果。另外可扩展性也非常好。LVS技术实现高可伸缩的、高可用的网络服务,例如WWW服务、Cache服务、DNS服务、FTP服务、MAIL服务、视频/音频点播服务等等

三、LVS体系架构:
使用LVS架设的服务器集群系统有三个部分组成:
(1)最前端的负载均衡层,用Load Balancer表示;
(2)中间的服务器集群层,用Server Array表示;
(3)最底端的数据共享存储层,用Shared Storage表示;
iyunv.com-2017-3-2237.png


四、LVS负载均衡机制:
(1)LVS是四层负载均衡,也就是说建立在OSI模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS支持TCP/UDP的负载均衡。因为LVS是四层负载均衡,因此它相对于其它高层负载均衡的解决办法,比如DNS域名轮流解析、应用层负载的调度、客户端的调度等,它的效率是非常高的。
(2)LVS的转发主要通过修改IP地址(NAT模式,分为源地址修改SNAT和目标地址修改DNAT)、修改目标MAC(DR模式)来实现。
NAT模式:网络地址转换
iyunv.com-2017-3-2238.png
 NAT(Network Address Translation)是一种外网和内网地址映射的技术。NAT模式下,网络数据报的进出都要经过LVS的处理。LVS需要作为RS(真实服务器)的网关。当包到达LVS时,LVS做目标地址转换(DNAT),将目标IP改为RS的IP。RS接收到包以后,仿佛是客户端直接发给它的一样。RS处理完,返回响应时,源IP是RS IP,目标IP是客户端的IP。这时RS的包通过网关(LVS)中转,LVS会做源地址转换(SNAT),将包的源地址改为VIP,这样,这个包对客户端看起来就仿佛是LVS直接返回给它的。客户端无法感知到后端RS的存在。

DR模式:直接路由
iyunv.com-2017-3-2239.png
  DR模式下需要LVS和RS集群绑定同一个VIP(RS通过将VIP绑定在loopback实现),但与NAT的不同点在于:请求由LVS接受,由真实提供服务的服务器(RealServer, RS)直接返回给用户,返回的时候不经过LVS。详细来看,一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,LVS只是做了一下移花接木。RS收到LVS转发来的包时,链路层发现MAC是自己的,到上面的网络层,发现IP也是自己的,于是这个包被合法地接受,RS感知不到前面有LVS的存在。而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS。

(3)DR负载均衡模式数据分发过程中不修改IP地址,只修改mac地址,由于实际处理请求的真实物理IP地址和数据请求目的IP地址一致,所以不需要通过负载均衡服务器进行地址转换,可将响应数据包直接返回给用户浏览器,避免负载均衡服务器网卡带宽成为瓶颈。因此,DR模式具有较好的性能,也是目前大型网站使用最广泛的一种负载均衡手段。

五、项目架构图:
iyunv.com-2017-3-2240.png
  (1)搭建一个四台Linux(CentOS 6.4)系统所构成的一个服务器集群,其中两台负载均衡服务器(一台为主机,另一台为备机),另外两台作为Web服务器(向外部提供http服务,这里使用lanmp架构)。
  (2)本次基于DR负载均衡模式,设置了一个VIP(Virtual IP)为192.168.80.200,用户只需要访问这个IP地址即可获得网页服务。其中,负载均衡主机为192.168.80.100,备机为192.168.80.101。Web服务器A为192.168.80.102,Web服务器B为192.168.80.103。

六、 基础准备工作:
(1)绑定静态IP地址
  命令模式下可以执行setup命令进入设置界面配置静态IP地址;x-window界面下可以右击网络图标配置;配置完成后执行service network restart重新启动网络服务;
  验证:执行命令ifconfig
(2)设定主机名
  ①修改当前会话中的主机名,执行命令hostname xxxx (这里xxxx为你想要改为的名字)
  ②修改配置文件中的主机名,执行命令vi /etc/sysconfig/network (√一般需要进行此步凑才能永久更改主机名)
  验证:重启系统reboot
(3)IP地址与主机名的绑定
  执行命令vi /etc/hosts,增加一行内容,如下(下面的从节点以你自己的为主,本实验搭建了两个从节点):
  192.168.80.100 lvs-master
  192.168.80.101 lvs-slave
  #下面是本次试验的两个真实服务器节点
  192.168.80.102 lvs-webserver1
  192.168.80.103 lvs-webserver2
  保存后退出
  验证:ping lvs-master
  (4)关闭防火墙
  ①执行关闭防火墙命令:service iptables stop
      验证:service iptables stauts
  ②执行关闭防火墙自动运行命令:chkconfig iptables off
  验证:chkconfig --list | grep iptables

七、搭建-lanmp-两台web服务器:
1)Web框架:
LANMP:将动态页面交给Apache解析,静态页面交给Nginx解析,提高解析速率。

2)搭建方式:
源码编译

3)所需源码包:
mariadb-5.5.46-linux-x86_64.tar.gz
httpd:httpd-2.4.9.tar.bz2
php-5.4.26.tar.bz2
nginx-1.8.1.tar.gz

4)安装开发环境:
因为采用的搭建方式为源码编译方式,所以需要安装开发环境。
yum -y groupinstall "Development Tools" "Server Platform Development"
yum -y install pcre-devel openssl-devel zlib-devel apr-devel apr-util-devel libxml2-devel libmcrypt-devel bzip2-devel

5)编译mariadb:
[iyunv@lvs-webserver ~]# yum -y remove mariadb*   
[iyunv@lvs-webserver ~]# tar xf mariadb-5.5.46-linux-x86_64.tar.gz -C /usr/local/
[iyunv@lvs-webserver ~]# cd /usr/local/
[iyunv@lvs-webserver local]# ln -sv mariadb-5.5.46-linux-x86_64 mysql ‘mysql’ -> ‘mariadb-5.5.46-linux-x86_64’
[iyunv@lvs-webserver local]# id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)
[iyunv@lvs-webserver local]# cd mysql/
[iyunv@lvs-webserver mysql]# chown -R root:mysql ./*       ——链接文件赋权规则
[iyunv@lvs-webserver mysql]# mkdir /mydata/data -p
[iyunv@lvs-webserver mysql]# chown -R mysql.mysql /mydata/data/
[iyunv@lvs-webserver mysql]# cp support-files/my-large.cnf  /etc/my.cnf
[iyunv@lvs-webserver mysql]# vim /etc/my.cnf        ——添加下三行
添加:
datadir = /mydata/data
skip_name_resolve = ON
innodb_file_per_table = ON
[iyunv@lvs-webserver mysql]# cp support-files/mysql.server /etc/rc.d/init.d/mysqld
[iyunv@lvs-webserver mysql]# chkconfig --add mysqld
[iyunv@lvs-webserver mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data
[iyunv@lvs-webserver mysql]# ls /mydata/data/
aria_log.00000001 mysqlmysql-bin.000002 performance_schema
aria_log_control mysql-bin.000001 mysql-bin.index test
[iyunv@lvs-webserver mysql]# service mysqld start
Starting MySQL.. SUCCESS!
[iyunv@lvs-webserver mysql]# ss -tnl
State       Recv-Q Send-Q Local Address:Port               Peer Address:Port              
LISTEN      0      50              *:3306                        *:*                  
LISTEN      0      128             *:80                          *:*                  
LISTEN      0      128             *:22                          *:*                  
LISTEN      0      128             *:808                         *:*  
[iyunv@lvs-webserver mysql]# vim /etc/profile.d/mysql.sh                              ——命令调用
export PATH=/usr/local/mysql/bin:$PATH
[iyunv@lvs-webserver mysql]# . /etc/profile.d/mysql.sh  

6)编译apache-tomcat:
[iyunv@lvs-webserver ~]# yum groupinstall "Development Tools" "Server Platform Development" -y
[iyunv@lvs-webserver ~]# yum -y install pcre-devel openssl-devel zlib-devel
[iyunv@lvs-webserver ~]# tar xf httpd-2.4.9.tar.bz2
[iyunv@lvs-webserver ~]# cd httpd-2.4.9/
[iyunv@lvs-webserver httpd-2.4.9]# yum -y install apr-devel apr-util-devel
[iyunv@lvs-webserver httpd-2.4.9]# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24--enable-so --enable-ssl -- enable-rewrite --with-zlib --with-pcre --with-apr=/usr --with-apr-util=/usr --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
[iyunv@lvs-webserver httpd-2.4.9]# make -j 4 && make install
[iyunv@lvs-webserver profile.d]# cat /etc/profile.d/http24.sh
export PATH=/usr/local/apache24/bin:$PATH
[iyunv@lvs-webserver apache24]# . /etc/profile.d/httpd24.sh

7)编译php:
[iyunv@lvs-webserver ~]# yum -y install libxml2-devel libmcrypt-devel bzip2-devel [iyunv@lvs-webserver ~]# tar xf php-5.4.26.tar.bz2
[iyunv@lvs-webserver ~]# cd php-5.4.26/
[iyunv@lvs-webserver php-5.4.26]# ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-openssl --with-mysqli=/usr/local/mysql/bin/mysql_config --enable-mbstring --with-png-dir --with-jpeg-dir --with-freetype-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-apxs2=/usr/local/apache24/bin/apxs --with-mcrypt --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-bz2
[iyunv@lvs-webserver php-5.4.26]# make && make install

8)配置apache与php映射:
[iyunv@lvs-webserver php-5.4.26]# cp /root/php-5.4.26/php.ini-production /etc/php.ini [iyunv@lvs-webserver php-5.4.26]# cd /etc/httpd24/
[iyunv@lvs-webserver httpd24]# cp httpd.conf{,.backup}
[iyunv@lvs-webserver httpd24]# vim httpd.conf
添加:
AddType application/x-httpd-php .php
DirectoryIndex index.php index.html
Listen  808                 ——修改协议端口(因为这是自己编译的apache)
[iyunv@lvs-webserver httpd24]# apachectl stop
[iyunv@lvs-webserver httpd24]# apachectl start
[iyunv@lvs-webserver httpd24]# vim /usr/local/apache24/htdocs/index.php [iyunv@lvs-webserver httpd24]# rm /usr/local/apache24/htdocs/index.html
[iyunv@lvs-webserver httpd24]# firefox http://localhost:808

9)编译nginx:
[iyunv@lvs-webserver ~]# tar xf nginx-1.8.1.tar.gz

[iyunv@lvs-webserver nginx-1.8.1]# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --user=nginx --group=nginx --error-log-path=/var/log/nginx/error.log  --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --with-http_ssl_module --with-http_gzip_static_module --with-debug --with-http_stub_status_module

[iyunv@lvs-webserver nginx-1.8.1]# make && make install
[iyunv@lvs-webserver nginx-1.8.1]# useradd nginx
root@server nginx]# vim /etc/profile.d/nginx.sh
export PATH=/usr/local/nginx/sbin:$PATH
[iyunv@lvs-webserver nginx]# .  /etc/profile.d/nginx.sh
[iyunv@lvs-webserver nginx]# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful
[iyunv@lvs-webserver nginx]# nginx -h
nginx version: nginx/1.8.1

Usage: nginx [-?hvVtq] [-s signal] [-c filename] [-p prefix] [-g directives]

Options:

-?,-h: this help

-v: show version and exit

-V: show version and configure options then exit

-t: test configuration and exit

-q: suppress non-error messages during configuration testing

-s signal: send signal to a master process: stop, quit, reopen, reload
-p prefix  : set prefix path (default: /usr/local/nginx/)
-c filename : set configuration file (default: /etc/nginx/nginx.conf)
-g directives : set global directives out of configuration file
[iyunv@lvs-webserver html]# nginx      ——启动nginx

10)配置nginx:
[iyunv@lvs-webserver html]# vim /etc/nginx/nginx.conf
添加:
upstream lamp {——虚拟主机,做反向代理
server 127.0.0.1:808 weight=1 max_fails=2 fail_timeout=30s;
}
        location / {
           root  /usr/local/apache24/htdocs ;
           index  index.html index.htm index.php;
       }

location ~.*\.(php|jsp|cgi)?$——动态页面给lamp执行
{
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://lamp;
}

location ~.*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css)$ ——静态页面自己执行
{
root /usr/local/apache24/htdocs;
expires 3d;
}
11)编辑realserver脚本文件
[iyunv@lvs-webserver ~]# vim  /etc/init.d/realserver
SNS_VIP=192.168.80.200#这里我们设置虚拟IP为:192.168.80.200
/etc/rc.d/init.d/functionscase "$1" in
start)
       ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP
       /sbin/route add -host $SNS_VIP dev lo:0
       echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
       sysctl -p >/dev/null 2>&1
       echo "RealServer Start OK"
       ;;
stop)
       ifconfig lo:0 down
       route del $SNS_VIP >/dev/null 2>&1
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
       echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
       echo "RealServer Stoped"
       ;;*)
       echo "Usage: $0 {start|stop}"
       exit 1esac
exit 0
[iyunv@lvs-webserver ~]# chmod 755 realserver             #保存脚本文件后更改该文件权限:
[iyunv@lvs-webserver ~]# service realserver start     #开启realserver服务:

12)两台web服务器添加index.php用于测试:
192.168.80.102:vim /usr/local/apache24/htdocs/index.php
From 192.168.80.102

192.168.80.103:vim /usr/local/apache24/htdocs/index.php
From 192.168.80.103

八、配置lvs-master:
[iyunv@lvs-master ~]# yum install -y keepalived
[iyunv@lvs-master ~]# vim /etc/keepalived/keepalived.conf
global_defs {  
   notification_email {  
         edisonchou@hotmail.com  
   }  
   notification_email_from sns-lvs@gmail.com  
   smtp_server 192.168.80.1  
   smtp_connection_timeout 30
   router_id LVS_MASTER  # 设置lvs的id,在一个网络内应该是唯一的
}  
vrrp_instance VI_1 {  
    state MASTER   #指定Keepalived的角色,MASTER为主,BACKUP为备         
    interface eth1  #指定Keepalived的角色,MASTER为主,BACKUP为备
    virtual_router_id 51 #虚拟路由编号,主备要一致
    priority 100  #定义优先级,数字越大,优先级越高,主DR必须大于备用DR   
    advert_int 1  #检查间隔,默认为1s
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.80.200  #定义虚拟IP(VIP)为192.168.2.33,可多设,每行一个
    }  
}  
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.80.200 80 {  
    delay_loop 6 # 设置健康检查时间,单位是秒                    
    lb_algo wrr # 设置负载调度的算法为wlc                  
    lb_kind DR # 设置LVS实现负载的机制,有NAT、TUN、DR三个模式   
    nat_mask 255.255.255.0               
    persistence_timeout 0         
    protocol TCP                  
    real_server 192.168.80.102 80 {  # 指定real server1的IP地址
        weight 3   # 配置节点权值,数字越大权重越高              
        TCP_CHECK {  
        connect_timeout 10         
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
    }  
    real_server 192.168.80.103 80 {   # 指定real server2的IP地址
        weight 3  # 配置节点权值,数字越大权重越高  
        TCP_CHECK {  
        connect_timeout 10  
        nb_get_retry 3  
        delay_before_retry 3  
        connect_port 80  
        }  
     }  
}
[iyunv@lvs-master ~]#service keepalived start   #开启keepalived服务

九、配置lvs-slave:
从负载服务器与主负载服务器大致相同,只是在keepalived的配置文件中需要改以下两处:
  (1)将route_id由MASTER改为BACKUP
  (2)将state由MASTER改为BACKUP
  (3)将priority由100改为99
global_defs {  
   notification_email {  
         edisonchou@hotmail.com  
   }  
   notification_email_from sns-lvs@gmail.com  
   smtp_server 192.168.80.1  
   smtp_connection_timeout 30
   router_id LVS_BACKUP  # 设置lvs的id,在一个网络内应该是唯一的
}  
vrrp_instance VI_1 {  
    state BACKUP # 这里改为BACKUP
    interface eth1  
    virtual_router_id 51  
    priority 99 # 这里改为99,master优先级是100
    advert_int 1  
    authentication {  
        auth_type PASS  
        auth_pass 1111  
    }  
    virtual_ipaddress {  
        192.168.80.200  
    }  
}  

十、故障测试:
1、指定请求的均衡转发:因为两个Web服务器的权重一样,所以会依次转发给两个Web服务器;
访问网站:http://192.168.80.200
效果:刷新交替出现from 192.168.80.102与from 192.168.0.103

2、模拟lvs-master故障,lvs-master:service keepalived stop
访问网站http://192.168.80.200
效果:刷新交替出现from 192.168.80.102与from 192.168.0.103

3、模拟lvs-webserver1故障,lvs-webserver1:nginx -s stop
访问网站http://192.168.80.200
效果:只出现from 192.168.80.103
恢复webserver1,lvs-webserver1:nginx
访问网站http://192.168.80.200
效果:刷新交替出现from 192.168.80.102与from 192.168.0.103

4、模拟lvs-webserver2故障,lvs-webserver2:nginx -s stop
访问网站http://192.168.80.200
效果:只出现from 192.168.80.102
恢复webserver2,lvs-webserver2:nginx
访问网站http://192.168.80.200
效果:刷新交替出现from 192.168.80.102与from 192.168.0.103




运维网声明 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-353407-1-1.html 上篇帖子: linux-LVS负载均衡 下篇帖子: lvs+keepalive
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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