集群介绍
Linux集群根据功能划分为两大类:高可用和负载均衡。
高可用集群
高可用集群通常为2台服务器,一台工作,另一台作为冗余,当提供服务的机器宕机时,冗余将接替继续提供服务。
实现高可用的开源软件有:heartbeat、Keepalived,其中heartbeat已无人维护,基本上使用Keepalived来搭建高可用集群。
负载均衡集群
负载均衡集群,需要有1台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外就是给用户提供服务的服务器了,这些服务器数量至少为2台,所以负载均衡集群至少要3台服务器。
实现负载均衡的开源软件有:LVS、Keepalived、haproxy、nginx;商业软件有:F5、Netscaler。
Keepalived介绍
在这里我们使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果
keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
用keepalived配置高可用集群
两台机器,都要安装keepalived.
master: ip:192.168.176.135 编译安装Nginx
backup: ip : 192.168.176.134 yum安装Nginx
master:
安装keepalived
[root@ma-1 ~]# yum install -y keepalived
查看Nginx的版本:
[root@ma-1 ~]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.12.2
backup:
安装keepalived
[root@ma-2 ~]# yum install -y keepalived
yum 安装Nginx
[root@ma-2 ~]# yum install -y nginx
问题:
[root@ma-2 ~]# yum install -y nginx
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.163
* extras: mirrors.cqu.edu
* updates: mirrors.cqu.edu
没有可用软件包 nginx。
错误:无须任何处理
[root@ma-2 ~]# vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx/packages/centos/7/x86_64/
gpgcheck=0
enabled=1
处理方式在这片博文上
http://blog.csdn/lnboxue/article/details/74783885
配置keepalived
master:
将下面的配置文件写入/etc/keepalived/keepalived.conf的空文件中
global_defs {
notification_email {
aming@aminglinux
} #定义故障提醒邮件接收地址
notification_email_from root@aminglinux
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL #定义故障提醒邮件发送地址
}
vrrp_script chk_nginx { #定义监控脚本
script "/usr/local/sbin/check_ng.sh" #指定服务健康检测(check)脚本
interval 3 #检测时间间隔
}
vrrp_instance VI_1 {
state MASTER #定义该服务的角色
interface ens33 #定义在本机中监听VIP的网卡
virtual_router_id 51 #虚拟路由id(同组中的服务器保持该id一致)
priority 100 #指定本机权重(决定优先级)
advert_int 1
authentication { #定义认证相关信息
auth_type PASS #认证类型为密码形式
auth_pass 111111 #定义认证密码
}
virtual_ipaddress { #定义VIP
192.168.176.100
}
track_script { #加载监控服务(脚本)
chk_nginx #注意此处服务名称要与上面监控脚本名称一致
}
}
创建监控脚本(脚本名,自己在配置文件中定义了):
[root@ma-1 ~]# vim /usr/local/sbin/check_ng.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 #在此停止Keepalived服务是为了避免发生脑裂
fi
fi
保存退出
“脑裂”,即当master宕机后仍然未释放VIP,同时backup接替master提供服务要使用同一VIP,因而导致两台机器争占同一VIP导致服务紊乱,所以当master宕机后需要关闭其Keepalived服务来避免脑裂现象发生。Keepalived服务的日志位置:/var/log/messages。
写完脚本之后,还要给脚本变更权限
[root@ma-1 ~]# chmod 755 /usr/local/sbin/check_ng.sh
启动keepalived服务:
[root@ma-1 ~]# systemctl start keepalived
[root@ma-1 ~]# ps aux |grep keep
root 5114 0.0 0.1 120720 1484 ? Ss 21:23 0:00 /usr/sbin/keepalived -D
root 5115 0.3 0.3 127460 3292 ? S 21:23 0:00 /usr/sbin/keepalived -D
root 5126 0.0 0.0 112680 976 pts/0 R+ 21:23 0:00 grep --color=auto keep
查看Nginx服务
[root@ma-1 ~]# ps aux |grep nginx
root 1846 0.0 0.1 45996 1272 ? Ss 13:07 0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody 1854 0.0 0.3 48484 3920 ? S 13:07 0:00 nginx: worker process
nobody 1855 0.0 0.3 48484 3920 ? S 13:07 0:00 nginx: worker process
root 5159 0.0 0.0 112684 972 pts/0 R+ 21:26 0:00 grep --color=auto nginx
将Nginx停掉
[root@ma-1 ~]# /etc/init.d/nginx stop
Stopping nginx (via systemctl): [ 确定 ]
[root@ma-1 ~]# ps aux |grep nginx
root 5190 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@ma-1 ~]# ps aux |grep nginx
root 5193 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@ma-1 ~]# ps aux |grep nginx
root 5198 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
[root@ma-1 ~]# ps aux |grep nginx
root 5202 0.0 0.0 112680 976 pts/0 R+ 21:27 0:00 grep --color=auto nginx
停掉Nginx服务后,keepalived会自动启动Nginx服务
vip只能用ip add 查看
问题:
开启keepalived后 ,用ip add 查看发现VIP没有。查看配置文件,没错,查看脚本,没错。看日志,就是没启动起来,像这样
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:0e:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.176.135/24 brd 192.168.176.255 scope global dynamic ens33
valid_lft 1131sec preferred_lft 1131sec
inet 192.168.176.150/24 brd 192.168.176.255 scope global secondary ens33:0
valid_lft forever preferred_lft forever
inet6 fe80::4f59:7251:18f1:8716/64 scope link
valid_lft forever preferred_lft forever
解决方法:
查看iptables规则,关闭。
[root@ma-1 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
查看selinux,
[root@ma-1 ~]# getenforce
Enforcing
关闭后,VIP出来了。
[root@ma-1 ~]# setenforce 0
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:a1:0e:2c brd ff:ff:ff:ff:ff:ff
inet 192.168.176.135/24 brd 192.168.176.255 scope global dynamic ens33
valid_lft 1048sec preferred_lft 1048sec
inet 192.168.176.100/32 scope global ens33
valid_lft forever preferred_lft forever
backup:
关掉防火墙
[root@ma-2 ~]# systemctl stop firewalld
[root@ma-2 ~]# setenforce 0
keepalived配置:
[root@ma-2 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
aming@aminglinux
}
notification_email_from root@aminglinux
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
}
vrrp_script chk_nginx {
script "/usr/local/sbin/check_ng.sh"
interval 3
}
vrrp_instance VI_1 { #只有该部分与master有区别
state BACKUP #角色
interface ens33
virtual_router_id 51
priority 90 #权重
advert_int 1
authentication {
auth_type PASS
auth_pass 111111
}
virtual_ipaddress {
192.168.176.100
}
track_script {
chk_nginx
}
}
保存退出
创建监控脚本
[root@ma-2 ~]# vim /usr/local/sbin/check_ng.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
systemctl start nginx
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@ma-2 ~]# chmod 755 !$
chmod 755 /usr/local/sbin/check_ng.sh
启动keepalived
[root@ma-2 ~]# systemctl start keepalived
负载均衡集群介绍
实现负载均衡集群的软件有:LVS、Keepalived、Nginx、haproxy等。其中LVS属于四层(网络OSI模型);Nginx属于七层;haproxy既可以认为是四层,也可以当做是七层使用。
keepalived的负载均衡功能是lvs.
LVS、haproxy这种四层负载均衡可以分发除80端口(web服务)以外的通信,如MySQL-3306;而Nginx仅仅支持http,https,mail。
相对来说,LVS这种四层的更加稳定,能承受更多的请求,而Nginx这种七层的更加灵活,能实现更多的个性化需求。
LVS介绍
LVS是基于tcp/ip做的路由和转发,稳定性和效率很高,LVS最新版本是基于Linux内核2.6。LVS常见的模式有三种:NAT、DR、IP Tunnel。LVS架构中有一个核心角色叫分发器(Load Balance),用于分发客户的各种请求,另外还有诸多服务器(real server,简称rs),用于处理用户各种请求。
nat:
这种模式借助iptables的nat表来实现
用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
rs需要设定网关为分发器的内网ip
用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
在该模式中,load balancer是限制该架构处理用户请求的一个瓶颈,所以该模式比较适合小模式的集群(服务器rs在10台以内);该模式的优势是节省公网资源。
IP Tunnel:
这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip
客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs上
rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
DR:
这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
LVS的调度算法
轮询 Round-Robin rr
均衡的把请求发到real server上
加权轮询 Weight Round-Robin wrr
根据权重轮询
最小连接 Least-Connection lc
新的请求分给请求量少的real server
加权最小连接 Weight Least-Connection wlc
基于局部性的最小连接 Locality-Based Least Connections lblc
带复制的基于局部性最小连接 Locality-Based Least Connections with Replication lblcr
目标地址散列调度 Destination Hashing dh
源地址散列调度 Source Hashing sh
LVS NAT模式搭建
三台机器:
分发器(ma-1)
内网:192.168.176.135外网:192.168.248.130(仅主机)
real server1(ma-2)
内网:192.168.176.134 设置网关为: 192.168.176.135
real server2(mxk)
内网:192.168.176.133 设置网关为: 192.168.176.135
全都关闭防火墙(selinux和firewalld规则)
在ma-2和mxk中:安装iptables
[root@ma-2 ~]#yum install -y iptables-services
[root@ma-2 ~]# iptables -F
[root@ma-2 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
配置ma-1:
安装ipvsadm
[root@ma-1 ~]# yum install -y ipvsadm
编辑脚本
[root@ma-1 ~]# 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
# 注意区分网卡名字,shuai的两个网卡分别为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.176.0/24 -j MASQUERADE
# director设置ipvsadm规则
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C
#-C=clear,清除规则
$IPVSADM -A -t 192.168.248.130:80 -s rr
#-A:=add,添加规则;-t:=tcp;-s 指定算法;
#在此可以添加-p:指定超时时间(解决session问题:保证同一请求被分发到同一rs上)
#因为添加-p选项后会影响测试效果,所以在此不加该参数(注:时间不能设置为0)
$IPVSADM -a -t 192.168.248.130:80 -r 192.168.176.134:80 -m -w 1
$IPVSADM -a -t 192.168.248.130:80 -r 192.168.176.133:80 -m -w 1
#-a:=add,增加nat架构中的rs;-r:指定rs的IP;-m:指定LVS模式为NAT(masquerade)
#-w:=weight,指定权重
运行脚本:
[root@ma-1 ~]# sh /usr/local/sbin/lvs_nat.sh
测试
两台rs上都安装nginx
在两台real server上的Nginx的index.html写不同信息
[root@ma-2 ~]# vi /usr/share/nginx/html/index.html
ma-2
[root@mxk ~]# vi /usr/share/nginx/html/index.html
mxk
都开启Nginx服务
这时,就可以做测试了。
用浏览器访问公网IP
可能会有缓存,得到不了想要的结果
用curl测试:
[root@ma-1 ~]# curl 192.168.248.130
mxk
[root@ma-1 ~]# curl 192.168.248.130
ma-2
[root@ma-1 ~]# curl 192.168.248.130
mxk
[root@ma-1 ~]# curl 192.168.248.130
ma-2
扩展
lvs 三种模式详解 http://www.it165/admin/html/201401/2248.html
lvs几种算法 http://www.aminglinux/bbs/thread-7407-1-1.html
关于arp_ignore和 arp_announce http://wwwblogs/lgfeng/archive/2012/10/16/2726308.html
lvs原理相关的 http://blog.csdn/pi9nc/article/details/23380589
LVS DR模式搭建
准备:
三台机器
分发器,调度器(ma-1)
ip:192.168.176.135
real server1 (mxk)
ip:192.168.176.134
real server2 (mxk)
ip:192.168.176.133
vip:192.168.176.100
vip要绑定到所有机器上
配置ma-1:
编写脚本
[root@ma-1 ~]# vim /usr/local/sbin/lvs_dr.sh
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
#开启端口转发
ipv=/usr/sbin/ipvsadm
vip=192.168.176.100
rs1=192.168.176.134
rs2=192.168.176.133
#注意这里的网卡名字
ifdown ens33
ifup ens33
#在此重启网卡的目的是避免重复设置命令行提供的IP
ifconfig ens33:2 $vip broadcast $vip netmask 255.255.255.255 up
#绑定VIP到dir的虚拟网卡ens33:2
route add -host $vip dev ens33:2
#添加网关
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
#设置ipvsadm规则,-g=gateway:使用默认网关(DR模式)
运行脚本
[root@ma-1 ~]# sh /usr/local/sbin/lvs_dr.sh
成功断开设备 'ens33'。
成功激活的连接(D-Bus 激活路径:/org/freedesktop/NetworkManager/ActiveConnection/2)
在两real server 下写脚本
[root@ma-2 ~]# vi /usr/local/sbin/lvs_dr.sh
#/bin/bash
vip=192.168.176.100
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
#参考文档wwwblogs/lgfeng/archive/2012/10/16/2726308.html
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
执行脚本
[root@mxk ~]# sh !$
sh /usr/local/sbin/lvs_dr.sh
[root@mxk ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.176.2 0.0.0.0 UG 100 0 0 ens33
192.168.176.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.176.100 0.0.0.0 255.255.255.255 UH 0 0 0 lo
测试:
浏览器访问VIP
keepalived + LVS DR
完整的架构需要两台服务器(角色为dir),分别安装Keepalived工具,目的是实现高可用,但Keepalived本身也有负载均衡功能,所以本次使用可以只安装一台Keepalived。
Keepalived内置了ipvsadm的功能,所以不需要安装ipvsadm包,也不用编写和执行lvs_dr脚本
三台机器:
调度器director(ma-1):
ip:192.168.176.135 安装keeplived
real server1(mxk):
ip:192.168.176.134
realserver2(mxk):
ip:192.168.176.133
vip:192.168.176.100
配置director:
编辑配置文件
[root@ma-1 ~]# vim /etc/keepalived/keepalived.conf
nstance VI_1 {
state MASTER
#绑定vip的网卡为ens33,你的网卡和阿铭的可能不一样,这里需要你改一下
interface ens33
virtual_router_id 51
#备用服务器上为90
priority 100
advert_int 1
authentication {
}
virtual_ipaddress {
192.168.176.100
}
virtual_server 192.168.176.100 80 {
#(每隔10秒查询realserver状态)
delay_loop 10
lb_algo wlc
#算法(DR模式)
lb_kind DR
#(同一IP的连接60秒内被分配到同一台realserver)
#(用TCP协议检查realserver状态)
protocol TCP
real_server 192.168.176.134 80 {
#(权重)
weight 100
TCP_CHECK {
#(10秒无响应超时)
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
real_server 192.168.176.133 80 {
weight 100
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}
配置real server ,和LVS DR 模式一样,并且要启动脚本。分发器的脚本只需要执行
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
扩展
haproxy+keepalived http://blog.csdn/xrt95050/article/details/40926255
nginx、lvs、haproxy比较 http://www.csdn/article/2014-07-24/2820837
keepalived中自定义脚本 vrrp_script http://my.oschina/hncscwc/blog/158746
lvs dr模式只使用一个公网ip的实现方法 http://storysky.blog.51cto/628458/338726
更多推荐
集群介绍
发布评论