LVS 负载均衡集群搭建

时间:2022-04-17 21:49:21

1.内容概述:

    1. LVS 集群的体系结构和特点
    2. 基本LVS集群的安装和配置
    3. 介绍了命令行 ipvsadm 和 ldirectord 配置LVS集群
    4. 介绍了使用RedHat工具 piranha 图形化配置LVS集群

2.简介

LVS是Linux Virtual Server的简称,也就是linux虚拟服务器。

3.实现目标

通过LVS提供的负载均衡技术和linux系统实现一个高性能、高可用的服务器集群,它具有良好的可靠性、可扩展性和可操作性,成本低廉的特性

4.LVS体系结构

LVS 负载均衡集群搭建

包含:

    1. 最前端 负载均衡层
    2. 中间 服务器群组
    3. 最底层 共享存储层

5.LVS集群的特点

5.1 IP负载均衡与负载调度算法:

LVS的IP负载均衡技术:是通过IPVS模块来实现的,IPVS是LVS集群系统的核心软件。它的主要作用是:安装在 Director Server(前端服务器)上,同时Director Server上虚拟出一个IP地址(VIP),用户必须通过这个虚拟的VIP地址访问服务。-----访问请求首先经过VIP到达负载均衡调度器,然后由负载均衡调度器根据设定好的算法 从 Real Server 列表中选取一个服务节点响应用户请求。

5.2IPVS实现负载均衡的机制:

  • NAT 网络地址转换模式
  • TUN 使用IP隧道技术 IP隧道模式
  • DR 使用直接路由技术 直接路由模式

优缺点:

NAT 优点:配置及管理简单。Director Server 和 Real Server 群组可以不再一个

网段

缺点:要求 Director Server 必须要有两块网卡

Director Server很容易成为整个集群的性能瓶颈(所有都数据经过这里)

DR 优点:性能最好

缺点:要求Director Server和所有的Real Server 必须在同一个网段中,不

能实现集群的跨网段应用

TUN 优点: 性能介于 NAT 和 DR 模式之间

Director Server 与 Real Server 可以再不同的网段内,即集群中

的Real Server 可以再不同的城市

缺点: 需要的Real Server 服务器的内核中,必须编译支持IP Tunnel这个选项

5.3负载调度算法(此处只列出了常用的4种,共有8种)

静态:

  • 轮叫调度(Round Robin)
  • 加权轮叫调度(Weighted Round Robin)

动态:

  • 最少链接调度(Least Connections)
  • 加权最少链接调度(Weighted Least Connections)

5.4使用环境 

Director Server 支持的系统: Linux 和 FreeBSD

支持大多数的TCP和UDP协议

Real Server 可以运行在任何支持TCP/IP的操作系统上

6. 基本的 LVS集群的实现

6.1集群环境规划

SElinux and iptables is disable

操作系统使用RHEL 6.3x86_64

服务器名

IP地址

网关

虚拟设备名

虚拟IP

Director Server

192.168.1.100

192.168.1.1

eth0:0

192.168.1.135

Real Server

192.168.1.210

192.168.1.1

lo:0

192.168.1.135

Real Server

192.168.1.220

192.168.1.1

lo:0

192.168.1.135

集群架构规划图:(DR模式)

LVS 负载均衡集群搭建

6.1根据实验规划设置固定IP,实验中为方便起见,规定

A 192.168.1.100

B 192.168.1.210

C 192.168.1.220

本实验时LVS集群的基本实现:

方法一、ipvsadm 命令行模式

方法二、piranha 图形化模式

须知:本实验 不涉及共享存储

不涉及Director Server 的双机热备

6.2(ABC)设置yum 源

[extras-163]

name=163-extras

baseurl=http://mirrors.163.com/CentOS/6.3/extras/x86_64/

enabled=1

gpgcheck=0

[update-163]

name=163-update

baseurl=http://mirrors.163.com/centos/6.3/updates/x86_64/

enabled=1

gpgcheck=0

[os-163]

name=163-os

baseurl=http://mirrors.163.com/centos/6.3/os/x86_64/

enabled=1

gpgcheck=0

[fasttrack-163]

name=163-fasttrack

baseurl=http://mirrors.163.com/centos/6.3/fasttrack/x86_64/

enabled=1

gpgcheck=0

[plus-163]

name=163-plus

baseurl=http://mirrors.163.com/centos/6.3/centosplus/x86_64/

enabled=1

gpgcheck=0

 

 

方法一、命令行管理模式

6.5(A)Directory Server 上安装IPVS管理软件

本例中使用rpm方式安装:

[root@localhost ~]# yum install -y ipvsadm

6.6ipvsadm 的使用方法:

-A 用于虚拟服务器增加虚拟IP即VIP

-E 用于虚拟服务器编辑VIP记录

-D 用于虚拟服务器删除VIP记录

-C 清除虚拟服务器所有的VIP记录

-R 恢复虚拟服务器规则

-S 保存虚拟服务器规则

-a 用于虚拟服务器增加新的Real Server

-e 用于虚拟服务器编辑某条Real Server记录

-d 用于虚拟服务器删除某条Real Server记录

-L| -l 显示出虚拟服务器的列表

-Z 虚拟服务器计数器清零

--set tcp udp 设置连接超时值

-t 说明虚拟服务器提供tcp服务,选项后面跟如下格式:

vip:port 或 Real-Server-ip:port

-u 说明虚拟服务器提供udp服务,选项后面跟如下格式:

vip:port 或 Real-Server-ip:port

-f 说明是经过iptables标记过的服务类型

-s 该选项后面跟LVS使用的调度算法,有如下选项:

rr | wrr | lc | wlc | lblc | lblcr | dh | sh

默认的调度算法是: wlc

-p 在某个Real Server上持续的服务时间。在设定的时间内,来自同一个用户的多个请求,将会转发给同一个Real Server (利用缓存)

默认时间是:300s 例: -p 600

-r 指定Real Server的ip地址,此选项后面跟的格式:

Real-Server-ip:port

-g 指定LVS的工作模式为直接路由模式 (此模式为LVS的默认工作模式)

-i 指定LVS的工作模式为隧道模式

-m 指定LVS的工作模式为NAT模式

-w 指定Real Server的权值

-c 显示LVS目前的连接信息

-L --timeout 显示服务连接超时值

--daemon 显示同步守护进程状态

--stats 显示统计信息

--rate 显示速率信息

--sort 对虚拟服务器和真是服务器排序输出

举例如下:

添加虚拟IP:

ipvsadm -A -t 192.168.1.100:80 -s rr -p 600

ipvsadm -A -t 192.168.1.150:21 -s wlc

添加Real Server:

ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.210:80 -g

ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.220:80 -g

用法总结:首先添加VIP 指定策略

其次针对指定的VIP 添加 Real Server 并指定工作模式(g)

7.开始配置LVS集群(使用ipvsadm命令行工具)

下面通过搭建www服务的负载均衡实例,讲述DR模式的LVS集群配置

7.1 (A)Director Server 的配置

7.1.1 (A)在Director Server上绑定一个VIP,用于对外提供服务。

[root@localhost ~]# /sbin/ifconfig eth0:0 192.168.1.135 broadcast 192.168.1.135 netmask 255.255.255.255 up

特别注意:

广播地址 与 ip地址 相同

子网掩码 255.255.255.255

7.1.2(A)在Director Server上为eth0:0指定路由

[root@localhost ~]# /sbin/route add -host 192.168.1.135 dev eth0:0

开启内核IP转发

[root@localhost ~]# echo "1" >> /proc/sys/net/ipv4/ip_forward

在DR模式下,开启ip转发不是必须的,在NAT模式下开启ip转发是必须的。

注意:7.1.1 和 7.1.2 对于网卡的操作都是一次性的,重启不能生效。

解决: /sbin/ifconfig eth0:0 192.168.1.135 broadcast 192.168.1.135 netmask 255.255.255.255 up 
 

/sbin/route add -host 192.168.1.135 dev eth0:0 
 

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

将三条命令写入 rc.local # cat <<EOF>> /etc/rc.d/rc.local

 

7.2(A)使用ipvsadm配置LVS

[root@localhost ~]# ipvsadm -C #清除原有记录

[root@localhost ~]# ipvsadm -A -t 192.168.1.135:80 -s rr -p 500

[root@localhost ~]# ipvsadm -a -t 192.168.1.135:80 -r 192.168.1.210:80 -g

[root@localhost ~]# ipvsadm -a -t 192.168.1.135:80 -r 192.168.1.220:80 -g

[root@localhost ~]# service ipvsadm save

[root@localhost ~]# service ipvsadm start

注意:实际生产中是不直接使用ipvsadm 直接配置LVS集群的

8.使用ldirectord配置LVS

8. 1(A)在Director Server上绑定一个VIP,用于对外提供服务。

[root@localhost ~]# ifconfig eth0:0 192.168.1.135 broadcast 192.168.1.135 netmask 255.255.255.255 up

特别注意:

广播地址 与 ip地址 相同

子网掩码 255.255.255.255

8.2(A)在Director Server上为eth0:0指定路由

[root@localhost ~]# route add -host 192.168.1.135 dev eth0:0

开启内核IP转发

[root@localhost ~]# echo "1" >> /proc/sys/net/ipv4/ip_forward

在DR模式下,开启ip转发不是必须的,在NAT模式下开启ip转发是必须的。

8.3安装ldirectord

#yum install -y heartbeat-ldirectord 用以LVS监控real server 节点的运行状态,当real server失效是,把它从虚拟服务器列表中删除,恢复是重新加入到列表。同时,它还能调用ipvsadm 自动创建LVS路由表。

需要说明的是:ldirectord 和 Piranha 都具有监控 real server的功能。

如果要通过ldirectord监控节点状态,只需要启动 ldirectord服务,整个集群就可以运行起来。

如果要通过Piranha工具配置LVS,就无需使用ldirectord。

查找安装的示例配置文件 

#rpm -qd heartbeat-ldirectord

复制示例文件做配置文件 

#cp /usr/share/doc/heartbeat-ldirectord-<tab>/ldirectord.cf /etc/ha.d

服务启动脚本 

service ldirectord start|stop 

 

编辑配置文件 

#vim /etc/ha.d/ldirectord.cf 

#全局配置选项 

checktimeout=20 #判定real server出错的时间间隔 

checkinterval=10

#判定ldirectord在两次检查之间的间隔 

fallback=127.0.0.1:80 

#当所有的real server都不工作时,web服务重定向 

autoreload=yes 

#自动重载配置文件。 

logfile="/var/log/ldirectord.log" 

#指定日志文件路径

quiescent=no #"no" 表示:如果一个节点在checktimeout设置的时间周期内没有相应,ldirectord会从LVS的路由表中之间移除real server,此时中断现有的客户端连接,并是LVS丢掉所有的连接跟踪记录和持续连接记录;"yes" 表示当某个real server失效时,ldirectord 将失效节点的权值设置为0,新的连接将不能到达,但是并不从LVS路由表中清除此节点,同时,连接跟踪记录和程序连接模版仍然保留在Director上

 

----------注意:以上为ldrectord.cf文件的全局配置。它们可以应用大下面多个虚拟主机上,下面是每个虚拟主机的配置。

 

#sample for 按 http virtual service

virtual=192.168.1.135:80 #设置VIP和端口号,注意:virtual行后面的行必须缩进4个空格或以一个tab字符进行标记。 

real=192.168.1.210:80 gate #指定real server服务器地址和端口,同时设定LVS的工作模式 gate: DR | ipip: TUNL | masq : NAT

real=192.168.1.220:80 gate

fallback=127.0.0.1:80 gate

service=http #指定做负载均衡的服务

request="index.html" #ldirectord将根据real server 地址,结合该选项给出的请求路径,发送访问请求,检查real server上的服务是否正常运行,确保这里给出的页面是可以访问的,否则ldirectord会误认为此节点已经失效,发生错误监控现象。

receive="Test Page" #指定请求和应答字符串

scheduler=rr #指定调度算法,这里是rr 轮询 算法

protocol=tcp #指定协议类型,包含 tcp 和 udp

checkport=80 #指定监控的端口号

checktype=negotiate #指定ldirectord的检查类型

virtualhost=www.example.com #虚拟服务器的名称

9.real server 的配置

9.1禁止real server 相应ARP请求,只允许LVS 相应

[root@zzh /]# vim /etc/sysctl.conf

编辑内核运行参数,添加下面字段

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

[root@zzh /]# sysctl -p

使上面的修改立即生效

9.2配置VIP地址

[root@localhost ~]# ifconfig lo:0 192.168.1.135 broadcast 192.168.1.135 netmask 255.255.255.255 up

[root@localhost ~]# route add -host 192.168.1.135 dev lo:0

需要在所有的real server 执行相同的命令,可以写成脚本在所有的real server上执行,并 放到 /etc/rc.d/rc.local 中使该脚本开机执行

10.在Director Server 启动 Keepalived 服务

service ldirectord start

方法二、图形化管理模式

11.安装图形化管理配置工具

#yum install cman* ipvsadm modcluster piranha

配置文件

说明

/etc/sysconfig/ha/lvs.cf

web 界面生成的配置写入这个文件中

/etc/init.d/piranha-gui start

启动 piranha 服务的 WEB 配置界面

/etc/init.d/pulse

启动 piranha 服务读取的就是 /etc/sysconfig/ha/lvs.cf 文件

/etc/sysconfig/ha/conf/httpd.conf

这个文件是他的配置文件可以改用什么端口来管理


11.1使用RedHat提供的工具piranha来配置LVS

Piranha 是renhat提供的基于web的LVS的配置软件。也可以单独用作cluster功能。例如:可以通过 Piranha激活 Director Server的后背主机,也就是配置Director Server的双机热备功能。

[root@localhost yum.repos.d]# rpm -qc piranha

/etc/sysconfig/ha/lvs.cf 所有的配置都被注释掉了

/etc/sysconfig/ha/conf/httpd.conf

/etc/sysconfig/ha/conf/httpd.conf 对LVS管理界面的访问控制

11.2 Director Server上prianha的设置

11.2.1开启web页面管理服务

[root@localhost Desktop]# /etc/init.d/piranha-gui start 11.2.2查看3636端口

[root@localhost Desktop]# netstat -tunalp | grep :3636

11.2.3设置管理用户piranha的密码

[root@localhost Desktop]# piranha-passwd

New Password:

Verify:

Adding password for user piranha

tcp 0 0 :::3636 :::* LISTEN 2978/httpd

11.2.4登录 192.168.1.100:3636

LVS 负载均衡集群搭建

LVS 负载均衡集群搭建

 

12.web页面配置部分

--------由于本实验只涉及到一台Director Server调度服务器,未做双机热备,所以不用理会下面两个选项:

12.1GLOBAL SETTINGS 是用来设置 Director Server 的全局配置:

包含: primary server public ip : LVS 服务器的ip

primary server public ip : LVS 如果启用双机热备,心跳地址

超时设置:

Use network type :使用的工作模式 .默认是 : DR模式

LVS 负载均衡集群搭建

LVS 负载均衡集群搭建 

是用来设置 Director Server的双机热备从服务器

12.2设置 VIRTUAL SERVERS

LVS 负载均衡集群搭建

添加

LVS 负载均衡集群搭建

编辑VIRTUAL SERVER

LVS 负载均衡集群搭建

选项说明:

Load monitoring tool :用于监视各个real server上的负载状态

rup : 要求real server 启动 rstatd 服务

rup : 要求real server 启动 rwhod 服务

Service timeout: 表示real server 失效后,从lvs路由表中移除所要经过的时间,S

Re-entry Time : 表示某个real server被移除后,重新加入路由表必须经过的时间

Quiesce server :“yes” 表示当有新的节点加入集群时,最少链接数会被清零,此时lvs会发送大量的请求到这个新的服务节点,造成新节点的服务阻塞。建议是 "no"

Scheduling : 使用的调度算法 默认是:wlc 加权最小链接

为了实验便于查看结果,此处使用了 rr 轮询算法

12.3激活VIRTUAL SERVER

LVS 负载均衡集群搭建

基于该 VIRTUAL SERVER(192.168.1.135),添加REAL SERVER 并设置("EDIT")

12.4添加并设置REAL SERVER

LVS 负载均衡集群搭建

添加

LVS 负载均衡集群搭建

编辑 REAL SERVER

LVS 负载均衡集群搭建

再次添加REAL SERVER

LVS 负载均衡集群搭建

设置 REAL SERVER 2

LVS 负载均衡集群搭建

12.5激活添加的REAL SERVER

LVS 负载均衡集群搭建

LVS 负载均衡集群搭建

12.6启动pulse服务

注意:上面的虚拟服务器激活了才可启动

[root@localhost Desktop]# service pulse start

Starting pulse: [ OK ]

[root@localhost Desktop]#chkconfig pulse on

LVS 负载均衡集群搭建

13.从 Piranha 上配置

----由于本实验中 VIRTUAL SERVER 没有做双机热备,也就不用设置从 Piranha

14.REAL SERVER 配置

在选择连接类型有NAT、DR(路由直连)、Tunneling三种,选择不同类型真实服务器也要对应不同的设置上面我们选择了DR类型,只要把每台真实服务器按着之前做路由直连时 ipvsadm ),设置多台真实服务器就可以了 10.1禁止real server 相应ARP请求,只允许LVS 相应[root@zzh /]# vim /etc/sysctl.conf编辑内核运行参数,添加下面字段

net.ipv4.conf.lo.arp_ignore = 1

net.ipv4.conf.lo.arp_announce = 2

net.ipv4.conf.all.arp_ignore = 1

net.ipv4.conf.all.arp_announce = 2

[root@zzh /]# sysctl -p

使上面的修改立即生效

需要在所有的real server 执行相同的命令,可以写成脚本在所有的real server上执行,并 放到 /etc/rc.d/rc.local 中使该脚本开机执行

15.测试

REAL SERVER1 上

[root@localhost ~]# cd /var/www/html/

[root@localhost html]# ls

[root@localhost html]# echo "real server 1" >> index.html

[root@localhost html]# service httpd start

Starting httpd: httpd: Could not reliably determine t

he server's fully qualified domain name, using localhost.localdomain for ServerName

[ OK ]

[root@localhost html]# chkconfig httpd on

REAL SERVER2 上

[root@localhost ~]# cd /var/www/html/

[root@localhost html]# ls

[root@localhost html]# echo "real server 2" >> index.html

[root@localhost html]# service httpd start

Starting httpd: httpd: Could not reliably determine the server's fully qualified domain name, using localhost.localdomain for ServerName

[ OK ]

[root@localhost html]# chkconfig httpd on

 

LVS 负载均衡集群搭建

LVS 负载均衡集群搭建

----实验成功

多种配置LVS的方式,real server的配置都是一样的。附上配置脚本,设置固定ip后就可以执行该脚本,并立即生效。而且重启后依然有效。

real server配置脚本 #!/bin/bash 

#本次生效 

VIP=192.168.1.135

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 

/sbin/route add -host $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 

/usr/sbin/setenforce 0 

/sbin/iptables -F 

/sbin/iptables -Z 

service iptables save 

#每次开机自动执行lvs.sh 

/bin/cat <<EOF >> /etc/rc.d/rc.local 

/sbin/lvs-rs.sh 

EOF 

/bin/cat <<EOF>> /sbin/lvs.sh 

#!/bin/bash 

VIP=192.168.1.135 

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up 

/sbin/route add -host $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 

/usr/sbin/setenforce 0 

EOF