我采用的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
第一步:准备工作系统使用的是 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
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
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
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
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
在tomcat中部署一个测试项目
http://192.168.0.155/clusterTest/
然后刷新
至此轮询测试成功,然后关闭192.168.0.6上的keepalived,发现主机上的vip飘到了备机上,且项目正常运行,同事关闭项目无法启动,nginx也可以如此测试。
为了方便服务器重启,以下对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