Linux集群架构
1. Linux集群概述
- 根据功能划分为两大类:高可用和负载均衡
- 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
- 实现高可用的开源软件有:heartbeat、keepalived
- 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2
- 实现负载均衡的开源软件有LVS、keepalived、haproxy、nginx,商业的有F5、Netscaler
2. 搭建 keepalived+nginx 实现高可用集群
2.1 keepalived介绍及工作原理
- keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
- 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
- master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master。
- Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。
2.2 搭建准备
准备两台虚拟机并配置IP地址。
IP |
主机名 |
172.16.51.128 |
master |
172.16.51.129 |
backup |
2.3 master设置
2.3.1 安装nginx
下载wget服务:
下载nginx服务压缩包:
解压nginx压缩包,并配置编译选项:
编译和安装nginx:
编写nginx启动脚本,并加入系统服务,命令如下:
#!/bin/bash
# chkconfig: - 30 21
# description: http service.
# Source Function Library
. /etc/init.d/functions
# Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start()
{
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop()
{
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETVAL=$?
echo
return $RETVAL
}
reload()
{
echo -n $"Reloading $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -HUP
RETVAL=$?
echo
return $RETVAL
}
restart()
{
stop
start
}
configtest()
{
$NGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop|reload|restart|configtest}"
RETVAL=1
esac
exit $RETVAL
更改脚本权限,设置开机自启动,并清空原配置文件(/usr/lcoal/ngnix/conf/nginx.conf),如下图:
编辑/usr/lcoal/ngnix/conf/nginx.conf文件,命令如下:
user nobody nobody;
worker_processes 2;
error_log /usr/local/nginx/logs/nginx_error.log crit;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 51200;
events
{
use epoll;
worker_connections 6000;
}
http
{
include mime.types;
default_type application/octet-stream;
server_names_hash_bucket_size 3526;
server_names_hash_max_size 4096;
log_format combined_realip '$remote_addr $http_x_forwarded_for [$time_local]'
' $host "$request_uri" $status'
' "$http_referer" "$http_user_agent"';
sendfile on;
tcp_nopush on;
keepalive_timeout 30;
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
connection_pool_size 256;
client_header_buffer_size 1k;
large_client_header_buffers 8 4k;
request_pool_size 4k;
output_buffers 4 32k;
postpone_output 1460;
client_max_body_size 10m;
client_body_buffer_size 256k;
client_body_temp_path /usr/local/nginx/client_body_temp;
proxy_temp_path /usr/local/nginx/proxy_temp;
fastcgi_temp_path /usr/local/nginx/fastcgi_temp;
fastcgi_intercept_errors on;
tcp_nodelay on;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 8k;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_types text/plain application/x-javascript text/css text/htm
application/xml;
server
{
listen 80;
server_name localhost;
index index.html index.htm index.php;
root /usr/local/nginx/html;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name;
}
}
}
检查文件是否正确,并启动nginx,查看服务是否启动:
至此nginx服务安装启动完成。
2.3.2 编辑nginx监控文件
创建nginx监控文件并编辑内容
2.3.3 安装keepalived
下载keepalived包:
2.3.4 编辑keepalived配置文件
编辑keepalived配置文件:
2.3.5 检测是否完成
开启keepalived服务,并关闭selinux,查看IP:
查看nginx服务是否启动:
关闭防火墙:systemctl stop firewalld
2.4 Bachup设置
2.4.1 编辑keepalived文件
下载keepalived包:
编辑keepalived文件:
2.4.2 编辑监控nginx脚本
创建监控nginx服务脚本文件:
更改脚本权限:
下载nginx,并开启keepalived服务,关闭selinux,关闭防火墙:
2.4.3 区分master和backup
Curl 128、129和VIP100:
可以得知128版本上为1.10.3,129版本上为16.1.1,直接访问VIP100上为1.10.3也在master上。
把nginx关闭,查看端口,并等会检查nginx服务再次启动:
查看日志,可以看出nginx被启动的信息:
增加Iptables规则:
查看backup是否被设置VIP:
2.5宕机
在master上关闭keepalived服务,模拟宕机:
可以看到master上VIP判定到了slaver上。
开启keepalived服务,再次查看:
可以看到VIP从新判定在master上。
3. LVS负载均衡
3.1 LVS介绍
- LVS是由国人章文嵩开发
- 流行度不亚于apache的httpd,基于TCP/IP做的路由和转发,稳定性和效率很高
- LVS最新版本基于Linux内核2.6,有好多年不更新了
- LVS有三种常见的模式:NAT、DR、IP Tunnel
- LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)
- 这种模式借助iptables的nat表来实现
- 用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去
- rs需要设定网关为分发器的内网ip
- 用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
- 在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源
3.2 LVS NAT模式
3.3 Nat模式lvs搭建:
3.3.1 环境要求:
需要3台服务器:调试器dir(需要两个网卡,一个为nat模式IP为:172.16.51.128作为内网IP,一个为仅主机模式IP为192.168.218.129,作为公网IP),真实服务器rs1(需要一块网卡作为内网IP:172.16.51.129),真是服务器rs2(需要一块网卡作为内网IP:172.16.51.127)。
Rs1和Rs2的网关应设成dir的IP。
Rs1和Rs2上应安装nginx并启动服务。
3.3.2 搭建
Yum安装iptables-services:
在三台服务器上关闭防火墙,关闭selinux:
在dir上安装ipvsadm:
在dir上编写脚本文件,命令如下:
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward # director 服务器上开启路由转发功能,不开启的话没有办法把数据传输到后面的rs上面
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects # 关闭icmp的重定向
echo 0 > /proc/sys/net/ipv4/conf/eno16777736/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/eno33554984/send_redirects
iptables -t nat -F # director 设置nat防火墙
iptables -t nat -X #清空iptables 规则
iptables -t nat -A POSTROUTING -s 172.16.51.0/24 -j MASQUERADE · #可以实现同网段的内网上网
IPVSADM='/usr/sbin/ipvsadm' # director设置ipvsadm
$IPVSADM -C #清空规则
$IPVSADM -A -t 192.168.218.129:80 -s wlc -p 300 #设置一个规则,指定使用的什么规则(大规则)
$IPVSADM -a -t 192.168.218.129:80 -r 172.16.51.129:80 -m -w 1
$IPVSADM -a -t 192.168.218.129:80 -r 172.16.51.127:80 -m -w 1 · #具体的规则(小规则)
-C:清空规则
-A:增加virtual server
-t:TCP
-s:指定调度算法
-wlc:带权重的最小连接法
-p:指定超时时间
-a:增加rs
-r:指定rs的ip
-m:lvs的模式为nat
若:-g表示lvs模式为dr,-i:lvs模式为ip tunnel,-w:权重
检查脚本是否正确:
执行脚本:
若dir上开启nginx服务,则需要关闭:
给129和127设置一个默认主页:
在dir上访问rs1和rs2:
在dir上访问外网IP,脚本里面设置了-p参数,一般上在300秒内会一直访问在rs2上:
删除脚本中的-p参数,再次开启脚本访问公网IP,已经做到均衡访问:
3.4 LVS DR模式
- 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
- 和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址
- rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己
-
3.5 Dr模式lvs搭建
3.5.1 搭建要求
环境:3台几区都需要关闭防火墙、selinux,开启nginx服务
3.5.2 搭建
在dir上编写一个dr脚本,命令如下:
#! /bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=172.16.51.110
rs1=172.16.51.129
rs2=172.16.51.127
ifconfig eno16777736:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eno16777736: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
在rs1和rs2上编写脚本,命令如下:
#/bin/bash
vip=172.16.51.110
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip 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
在3台机器上执行脚本:
在浏览器访问rs1、rs2、VIP: