18.1 集群介绍 18.2 keepalived介绍 18.3/18.4/18.5 用keepalived配置高可用集群 18.6 负载均衡集群介绍 18.7 LVS介绍 18.8 LVS调度算法 18.9/18.10 LVS NAT模式搭建
高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务。集群的特点:高性能(Performance)、价格有效(Cost-effectiveness)、可伸缩性(Scalability)、高可用性(Availability)、透明性(Traansparency)、可管理性(Manageability)、可编程性(Programmability)
根据功能划分为两大类:高可用和负载均衡
在这里我们使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果。
[root@linux-001 ~]# yum instll -y keepalived
已加载插件:fastestmirror
没有该命令:instll。请使用 /usr/bin/yum --help
[root@linux-001 ~]# yum install -y keepalived
已加载插件:fastestmirror
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Determining fastest mirrors
epel/x86_64/metalink | 7.1 kB 00:00:00
* base: mirrors.cn99.com
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.cn99.com
* updates: mirrors.zju.edu.cn
base | 3.6 kB 00:00:00
epel | 5.3 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
(1/3): epel/x86_64/updateinfo | 977 kB 00:00:00
(2/3): updates/7/x86_64/primary_db | 5.0 MB 00:00:01
(3/3): epel/x86_64/primary_db | 6.7 MB 00:00:05
正在解决依赖关系
--> 正在检查事务
---> 软件包 keepalived.x86_64.0.1.3.5-8.el7_6 将被 安装
--> 正在处理依赖关系 libnetsnmpmibs.so.31()(64bit),它被软件包 keepalived-1.3.5-8.el7_6.x86_64 需要
--> 正在处理依赖关系 libnetsnmpagent.so.31()(64bit),它被软件包 keepalived-1.3.5-8.el7_6.x86_64 需要
--> 正在处理依赖关系 libnetsnmp.so.31()(64bit),它被软件包 keepalived-1.3.5-8.el7_6.x86_64 需要
--> 正在检查事务
---> 软件包 net-snmp-agent-libs.x86_64.1.5.7.2-37.el7 将被 安装
---> 软件包 net-snmp-libs.x86_64.1.5.7.2-37.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=====================================================================================================================================
Package 架构 版本 源 大小
=====================================================================================================================================
正在安装:
keepalived x86_64 1.3.5-8.el7_6 updates 329 k
为依赖而安装:
net-snmp-agent-libs x86_64 1:5.7.2-37.el7 base 705 k
net-snmp-libs x86_64 1:5.7.2-37.el7 base 749 k
事务概要
=====================================================================================================================================
安装 1 软件包 (+2 依赖软件包)
总下载量:1.7 M
安装大小:6.0 M
Downloading packages:
(1/3): net-snmp-agent-libs-5.7.2-37.el7.x86_64.rpm | 705 kB 00:00:00
(2/3): net-snmp-libs-5.7.2-37.el7.x86_64.rpm | 749 kB 00:00:00
(3/3): keepalived-1.3.5-8.el7_6.x86_64.rpm | 329 kB 00:00:00
-------------------------------------------------------------------------------------------------------------------------------------
总计 1.8 MB/s | 1.7 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : 1:net-snmp-libs-5.7.2-37.el7.x86_64 1/3
正在安装 : 1:net-snmp-agent-libs-5.7.2-37.el7.x86_64 2/3
正在安装 : keepalived-1.3.5-8.el7_6.x86_64 3/3
验证中 : 1:net-snmp-libs-5.7.2-37.el7.x86_64 1/3
验证中 : keepalived-1.3.5-8.el7_6.x86_64 2/3
验证中 : 1:net-snmp-agent-libs-5.7.2-37.el7.x86_64 3/3
已安装:
keepalived.x86_64 0:1.3.5-8.el7_6
作为依赖被安装:
net-snmp-agent-libs.x86_64 1:5.7.2-37.el7 net-snmp-libs.x86_64 1:5.7.2-37.el7
完毕!
[root@linux-001 ~]#
[root@linux-001 ~]# mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
[root@linux-001 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
whdong007@163.com
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval 3
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.141.100
}
track_script {
chk_nginx
}
}
[root@linux-001 ~]# vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
[root@linux-001 ~]# chmod 755 /usr/local/sbin/check_ng.sh
为了做实验,启动keepalived服务的时候,关闭防火墙firewalld,iptables规则清空,selinux也关闭。
[root@linux-001 ~]# getenforce
Disabled
[root@linux-001 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
3866 15M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
1 84 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
1 52 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
26 4211 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 3102 packets, 234K bytes)
pkts bytes target prot opt in out source destination
[root@linux-001 ~]# iptables -F
[root@linux-001 ~]# systemctl stop firewalld
[root@linux-001 ~]# /etc/init.d/nginx start
Reloading systemd: [ 确定 ]
Starting nginx (via systemctl): [ 确定 ]
[root@linux-001 ~]# !ps
ps aux | grep nginx
root 8150 0.0 0.0 20544 600 ? Ss 03:33 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 8154 0.0 0.0 20984 1060 ? S 03:33 0:00 nginx: worker process
root 8160 0.0 0.0 112724 988 pts/0 R+ 03:33 0:00 grep --color=auto nginx
[root@linux-001 ~]# systemctl start keepalived
[root@linux-001 ~]# ps aux |grep kee
root 7948 0.0 0.0 122980 1412 ? Ss 03:31 0:00 /usr/sbin/keepalived -D
root 7949 0.0 0.1 133940 3328 ? S 03:31 0:00 /usr/sbin/keepalived -D
root 7950 0.0 0.1 133812 2604 ? S 03:31 0:00 /usr/sbin/keepalived -D
root 8269 0.0 0.0 112724 984 pts/0 S+ 03:34 0:00 grep --color=auto kee
由于nginx没有配置虚拟主机,使用的默认配置文件,网页在nginx根目录下的html目录下。
[root@linux-001 ~]# cd /usr/local/nginx/html/
[root@linux-001 html]# mv index.html index.html.bak
[root@linux-001 html]# vim index.html
THIS IS MASTER KEEPALVED!
[root@linux-02 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
whdong007@163.com
}
notification_email_from
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_nginx.sh"
interval 3
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 55 //在同一网段内virtual_router_id 值不能相同,如果相同会在messages中收到VRRP错误包 所以需要更改
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.141.100
}
track_script {
chk_nginx
}
}
[root@linux-02 ~]# !vim
vim /usr/local/sbin/check_nginx.sh
#!/bin/bash
#时间变量,用于记录日志
d=`date --date today +%Y%m%d_%H:%M:%S`
#计算nginx进程数量
n=`ps -C nginx --no-heading|wc -l`
#如果进程为0,则启动nginx,并且再次检测nginx进程数量,
#如果还为0,说明nginx无法启动,此时需要关闭keepalived
if [ $n -eq "0" ]; then
/etc/init.d/nginx start
n2=`ps -C nginx --no-heading|wc -l`
if [ $n2 -eq "0" ]; then
echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
systemctl stop keepalived
fi
fi
[root@linux-02 ~]# chmod 755 /usr/local/sbin/check_ng.sh
[root@linux-02 ~]# systemctl stop firewalld
[root@linux-02 ~]# iptables -F
[root@linux-02 ~]#
[root@linux-02 ~]# getenforce
Disabled
[root@linux-02 ~]# systemctl start keepalived
[root@linux-02 ~]# ps aux |grep keep
root 7596 0.0 0.0 122980 1412 ? Ss 03:55 0:00 /usr/sbin/keepalived -D
root 7597 0.0 0.1 133940 3316 ? S 03:55 0:00 /usr/sbin/keepalived -D
root 7598 0.0 0.1 133812 2600 ? S 03:55 0:00 /usr/sbin/keepalived -D
root 7644 0.0 0.0 112724 984 pts/0 R+ 03:57 0:00 grep --color=auto keep
[root@linux-02 vhost]# vim /data/wwwroot/test.com/index.html
THIS IS BACKUP DEEPALIVED !
master端停止keepalived的服务,访问vip地址测试,如下,我们可以查看到访问192.168.141.100地址已经跳转到backup机器上了。
查看/var/log/message日志
如果日志中有以下的日志说明在keepalived的配置文件中virtual_router_id的值设置有问题。在同一网段内virtual_router_id 值不能相同,如果相同会在messages中收到VRRP错误包,所以需要更改。
LVS:Linux Virtuer Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统,基于TCP/IP做的路由和转发,稳定性和效率很高。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的开源软件项目之一。
LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。
一般来说,LVS集群采用三层结构 A、负载调度器(load balancer)或者叫分发器(Load Runner),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。 B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。 C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。
lvs支持的算法有: 轮询:Round-Robin,简称:rr 加权轮询:Weight Round-Robin,简称:wrr 最小连接:Least-Connection,简称:lc 加权最小连接:Weight Least-Connection,简称:wlc 基于局部性的最小连接:Locality-Based Least Connections,简称:lblc 带复制的基于局部性最小连接:Locality-Based Least Connections with Replication,简称:lblcr 目标地址散列调度:Destination Hashing,简称:dh 源地址散列调度:Source Hashing,简称:sh
使用的源码安装,下载地址:http://www.linuxvirtualserver.org/software/ipvs.html
[root@linux-001 ~]# yum -y install popt popt-devel libnl libnl-devel popt-static
安装省略
[root@linux-001 ~]# cd /usr/local/src/
tar -zxvf ipvsadm-1.26.tar.gz
[root@linux-001 src]# mv ipvsadm-1.26 /usr/local/ipvsadm
[root@linux-001 src]# cd !$
cd /usr/local/ipvsadm
[root@linux-001 ipvsadm]# make && make install
安装省略
ipvsadm工具常用的参数选项有: -A --add-service添加一条新的虚拟服务 -E --edit-service编辑虚拟服务 -D --delete-service删除虚拟服务 -C --clear清除所有的虚拟服务规则 -R --restore恢复虚拟服务规则 -a --add-server在一个虚拟服务中添加一个新的真实服务器 -e --edit-server编辑某个真实服务器 -d --delete-server删除某个真实服务器 -L | -l --list显示内核中的虚拟服务规则 -n --numeric以数字形式显示IP端口 -c --connection显示ipvs中目前存在的连接,也可以用于分析调度情况 -Z --zero将转发消息的统计清零 -p --persistent配置持久化时间 –set tcp tcpfin udp配置三个超时时间(tcp/tcpfin/udp) -t | -uTCP/UDP协议的虚拟服务 -g | -m | -iLVS模式为:DR | NAT | TUN -w 配置真实服务器的权重 -s 配置负载均衡算法,如:rr, wrr, lc等 –timeout 显示配置的tcp/tcpfin/udp超时时间 –stats 显示历史转发消息统计(累加值) –rate 显示转发速率信息(瞬时值)
[root@linux-001 ipvsadm]# vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# director 服务器上开启路由转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# 注意区分网卡名字,两个网卡分别为ens33和ens37
echo 0 > /proc/sys/net/ipv4/conf/ens33/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
iptables -t nat -F
iptables -t nat -X
iptables -t nat -A POSTROUTING -s 192.168.141.0/24 -j MASQUERADE
# director设置ipvsadm
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
$IPVSADM -A -t 192.168.23.88:80 -s rr
$IPVSADM -a -t 192.168.23.88:80 -r 192.168.141.129:80 -m -w 1
$IPVSADM -a -t 192.168.23.88:80 -r 192.168.141.130:80 -m -w 1
[root@linux-001 ipvsadm]# sh /usr/local/sbin/lvs_nat.sh
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-003
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-002
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-003
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-002
[root@linux-001 ipvsadm]# curl 192.168.23.88
linux-003
[root@linux-001 ipvsadm]#
高可用(双机热备) 负载均衡 分布式集群
高可用可以保证业务的稳定性
VRRP协议 https://blog.csdn.net/u013920085/article/details/21184143
http://blog.51cto.com/jiekeyang/1839583
5 fullnat模式