admin管理员组

文章数量:1561838

集群介绍

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

 

本文标签: 集群