当前位置:   article > 正文

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

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配置文件说明

  1. ! Configuration File for keepalived
  2. global_defs {
  3. router_id demo01
  4. }
  5. vrrp_instance VI_1 {
  6. state MASTER # 标示为主lvs,备lvs改为BACKUP
  7. interface eth0 # HA检测端口
  8. virtual_router_id 51 # 主备的virtual_router_id 必须相同
  9. priority 100 # 优先级,备lvs要比主lvs稍小
  10. advert_int 1 # VRRP Multicast 广播周期秒数
  11. authentication { # 定义认证
  12. auth_type PASS # 认证方式为口令认证
  13. auth_pass 1111 # 定义口令
  14. }
  15. virtual_ipaddress { # 定义vip
  16. 192.168.0.155 # 多个vip可换行添加
  17. }
  18. }
  19. virtual_server 192.168.0.155 80 {
  20. delay_loop 6 # 每隔6秒查看realserver状态
  21. lb_algo rr # 调度算法为轮询算法
  22. lb_kind DR # lvs工作模式为DR(直接路由)模式
  23. nat_mask 255.255.255.255
  24. persistence_timeout 0 #50 同一IP 的连接50秒内被分配到同一台realserver(测试时建议改为0)
  25. protocol TCP # 用TCP监测realserver的状态
  26. real_server 192.168.0.7 80 { # 定义realserver
  27. weight 3 # 定义权重
  28. TCP_CHECK { # 注意TCP_CHECK和{之间的空格,如果没有的话只会添加第一个realserver
  29. connect_timeout 3 # 三秒无响应超时
  30. nb_get_retry 3
  31. delay_before_retry 3
  32. connect_port 80
  33. }
  34. }
  35. real_server 192.168.0.9 80 {
  36. weight 3
  37. TCP_CHECK {
  38. connect_timeout 3
  39. nb_get_retry 3
  40. delay_before_retry 3
  41. connect_port 80
  42. }
  43. }
  44. }

重新启动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配置文件说明,配置一个简单的集群转发

  1. #运行用户,默认即是nginx,可不设置
  2. #user nobody;
  3. #nginx进程,一般设置为和cpu核数一样
  4. worker_processes 8;
  5. #错误日志存放目录
  6. #error_log logs/error.log;
  7. #error_log logs/error.log notice;
  8. #error_log logs/error.log info;
  9. #进程pid存放位置
  10. #pid logs/nginx.pid;
  11. #工作模式及连接数上限
  12. events {
  13. #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
  14. use epoll;
  15. #单个后台worker process进程的最大并发链接数
  16. worker_connections 1024;
  17. }
  18. http {
  19. include mime.types;
  20. default_type application/octet-stream;
  21. sendfile on;
  22. keepalive_timeout 60;
  23. upstream tomcat_server_pool{
  24. server 192.168.0.10:8080 weight=10;
  25. server 192.168.0.11:8080 weight=10;
  26. }
  27. server {
  28. listen 80;
  29. server_name 192.168.0.155;
  30. location / {
  31. proxy_set_header Host $host;
  32. proxy_set_header X-Real-Ip $remote_addr;
  33. proxy_set_header X-Forwarded-For $remote_addr;
  34. proxy_pass http://tomcat_server_pool;
  35. index index.jsp index.html index.htm;
  36. }
  37. }
  38. }

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,在文件中写入以下代码:

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

添加权限

chmod +x /etc/init.d/lvsdr

启动:service lvsdr start

停止:service lvsdr stop

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

  1. #!/bin/sh
  2. VIP=192.168.0.155 #虚拟ip,根据需求修改
  3. . /etc/rc.d/init.d/functions
  4. case $1 in
  5. start)
  6. echo "lo:0 port starting"
  7. # 为了相应lvs调度器转发过来的包,需在本地lo接口上绑定vip
  8. ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
  9. # 限制arp请求
  10. echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  11. echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
  12. echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
  13. echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
  14. ;;
  15. stop)
  16. echo "lo:0 port closing"
  17. ifconfig lo:0 down
  18. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
  19. echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
  20. echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
  21. echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
  22. ;;
  23. *)
  24. echo "Usage: $0 {start ¦ stop}"
  25. exit 1
  26. esac

添加权限

chmod +x /etc/init.d/lvsrs

启动:service lvsrs start

停止:service lvsrs stop

以上!

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/837571?site
推荐阅读
相关标签
  

闽ICP备14008679号