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