• LVS的DR模型 + Keepalived 实现高可用负载均衡


    如何保证vip对内可见,对外隐藏?

    kernel parameter:
    目标mac地址为全F,交换机触发广播

     /proc/sys/net/ipv4/conf/*IF*/
    

    arp_ignore: 定义接收到ARP请求时的响应级别;

    0:只要本地配置的有相应地址,就给予响应;
    1:仅在请求的目标(MAC)地址配置请求
    到达的接口上的时候,才给予响应;

    arp_announce:定义将自己地址向外通告时的通告级别;

    0:将本地任何接口上的任何地址向外通告;
    1:试图仅向目标网络通告与其网络匹配的地址;
    2:仅向与本地接口上地址匹配的网络进行通告;
    os可以给一个网卡配置多个ip地址同时使用,对于2:接口上配置了很多ip,指向匹配的那个网络去通知自己匹配的ip地址。

    负载均衡调度算法的使用

    LVS会记录请求的数据包记录下来,当三次握手建立之后,server的连接会+1,LVS能偷窥服务的连接,负载均衡调度算法把请求负载到对应的服务器上。

    搭建

    负载均衡在内核模块是ipvs
    要使用负载均衡首先要安装一个连接包ipvsadm

    yum install ipvsadm -y
    

    管理集群服务(接受包规则)

    添加:-A -t|u|f service-address [-s scheduler]
    -t: TCP协议的集群 
    -u: UDP协议的集群
    service-address:     IP:PORT
    -f: FWM: 防火墙标记 
    service-address: Mark Number
    修改:-E
    删除:-D -t|u|f service-address
    
    ipvsadm -A -t 192.168.9.100:80 -s rr
    

    管理集群服务中的RS(把包发给realServer)

    添加:-a -t|u|f service-address -r server-address [-g|i|m] [-w weight]
      -t|u|f service-address:事先定义好的某集群服务
      -r server-address: 某RS的地址,在NAT模型中,可使用IP:PORT实现端口映射;
      [-g|i|m]: LVS类型 
      -g: DR
      -i: TUN
      -m: NAT
      [-w weight]: 定义服务器权重
    修改:-e
    删除:-d -t|u|f service-address -r server-address
    # ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.8 –g
    # ipvsadm -a -t 172.16.100.1:80 -r 192.168.10.9 -g
    查看
      -L|l
      -n: 数字格式显示主机地址和端口
      --stats:统计数据
      --rate: 速率
      --timeout: 显示tcp、tcpfin和udp的会话超时时长
      -:c 显示当前的ipvs连接状况
    删除所有集群服务
      -C:清空ipvs规则
    保存规则
      -S 
    # ipvsadm -S > /path/to/somefile
    载入此前的规则:
      -R
    # ipvsadm -R < /path/form/somefile 
    

    DR模式实验手册

    LVS配置命令

    node01:

            配置负载均衡服务器的VIP
    	ifconfig eth0:8 192.168.150.100/24
    	如果要撤销 
    	ifconfig eth0:8 down
    

    node02~node03:

    	1)修改内核(配置arp协议):
    		echo 1 > /proc/sys/net/ipv4/conf/eth0/arp_ignore 
    		echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
    		echo 2 > /proc/sys/net/ipv4/conf/eth0/arp_announce 
    		echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
    	2)设置隐藏的vip:
    		ifconfig  lo:3  192.168.150.100  netmask 255.255.255.255
    

    RS中的服务:
    node02~node03:

            安装http服务
    	yum install httpd -y
    	启动http服务
    	service httpd start
    	添加一个主页,便于访问演示
    	vi   /var/www/html/index.html
    		from 192.168.150.1x
    

    LVS服务配置
    node01:

    	安装ipvs工具
    	yum install ipvsadm 
    	配置接收请求包
    	ipvsadm -A  -t  192.168.150.100:80  -s rr
    	配置包转发到server
    	ipvsadm -a  -t 192.168.150.100:80  -r  192.168.150.12 -g -w 1
    	ipvsadm -a  -t 192.168.150.100:80  -r  192.168.150.13 -g -w 1
    	查看当前ipvs模块中记录的连接(可用于观察转发情况)
    	ipvsadm -ln
    

    验证:

    	浏览器访问  192.168.150.100   看到负载  疯狂F5
    	node01:
    		netstat -natp   结论看不到socket连接
    	node02~node03:
    		netstat -natp   结论看到很多的socket连接
    	node01:
    		ipvsadm -lnc    查看偷窥记录本
    		TCP 00:57  FIN_WAIT    192.168.150.1:51587 192.168.150.100:80 192.168.150.12:80
    		FIN_WAIT: 连接过,偷窥了所有的包
    		SYN_RECV: 基本上lvs都记录了,证明lvs没事,一定是后边网络层出问题
    

    Keepalived

    keepalived是集群管理中保证集群高可用的一个服务软件,其功能类似于heartbeat,用来防止单点故障。

    keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。

    虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面有一个对外提供服务的vip(该路由器所在局域网内其他机器的默认路由为该vip),master会发组播,当backup收不到vrrp包时就认为master宕掉了,这时就需要根据VRRP的优先级来选举一个backup当master。这样的话就可以保证路由器的高可用了。

    Keepalived配置命令

    主机: node01~node04

    node01:
    	ipvsadm -C   //清空LVS配置
    	ifconfig eth0:8 down    //清空网卡配置
    
    ----------------------------
    node01,node04:
    	yum install keepalived ipvsadm -y    //安装keepalived 
    	配置:
    		cd  /etc/keepalived/
    		cp keepalived.conf keepalived.conf.bak  //备份配置文件
    		vi keepalived.conf                      //编辑配置文件
    			node01:
    			vrrp:虚拟路由冗余协议!
    				vrrp_instance VI_1 {
    					state MASTER             //主备标识  node04  BACKUP
    					interface eth0           //网卡配置
    					virtual_router_id 51     //集群标识
    					priority 100		 //权重	 node04	 50
    					advert_int 1
    					authentication {
    						auth_type PASS
    						auth_pass 1111
    					}
    					virtual_ipaddress {
    						192.168.150.100/24 dev eth0 label  eth0:3
    					}
    				}
    			virtual_server 192.168.150.100 80 {
    				delay_loop 6
    				lb_algo rr
    				lb_kind DR
    				nat_mask 255.255.255.0
    				persistence_timeout 0           //保活时间
    				protocol TCP
    
    				real_server 192.168.150.12 80 {  //服务检查
    					weight 1
    					HTTP_GET {
    						url {            //请求路径,返回正常的状态码
    						  path /
    						  status_code 200
    						}
    						connect_timeout 3
    						nb_get_retry 3         //重试此时
    						delay_before_retry 3   /重试时间间隔
    					}   
    				}       
    				real_server 192.168.150.13 80 {
    					weight 1
    					HTTP_GET {
    						url {
    						  path /
    						  status_code 200
    						}
    						connect_timeout 3
    						nb_get_retry 3
    						delay_before_retry 3
    					}
    				}
    			scp  ./keepalived.conf  root@node04:`pwd`    //两台机器间拷贝配置文件
    
  • 相关阅读:
    scala :: , +:, :+ , ::: , ++ 的区别
    Scala 函数式编程思想
    Scala 关键字
    HDFS 的内存存储是什么?
    LRU
    高并发情况限流
    Java中List集合去除重复数据的方法
    MySQL支持的跨库事务
    死磕ConcurrentHashMap 1.8源码解析
    一致性Hash算法
  • 原文地址:https://www.cnblogs.com/farmersun/p/12687330.html
Copyright © 2020-2023  润新知