lvs+keepalived+nginx+tomcat高可用负载均衡集群配置

1.前言

     我采用的LVS-DR直接路由的方式进行配置,该方式请求由LVS接收,由真实提供服务的服务器(Real Server)直接返回给用户,返回的时候不经过LVS。如果完全不清楚LVS-DR模式的童鞋需要查询相关资料了解一下。

     DR模式下需要LVS服务器和RS绑定同一个VIP, 一个请求过来时,LVS只需要将网络帧的MAC地址修改为某一台RS的MAC,该包就会被转发到相应的RS处理,注意此时的源IP和目标IP都没变,RS收到LVS转发来的包,发现MAC是自己的,发现IP也是自己的,于是这个包被合法地接受,而当RS返回响应时,只要直接向源IP(即用户的IP)返回即可,不再经过LVS,因此,LVS服务器和RS在同一个物理网段上。

特性:

前端路由将目标地址为VIP报文统统发给Director Server

RS跟Director Server必须有一个网卡在同一个物理网络中

所有的请求报文经由Director Server,但响应报文必须不能经过Director Server

2.准备工作

第一步:准备工作系统使用的是 centos6

lvs+keepalived director server:

    demo01:192.168.0.6

    demo02:192.168.0.8

nginx两台ip:

    demo03:192.168.0.7

    demo04:192.168.0.9

tomcat两台ip:

    192.168.0.10

    192.168.0.11

VIP虚拟ip:

    192.168.0.155

手动配置静态ip:

centos的图形界面修改setup

修改完成之后 由于ONBOOT=NO,必须将其改为yes

vi /etc/sysconfig/network-scripts/ifcfg-eth0

DEVICE=eth0

BOOTPROTO=none

HWADDR=00:0c:29:57:a7:15

NM_CONTROLLED=yes

ONBOOT=yes

TYPE=Ethernet

UUID="9560d15f-f413-4da7-994e-bc82f538ffcd"

IPADDR=192.168.1.6

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

DNS1=192.168.1.1

IPV6INIT=no

USERCTL=no

修改完成之后 service network restart

第二步 给director server和nginx四台机子的防火墙添加80端口

给tomcat两台添加8080端口

vi + /etc/sysconfig/iptables

然后输入i进行修改模式,然后将下面内容增加到文件中

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

最后esc:wq 保存退出

重启防火墙

service iptables restart

3.lvs director server和real server的安装配置

    192.168.0.6

    192.168.0.8

设置vip:192.168.0.155

检查linux内核是否集成lvs模块

modprobe -l | grep ipvs

安装lvs的管理工具ipvsadm

安装依赖

yum install -y gcc gcc-c++ makepcre pcre-devel kernel-devel openssl-devel libnl-devel popt*

安装lvs的管理工具ipvsadm

wget http://www.linuxvirtualserver.org/software/kernel-2.6/ipvsadm-1.26.tar.gz

tar zxvf ipvsadm-1.26.tar.gz

cd ipvsadm-1.26

make && make install

校验是否安装成功:

ipvsadm -h

 

在eth0上绑定虚拟ip(vip)

ifconfig eth0:0 192.168.0.155 broadcast 192.168.0.155 netmask 255.255.255.255 up

添加路由规则

route add -host 192.168.0.155 dev eth0:0

启用系统的包转发功能

echo "1" >/proc/sys/net/ipv4/ip_forward

清除原有转发规则

ipvsadm --clear

添加vip规则

ipvsadm -A -t 192.168.0.155:80 -s rr(采用轮询规则)

在虚拟ip中添加服务规则

虚拟ip对应的是nginx上的ip

-g表示默认选择直接路由模式

ipvsadm -a -t 192.168.0.155:80 -r 192.168.0.7:80 -g

ipvsadm -a -t 192.168.0.155:80 -r 192.168.0.9:80 -g

(这种是加权最少链接算法的写法

ipvsadm -a -t 192.168.0.155:80 –g -r 192.168.0.7:80 –w 1

ipvsadm -a -t 192.168.0.155:80 –g -r 192.168.0.9:80 –w 2)

保存规则至默认配置文件

service ipvsadm sav

重启lvs

ipvsadm

接着在两台nginx RealServer的回环设备上绑定了一个vip地址
192.168.1.7
192.168.1.9

ifconfig lo:0 192.168.0.155 broadcast 192.168.0.155 netmask 255.255.255.255 up

/sbin/route add -host 192.168.0.155 dev lo:0

当请求过来时,如何判断哪个VIP对应的物理设备是DR服务器,我们使用arp_ignore进行配置

arp_announce :定义不同级别:当ARP请求通过某个端口进来是否利用这个接口来回应。

       0 -利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;

       1 - 避免使用另外一个接口上的mac地址去响应ARP请求;

        2 - 尽可能使用能够匹配到ARP请求的最佳地址。

arp_ignore:当ARP请求发过来后发现自己正是请求的地址是否响应;
  0 - 利用本地的任何地址,不管配置在哪个接口上去响应ARP请求;
1 - 哪个接口上接受ARP请求,就从哪个端口上回应。
关闭arp解析:
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

4.安装配置keepalived

    192.168.0.6

    192.168.0.8

上传 keepalived-1.2.16.tar.gz

tar -zxvf keepalived-1.2.16.tar.gz

cd keepalived-1.2.16

./configure --prefix=/usr/local/keepalived

make && make install

安装成功后做成服务模式,方便启动和关闭

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

创建keepalived文件夹

mkdir /etc/keepalived

将keepalived配置文件拷贝到etc下

cp /usr/local/keepalived/etc/keepalived.conf /etc/keepalived/keepalived.conf

将init.d文件拷贝到etc下,加入开机启动项

cp/usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/keepalived

添加可执行权限

chmod +x /etc/init.d/keepalived

将keepalived文件拷贝到etc下,加入网卡配置

cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/keepalived

设置keepalived服务开机启动:

chkconfig keepalived on

启动服务

service keepalived start

停止服务

service keepalived stop

重启服务

service keepalived restart

加入开机启动项

添加时必须保证/etc/init.d/keepalived存在

chkconfig --add keepalived

chkconfig keepalived on

添加完可查询系统服务是否存在:

chkconfig –list

keepalived正常运行后,会启动3个进程,其中一个是父进程,负责监控其子进程。一个是vrrp子进程,另外一个是checkers子进程。

ps -ef | grep keepalived

keepalived.conf配置文件说明

! Configuration File for keepalived

global_defs {
   router_id demo01
}

vrrp_instance VI_1 {
    state MASTER             # 标示为主lvs,备lvs改为BACKUP
    interface eth0           # HA检测端口
    virtual_router_id 51     # 主备的virtual_router_id 必须相同
    priority 100              # 优先级,备lvs要比主lvs稍小
    advert_int 1             # VRRP Multicast 广播周期秒数
    authentication {         # 定义认证
        auth_type PASS       # 认证方式为口令认证
        auth_pass 1111       # 定义口令
    }
    virtual_ipaddress {      # 定义vip
        192.168.0.155        # 多个vip可换行添加
    }
}

virtual_server 192.168.0.155 80 {
    delay_loop 6       # 每隔6秒查看realserver状态
    lb_algo rr        	# 调度算法为轮询算法
    lb_kind DR         # lvs工作模式为DR(直接路由)模式
    nat_mask 255.255.255.255
    persistence_timeout 0  #50 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
    protocol TCP            # 用TCP监测realserver的状态

    real_server 192.168.0.7 80 {       # 定义realserver
        weight 3                       # 定义权重
        TCP_CHECK {  # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
            connect_timeout 3          # 三秒无响应超时
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.0.9 80 {
        weight 3
        TCP_CHECK {
            connect_timeout 3
            nb_get_retry 3 
            delay_before_retry 3
            connect_port 80
        }
    }
}

重新启动keepalived

至此配置lvs+keepalived配置已经完成

使用显示ip命令

ip a

查看网卡上的ip

我们发现在两个节点上都看到了VIP192.168.0.155,这是不合理的,正确情况应该是只在Master角色的节点上有虚拟IP,这是由于防火墙引起的。

关闭防火墙

service iptables stop

配置防火墙重启后仍然关闭

chkconfig iptables off

5.安装配置nginx集群

        192.168.1.7

        192.168.1.9

首先安装安装编译环境:

yum install -y make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel pcre pcre-devel

安装pcre

检查pcre是否安装:

rpm -qa pcre

显示如上信息表示表示已经安装

我们要编译升级到新版本的pcre,首先把系统里的旧版删除了,然后再进行安装

使用如下命令进行卸载它

rpm -e --nodeps pcre 

(wget http://downloads.sourceforge.net/project/pcre/pcre/8.35/pcre-8.35.tar.gz)

或者将已经下载好的包上传至相应服务器上

解压安装包:tar zxvf pcre-8.35.tar.gz

进入安装包目录:cd pcre-8.35

编译:./configure

安装:make && make install

查看安装版本:pcre-config --version   如果出现版本号,说明安装成功

下载nginx:wget http://nginx.org/download/nginx-1.6.2.tar.gz

解压安装包: tar zxvf nginx-1.6.2.tar.gz

进入安装包目录:cd nginx-1.6.2

编译安装:./configure

默认地址 /usr/local/nginx-1.6.2

安装:make && make install

nginx.conf配置文件说明,配置一个简单的集群转发

#运行用户,默认即是nginx,可不设置
#user  nobody;
#nginx进程,一般设置为和cpu核数一样
worker_processes  8;

#错误日志存放目录 
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#进程pid存放位置
#pid        logs/nginx.pid;
#工作模式及连接数上限
events {
    #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
    use   epoll;
    #单个后台worker process进程的最大并发链接数
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  60;
    upstream tomcat_server_pool{
		server 192.168.0.10:8080 weight=10;
		server 192.168.0.11:8080 weight=10;
    }
    server {
        listen	80;
        server_name 192.168.0.155;
        location / {
            proxy_set_header Host $host;
            proxy_set_header X-Real-Ip $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
	    proxy_pass http://tomcat_server_pool;
            index index.jsp index.html index.htm;
        }
    }

}

Nginx启动,关闭和重启命令

cd /usr/local/nginx/sbin/

启动ngnix

若你配置文件不是默认名称nginx.conf可以使用如下命令启动

./nginx -c /usr/local/nginx/conf/nginx-lvs.conf

停止

./nginx -s stop

nginx进程处理任务完毕进行停止

./nginx -s quit

重启

./nginx -s reload

6.tomca8和jdk8安装配置

    192.168.1.10

    192.168.1.11

安装tomcat8和jdk8环境

首先将tomcat8和jdk8安装包上传到服务器

cd /usr/local

tar –zxvf apache-tomcat-8.5.35.tar.gz

cd /usr/local/apache-tomcat-8.5.35/bin

启动tomcat

/startup.sh

查看tomcat进程

ps -ef|grep tomcat

关闭

./shutdown.sh

安装配置jdk8

查看是否系统内部已经安装jdk

rpm -qa|grep java

一般将获得如下信息:     

tzdata-java-2013g-1.el6.noarch

java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64

java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

卸载原有jdk

rpm -e --nodeps tzdata-java-2013g-1.el6.noarch

rpm -e --nodeps java-1.7.0-openjdk-1.7.0.45-2.4.3.3.el6.x86_64

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.x86_64

解压

tar -zxvf  jdk-8u191-linux-x64.tar.gz

vi /etc/profile

配置环境变量

export JAVA_HOME=/usr/local/jdk1.8.0_191

export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar 

export PATH=$PATH:$JAVA_HOME/bin

安装jdk8需要额外安装一个依赖Linux下安装jdk1.8查看版本的时候报出:

-bash: /usr/local/jdk1.8.0_144/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: 没有那个文件或目录 使用命令 sudo yum install glibc.i686

安装完成之后启动tomcat

7.测试

在tomcat中部署一个测试项目

http://192.168.0.155/clusterTest/

然后刷新

至此轮询测试成功,然后关闭192.168.0.6上的keepalived,发现主机上的vip飘到了备机上,且项目正常运行,同事关闭项目无法启动,nginx也可以如此测试。

8.director server和real server配置脚本封装

为了方便服务器重启,以下对DR和RL部分脚本进行封装,

DR配置部分,在/etc/init.d下创建文件lvsdr,在文件中写入以下代码:

#!/bin/sh
# 定义虚拟ip
VIP=192.168.0.155 #虚拟 ip根据需求修改
# 定义realserver,空格分开,根据需求修改
RIPS="192.168.0.7 192.168.0.9"
# 定义提供服务的端口
SERVICE=80
# 调用init.d脚本的标准库
./etc/rc.d/init.d/functions
case $1 in
        start)
        echo "Start LVS of DR Mode"
        # 开启ip转发
        echo "1" > /proc/sys/net/ipv4/ip_forward
        # 绑定虚拟ip
        ifconfig eth0:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        route add -host $VIP dev eth0:0
        # 清除lvs规则
        ipvsadm -C	
        # 添加一条虚拟服务器记录
    # -p指定一定的时间内将相同的客户端分配到同一台后端服务器
    # 用于解决session的问题,测试时或有别的解决方案时建议去掉
        ipvsadm -A -t $VIP:$SERVICE -s rr
        # 添加真实服务器记录
        for RIP in $RIPS
    do
        echo $RIP:$SERVICE;
                ipvsadm -a -t $VIP:$SERVICE -r $RIP:$SERVICE -g
        done
        # 设置tcp tcpfin  udp的超时连接值
        ipvsadm --set 30 120 300
        ipvsadm
        ;;
        stop)
        echo "Stop LVS DR"
        ifconfig eth0:0 down
        ipvsadm -C
        ;;
        *)
        echo "Usage:$0 {start | stop}"
        exit 1
esac

添加权限

chmod +x /etc/init.d/lvsdr

启动:service lvsdr start

停止:service lvsdr stop

RS配置部分,在/etc/init.d下创建文件lvsrs,在文件中写入以下代码:

#!/bin/sh
VIP=192.168.0.155 #虚拟ip,根据需求修改
. /etc/rc.d/init.d/functions
case $1 in
        start)
        echo "lo:0 port starting"
        # 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
        ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
        # 限制arp请求
        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
        ;;
        stop)
        echo "lo:0 port closing"
        ifconfig lo:0 down
        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 "Usage: $0 {start ¦ stop}"
        exit 1
esac

添加权限

chmod +x /etc/init.d/lvsrs

启动:service lvsrs start

停止:service lvsrs stop

以上!

参考文献,至此特别感谢木子木泗的倾情奉献:https://www.cnblogs.com/arjenlee/p/9262737.html#auto_id_36

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值