VS/NAT模式(Network address translation) VS/TUN模式(tunneling) DR模式(Direct routing):常用;内网单用卡
官方: http://www.linuxvirtualserver.org/zh/lvs4.html
固定调度算法:rr,wrr,dh,sh 轮询调度(Round-Robin Scheduling) 加权轮询调度(Weighted Round-Robin Scheduling) 目标地址散列调度(Destination Hashing Scheduling) 源地址散列调度(Source Hashing Scheduling)
动态调度算法:wlc,lc,lblc,lblcr 最小连接调度(Least-Connection Scheduling) 加权最小连接调度(Weighted Least-Connection Scheduling) 基于局部性的最少链接(Locality-Based Least Connections Scheduling) 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)
vip:10.0.1.15
Director节点 lvs-1:10.0.1.8 (master) Director节点 lvs-2:10.0.1.9 (backup)
在lvs主机上执行 keepalived shell
Real server1 web1:10.0.1.4 Real server1 web2:10.0.1.5
在后端主机上执行 lvs_rs.sh shell
yum -y install keepalived
echo 1 > /proc/sys/net/ipv4/ip_forward
grep ip_forward /etc/sysctl.conf &>/dev/null || echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
notification_email {
admin@attacker.club
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server smtp.qq.com
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_sync_group VG1 {
group{
VI_1
}
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
// 虚拟的路由ID两台参数必须一致
priority 100
// 定义优先级,谁大就是master
advert_int 1
// 超出1s如果对方没有反应它就接管
nopreempt //不抢占,master节点
authentication {
auth_type PASS
auth_pass lvsPASS0
}
virtual_ipaddress {
10.0.1.15
// 定义一个VIP
}
}
virtual_server 10.0.1.15 80 {
delay_loop 5
// 每隔5秒查询realserver状态
lb_algo rr
// lvs 算法
lb_kind DR
// DR模式
// persistence_timeout 60
// 会话保持时间
protocol TCP
real_server 10.0.1.4 80 {
weight 1 // 权重
inhibit_on_failure
// 服务器健康失败,将weight设置为0,而不删除
// notify_down /root/MySQL.sh //检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 5
// 连接超时时间;秒
nb_get_retry 3
// 重连次数
delay_before_retry 3
// 重连间隔时间
connect_port 80
// 健康检查端口
}
}
real_server 10.0.1.5 80 {
weight 1
inhibit_on_failure
TCP_CHECK {
connect_timeout 5
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
替换
% s/MASTER/BACKUP/
% s/priority 100/priority 90/
g/nopreempt/d
systemctl start keepalived
systemctl enable keepalived
ip add # 查看浮动ip地址
systemctl status keepalived # 查看状态
ipvsadm -ln
ipvsadm -ln --stats
ipvsadm -ln --rate
/opt/lvs_rs.sh
#read -p "请输入vip地址:" vip
vip=10.0.1.15
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
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
server {
listen 80 default_server;
default_type application/json;
server_name _;
return 200 '{"date":"$time_local","host":"web-2","result":"nginx json"}';
access_log /usr/local/nginx/logs/default.log;
}
1)持久连接(lvs persistence)模板:
实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS
ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
-p # :定义持久时长
2)持久连接实现方式:
每端口持久(PPC):每个端口对应定义为一个集群服务,每个集群服务单独调度,同一服务持久
每防火墙标记持久(PFWMC ):基于防火墙标记定义集群服务,可实现将多个端口上的应用统一调度,即所谓的port Affinity,同一防火墙标记持久
每客户端持久(PCC ):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式,所有服务持久将vip的端口定义为0,则表示所有请求都将发送后台服务器。
3)具体实现
在VS上进行如下操作
[root[@centos7](https://my.oschina.net/centos7) ~]#ipvsadm -E -f 12 -s rr -p 300
[root[@centos7](https://my.oschina.net/centos7) ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
FWM 12 rr persistent 300
-> 192.168.74.129:0 Route 1 0 0
-> 192.168.74.133:0 Route 1 0 0
session绑定(session sticky)
始终将同一个请求者的请求发送到同一台RS(第一次请求由算法调度)
缺陷:没有容错能力,若此RS宕机,则会话丢失,并且将同一请求发送到同一RS有损均衡效果。
session复制(session cluster)
在RS之间同步session,因此每个RS都保持集群中的所有session
缺陷:增加了RS的负担,对大规模的集群不适用
session服务器(session server),redis:
用单独一组服务器来管理session
转至:https://www.cnblogs.com/shenxm/p/8461303.html
!Configuration File for keepalived
global_defs {
notification_email {
xiaolin0199@gmail.com
}
notification_email_from xiaolin0199@gmail.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id MySQL-ha
}
vrrp_instance VI_1 {
state BACKUP #两台配置此处均是BACKUP
interface eth0
virtual_router_id 51
priority 100 #优先级,另一台改为90
advert_int 1
nopreempt #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.0.200
}
}
virtual_server 192.168.0.200 3306 {
delay_loop 2 #每个2秒检查一次real_server状态
lb_algo wrr #LVS算法
lb_kind DR #LVS模式
persistence_timeout 60 #会话保持时间
protocol TCP
real_server 192.168.0.219 3306 {
weight 3
notify_down /usr/local/MySQL/bin/MySQL.sh #检测到服务down后执行的脚本
TCP_CHECK {
connect_timeout 10 #连接超时时间
nb_get_retry 3 #重连次数
delay_before_retry 3 #重连间隔时间
connect_port 3306 #健康检查端口
}
}
}
编写检测服务down后所要执行的脚本
/usr/local/MySQL/bin/MySQL.sh
#!/bin/sh
pkill keepalived
注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本; 我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。
转至:https://xiaolin0199.iteye.com/blog/2017997
https://blog.51cto.com/11091005/2115025
/etc/sysconfig/keepalived
KEEPALIVED_OPTIONS= "-D -S 0 -d"
-D是让keepalived详细记录log -d是在日志里打出keepalived读到的配置信息 -S 0是到会将日志发送给syslog,且日志定为LOCAL0
``` echo "local0.* /var/log/keepalived.log">> /etc/rsyslog.conf
systemctl restart rsyslog
tail /var/log/keepalived.log