• Linux_31 Linux Cluster && 各种调度算法实现不同的调度


    Linux Cluster

    Cluster:计算机集合,为解决某个特定问题组合起来 形成的单个系统;
    Linux Cluster 类型:
    	LB:Load Balancing,负载均衡;
    	HA:High Availiablity,高可用;
    		A=MTBF/(MTBF+MTTR)
    			(0,1):90%,95%,99%,99.9%,99.99%,99.999%,99.9999%
    	HP:High Performance,高性能;
    	
    		www.top500.org
    	
    	分布式系统:
    		分布式存储
    		分布式计算
    
    系统扩展方式:
    	Scale up:向上扩展
    	Scale Out:向外扩展
    		Cluster
    
    LB Cluster:
    	LB Cluster的实现:
    		硬件:
    			F5 Big-IP
    			Citrix Netscaler
    			A10 A10
    		软件:
    			lvs:Linux Virtual Server
    			nginx 
    			haproxy
    			ats:apache traffic server
    			perlbal
    			pound
    		
    		基于工作的协议层次划分:
    			传输层(通用):(DPORT)
                    lvs:
                    nginx:(stream)
                    haproxy:(mode tcp
    			应用层(专用):(自定义的请求模型分类)
    				proxy server:
    					http:nginx httpd haproxy(mode http)
    					fastcgi:nginx,httpd,...
    					mysql:ProxySQL,...
    					...
    			站点指标:
    				PV:Page View
    				UV:Unique Vistor
    				IP:
    		会话保持:
    			(1)session sticky
    				Source IP
    				Cookie
    			(2)session replication;
    				session cluster
    			(3)session server
    	
    	lvs:Linux Virtual Server
    	VS:Virtual Server
    	RS:Real Server
    	
    	l4:四层路由器,四层交换机;
    		VS:根据请求报文的目标IP和目标协议及端口将其调度转达至某RealServer,根据调度算法来挑选RS;
    	
    	iptables/netfilter:
    		iptables:用户空间的管理工具;
    		netfilter:内核空间上的框架;
    			流入:PREROUTING-->INPUT
    			流出:OUTPUT-->POSTROUTING
    			转发:PREROUTING-->FORWARD-->POSTROUTING
    		
    		DNAT:目标地址转换;PREROUTING;
    	
    	lvs:ipvsadm/ipvs
    		ipvsadm:用户空间的命令行工具,规则管理器,用于管理集群服务及RealServer;
    		ipvs:工作于内核空间的netfilter的INPUT钩子之上的框架;
    	
    	lvs集群类型中的术语:
    		vs:Virtual Server,Director,Dispatcher,Balancer
    		rs:Real Server,upstream server,backend server
    		
    		CIP:Client IP,VIP:Virtual serve IP,RIP:Real server IP,DIP:Director IP
    		
    		CIP<-->VIP == DIP<-->RIP
    		
    	lvs 集群的类型:
    		lvs-nat:修改请求报文的目标IP;多目标IP的DNAT;
    		lvs-dr:操纵封装新的MAC地址;
    		lvs-tun:在原请求IP报文之外新加一个IP首部;
    		lvs-fullnat:修改请求报文的源和目标IP;
    		
    		lvs-nat:
    			多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发;
    			(1)RIP和DIP必须在同一个IP网络,且应该使用私网地址;RS的网关要指向DIP;
    			(2)请求报文和响应报文都必须经由Director转发;Director易于成为系统瓶颈;
    			(3)支持端口映射,可修改请求报文的目标PORT;
    			(4)vs必须是Linux系统rs可以是任意系统;
    		
    		lvs-dr:
    			Direct Routing,直接路由;
    			
    			通过对请求报文重新封装一个MAC首部进行转发,源MAC是DIP所在的接口的MAC,目标MAC是某挑选处的RS的RIP所在的接口的MAC地址;源IP/PORT,以及目标IP/PORT均保持不变;
    			
    			Director和各RS都得配置使用VIP;
    			
    			(1)确保前端路由器将目标IP为VIP的请求报文发往Director;
    				(a)在前端网关做静态绑定;
    				(b)在RS上使用arptables;
    				(c)在RS上修改内核参数以限制arp通告及应答级别;
    					arp_announce
    					arp_ignore
    			(2)RS的RIP可以使用私网地址,也可以是公网地址;RIP与DIP在同一IP网络;RIP的网关不能指向DIP,以确保响应报文不会经由Director;
    			(3)RS跟Director要在同一个物理网络;
    			(4)请求报文要经由Director,但响应不能经由Director,而是由RS直接发往Client;
    			(5)不支持端口映射;
    		
    		lvs-tun:
    			转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而是在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;
    			RS直接响应给客户端(源IP是VIP,目标IP是CIP);
    			
    			(1)DIP,VIP,RIP都应该是公网地址;
    			(2)RS的网关不能,也不可能指向DIP;
    			(3)请求报文要经由Director,但相应不能经由Director;
    			(4)不支持端口映射;
    			(5)RS的OS得支持隧道功能;
    		
    		lvs-fullnat:
    			通过同时修改请求报文的源地址和目标IP地址进行转发;
    				CIP-->DIP 
    				VIP-->RIP
                   
                   (1)VIP是公网地址,RIP和DIP是私网地址,且通常不再同一IP网络;因此,RIP的网关一般不会指向DIP;
                   (2)RS收到的请求报文源地址是DIP,因此,只需要响应给DIP;但Director还要将其发往Client;
                   (3)请求和响应报文都经由Director;
                   (4)支持端口映射;
                   
                   注意:此类型默认不支持;
    	总结:
    		lvs-nat,lvs-fullnat:请求和响应报文都经由Director;
    			lvs-nat:RIP的网关要指向DIP;
    			lvs-fullnat:RIP和DIP未必在同一IP网络,但要能通信;
    		lvs-dr,lvs-tun:请求报文要经由Director,但响应报文由RS直接发往Client;
    			lvs-dr:通过封装新的MAc首部实现,通过MAC网络转发;
    			lvs-tun:通过在原IP报文之外封装新的IP首部实现转发,支持远距离通信;
    
    ipvs scheduler:
    	根据其调度时是否考虑各RS当前的负载状态,可分为静态方法和动态方法两种:
    		静态方法:仅根据算法本身进行调度;
    			RR:roundrobin,轮询;
    			WRR:Weighted RR,加权轮询;
    			SH:Source Hashing,实现session stichy,源IP地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定;
    			DH:Destination Hashing;目标地址哈希,将发往同一个目标地址的请求始终转发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡;
    		
    		动态方法:主要根据每RS当前的负载状态及调度算法进行调度;
    			Overhead=
    			
    			LC:least connections
    				Overhead=activeconns*256+inactiveconns
    			WLC:Weighted LC
    				Overhead=(acticeconns*256+inactiveconns)/weight
    			SED:Shortest Expection Delay
    				Overhead=(activeconns+1)*256/weight
    			NQ:Nerver Queue
    			
    			LBLC:Locality-Based LC,动态的DH算法;
    			LBLCR:LBLC with Replication,带复制功能的LBLC;
    
    ipvsadm/ipvs:
    	集群和集群之上的各RS是分开管理的;
    		集群定义
    		RS定义
    	
        准备拓扑环境
        了解规则编写工具的使用
        
        	yum  -y install ipvsadm
        	
        		配置文件:/etc/sysconfig/ipvsadm-config
        	
        	ipvsadm命令:
        		核心功能:
        			集群服务管理:增、删、改;
        			集群服务的RS管理:增、删、改;
        			查看:
        		
        		ipvsadm -A|E -t|u|f service-address [-s scheduler][-p[timeout]][-M netmask][--pe persistence_engine][-b sched-flags]
        		ipvsadm -D -t|u|f server-address
        		ipvsadm -C
        		ipvsadm -R
        		ipvsadm -S [-n]
        		ipvsadm -a|e -t|u|f service-address -r server-address [options]
        		ipvsadm -d -t|u|f service-address -r server-address
        		ipvsadm -L|I [options]
        		ipvsadm -Z [-t|u|f service-address]
        		
        		管理集群服务:增、删、改:
        			增、改:
        				ipvsadm -A|E -t|u|f service-address [-s scheduler][-p [timeout]]
    				删:
                    	ipvsadm —D -t|u|f service-address
                    
                    service-address:
                    	-t|u|f:
                    		-t:TCP协议的端口,VIP:TCP_PORT
                    		-u:UDP协议的端口,VIP:UDP_PORT
                    		-f:firewall MARK,是一个数字;
                    
                    [-s scheduler]:指定集群的调度算法,默认为wlc;
    
    	管理集群上的RS:增、改、删;
    		增、改:
    			ipvsadm -a|e -t|u|f service-address -r server-address [-g|i|m][-w weight]
    		
    		删:
    			ipvsadm -d -t|u|f service-address -r server-address
    			
    		server-address:
    			rip[:port]
    		选项:
    			lvs类型:
    				-g:gateway,dr类型
    				-i:ipip,tun类型
    				-m:masquerade,nat类型
    			
    			-w weight:权重;
    	
    	清空定义的所有内容:
    		ipvsadm -C
    	
    	查看:
    		ipvsadm -L|I [options]
    			--numeric,n:numeric output of addresses and ports
    			--exact:expand numbers (display exact values)
    			--connection,-c:output of current IPVS connections
    			--stats:output of statistics information
    			--rate:output of rate information
    			ipvsadm -ln
    			ipvsadm -ln --stats # 如图1
    				Conns:主机上的连接数,其中conns(vs)=conns(ns1)+conns(ns2)
    				InPkts:入栈的报文数量
    				OutPkts:出栈的报文数量
    				InBytes:入栈的字节数量
    				OutBytes:出栈的字节数量
    			ipvsadm -ln --rate
    				CPS:每秒钟建立的连接数
    				InPPS:每秒钟入栈的报文数量
    				OutPPS:每秒钟出栈的报文数量
    				InBPS:每秒钟入栈的字节数量
    				OutBPS::每秒钟出栈的字节数量
    			
    			ipvsadm -Z # 清空--stats --rate的记录值 如下图3
    			
    			ipvsadm -ln -c # 查看客户端访问被发送到哪台real server上  如图4
    			
    	
    	保存和重载:  # 如图5
    		# 保存
    		ipvsadm -S = ipvsadm-save
    			ipvsadm-save > /PATH/TO/IPVSADM_FILE
    			ipvsadm -S > /PATH?TO?IPVSADM_FILE
    			systemctl stop | ipvsadm.service
    		# 重载
    		ipvsadm -R = ipvsadm-restore
    			ipvsadm-restore < /PATH/FROM/IPVSADM_FILE
    			ipvsadm -R < /PATH/FROM/IPVSADM_FILE
    		或者:
    			systemctl start ipvsadm.service 也可以重载规则,但是得先将规则保存到/etc/sysconfig/ipvsadm中 # 如图6
    			使用rm 删除ipvsadm文件保存得规则,然后 systemctl stop ipvsadm.service,规则会自动再次被写入/etc/sysconfig/ipvsadm中
    			rm /etc/sysconfig/ipvsadm  
    			systemctl stop ipvsadm.service		
    

    图1:

    image-20210711092924502

    图2:

    图3:

    图4:

    图5:

    image-20210711094732831

    图6:

    负载均衡集群设计

    负载均衡集群设计时要注意的问题:
    	(1)是否需要会话保持;
    	(2)是否需要共享存储;
    		共享存储:NAS,SAN,DS(分布式存储)
    		数据同步:
    			rsync+Inotify实现数据同步
    

    lvs-nat 负载均衡集群设计

    lvs-nat:
    	设计要点:
    		(1)RIP与DIP在同一IP网络,RIP的网关要指向DIP;
    		(2)支持端口映射;
    		(3)Director要打开核心转发功能;
    		
    	作业:负载均衡两个php应用(wordpress,discuzx);
    		测试:(1)是否需要会话保持;(2)是否需要共享存储;
    lvs-nat:
        
        ipvsadm -A -t 172.16.0.6:23 -s wlc
        ipvsadm -a -t 172.16.0.6:23 -r 192.168.10.11 -m -w 1
        ipvsadm -a -t 172.16.0.6:23 -r 192.168.10.12 -m -w 2
    

    lvs-dr 负载均衡集群设计

    dr模型中,各主机上均需要配置VIP,解决地址冲突的方式有三种:
    	(1)在前端网关做静态绑定;# 但调度器(director)容易成为系统瓶颈,将来做冗余,mac地址变化,原绑定会失效
    	(2)在各RS使用arptables;
    	(3)在各RS修改内核参数,来限制arp响应和通告的级别;
    		限制响应级别:arp_ignore
    			0:默认值,表示可使用本地任意接口上配置的任意地址进行响应;
    			1:仅在请求的目标IP配置在本地主机的接收到请求报文接口上时,才给予响应;
    		限制通告级别:arp_announce
    			0:默认值,把本机上的所有接口的所有信息向每个接口上的网络进行通告;
    			1:尽量避免向非直接连接网络进行通告;
    			2:必须避免向非本网络通告;
    

    # RS的预配置脚本
    
    #!/bin/bash
    #
    vip='172.16.0.99'
    mask='255.255.255.255'
    iface='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 $iface $vip netmask $mask broadcast $vip up
    	route add -host $vip dev $iface
    	;;
    stop)
    	ifconfig $iface down
    	
    	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
    	;;
    *)
    	echo "Usage: $(basename $0) start | stop"
        exit 1
        ;;
    
    esac
    
    # VS的与配置脚本:
    
    #!/bin/bash
    #
    vip='10.1.0.5'
    iface=eno16777736:0
    mask='255.255.255.255'
    port='80'
    scheduler='wrr'
    type='-g'
    
    case $1 in
    start)
    	ifconfig $iface $vip netmask $mask broadcast $vip up
    	iptables -F
    	
    	ipvsadm -A -t $(vip):$(port) -s $scheduler
    	ipvsadm -a -t $(vip):$(port) -r $(rs1) $type -w l
    	ipvsadm -a -t $(vip):$(port) -r $(rs2) $type -w l
    	;;
    	
    stop)
    	ipvsadm -C
    	ifconfig $iface down
    	;;
    
    *)
    	echo "Usage $(basename $0) start|stop"
    	exit 1
    	;;
    	
    

    防火墙标记

    FWM:Firewall Mark
    	netfilter:
    		target:MATK,This target is used to set the Netfilter mark value associated with the packet.
    			--set-mark value
    	
    	借助于防火墙标记来分类报文,而后基于标记定义集群服务;可将多个不同的应用使用同一个集群服务进行调度;
    	
    	打标记方法(在Director主机):
    		# iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER
    	
    	基于标记定义集群服务:
    		# ipvsadm -A -f NUMBER [options]
    
    lvs persistence:持久连接:
    	持久连接模板:实现无论使用任何调度算法,在一段时间内,能够实现将来自同一个地址的请求始终发往同一个RS;
    		ipvsadm -A|E -t|u|f service-address [-s scheduler][-p [timeout]]
    		
    	
    	port Affinity:
    		每端口持久:每个端口对应定义为一个集群服务,每集群服务单独调度;
    		每防火墙标记持久:基于防火墙标记定义集群服务;可实现将多个端口上的应用统一调度,即所谓的port Affinity;
    		每客户端持久:基于0端口定义集群服务,即将客户端对所有应用的请求统统调度至后端主机,必须定义为持久模式;
    
    考虑:
    	(1)Director不可用,整个系统将不可用;SPoF
    		解决方案:高可用
    			keepalived
    			heartbeat/corosync
    	(2)某RS不可用时,Director依然会调度请求至此RS;
    		解决方案:对各RS的健康状态做检查,失败时禁用,成功时启用;
    			keepalived
    			Idirectord
    		检测方式:
    			(a)网络层检测
    			(b)传输层检测,端口探测;
    			(c)应用层检测,请求某关键资源;
    			
    Idirectord:
    	Daemon to monitor remote service and control Linuxx Virtual Server. Idirectord is a daemon to monitor and administer real servers in a cluster of load balanced virtual servers. Idirectord typically is started from heartbeat but can also be run from the command line.
    
    	配置示例:
    		checktimeout=3
    		checkinterval=1
    		fallback=127.0.0.1:80
    		autoreload=yes
    		logfile="/var/log/Idirectord.log"
    		qulescent=no
    		virtual=5
    			real=172.16.0.7:80 gate 2
    			real=172.16.0.8:80 gate 1
    			fallback=127.0.0.1:80 gate
    			service=http
    			scheduler=wrr
    			checktype=negotiate
    			checkport=80
    			receive="CentOS"
    
    共享存储
    	NAS:Network Attached Storage
    		nfs/cifs
    		文件系统接口
    	SAN:Storage Area Network
    		"块"接口
    
    
  • 相关阅读:
    MDX Step by Step 读书笔记(六) Building Complex Sets (复杂集合的处理) Filtering Sets
    在 Visual Studio 2012 开发 SSIS,SSAS,SSRS BI 项目
    微软BI 之SSIS 系列 在 SSIS 中读取 SharePoint List
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式) Infinite Recursion 和 SOLVE_ORDER 原理解析
    MDX Step by Step 读书笔记(五) Working with Expressions (MDX 表达式)
    使用 SQL Server 2012 Analysis Services Tabular Mode 表格建模 图文教程
    MDX Step by Step 读书笔记(四) Working with Sets (使用集合) Limiting Set and AutoExists
    SQL Server 2012 Analysis Services Tabular Model 读书笔记
    Microsoft SQL Server 2008 MDX Step by Step 学习笔记连载目录
    2011新的开始,介绍一下AgileEAS.NET平台在新的一年中的发展方向
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/15011619.html
Copyright © 2020-2023  润新知