linux集群

Linux集群

高可用集群

简介

           高可用性集群(HA cluster)是指如单系统一样地运行并支持(计算机)持续正常运行的一个主机群。高可用集群的出现是为了使集群的整体服务尽可能可用,从而减少由计算机硬件和软件易错性所带来的损 失。如果某个节点失效,它的备援节点将在几 秒钟的时间内接管它的职责。因此,对于用户而言,集群永远不会停机。高可用集群软件的主要作用就是实现故障检查和业务切换的自动化。

组件:

1、Messaging  Layer:传递当前节点的心跳信息,并告知给对方,如    果不在线,则可以实现资源转移,这样另一台节点就可以充当主 节点,并正常提供服务。

      提供该组件的软件有:

                      Heartbeat 比较常用的软件

                      Keepalived配置相对比较简单

                      ultramonkey不常用

                      Corosync功能强大、丰富。

2、CRM(Cluster  Resource Messager):该组件叫做资源管理器,它 主要是用来提供那些不具有高可用的服务提供高可用性的。它需     要借助Messaging  Layer来实现工作,因此工作在Messaging      Layer上层。

3、LRM(Local Resource  Messager):本地资源管理器,它是CRM 的一个子组件,用来获取某个资源的状态,并且管理本地资源的。

4、DC:相当于事务调解员。当多个节点之间彼此收不到对方的心跳 信息时,各个节点都会认为对方发生故障,于是就会产尘分裂状   况(分组)。并且都运行着相关服务,因此就会发生资源争夺的状   况。事务协调员会根据每个组的法定票数来决定哪些节点启动服    务,哪些节点停止服务。

5、PE和TE:PE和TE也是DC的子组件

      PE(Policy Engine):策略引擎,来定义资源转移的一整套转移方 式,但只是做      策略者,并不亲自来参加资源转移的过程,而是     让TE来执行自己的策略。

      TE(Transition Engine): 就是来执行PE做出的策略的并且只有 DC上才运行PE和TE

6、stonithd组件:当一个节点发生故障时,另 一个节点如果能侦测 到,就会通过网络发出命令,控制故障节点的电源开关,通过暂   时断电,而又上电的方式使故障节点被重启动或者直接断电, 这  种方式需要硬件支持。

7、共享存储

8、资源

 

Keepalived高可用集群

       keepalived通过VRRP(Virtual Router Redundancy Protocl 中文为:虚拟路由冗余协议)来实现高可用。在这个协议里,会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。在这个协议里,会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。

      Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。

1.Master主机

      1.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服务安装启动完成。

      1.2编辑keepalived配置文件

       下载keepalived包:

       编辑keepalived配置文件:

! Configuration File for keepalived

 

global_defs {                                     #全局配置标识,表明这个区域{}是全局配置

   notification_email {

        131917381@qq.com             #表示发送通知邮件时邮件源地址是谁

   }

   notification_email_from root@aaaaa.com      #表示keepalived在发生诸如切换操作时需要发送email通知,以及email发送给哪些邮件地址,邮件地址可以多个,每行一个

   smtp_server 127.0.0.1     #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现

   smtp_connect_timeout 30        #连接smtp连接超时时间

   router_id LVS_DEVEL          #机器标识

}

 

vrrp_script chk_nginx {

    script "/usr/local/sbin/check_ng.sh"             #检查服务是否正常,通过写脚本实现,脚本检查服务健康状态

    interval 3                      #检查时间间断是3秒

    }

 

vrrp_instance VI_1 {                   #VRRP配置标识 VI_1是实例名称

    state MASTER                     #定义master相关

    interface eno16777736   #通过vrrp协议去通信、去发广播。此为网卡名

    virtual_router_id 51              #定义路由器ID ,配置的时候和从机器一致

    priority 100    #权重,主角色和从角色的权重是不同的,一般主比从大

    advert_int 1    #设定MASTER与BACKUP主机质检同步检查的时间间隔,单位为秒

    authentication {             #认证相关信息

        auth_type PASS     #认证类型

        auth_pass 5201314>g           #密码的形式是一个字符串

    }

    virtual_ipaddress { #设置虚拟IP地址 (VIP),又叫做漂移IP地址

        172.16.51.100

    }

    track_script {         #加载脚本

        chk_nginx

    }

}

 

      1.3编辑监控nginx脚本

       创建监控nginx服务脚本,命令如下:

  #!/bin/bash                                                                        
  d=`date --date today +%Y%m%d_%H:%M:%S`    #时间变量,用于记录日志
  n=`ps -C nginx --no-heading|wc -l`        #计算nginx进程数量
  if [ $n -eq "0" ]; then                            #如果进程为0,则启动nginx,并且再次检测nginx进程数量,=
          /etc/init.d/nginx start
          n2=`ps -C nginx --no-heading|wc -l`        #如果还为0,说明nginx无法启动,此时需要关闭keepalived
          if [ $n2 -eq "0"  ]; then
                  echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
                  systemctl stop keepalived
          fi
 fi

   开启keepalived服务,并关闭selinux,查看IP:

   查看nginx服务是否启动:

   关闭防火墙:

2.Bachup主机

      2.1编辑keepalived文件

       下载keepalived包:

      编辑keepalived文件:

! Configuration File for keepalived

 

global_defs {

   notification_email {

        131917381@qq.com

   }

   notification_email_from root@aaaaa.com

   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 {

    state BACKUP

    interface eno16777736

    virtual_router_id 51

    priority 90

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 5201314>g

    }

    virtual_ipaddress {

        172.16.51.100

    }

    track_script {

        chk_nginx

    }

}

      

      2.2编辑监控nginx脚本

      创建监控nginx服务脚本文件:

d=`date --date today +%Y%m%d_%H:%M:%S`

n=`ps -C nginx --no-heading|wc -l`

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

       更改脚本权限:

      下载nginx,并开启keepalived服务,关闭selinux,关闭防火墙:

 

 

 

 

 

 

      2.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.4宕机

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

可以看到master上VIP判定到了slaver上。

      开启keepalived服务,再次查看:

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

在生产环境中,可能会用到2-3台backup角色, vim /etc/keepalived/keepalived.conf 这里面的权重调成不同级别,权重越高优先级越高!除了nginx服务的话,还可以做MySQL的高可用集群服务。(做mysql的高可用,一定要保证两边的数据一致)

 

 

搭建负载均衡集群

       LVS介绍:

           LVS是由国人章文嵩开发,LVS有三种常见的模式:NAT、DR、IP Tunnel,LVS架构中有一个核心角色叫做分发器(Load balance),它用来分发用户的请求,还有诸多处理用户请求的服务器(Real Server,简称rs)。

LVS的调度算法:

  1. 轮询调度(rr):按照顺序把请求
  2. 加权轮询调度(wrr):我们给每个服务器设置权值Weight,负载均衡调度器根据权值调度服务器,服务器被调用的次数跟权值成正比。
  3. 最小连接调度(lc):优先把请求转发给连接数少的服务器。
  4. 加权最小连接调度(wlc):在lc的基础上,为每台服务器加上权值。算法为:(活动连接数 * 256 + 非活动连接数) ÷ 权重,计算出来的值小的服务器优先被选择。
  5. 原地址散列算法(sh):提取用户IP,根据散列函数得出一个key,再根据静态映射表,查处对应的value,即目标服务器IP。过目标机器超负荷,则返回空。
  6. 目标地址散列算法(dh):提取的是目标地址的IP来做哈希。

Nat模式lvs搭建:

      这种模式借助iptables的nat表来实现,用户的请求到分发器后,通过预设的iptables规则,把请求的数据包转发到后端的rs上去,rs需要设定网关为分发器的内网ip,用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈,在nat模式中,只需要分发器有公网ip即可,所以比较节省公网ip资源。

      使用NAT 这种模式的请求量不能过大 一般十台以内,超过十台就有点力不从心了,除非机器配置很高,网卡是千兆网卡,万兆光纤。

 

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并启动服务。

      Yum安装iptables-services:

      在三台服务器上关闭防火墙,关闭selinux:

 

 

 

 

      在dir上安装ipvsadm:

2.编写脚本文件

      在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服务,则需要关闭:

 

 

3.进行curl测试

给129和127设置一个默认主页:

 

      在dir上访问rs1和rs2:

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

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

 

LVS IP Tunnel模式

      这种模式,需要有一个公共的IP配置在分发器和所有rs上,我们把它叫做vip,客户端请求的目标IP为vip,分发器接收到请求数据包后,会对数据包做一个加工,会把目标IP改为rs的IP,这样数据包就到了rs,rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己。

Dr模式lvs搭建

这种模式,也需要有一个公共的IP配置在分发器和所有rs上,也就是vip。

和IP Tunnel不同的是,它会把数据包的MAC地址修改为rs的MAC地址。

rs接收数据包后,会还原原始数据包,这样目标IP为vip,因为所有rs上配置了这个vip,所以它会认为是它自己。

       环境:3台几区都需要关闭防火墙、selinux,开启nginx服务

1.编写脚本

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

 

 

 

 

2.访问测试

      在浏览器访问rs1、rs2、VIP:

 

 

 

 

 

 

Keepalived+LVS

环境:

           3台机器都应当安装nginx服务

           主keepalived调度器应当安装keepalived服务

编辑keepalived配置文件,命令如下:

vrrp_instance VI_1 {

    state MASTER

    interface eno16777736

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

        auth_type PASS

        auth_pass 1111

    }

    virtual_ipaddress {

        172.16.51.110        

    }

}

 

virtual_server 172.16.51.110 80 {          #VIP

    delay_loop 10         #每隔10秒查询realserver状态

    lb_algo wlc                                  #lvs算法

    lb_kind DR                                  #DR模式

    persistence_timeout 60               #(同一IP的连接60秒内被分配到同一台realserver)

    protocol TCP          #用TCP协议检查realserver状态

    real_server 172.16.51.129 80 {             #真实服务器ip

        weight 100             #权重

        TCP_CHECK {

            connect_timeout 10        # 10秒无响应超时(连接超时时间)

            nb_get_retry 3                #失败重试次数

            delay_before_retry 3       #失败重试的间隔时间

            connect_port 80             #连接的后端端口

        }

}

     real_server 172.16.51.127 80 {

        weight 100

        TCP_CHECK {

            connect_timeout 10

            nb_get_retry 3

            delay_before_retry 3

            connect_port 80

        }

    }

}

      清空ipvsadm规则,并把之前设置的vip删除掉:

      在两台rs上执行脚本:

 

      在dir上启动keepalived服务,并查看:

      使用浏览器访问vip,关闭127的nginx服务:

      开启服务再次启动:

 

posted @ 2020-03-26 15:07  htttt  阅读(360)  评论(0编辑  收藏  举报