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
- 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配置高可用集群
实验准备
※准备两台机器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客户端上

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 //查看相关服务

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

3.2.6、在luo-02上配置
先安装keepalived包;清空原配置文件,并按以下内容写入配置文件中
yum install -y keepalived
> /etc/keepalived/keepalived.conf
vim /etc/keepalived/keepalived.conf
global_defs {
notification_email {
}
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

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,发现已不在
在backup上查看,发现VIP已经移到此机上;

四、负载均衡集群介绍
负载均衡软件分类:
主流的负载均衡开源软件: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上配置仅主机模式;

此时查看ens37网卡的IP为124.89.248.18;
查看网卡网关:route -n
保存清空的规则service iptables save
iptables -nvL

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

iptables -F
service iptables save
此时把luo-02上的IP网关改为192.168.169.129
vim /etc/sysconfig/network-scripts/ifcfg-ens33

重启网络服务,查看其网关
systemctl restart network
route -n

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

iptables -F
service iptables save
此时把luo-03上的IP网关改为192.168.169.129
vim /etc/sysconfig/network-scripts/ifcfg-ens33

重启网络服务,查看其网关
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机器两个网卡分别为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.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

7.6、luo-03上
Luo-03同luo-02一样,开启nginx服务,并重新定义网页内容
echo 'luo-03 192.168.169.131' > /usr/local/nginx/html/index.html
curl localhost

7.7、luo-01上
执行脚本,查看nat规则,发现有网段出现;
sh /usr/local/sbin/lvs_nat.sh
iptables -t nat -nvL

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

被折叠的 条评论
为什么被折叠?



