集群及系统扩展基础(2)

lvs类型、lvs调度方法

lvs类型:

lvs-nat: 通过修改请求报文的目标IP地址进行调度;类似多目标的DNAT;

lvs-dr:通过重新封闭请求报文的帧首部(目标为RS的RIP对应MAC地址)进行调度;

(1) 在前端路由器上静态指定;

(2) arptables;

(3) 通过修改内核参数来限制arp通告和响应级别;

lvs-tun:通过为请求报文的原有IP首部之外再次封装外层IP首部完成调度;ipip;

lvs-fullnat:通过修改请求的报文的源IP以及目标IP地址进行调度;

lvs调度方法:

静态方法:rr, wrr, sh, dh

动态方法:lc(least connection), wlc, sed, nq, lblc, lblcr

lc: Overhead=Active*256+Inactive

sed: OVerhead=(Active+1)*256/weight

lvs: ipvs/ipvsadm

ipvs: netfilter, input

ipvsadm:

管理集群服务:

定义集群服务的方法:

-t service-address (IP:PORT)

-u service-address (IP:PORT)

-f service-address (FWM: firewall mark)

-A|-E|-D

-s scheduler

管理集群服务的RS:

为集群服务指定RS:

-r server-address (IP[:PORT])

lvs类型:-g|-i|-m

指定权重:-w #

-a|-e|-d

查看:

-L

-n, --stats, --rate, --exact

清空、保存及重载

清空:-C

保存:-S

重载:-R

session 保持:

session sticky:基于源ip绑定,基于cookie绑定;

session replication cluster:在各server之间以多播方式“复制”各session,从而每个server会持有所的session;(tomcat)

session server:引入第三方存储,专用于共享存储session信息;(redis, memcached)

lvs-dr:

(1) 各RS要直接响应Client,因此,各RS均得配置VIP;但仅能够让Director上的VIP能够与本地路由直接通信;

(2) Director不会拆除或修改请求报文的IP首部,而是通过封装新的帧首部(源MAC为Director的MAC,目标MAC为挑选出的RS的MAC)完成调度;

2.4.26, 2.6.4 kernel引入了两个内核参数:

arp_announce:定义arp通告限制级别;2----只能通告同一网络

arp_ignore:定义arp忽略arp请求或arp通告的级别;1---只能请求目标就是目标地址

接口位置:/proc/sys/net/ipv4/conf/INTERFACE

配置过程总结:

Director:

(1) VIP配置在物理接口的别名上

ifconfig INTERFACE:ALIAS $vip broadcast $vip netmask 255.255.255.255

(2) 配置路由信息

route add -host $vip dev INTEFACE:ALIAS

RS:

(1) 先修改内核参数

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

(2) VIP配置在lo的别名上

ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up

(3) 配置路径信息

route add -host $vip dev lo:0

示例

注意:vip和dip不是同一网段

1.保证在路由器上要拥有各个网关地址,并开启路由转发

2.rip配置ip和默认网关

3.其他内核配置不变

4.ipvsadm设置rip与VIP为不同网段

示例脚本:

DR类型director脚本示例:

#!/bin/bash

#

vip=172.16.100.7

rip=(‘172.16.100.8‘ ‘172.16.100.9‘)

weight=(‘1‘ ‘2‘)

port=80

scheduler=rr

ipvstype=‘-g‘

case $1 in

start)

iptables -F -t filter

ipvsadm -C

ifconfig eth0:0 $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip dev eth0:0

echo 1 > /proc/sys/net/ipv4/ip_forward

ipvsadm -A -t $vip:$port -s $scheduler

[ $? -eq 0 ] && echo "ipvs service $vip:$port added."  || exit 2

for i in `seq 0 $[${#rip[@]}-1]`; do

ipvsadm -a -t $vip:$port -r ${rip[$i]} $ipvstype -w ${weight[$i]}

[ $? -eq 0 ] && echo "RS ${rip[$i]} added."

done

touch /var/lock/subsys/ipvs

;;

stop)

echo 0 > /proc/sys/net/ipv4/ip_forward

ipvsadm -C

ifconfig eth0:0 down

rm -f /var/lock/subsys/ipvs

echo "ipvs stopped."

;;

status)

if [ -f /var/lock/subsys/ipvs ]; then

echo "ipvs is running."

ipvsadm -L -n

else

echo "ipvs is stopped."

fi

;;

*)

echo "Usage: `basename $0` {start|stop|status}"

exit 3

;;

esac

DR类型RS脚本示例:

#!/bin/bash

#

vip=172.16.100.7

interface="lo:0"

case $1 in

start)

echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $interface $vip broadcast $vip netmask 255.255.255.255 up

route add -host $vip dev $interface

;;

stop)

echo 0 > /proc/sys/net/ipv4/conf/all/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_ignore

echo 0 > /proc/sys/net/ipv4/conf/all/arp_announce

echo 0 > /proc/sys/net/ipv4/conf/lo/arp_announce

ifconfig $interface down

;;

status)

if ifconfig lo:0 |grep $vip &> /dev/null; then

echo "ipvs is running."

else

echo "ipvs is stopped."

fi

;;

*)

echo "Usage: `basename $0` {start|stop|status}"

exit 1

esac

lvs定义集群服务,有三种方式:

-t service-address

-u service-address

-f service-address

FWM

FWM: firewall mark

iptables/netfilter,

filter, nat, mangle, raw

mangle: 防火墙标记,目的为了使用不同端口访问同一个集群服务。

前提:在ipvs生效之前的netfilter的某hook function上定义iptables规则,实现给报文打上防火墙标记;

定义方法:

(1) 打标:在Director上mangle表的PREROUTING链上实现

# iptables -t mangle -A PREROUTING -d $vip -p $protocol --dport $port -j MARK --set-mark [1-99]

(2) 基于FWM定义集群服务

# ipvsadm -A -f FWM -s SCHEDULER

# ipvsadm -a -f FWM -r server-address -g|-i|-m -w #

示例:

IP配置和路由配置和内核配置事先配置完毕

lvs的persistence: lvs持久连接

无论使用哪一种调度方法,持久连接功能都能保证在指定时间范围之内,来自于同一个IP的请求将始终被定向至同一个RS;

persistence template:持久连接模板

PPC:每端口持久;持久连接生效范围仅为单个集群服务;如果有多个集群服务,每服务被单独持久调度;

PCC:每客户端持久;持久连接生效范围为所有服务;定义集群服务时,其TCP或UDP协议的目标端口要使用0;

PFWM:每FWM持久:持久连接生效范围为定义为同一个FWM下的所有服务;

示例

ipvsadm -A -t|-u|-f service-address -s SCHEDULER [-p [#]]

无-p选项:不启用持久连接

-p #:指定持久时长,省略时长,默认为300seconds

示例:(接上)ppc

pcc

pfwm

重做:

dr的不同网段:

dr:vip,dip不同网段,同时指向各自网关

vip:ifconfig eth0:0 192.168.0.2/24

打开转发

设置路由

ipvs设置

rs:vip,dip不同网段,指向网关,设置路由,打开服务,配置防火墙

lvs集群:

lvs本身不支持对RS的健康状态作检测;

健康:周期性检查机制

状态发生转变时,要作出相应处理

up --> down: 建议要至少确认三次;

down --> up: 建议一次以上(含一次);

下线处理机制:

(1) 设置权重为0;

(2) 将相应的RS从ipvs的可用RS列表中移除;

上线处理机制:

(1) 设置为正常权重;

(2) 将相应的RS添加至ipvs的可用RS列表;

解决方案:

(1) 写程序完成相应功能;

如何做健康状态检查:

三种方案:

IP层:ping等主机在线状态探查工具;

传输层:端口扫描工具探查服务在线状态;

应用层:请求专用于健康状态检查的资源或者某正常资源;

备用服务器:

sorry server, backup server

可以在Director上直接实现:即配置director成为web服务,仅提供有限资源,在所有RS都故障时,方才启用此server;

初始脚本,完成RS健康状态检查;

#!/bin/bash

#

fwm=10

sorry_server=‘127.0.0.1‘

lvstype=‘-m‘

checkloop=3

logfile=/var/log/ipvs_health_check.log

rs=(‘192.168.10.11‘ ‘192.168.10.12‘)

rw=(‘1‘ ‘1‘)

rsstatus=(0 0)

addrs() {

# $1: rs, $2: rs weight

ipvsadm -a -f $fwm -r $1 $lvstype -w $2

[ $? -eq 0 ] && return 0 || return 1

}

delrs() {

# $1: rs

ipvsadm -d -f $fwm -r $1

[ $? -eq 0 ] && return 0 || return 1

}

chkrs() {

# $1: rs

local i=1

while [ $i -le $checkloop ]; do

if curl --connect-timeout 1 -s http://$1/index.html | grep -i "real[[:space:]]* server" &> /dev/null; then

return 0

fi

let i++

sleep 2

done

return 1

}

initstatus() {

for host in `seq 0 $[${#rs[@]}-1]`; do

if chkrs ${rs[$host]}; then

if [ ${rsstatus[$host]} -eq 0 ]; then

rsstatus[$host]=1

fi

else

if [ ${rstatus[$host]} -eq 1 ]; then

rsstatus[$host]=0

fi

fi

done

}

initstatus

while :; do

for host in `seq 0 $[${#rs[@]}-1]`; do

if chkrs ${rs[$host]}; then

if [ ${rsstatus[$host]} -eq 0 ]; then

addrs ${rs[$host]} ${rw[$host]}

[ $? -eq 0 ] && rsstatus[$host]=1

fi

else

if [ ${rsstatus[$host]} -eq 1 ]; then

delrs ${rs[$host]}

[ $? -eq 0 ] && rsstatus[$host]=0

fi

fi

done

sleep 10

done

改进此脚本

(1) 启用在rs上下线时记录日志;

(2) 在所有rs下线时启用sorry_server;

时间: 2024-10-29 19:10:04

集群及系统扩展基础(2)的相关文章

集群及系统扩展基础(1)

Linux Cluster Cluster:  Scale up:向上扩展,垂直扩展 Scale out: 向外扩展,横向扩展 director, dispatcher, load balancer 系统: 可扩展性.可用性.性能.容量 性能:响应时间: 容量:在一定时间内能完成的工作量:容量必须是可有效利用:在保证可接受性能的情况下能够达到的吞吐量: 最大吞吐量:基准性能测试时得出的数据指标:系统容量的极限: 可扩展性:表明了需要增加资源以完成更多的工作任务时能够获得的划算地等同提升: 系统运

集群及系统扩展基础

linux cluster 扩容 例如:web站点键入网址后3s内必须响应,经统计若3s后响应将流失40%用户,10s后流失70%用户 解决方案: Scale up:向上扩展/垂直扩展 Scalle out:向外扩展/横向扩展 director/dispatcher/load balancer 调度器/分发器/负载均衡器 系统指标 可扩展性:是否便于扩展 可用性:可用性指标(99%,99.9%,99.99%,99.999%一年不可用时间不超过5分钟) 性能: 容量: 系统运维:保证系统可用-->

linux集群及系统扩展基础

1.什么是服务器集群 简单来说就是把多台服务器组合到一起按照某一个目的实现特定功能的服务器的集合,也就是服务器集群,而这些服务器都采用linux系统,那么,我们就可以把这个集群称作linux集群. 2.为什么要用到集群 比如说现在有一台服务器,现将此服务器部署为LAMP或者LNMP,并再此上架设了某站点,刚开始有2000个连接并发访问,服务器可以在3秒之内提供正常用户服务,当连接增长到3000时,服务器可以在5秒之内提供服务,相对来说,服务器响应时间越长,用户体验就会下降,当打开网站的时间超过3

Elasticstack 5.1.2 集群日志系统部署及实践

Elasticstack 5.1.2 集群日志系统部署及实践 一.ELK Stack简介 ELK Stack 是Elasticsearch.Logstash.Kibana三个开源软件的组合,在实时数据检索和分析场合,三者通常是配合共用的. 可参考:https://www.elastic.co/products 二.Elasticstack重要组件 Elasticsearch: 准实时索引 Logtash: 收集数据,配置使用 Ruby DSL Kibana 展示数据,查询聚合,生成报表 Kafk

集群及系统扩展之三:持久连接及健康检测

一.FWM FWM: firewall mark iptables/netfilter: filter, nat, mangle, raw mangle: 防火墙标记 前提:在ipvs生效之前的netfilter的某hook function上定义iptables规则,实现给报文打上防火墙标记: 定义方法: (1) 打标:在Director上mangle表的PREROUTING链上实现 # iptables -t mangle -A PREROUTING -d $vip -p $protocol

OpenResty Codis集群缓存系统

部署环境 OpenResty1.12.5 Codis3.2集群(客户端不支持Redis集群协议故选择了Codis集群) Nginx1.12.1反向代理 Iis7源站 依赖的第三方模块 echo-nginx-module https://github.com/openresty/echo-nginx-module  set-misc-nginx-module  https://github.com/openresty/set-misc-nginx-module  redis-nginx-modul

用Nginx+Telegraf+Influxb+Grafana构建高逼格Nginx集群监控系统

日常生产环境搭建了Nginx集群后,就需要继续深入研究的就是日常Nginx监控. Nginx如何监控?相信百度就可以找到:nginx-status 通过Nginx-status,实时获取到Nginx监控数据后,如何和现有监控系统集成?一个很好的解决方案: Nginx+Telegraf+Influxdb+Grafana 即通过Telegraf监控插件定时收集Nginx的监控状态,存储到时序数据库Influxdb中,然后通过Grafana展现即可. 一.Nginx启用nginx-status功能 源

linux集群系列(1) --- Linux集群系统基础

一.简介     1.1. Linux集群系统包括集群节点和集群管理器两部分. 集群节点有时简称为节点.服务器或服务器节点,是提供处理资源的系统,它进行集群的实际工作.一般来讲,它必须进行配置才能成为集群的一部分,也必须运行集群的应用软件.应用软件可以是专用于集群的软件,也可以是设计用于分布式系统的标准软件. Linux集群管理器则是将节点捆绑在一起,以构成单一系统外观的逻辑结构,它用于将任务分解到所有的节点.集群因多种不同的原因而有着不同的类型,建立Linux集群的最直接原因是共享CPU资源,

【大话存储II】学习笔记(15章),文件级集群系统

[大话存储II]学习笔记(15章),块级集群存储系统里面分析的主要是块集群系统,同样文件级存储也可以集群化. 因为NAS系统的前端网络是以太网,速度比较低,导致NAS主要用于一些非关键业务中,比如文件共享.但是一些特殊应用也需要多主机同时访问某个大文件,比如3D渲染集群等.如果我们使用块集群存储系统,则会存在一个问题,需要在应用程序上引入文件锁,而NAS的文件系统一般都自带有文件锁机制,所以还不如把NAS存储系统进行集群化. 在谈怎么样把NAS系统进行集群化之前,我们说说集群文件系统的架构.集群