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