Linux集群实践

Linux集群架构

1. Linux集群概述

  • 根据功能划分为两大类:高可用和负载均衡
  • 高可用集群通常为两台服务器,一台工作,另外一台作为冗余,当提供服务的机器宕机,冗余将接替继续提供服务
  • 实现高可用的开源软件有:heartbeatkeepalived
  • 负载均衡集群,需要有一台服务器作为分发器,它负责把用户的请求分发给后端的服务器处理,在这个集群里,除了分发器外,就是给用户提供服务的服务器了,这些服务器数量至少为2
  • 实现负载均衡的开源软件有LVSkeepalivedhaproxynginx,商业的有F5Netscaler

 

2. 搭建 keepalived+nginx 实现高可用集群

2.1 keepalived介绍及工作原理

  • keepalived通过VRRPVirtual Router Redundancy Protocl)来实现高可用。
  • 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1master角色和NN>=1)个backup角色。
  • master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的master
  • Keepalived要有三个模块,分别是corecheckvrrp。其中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 128129VIP100:

 

 

 

 

 

 

 

可以得知128版本上为1.10.3,129版本上为16.1.1,直接访问VIP100上为1.10.3也在master上。

nginx关闭,查看端口,并等会检查nginx服务再次启动:

 

查看日志,可以看出nginx被启动的信息:

 

增加Iptables规则:

 

查看backup是否被设置VIP

 

2.5宕机

master上关闭keepalived服务,模拟宕机:

 

可以看到masterVIP判定到了slaver上。

开启keepalived服务,再次查看:

 

可以看到VIP从新判定在master上。

3. LVS负载均衡

3.1 LVS介绍

  • LVS是由国人章文嵩开发
  • 流行度不亚于apachehttpd,基于TCP/IP做的路由和转发,稳定性和效率很高
  • LVS最新版本基于Linux内核2.6,有好多年不更新了
  • LVS有三种常见的模式:NATDRIP Tunnel
  • LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs
  • 这种模式借助iptablesnat表来实现
  • 用户的请求到分发器后,通过预设的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,一个为仅主机模式IP192.168.218.129,作为公网IP),真实服务器rs1(需要一块网卡作为内网IP172.16.51.129),真是服务器rs2(需要一块网卡作为内网IP172.16.51.127)。

Rs1Rs2的网关应设成dirIP

Rs1Rs2上应安装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

-tTCP

-s:指定调度算法

-wlc:带权重的最小连接法

-p:指定超时时间

-a:增加rs

-r:指定rsip

-mlvs的模式为nat

若:-g表示lvs模式为dr-ilvs模式为ip tunnel-w:权重

检查脚本是否正确:

 

执行脚本:

 

dir上开启nginx服务,则需要关闭:

 

 

 

129127设置一个默认主页:

 

 

 

 

dir上访问rs1rs2:

 

dir上访问外网IP,脚本里面设置了-p参数,一般上在300秒内会一直访问在rs2上:

 

删除脚本中的-p参数,再次开启脚本访问公网IP,已经做到均衡访问:

 

 

 

3.4 LVS DR模式

  • 这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip
  • IP Tunnel不同的是,它会把数据包的MAC地址修改为rsMAC地址
  • rs接收数据包后,会还原原始数据包,这样目标IPvip,因为所有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

rs1rs2上编写脚本,命令如下:

 

#/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台机器上执行脚本:

 

在浏览器访问rs1rs2VIP

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/wft9/p/12907319.html
今日推荐