LVS

lvs-linux虚拟化服务器;
lvs集群采用IP负载均衡技术和基于内容分发机制;
一:是通过IPVS模块实现的
二:集群采用的是 三层结构

A、负载调度器(load balancer),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。
B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。
C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

三:IPVS实现负载均衡有3中方式

nat:网络地址转移; masq 参数 -m
tun:IP隧道技术实现虚拟服务器; ipip 参数 -i
DR:直接路由实现虚拟服务器; gate 参数 -g

四:负载算法

1、轮叫调度 rr
将外部请求按顺序1:1分配到真实server 上;
2、加权轮叫调度 wrr
根据不同的处理能力来调度请求;
3、最少链接调度 lc
动态的将请求调度到已经建立最少连接的服务器上;
4、加权最少连接调度 wlc 
优先级的最少连接;

 

五:安装配置

安装依赖:
# yum install gcc gcc-c++ popt openssl-devel popt-devel libnl libnl-devel kernel-devel -y 
# yum install ipvsadm -y

  1、查看 lvs规则表

# ipvsadm -Ln

2、IPVS 调度状态:

# ipvsadm Lnc

  3、添加虚拟服务

示例: 虚拟IP 负载算法
# ipvsadm -A -t ip:port -s rr
# ipvsadm -A -t ip:port -s wrr
# ipvsadm -S >/tmp/ipvs.bak 备份导出
# ipvsadm -C 清除规则
# ipvsadm -R </tmp/ipvs.bak 还原导入

参数:(大小写注明)
-A 添加虚拟服务
-E 编辑修改
-D 删除
-C 清空规则;
-t 使用tcp 协议后跟端口
-u UDP 协议
-s LVS 采用的调度算法
-r 设置真实服务器跟端口信息

  4、在虚拟服务后添加真实服务器

# ipvsadm -a -t 172.27.27.89:80 -r 172.27.27.74:80 -g
-g DR直连路由
-i TUN隧道模式
-a 在虚拟服务中添加一台真实服务器
-w 设置权重
-m 设置工作模式 NAT 地址转换;
{ rr 轮询算法 wrr 加权轮询算法 w 要设置权重 可以直接根数字}

# ipvsadm -d -t 172.27.27.89:80 -r 172.27.27.74:80
-d 删除虚拟服务提供的真实服务器

保存设置
# service ipvsadm save
# /etc/init.d/ipvsadm start 
也可以直接编辑/etc/sysconfig/ipvsadm 文件添加;
# ipvsadm -A -t VIP:0 -s rr
# 设置当客户端访问服务器VIP的任意端口都可以被调度至后端的real server

  5、ipvsadm 配置示例

ipvsadm -A -t 172.16.2.10:80 -s rr 
ipvsadm -a -t 172.16.2.10:80 -r 172.16.2.17:80 -g
ipvsadm -a -t 172.16.2.10:80 -r 172.16.2.18:80 -g
ipvsadm -a -t 172.16.2.10:80 -r 172.16.2.15:80 -g
ipvsadm -a -t 172.16.2.10:80 -r 172.16.2.16:80 -g

查看状态 service ipvsadm save service ipvsadm restart ipvsadm
-L -n

查看LVS的连接情况:ipvsadm -L -n
查看LVS的吞吐量情况: ipvsadm -L -n --rate
查看LVS的统计信息:ipvsadm -L -n --stats
实时查看LVS连接状态变化: watch ipvsadm -ln

  6、 ipvs 查看链接状态

[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.16.2.10:80 rr
-> 172.16.2.15:80 Route 3 0 0 
-> 172.16.2.16:80 Route 3 0 0 
-> 172.16.2.17:80 Route 3 0 0 
-> 172.16.2.18:80 Route 3 0 0 

 


六、keepalived 路由热备软件
  主要通过VRRP功能 解决静态路由出现单节点故障问题;
  Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除;

# yum install keepalived -y

  实例配置:

# /etc/keeplived/keepalived.conf

可以分为三部分
  1、全局设置定义:告警机制
  2、VRRP示例部分; 配置 state MASTER主机
  3、real server 设置;配置服务节点;

keepalived 配置示例:
[root@localhost ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
notification_email {
haikun@eastmoney.com # 后端负载警告邮件
}
notification_email_from Keepalived@localhost
smtp_server 127.0.0.1
smtp_connect_timeout 60
router_id LVS_DEVEL
}

vrrp_instance VI_1 {
state MASTER # 备用设置 backup 主机安装默认是master
interface eth2
virtual_router_id 121
priority 110
# 在相同的VRID 组中优先级高的为主设备
# master 可以设置为110 backup 可以设置 110 以下 
advert_int 1
authentication {
auth_type PASS # 验证密码 
auth_pass SJFW
}
virtual_ipaddress {
# 10.205.202.* 
172.16.2.10 # 设置虚拟IP 
}
}
virtual_server 172.16.2.10 80 {

delay_loop 6
lb_algo rr # 轮叫调度
lb_kind DR # 直连路由模式

# persistence_timeout 50 # 网页延时时间
protocol TCP # TCP 协议

### 后端负载机器示例: 可以以此添加;

real_server 172.16.2.15 80
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}

real_server 172.16.2.16 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}

real_server 172.16.2.17 80 {
weight 3
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}

 

 

  配置完成 启动

/etc/keepalived/keepalived start
(当重启ipvsadm了 时 一定要重启 keepalived ;)
# 设置启动程序为系统开机自启;
# chkconfig on ipvsadm 
# chkconfig on keepalived

 

 

  # ip addr show 查看虚拟IP加载

[root@localhost ~]# ip addr

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:0c:29:31:5c:9d brd ff:ff:ff:ff:ff:ff
inet 172.16.2.11/16 brd 255.255.255.0 scope global eth1
inet6 fe80::20c:29ff:fe31:5c9d/64 scope link 
valid_lft forever preferred_lft forever
3: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000
link/ether 00:0c:29:31:5c:a7 brd ff:ff:ff:ff:ff:ff
inet 172.16.2.12/24 brd 255.255.255.0 scope global eth2
inet 172.16.2.10/32 scope global eth2
inet6 fe80::20c:29ff:fe31:5ca7/64 scope link 
valid_lft forever preferred_lft forever

Nginx 设置
  1、安装nginx (或者其他web服务器)
  设置一个站点页面

cat vi /opt/nginx/conf/nginx.conf
events { worker_connections
10240; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; server_name 172.16.2.15; location / { root /opt/nginx/server index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } }

 


Linux 后端机器注意:

  设置修改内核;(定义添加虚拟IP )

1、添加VIP 设置 arp_announce和arp_ignore 这两个参数;

# arp_ignore
# 1 -- 只有ARP请求数据包所请求的IP地址属于当前网卡的IP地址,才会回应ARP响应数据包。
# 2 -- 除了满足1的条件外,还要满足ARP请求数据包的发送方IP地址也属于当前网卡所属子网,这样才会回应ARP响应数据包。
# 3 -- 如果ARP请求数据包所请求的IP地址对应的本地地址其作用域(scope)为主机(host),则不回应ARP响应数据包,如果作用域为全局(global)或链路(link),则回应ARP响应数据包。
# 4~7 -- 保留
# 8 -- 即使ARP请求数据所请求的IP地址属于任何一个本地地址,也不回应ARP响应数据包。

#add for chkconfig 
#chkconfig:
2345 70 30 #234都是文本界面,5就是图形界面X,70启动顺序号,30系统关闭,脚本 #止顺序号 #description: RealServer's script #关于脚本的简短描述 #processname: realserver.sh #第一个进程名,后边设置自动时会用到

 

  内核修改生效
  # sysctl -p 执行重新加载 sysctl.conf

  2、也可以设置一个 vip设置脚本

#!/bin/bash 
VIP=172.16.2.15
source /etc/rc.d/init.d/functions 
case "$1" in 
start) 
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP 
/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 
echo "RealServer Start OK" 
;; 
stop) 
ifconfig lo:0 down 
route del $VIP >/dev/null 2>&1 
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 "RealServer Stoped" 
;; 
*) 
echo "Usage: $0 {start|stop}" 
exit 1 
esac 
exit 0

 

posted @ 2018-04-11 11:44  01234567  阅读(352)  评论(0编辑  收藏  举报