0604 linux集群架构(上)

本文详细介绍了Linux集群架构,包括高可用性集群与负载均衡集群的构建过程。重点讲解了使用Keepalived实现高可用集群,以及LVS在NAT模式下的负载均衡配置。通过实例演示了Keepalived与LVS的配置步骤,展示了如何实现服务的高可用性和负载均衡。

0604 linux集群架构(上)

一、集群介绍

集群,简单地说是指一组(若干个)相互独立的计算机,利用高速通信网络组成一个较大的计算机服务系统,每个集群节点(即集群中的每台计算机)都是运行各自服务的独立服务器。

集群的特点:高性能(Performance)、价格有效(Cost-effectiveness)、可伸缩性(Scalability)、高可用性(Availability)、透明性(Traansparency)、可管理性(Manageability)、可编程性(Programmability)

  • 集群的分类:
    • 负载均衡集群:Load balancing clusters,简称LBC、LB
    • 高可用集群:High-availability clusters,简称HAC
    • 高性能计算集群:High-performance clusters,简称HPC
    • 网格计算集群:Grid computing clusters
  • 常见的集群开源软件:
    • 高可用: Keepalived、Heartbeat
    • 负载均衡:Keepalived、Nginx、LVS、Haproxy

二、keepalived介绍

使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果,而且heartbeat软件在2010年停止更新;因此着重讲解keepalived

  1. keepalived通过VRRP(Virtual Router Redundancy Protocl)来实现高可用。
  2. 在这个协议里会将多台功能相同的路由器组成一个小组,这个小组里会有1个master角色和N(N>=1)个backup角色。
  3. master会通过组播的形式向各个backup发送VRRP协议的数据包,当backup收不到master发来的VRRP数据包时,就会认为master宕机了。此时就需要根据各个backup的优先级来决定谁成为新的mater。
  4. Keepalived要有三个模块,分别是core、check和vrrp。其中core模块为keepalived的核心,负责主进程的启动、维护以及全局配置文件的加载和解析,check模块负责健康检查,vrrp模块是来实现VRRP协议的。

三、用keepalived配置高可用集群

实验准备

※准备两台机器luo-01和luo-02,luo-01作为master,luo-02作为backup;

※两台机器都执行yum install -y keepalived;

※两台机器都安装nginx,其中luo-01上已经编译安装过nginx,luo-02上需安装nginx。

3.1在luo-02上配置安装nginx

使用Xftp将nginx压缩包文件拷贝至luo-02客户端上

a9123b9a34f64ec8bac6b9d17faf2c152e7.jpg

3.1.1、解压安装并配置编译

tar zxvf nginx-1.14.2.tar.gz

cd nginx-1.14.2

./configure --prefix=/usr/local/nginx

3.1.2、Nginx配置

vim /etc/init.d/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

3.1.3、更改权限

chmod 755 /etc/init.d/nginx

chkconfig --add nginx

chkconfig nginx on

3.1.4、编辑配置文件

进入nginx/conf/目录下,把默认的配置文件拷贝作为备份;

cd /usr/local/nginx/conf/

mv nginx.conf nginx.conf.1

新建vim 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;

}

}

}

3.1.5、启动nginx服务

/usr/local/nginx/sbin/nginx -t

/etc/init.d/nginx start //开启服务

ps aux |grep nginx //查看相关服务

92b89f7f6268f1b7ffb6a3c75c550e229a9.jpg

3.2、在luo-01和luo-02上安装配置keepalived包

3.2.1、在luo-01上配置

先安装keepalived包;并找到其配置文件;

yum install -y keepalived

ls /etc/keepalived/keepalived.conf

3.2.2、原配置文件清空,并写入以下配置

> /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf

 

 

global_defs {

notification_email {

2225917814@qq.com //定义接收邮件人

}

notification_email_from root@aminglinux.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" //此脚本为监控nginx服务的

interval 3

}

 

vrrp_instance VI_1 {

state MASTER

interface ens33 //网卡

virtual_router_id 51

priority 100 //权重100,此数值要大于backup

advert_int 1

authentication {

auth_type PASS

auth_pass 000000 //定义密码

}

virtual_ipaddress {

192.168.169.100 //定义VIP

}

 

track_script {

chk_nginx //定义监控脚本,这里和上面vrr_script后面的字符串保持一致

}

}

3.2.3、在配置文件中,定义了check_ng.sh脚本,现在新建如下脚本;

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

fi

fi

3.2.4、给该脚本赋予755权限,否则无法被keepalived调用

ls -l /usr/local/sbin/check_ng.sh

chmod 755 /usr/local/sbin/check_ng.sh

ls -l /usr/local/sbin/check_ng.sh

3.2.5、开启keepalived服务,停止防火墙,关闭SElinux

systemctl start keepalived

5cc792a72b8b8b6f4df6140893a1d4d1b7e.jpg

3.2.6、在luo-02上配置

先安装keepalived包;清空原配置文件,并按以下内容写入配置文件中

yum install -y keepalived

> /etc/keepalived/keepalived.conf

vim /etc/keepalived/keepalived.conf

global_defs {

notification_email {

txwd1214@126.com

}

notification_email_from

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 ens33

virtual_router_id 51

priority 90 //权重90

advert_int 1

authentication {

auth_type PASS

auth_pass 000000 //密码

}

virtual_ipaddress {

192.168.169.100

}

 

track_script {

chk_nginx

}

}

在配置文件中,定义了check_ng.sh脚本,现在新建如下脚本;

vim /usr/local/sbin/check_ng.sh

#时间变量,用于记录日志

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

/etc/init.d/nginx start

if [ $n2 -eq "0" ]; then

echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log

systemctl stop keepalived

fi

fi

给该脚本赋予755权限,否则无法被keepalived调用

chmod 755 /usr/local/sbin/check_ng.sh

开启keepalived服务,停止防火墙,关闭SElinux

systemctl start keepalived

ps aux |grep keep

systemctl stop firewalld

getenforce

78c4a7f032e86322e04e25654655aa8e792.jpg

3.3、测试阶段

现在把个机器梳理以下:

192.168.169.129 为master机,luo-01

192.168.169.130 为backup机,luo-02

192.168.169.100 为VIP

用ip add命令查看,此时VIP 192.168.169.100在luo-01上;而backup机上没有.mater给客户端提供服务;而backup机上没有.mater给客户端提供服务;现在希望让luo-01 master宕机; 关闭keepalived服务即可(关闭它,即连带关闭nginx)。

systemctl stop keepalived

在masters查看VIP,发现已不在

0bd6adc88a4f99a0251f04128d59234c4db.jpg在backup上查看,发现VIP已经移到此机上;

95cdcd8f63a9b2665b63de0196c1f918a09.jpg

四、负载均衡集群介绍

负载均衡软件分类:

主流的负载均衡开源软件:LVS、keepalived、haproxy、nginx等

其中,LVS属于4层(网络OSI7层模型),nginx属于7层,haproxy即可以是4层,也可以是7层。

keepalived的负载均衡功能其实就是lvs

lvs这种4层的负载均衡是可以分发除80外的其他端口通信,比如mysql,而nginx仅仅支持http、https、mail

haproxy也可以支持mysql

4层和7层负载比较:

LVS4层的更稳定,能承受更多的请求

nginx 7层的更加灵活,能实现更多的个性化需要

五、lvs介绍

LVS:Linux Virtuer Server,即Linux虚拟服务器,是一个虚拟的服务器集群系统,基于TCP/IP做的路由和转发,稳定性和效率很高。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的开源软件项目之一。

LVS集群采用IP负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。整个服务器集群的结构对客户是透明的,而且无需修改客户端和服务器端的程序。为此,在设计时需要考虑系统的透明性、可伸缩性、高可用性和易管理性。

一般来说,LVS集群采用三层结构

A、负载调度器(load balancer)或者叫分发器(Load Runner),它是整个集群对外面的前端机,负责将客户的请求发送到一组服务器上执行,而客户认为服务是来自一个IP地址(我们可称之为虚拟IP地址)上的。

B、服务器池(server pool),是一组真正执行客户请求的服务器,执行的服务有WEB、MAIL、FTP和DNS等。

C、共享存储(shared storage),它为服务器池提供一个共享的存储区,这样很容易使得服务器池拥有相同的内容,提供相同的服务。

六、LVS调度算法

lvs支持的算法有:

轮询:Round-Robin,简称:rr

加权轮询:Weight Round-Robin,简称:wrr

最小连接:Least-Connection,简称:lc

加权最小连接:Weight Least-Connection,简称:wlc

基于局部性的最小连接:Locality-Based Least Connections,简称:lblc

带复制的基于局部性最小连接:Locality-Based Least Connections with Replication,简称:lblcr

目标地址散列调度:Destination Hashing,简称:dh

源地址散列调度:Source Hashing,简称:sh

七、LVS NAT模式搭建

试验原理:

LVS NAT模式借助iptables的nat表来实现:

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

试验准备:

三台机器:

分发器,也叫调度器(简写为dir 内网:192.168.169.129,外网:124.89.248.18.vmware仅主机模式)

rs1 内网:192.168.169.130,设置网关为192.168.169.2

rs2 内网:192.168.169.131,设置网关为192.168.169.2

三台机器上都执行执行

systemctl stop firewalld; systemc disable firewalld;

systemctl start iptables-services; iptables -F; service iptables save

注意:luo-01和luo-02机器已经存在,现在需要克隆一台luo-03机器;其IP定位:192.168.169.131。此处不详细介绍;

7.1、在luo-01上

分发器需要,两个网卡,也就是luo-01机器上需要两个网卡;

在luo-01机器,vmware上配置仅主机模式;

e141492b7b2f0e28d81cd4969866ba1027a.jpg

此时查看ens37网卡的IP为124.89.248.18;

查看网卡网关:route -n

保存清空的规则service iptables save

iptables -nvL

52b2d96de1319fee55f3722fa149a1a0fea.jpg

7.2、luo-02上

停止防火墙;systemctl stop firewalld   iptables -nvL

安装iptables-services服务;

yum list |grep iptables-service

iptables-services.x86_64 1.4.21-24.1.el7_5 updates

yum install -y iptables-services

开启iptables服务,清空规则后,保存规则;

systemctl enable iptables

systemctl start iptables

iptables -nvL

671ded8225bf31fea9fe70e368a2e7a5da0.jpg

iptables -F

service iptables save

此时把luo-02上的IP网关改为192.168.169.129

vim /etc/sysconfig/network-scripts/ifcfg-ens33

37b171178b8fe734a67829329e5b9f31d07.jpg

重启网络服务,查看其网关

systemctl restart network

route -n

f2ed834a177e1c4a202a74f3a2bf3efffed.jpg

7.3、在luo-03

安装iptables-services服务;

yum list |grep iptables-service

iptables-services.x86_64 1.4.21-24.1.el7_5 updates

yum install -y iptables-service

开启iptables服务,清空规则后,保存规则;

iptables -nvL

dece0afb9640b075b563843ff8fca1a17c0.jpg

iptables -F

service iptables save

此时把luo-03上的IP网关改为192.168.169.129

vim /etc/sysconfig/network-scripts/ifcfg-ens33

d6525e61e901f2fa452993977b1f76e3c9a.jpg

重启网络服务,查看其网关

systemctl restart network

route -n

7.4、回到luo-01上设置

安装ipvsadm包

yum install -y ipvsadm

编辑lvs_nat.sh脚本

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

# 注意区分网卡名字,luo-01机器两个网卡分别为ens33ens37

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.169.0/24 -j MASQUERADE

# director设置ipvsadm

IPVSADM='/usr/sbin/ipvsadm'$IPVSADM -C

$IPVSADM -A -t 124.89.248.18 -s wlc -p 3

$IPVSADM -a -t 124.89.248.18:80 -r 192.168.169.130:80 -m -w 1

$IPVSADM -a -t 124.89.248.18:80 -r 192.168.169.131:80 -m -w 1

 

7.5、luo-02上

Luo-02上开启nginx,把其主页重新定义;

echo 'luo-02 192.168.169.130' > /usr/local/nginx/html/index.html

curl localhost

422d4bbac0e20d6cd885088ff29d9d429d4.jpg

7.6、luo-03上

Luo-03同luo-02一样,开启nginx服务,并重新定义网页内容

echo 'luo-03 192.168.169.131' > /usr/local/nginx/html/index.html

curl localhost

a53e58a81e237600b3c4a8351b8aaa25839.jpg

7.7、luo-01上

执行脚本,查看nat规则,发现有网段出现;

sh /usr/local/sbin/lvs_nat.sh

iptables -t nat -nvL

792718a910706c334115e9a52f7afe009e8.jpg

测试124.89.248.18的主页,发现显示单位为luo-02上的主页;

进入脚本,把延迟时间去掉;

vim /usr/local/sbin/lvs_nat.sh

$IPVSADM -A -t 124.89.248.18:80 -s wlc //把延迟3s去掉

重新执行脚本,此时每测试一次,显示的主页为luo-02、luo-03;很均衡的显示;

luo-03 192.168.169.131

luo-02 192.168.169.130

luo-03 192.168.169.131

luo-02 192.168.169.130

luo-03 192.168.169.131

luo-02 192.168.169.130

转载于:https://my.oschina.net/u/4095803/blog/3058715

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值