LVS负载均衡集群_第1张图片

本章内容

集群概念

LVS介绍

LVS-NAT模式的实现

LVS-DR模式的实现

ldirectord


Cluster概念

系统扩展方式:

Scale UP:向上扩展,增强

Scale Out:向外扩展,增加设备,调度分配问题,Cluster

Cluster:集群,为解决某个特定问题将多台计算机组合起来形成的单个系统

Linux Cluster类型:

LBLoad Balancing,负载均衡

HAHigh Availiablity,高可用,SPOFsingle Point Of failure

MTBF:Mean Time Between Failure 平均无故障时间

MTTR:Mean Time To Restoration repair)平均恢复前时间

A=MTBF/MTBF+MTTR (0,1)99%, 99.5%, 99.9%, 99.99%, 99.999%

HPCHigh-performance computing,高性能 www.top500.org

分布式系统:

分布式存储:云盘

分布式计算:hadoopSpark

 

集群和分布式

 LVS负载均衡集群_第2张图片 

Cluster分类

LB Cluster的实现

硬件

F5 Big-IP

Citrix Netscaler

A10 A10

软件

lvsLinux Virtual Server

nginx:支持七层调度

haproxy:支持七层调度

atsapache traffic serveryahoo捐助

perlbalPerl 编写

pound

 

Cluster分类

基于工作的协议层次划分:

传输层(通用):DPORT

LVS

nginxstream

haproxymode tcp

应用层(专用):针对特定协议,自定义的请求模型分类

proxy server

httpnginx, httpd, haproxy(mode http), ...

fastcginginx, httpd, ...

mysqlmysql-proxy, ...

 

Cluster相关

会话保持:负载均衡

(1) session sticky:同一用户调度固定服务器

Source IPLVS sh算法(对某一特定服务而言)

Cookie

(2) session replication:每台服务器拥有全部session

session multicast cluster

(3) session server:专门的session服务器

MemcachedRedis

HA集群实现方案

keepalived:vrrp协议

ais:应用接口规范

heartbeat

cman+rgmanager(RHCS)

coresync_pacemaker

 

LVS介绍

LVSLinux Virtual Server,负载调度器,集成内核 章文嵩 阿里

官网:http://www.linuxvirtualserver.org/,最新更新在2012

LVS被红帽收购,已经集成在内核里,不用额外装包

VS: Virtual Server,负责调度

RS: Real Server,负责真正提供服务

L4:四层路由器或交换机

工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS

iptables/netfilter

iptables:用户空间的管理工具

netfilter:内核空间上的框架

流入:PREROUTING --> INPUT

流出:OUTPUT --> POSTROUTING

转发:PREROUTING --> FORWARD --> POSTROUTING

DNAT:目标地址转换; PREROUTING

 

LVS集群体系结构

LVS负载均衡集群_第3张图片 

LVS概念

lvs集群类型中的术语:

VSVirtual ServerDirector Server(DS)

Dispatcher(调度器)Load Balancer

RSReal Server(lvs), upstream server(nginx)

backend server(haproxy)

CIPClient IP

VIP: Virtual serve IP VS外网的IP

DIP: Director IP VS内网的IP

RIP: Real server IP

访问流程:CIP <--> VIP == DIP <--> RIP

 

lvs集群的类型

lvs: ipvsadm/ipvs

ipvsadm:用户空间的命令行工具,规则管理器

用于管理集群服务及RealServer

ipvs:工作于内核空间netfilterINPUT钩子上的框架

lvs集群的类型:

lvs-nat:修改请求报文的目标IP,多目标IPDNAT

lvs-dr:操纵封装新的MAC地址

lvs-tun:在原请求IP报文之外新加一个IP首部

lvs-fullnat:修改请求报文的源和目标IP

重点掌握natdrtunfullnat了解即可

 

lvs-nat模式

lvs-nat

本质是多目标IPDNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RSRIPPORT实现转发

1RIPDIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIPRIPDIP也可以不在同一个IP网络,中间用路由器,不过一般不这么做,因路由器带宽有限 ;也可以不用私网地址,但没必要,但对互联网用户来说不可见;如果用路由器的话,RS的网关要指向路由器)

2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈

3)支持端口映射,可修改请求报文的目标PORT

4VS必须是Linux系统(因lvs集成在Linux内核中),RS可以是任意OS系统

 

NAT模式,VS能否只有一张网卡?是可以的,在单网卡上配两个IPVIPDIPDIP作为RS的网关

 

VS/NAT的体系结构

  LVS负载均衡集群_第4张图片

NAT模式IP包调度过程

LVS负载均衡集群_第5张图片 

NAT模式

LVS负载均衡集群_第6张图片

LVS-DR模式

LVS-DRDirect Routing,直接路由,LVS默认模式,应用最广泛,通过为请求报文重新封装一个MAC首部进行转发,源MACDIP所在的接口的MAC,目标MAC是某挑选出的RSRIP所在接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变

1 Director和各RS都配置有VIP

2 确保前端路由器将目标IPVIP的请求报文发往Director

在前端网关做静态绑定VIPDirectorMAC地址(一般不用)

RS上使用arptables工具(一般也不用)

arptables -A IN -d $VIP -j DROP

arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP

RS上修改内核参数以限制arp通告及应答级别(一般用这种方法)

/proc/sys/net/ipv4/conf/all/arp_ignore

/proc/sys/net/ipv4/conf/all/arp_announce

3RSRIP可以使用私网地址,也可以是公网地址;RIPDIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director

4RSDirector要在同一个物理网络

5)请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

6)不支持端口映射(端口不能修改)

7RS可使用大多数OS系统

 

VS/DR体系结构

LVS负载均衡集群_第7张图片

DR模式IP包调度过程

LVS负载均衡集群_第8张图片

DR模式

LVS负载均衡集群_第9张图片

lvs-tun模式

lvs-tun

转发方式:不修改请求报文的IP首部(源IPCIP,目标IPVIP),而在原IP报文之外再封装一个IP首部(源IPDIP,目标IPRIP),将报文发往挑选出的目标RSRS直接响应给客户端(源IPVIP,目标IPCIP

(1) DIP, VIP, RIP都应该是公网地址(DIPRIP可以是私网地址,拉专线的话)

(2) RS的网关一般不能指向DIP

(3) 请求报文要经由Director,但响应不能经由Director

(4) 不支持端口映射

(5) RSOS须支持隧道功能

可以跨异地

 

VS/TUN体系结构

LVS负载均衡集群_第10张图片

TUN模式IP包调度过程

LVS负载均衡集群_第11张图片

lvs-fullnat模式

lvs-fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发

CIP --> DIP

VIP --> RIP

(1) VIP是公网地址,RIPDIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP

(2) RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client

(3) 请求和响应报文都经由Director

(4) 支持端口映射

注意:此类型kernel默认不支持,需要从新编译

可以跨异地

 

LVS工作模式总结

lvs-natlvs-fullnat:请求和响应报文都经由Director

lvs-natRIP的网关要指向DIP

lvs-fullnatRIPDIP未必在同一IP网络,但要能通信

lvs-drlvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client

lvs-dr:通过封装新的MAC首部实现,通过MAC网络转发

lvs-tun:通过在原IP报文外封装新IP头实现转发,支持远距离通信

 

ipvs scheduler

ipvs scheduler:根据其调度时是否考虑各RS当前的负载状态

分为两种:静态方法和动态方法

静态方法:仅根据算法本身进行调度

1RRroundrobin,轮询

2WRRWeighted RR,加权轮询

3SHSource Hashing,实现session sticky,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定

4DHDestination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商(基于VIP,而不是URL,因为LVS只在4层以下起作用)

 

动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value 较小的RS将被调度

1LCleast connections 适用于长连接应用

Overhead=activeconns*256+inactiveconns

2WLCWeighted LC默认调度方法

Overhead=(activeconns*256+inactiveconns)/weight

3SEDShortest Expection Delay,初始连接高权重优先

Overhead=(activeconns+1)*256/weight

4NQNever Queue,第一轮均匀分配,后续SED

5LBLCLocality-Based LC,动态的DH算法,使用场景:根据负载状态实现正向代理

6LBLCRLBLC with Replication,带复制功能的LBLC

解决LBLC负载不均衡问题,从负载重的复制到负载轻的RS

LBLCLBLCR一般也是电信运营商用得多一些

 

ipvs

ipvsadm/ipvs

ipvs

grep -i -C 10 "ipvs" /boot/config-VERSION-RELEASE.x86_64

支持的协议:TCP UDP AH ESP AH_ESP, SCTP

ipvs集群:

管理集群服务

管理服务上的RS

 

ipvsadm包构成

ipvsadm

程序包:ipvsadm

Unit File: ipvsadm.service

主程序:/usr/sbin/ipvsadm

规则保存工具:/usr/sbin/ipvsadm-save

规则重载工具:/usr/sbin/ipvsadm-restore

配置文件:/etc/sysconfig/ipvsadm-config

 

ipvsadm命令

ipvsadm命令:

核心功能:

集群服务管理:增、删、改

集群服务的RS管理:增、删、改

查看

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]] [-M netmask] [--pe persistence_engine] [-b sched-flags]

ipvsadm -D -t|u|f service-address 删除

ipvsadm -C 清空

ipvsadm -R 重载

ipvsadm -S [-n] 保存(强烈建议加-n,否则会反向解析)

ipvsadm -a|e -t|u|f service-address -r server-address [options]

ipvsadm -d -t|u|f service-address -r server-address

ipvsadm -L|l [options](建议加-n

ipvsadm -Z [-t|u|f service-address]

 

管理集群服务:增、改、删

增、改:

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

删除:

ipvsadm -D -t|u|f service-address

service-address

-t|u|f

-t: TCP协议的端口,VIP:TCP_PORT

-u: UDP协议的端口,VIP:UDP_PORT

-ffirewall MARK,标记,一个数字

[-s scheduler]:指定集群的调度算法,默认为wlc

 

管理集群上的RS:增、改、删

增、改:ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m] [-w weight]

删:ipvsadm -d -t|u|f service-address -r server-address

server-address

rip[:port] 如省略port,不作端口映射

选项:

lvs类型:

-g: gateway, dr类型,默认

-i: ipip, tun类型

-m: masquerade, nat类型

-w weight:权重

 

清空定义的所有内容:ipvsadm -C

清空计数器:ipvsadm -Z [-t|u|f service-address]

查看:ipvsadm -L|l [options]

--numeric, -n:以数字形式输出地址和端口号

--exact:扩展信息,精确值

--connection-c:当前IPVS连接输出

--stats:统计信息

--rate :输出速率信息

ipvs规则: /proc/net/ip_vs

ipvs连接:/proc/net/ip_vs_conn

 

保存及重载规则

保存:建议保存至/etc/sysconfig/ipvsadm

ipvsadm-save -n > /PATH/TO/IPVSADM_FILE

ipvsadm -Sn > /PATH/TO/IPVSADM_FILE

systemctl stop ipvsadm.service

重载:

ipvsadm-restore < /PATH/FROM/IPVSADM_FILE

ipvsadm -R < /PATH/FROM/IPVSADM_FILE

systemctl restart ipvsadm.service

 

LVS

负载均衡集群设计时要注意的问题

(1) 是否需要会话保持

(2) 是否需要共享存储

共享存储:NAS SAN DS(分布式存储)

数据同步:

lvs-nat

设计要点:

(1) RIPDIP在同一IP网络, RIP的网关要指向DIP

(2) 支持端口映射

(3) Director要打开核心转发功能

 

实验:NAT模型实现http负载均衡集群

LVS-NAT模式下,RIPDIP应在同一个IP网络,且应使用私网地址,但RIPDIP也可以不在同一个IP网络,中间用路由器,这个实验就来模拟增加路由器的情况。生产中没有必要,仅实验用。拓扑图如下:

 LVS负载均衡集群_第12张图片

VMware虚拟机上模拟的话,可以将172.20.0.0/16网段、192.168.0.0/24网段和192.168.30.0/24网段划如不同的VMnet

本实验中,172.20.0.0/16网段属于桥接网段,192.168.0.0/24网段属于VMnet6(仅主机模式),192.168.30.0/24网段属于VMnet1(仅主机模式)

 

首先每台服务器关闭SELinux,清空iptables,然后以下是各服务器配置

 

1、客户端client

hostname client  #为便于演示,更改一下主机名

IP172.20.61.2/16(桥接网卡)

网关GATEWAY172.20.61.3lvs服务器)  #可不配

LVS负载均衡集群_第13张图片 

2lvs服务器

hostname lvs

IP1(VIP)172.20.61.3/16(桥接网卡)

IP2(DIP)192.168.0.3/24VMnet6),网关GATEWAY192.168.30.5(路由器)

LVS负载均衡集群_第14张图片

vim /etc/sysctl.conf

       net.ipv4.ip_forward = 1  #启用IP包转发

LVS负载均衡集群_第15张图片

sysctl -p

ipvsadm -A -t 172.20.61.3:80 -s wrr

ipvsadm -a -t 172.20.61.3:80 -r 192.168.30.6:80 -m -w 2  #权重为2

ipvsadm -a -t 172.20.61.3:80 -r 192.168.30.7:80 -m  #权重不写默认为1

LVS负载均衡集群_第16张图片 

3、路由器

hostname router

IP1192.168.0.5/24VMnet6),网关GATEWAY192.168.0.3lvs服务器)

IP2192.168.30.5/24VMnet1

LVS负载均衡集群_第17张图片

vim /etc/sysctl.conf

       net.ipv4.ip_forward = 1  #启用IP包转发

sysctl -p

 

4web服务器rs1

hostname rs1

IP(RIP1)192.168.30.6/24VMnet1),网关GATEWAY192.168.30.5(路由器)

yum -y install httpd  #安装httpd服务

echo RS1 > /var/www/html/index.html

systemctl start httpd

curl 127.0.0.1  #自测http服务,启动成功

LVS负载均衡集群_第18张图片

5web服务器rs2

hostname rs2

IP(RIP2)192.168.30.7/24VMnet1),网关GATEWAY192.168.30.5(路由器)

yum -y install httpd  #安装httpd服务

echo RS1 > /var/www/html/index.html

systemctl start httpd

curl 127.0.0.1  #自测http服务,启动成功

LVS负载均衡集群_第19张图片

最后,在客户端访问lvs服务器的80端口,发现RS1RS22:1的比例轮询,实验成功

LVS负载均衡集群_第20张图片

LVS-DR

DR模型中各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1) 在前端网关做静态绑定

(2) 在各RS使用arptables

(3) 在各RS修改内核参数,来限制arp响应和通告的级别

限制响应级别:arp_ignore

0:默认值,表示可使用本地任意接口上配置的任意地址进行响应

1: 仅在请求的目标IP配置在本地主机的接收到请求报文的接口上时,才给予响应

限制通告级别:arp_announce

0:默认值,把本机所有接口的所有信息向每个接口的网络进行通告

1:尽量避免将接口信息向非直接连接网络进行通告

2:必须避免将接口信息向非本网络进行通告

 

实验:用LVS-DR实现基于NFSwordpress的负载均衡

一、拓扑图和环境说明

拓扑图如下:

LVS负载均衡集群_第21张图片

不算交换机的话,共需8台虚拟机,wordpress的文件在NFS服务器上,共享给两台web服务器,wordpressMySQL数据库独立在1MySQL服务器上,然后两台web服务器通过1lvs服务器实现负载均衡,由1台服务器模拟的路由器连接外网,外网上模拟1台客户端通过DNS服务器解析访问wordpress

VMware模拟的话,可以将172.20.0.0/16网段划作一个VMnet192.168.30.0/24网段和10.0.0.0/8网段划在另一个VMnet中。

本实验中,172.20.0.0/16网段属于桥接网段,192.168.0.0/24网段和10.0.0.0/8网段属于VMnet1(仅主机模式)。

本实验的难点主要在于网络环境搭建,对网络熟悉一些做起来会容易些。接下来是实验步骤:

 

二、准备两个配置脚本

脚本里的变量按自己的环境情况修改:

1RS的配置脚本

#!/bin/bash;

#FileName: lvs_dr_rs.sh

vip=10.0.0.100

mask='255.255.255.255‘

dev=lo:1

case $1 in

start)

              echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

              echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

              echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

              echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

              ifconfig $dev $vip netmask $mask #broadcast $vip up

              #route add -host $vip dev $dev

              ;;

stop)

              ifconfig $dev down

              echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

              echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

              echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

              echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

              ;;

*)

              echo "Usage: $(basename $0) start|stop"

              exit 1

              ;;

esac

#File End

 

2VS的配置脚本

#!/bin/bash

#FileName: lvs_dr_vs.sh

vip='10.0.0.100'

iface='lo:1'

mask='255.255.255.255'

port='80'

rs1='192.168.30.6'

rs2='192.168.30.7'

scheduler='wrr'

type='-g'

case $1 in

start)

              ifconfig $iface $vip netmask $mask #broadcast $vip up

              iptables -F

              ipvsadm -A -t ${vip}:${port} -s $scheduler

              ipvsadm -a -t ${vip}:${port} -r ${rs1} $type -w 1

              ipvsadm -a -t ${vip}:${port} -r ${rs2} $type -w 1

              ;;

stop)

              ipvsadm -C

              ifconfig $iface down

              ;;

*)

              echo "Usage $(basename $0) start|stop“

              exit 1

esac

#File End

 

三、配置各服务器

1MySQL服务器

hostname mysql  #为便于演示,更改一下主机名

IP192.168.30.9/24VMnet1

yum -y install mariadb-server  #安装数据库

mkdir -pv /data/mysqllog/{bin_log,transaction_log}

#创建二进制日志目录和事务日志目录

chown -R mysql.mysql /data/mysqllog  #更改目录权限

vim /etc/my.cnf  #配置数据库

log_bin=/data/mysqllog/bin_log/mysql-bin  #指定二进制日志目录

binlog_format=row  #二进制日志基于行记录

innodb_log_group_home_dir=/data/mysqllog/transaction_log/ 

#指定事务日志存放目录

skip_name_resolve=on  #禁止名字解析

character_set_server=utf8  #设为utf8字符集

LVS负载均衡集群_第22张图片

systemctl start mariadb  #启动数据库

LVS负载均衡集群_第23张图片

mysql> create database wpdb;  #创建wordpress数据库wpdb

mysql> grant all privileges on wpdb.* to wpuser@'192.168.30.%' identified by "centos";  #创建wordpress用户wpuser,密码是centos

mysql> flush privileges;  #刷新数据库权限

 

2NFS服务器

hostname nfs  #为便于演示,更改一下主机名

IP192.168.30.8/24VMnet1

mkdir /data

下载wordpresshttps://cn.wordpress.org/wordpress-4.9.4-zh_CN.tar.gz,传到服务器上的/data目录下

yum -y install nfs-utils php php-mysql  #安装软件包

cd /data/

tar xf wordpress-4.9.4-zh_CN.tar.gz  #解压wordpress

LVS负载均衡集群_第24张图片

setfacl -m u:apache:rwx /data/wordpress  #设置acl允许httpd服务所用的的apache用户

cd wordpress

cp -a wp-config-sample.php wp-config.php

vim wp-config.php  #修改wordpress配置文件

LVS负载均衡集群_第25张图片

vim /etc/exports  #配置NFS服务,添加以下这一行

       /data/wordpress 192.168.30.0/24(rw)

systemctl start nfs-server  #启动NFS服务

exportfs -r  #重读NFS配置文件,并共享目录

exportfs -v  #查看本机的所有NFS共享

DR跨网络模式 02 nfs 03 exportfs -v.jpg 

3web服务器rs1

hostname rs1

IP(RIP1)192.168.30.6/24VMnet1),网关GATEWAY192.168.30.200(路由器router

yum -y install httpd  #安装httpd服务

showmount -e 192.168.30.8  #查看NFS服务器192.168.30.8是否成功共享目录

vim /etc/fstab  #添加以下一行

       192.168.30.8:/data/wordpress /var/www/html nfs defaults 0 0

mount -a  #按照/etc/fstab自动挂载

df -Th  #查看挂载是否成功,如果不成功,则检查一下前边的各配置

LVS负载均衡集群_第26张图片

systemctl start httpd

在浏览器上测试,打开wordpress配置页成功

LVS负载均衡集群_第27张图片

填写资料,点击安装wordpress,安装完毕后登录,进入主页成功

LVS负载均衡集群_第28张图片

配置web服务器作为lvs集群中的RS服务器:

在服务器上新建一个脚本文件lvs_dr_rs.sh,将上边的RS配置脚本复制进去,然后

chmod +x /root/bin/lvs_dr_rs.sh  #给脚本增加执行权限

lvs_dr_rs.sh start  #运行脚本

vim /etc/rc.d/rc.local

       lvs_dr_rs.sh start  #添加这行,以使脚本开机自动运行

 

4web服务器rs2

按照web服务器rs1相同的方式再配置一遍

hostname rs2

IP(RIP2)192.168.30.7/24VMnet1),网关GATEWAY192.168.30.200(路由器router

yum -y install httpd  #安装httpd服务

showmount -e 192.168.30.8  #查看NFS服务器192.168.30.8是否成功共享目录

vim /etc/fstab  #添加以下一行

       192.168.30.8:/data/wordpress /var/www/html nfs defaults 0 0

mount -a  #按照/etc/fstab自动挂载

df -Th  #查看挂载是否成功,如果不成功,则检查一下前边的各配置

systemctl start httpd

在浏览器上测试,打开wordpress主页成功

LVS负载均衡集群_第29张图片

配置web服务器作为lvs集群中的RS服务器:

在服务器上新建一个脚本文件lvs_dr_rs.sh,将上边的RS配置脚本复制进去

本实验将lvs_dr_rs.sh放在/root/bin目录下,然后

chmod +x /root/bin/lvs_dr_rs.sh  #给脚本增加执行权限

lvs_dr_rs.sh start  #执行脚本

echo 'lvs_dr_rs.sh start' >> /etc/rc.d/rc.local  #rc.local追加这行,以使脚本开机自动执行

 

5lvs服务器

hostname lvs

IP192.168.30.5/24VMnet1),网关GATEWAY192.168.30.200(路由器router

yum -y install ipvsadm

在服务器上新建一个脚本文件lvs_dr_vs.sh,将上边的VS配置脚本复制进去,然后

本实验将lvs_dr_vs.sh放在/root/bin目录下,然后

chmod +x /root/bin/lvs_dr_rs.sh  #给脚本增加执行权限

lvs_dr_vs.sh start  #执行脚本

echo 'lvs_dr_vs.sh start' >> /etc/rc.d/rc.local  #rc.local追加这行,以使脚本开机自动执行

DR跨网络模式 05 lvs 02 VS脚本执行.jpg

6、路由器

hostname router

IP1172.20.61.4/16(桥接网卡)

IP2192.168.30.254/24VMnet1

IP2:210.0.0.200/8VMnet1,跟192.168.30.254配在同一个网口上)

vim /etc/sysctl.conf  #添加下面这一行,启用IP包转发

       net.ipv4.ip_forward = 1

sysctl -p

 

7DNS服务器

hostname dns

IP1172.20.61.3/16(桥接网卡)

yum -y install named  #安装DNS服务

vim /etc/named.conf  #注释掉以下两行

//      listen-on port 53 { localhost; };

//      allow-query     { 192.168.30.6;192.168.30.7; };

LVS负载均衡集群_第30张图片

vim /etc/named.rfc1912.zones  #添加如下内容

zone "wind.com" IN {

        type master;

        file "wind.com.zone";

};

LVS负载均衡集群_第31张图片

vim /var/named/wind.com.zone  #添加以下内容

$TTL 1D

@       IN SOA   dns1.wind.com. admin.wind.com. (

                                        1       ; serial

                                        1D      ; refresh

                                        1H      ; retry

                                        1W      ; expire

                                        3H )    ; minimum

        NS      dns1.wind.com.

dns1    A       172.20.61.3

www     A       10.0.0.100

LVS负载均衡集群_第32张图片

systemctl restart named  #启动DNS服务

dig www.wind.com @127.0.0.1  #本地自己查询DNS成功

LVS负载均衡集群_第33张图片 

8、客户端client

hostname client  #为便于演示,更改一下主机名

配置IP172.20.61.2/16(桥接网卡),网关GATEWAY172.20.61.4(路由器router

vim /etc/resolv.conf  #配置DNS,清空并只留一行

       nameserver 172.20.61.3

dig www.wind.com  #查询www.wind.comIP地址成功

LVS负载均衡集群_第34张图片

打开火狐浏览器,输入www.wind.com,打开wordpress主页成功

LVS负载均衡集群_第35张图片

 

四、lvs负载均衡测试

1、在web服务器rs1rs2上分别清空http访问日志

LVS负载均衡集群_第36张图片

2、在客户机上打开wordpress主页,多点几次刷新

LVS负载均衡集群_第37张图片

3、在两台web服务器上查看http访问日志,发现两台都收到了http请求,实验成功

LVS负载均衡集群_第38张图片

实验结束

  

FireWall Mark

FWMFireWall Mark

MARK target 可用于给特定的报文打标记

--set-mark value

其中:value 可为0xffff格式,表示十六进制数字

借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度

实现方法:

Director主机打标记:

iptables -t mangle -A PREROUTING -d $vip -p $proto -m multiport --dports $port1,$port2,… -j MARK --set-mark NUMBER

Director主机基于标记定义集群服务:

ipvsadm -A -f NUMBER [options]

 

例:

Director主机:

iptables -t mangle -A PREROUTING -d 10.0.0.100 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 10

ip addr add 10.0.0.100/32 dev lo:0

ipvsadm -A -f 10 -s rr

ipvsadm -a -f 10 -r 192.168.30.6 -g

ipvsadm -a -f 10 -r 192.168.30.7 -g

curl http://10.0.0.100/; curl -k https://10.0.0.100/;,则会在192.168.30.6192.168.30.7上轮询,实现了httphttps同一个集群

 

持久连接

session 绑定:对共享同一组RS的多个集群服务,需要统一进行绑定,lvs sh算法无法实现

持久连接( lvs persistence )模板:实现无论使用任何调度算法,在一段时间内(默认360s ),能够实现将来自同一个地址的请求始终发往同一个RS

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

持久连接实现方式:

每端口持久(PPC):每个端口对应定义为一个集群服务,每集群服务单独调度

每防火墙标记持久(PFWMC):基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity

每客户端持久(PCC):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式(表示客户端访问VIP任何端口都会调度到后端的同一端口,如223306,表示把所有端口都发布了出去,不要做)

ipvsadm -A -t 10.0.0.100:0

 

例:

ip addr add 10.0.0.100/32 dev lo:0

ipvsadm -A -f 10 -s rr -p

  


LVS高可用性

1 Director不可用,整个系统将不可用;SPoF Single Point of Failure

解决方案:高可用

keepalived heartbeat/corosync

2 RS不可用时,Director依然会调度请求至此RS

解决方案: Director对各RS健康状态进行检查,失败时禁用,成功时启用

keepalived heartbeat/corosync ldirectord

检测方式:

(a) 网络层检测,icmp

(b) 传输层检测,端口探测

(c) 应用层检测,请求某关键资源

RS全不用时:backup server, sorry server

       ipvsadm -a -f 10 -r 127.0.0.1

检查可以写个死循环脚本, 5秒检查一次:

#!/bin/bash

#FileName: checkrs.sh

while true; do

       curl RIP1 &> /dev/null || ipvsadm -d -t VIP:PORT -r RIP1

       curl RIP2 &> /dev/null || ipvsadm -d -t VIP:PORT -r RIP2

       sleep 5

done;

 

ldirectord

ldirectord:监控和控制LVS守护进程,可管理LVS规则

包名:ldirectord-4.1.1-1.fc29.1.x86_64.rpm 光盘源和EPEL源都没有,要从网上下载:

http://www.rpmfind.net/linux/fedora/linux/development/rawhide/Everything/x86_64/os/Packages/l/ldirectord-4.1.1-1.fc29.1.x86_64.rpm

安装:yum -y install ldirectord-4.1.1-1.fc29.1.x86_64.rpm

文件:

/etc/ha.d/ldirectord.cf 主配置文件

/usr/share/doc/ldirectord-3.9.6/ldirectord.cf 配置模版

/usr/lib/systemd/system/ldirectord.service 服务

/usr/sbin/ldirectord 主程序

/var/log/ldirectord.log 日志

/var/run/ldirectord.ldirectord.pid pid文件

 

Ldirectord配置文件示例

cp /usr/share/doc/ldirectord-3.9.6/ldirectord.cf /etc/ha.d/ldirectord.cf

vim /etc/ha.d/ldirectord.cf

checktimeout=3

checkinterval=1

autoreload=yes

logfile="/var/log/ldirectord.log"    #日志文件

quiescent=no                                  #downyes权重设为0no为删除

virtual=10.0.0.100:80                                          #指定VSFWMIPport

              real=192.168.30.6:80 gate 2  #gate表示dr模式,后边数字表示权重

              real=192.168.30.7:80 gate 1

              fallback=127.0.0.1:80 gate      #sorry server

              service=http

              scheduler=wrr

              #protocal=fwm

              checktype=negotiate

              checkport=80

              request="index.html"

              receive=“Test Ldirectord"  #访问index.html时若没有出现Test Ldirectord字样则视为该机已经down

LVS负载均衡集群_第39张图片

systemctl enable ldirectord  #设为开机启动

vim /etc/rc.d/rc.local  #把添加VIP的语句添加到/etc/rc.d/rc.local中,或者写进网卡配置文件里

systemctl start ldirectord  #启动服务后,ipvs规则会自动添加

LVS负载均衡集群_第40张图片

在客户机上访问web服务,看到两台web服务器RS1RS22:1的权重被访问,符合配置

LVS负载均衡集群_第41张图片

RS服务器宕机后,ipvs规则会马上自动删除,RS服务器修复一台后,会马上添加ipvs规则

LVS负载均衡集群_第42张图片

RS服务器全宕了的话,会显示sorry server

需事先在lvs本机上安装httpd服务

yum -y install httpd

echo sorry server > /var/www/html/index.html

systemctl start httpd

LVS负载均衡集群_第43张图片