linux利用lvs+Keepalived实现负载均衡

2021-07-23 18:03:49 浏览数 (1)

负载均衡:两台(一主一备)  LVS Keepalived 三台HTTP服务器

这是我的第一台HTTP服务器【这里使用的是现成lnmp,然后复制出三台一模一样的】

每台(HTTP服务器)真实服务器网上上添加LO:0接口,并设置虚拟IP在此接口上

  1. cd /etc/init.d/
  2. vim realserver
代码语言:javascript复制
SNS_VIP=192.168.159.128                      #定义VIP变量192.168.159.128     
./etc/rc.d/init.d/functions                 #导脚本库
case "$1" in                            #case语句 $1传递给该shell脚本的第一个参数
start)
ifconfig lo:0 $SNS_VIP netmask 255.255.255.255 broadcast $SNS_VIP  #设置Lo:0 VIP  netmask  及广播
/sbin/route add -host $SNS_VIP dev lo:0                #route del 增加本地路由
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
sysctl -p >/dev/null 2>&1           # -p <file(default /etc/sysctl.conf) 将标准信息输入设备空文件
echo "RealServer Start OK"
;;
stop)
ifconfig lo:0 down
route del $SNS_VIP >/dev/null 2>&1                       #route del 删除本地路由
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"                           #$0 是脚本本身的名字
exit 1                                       #表示进程正常退出
esac                                         #case结束
exit 0                                        #表示进程非正常退出

记住:./etc/rc.d/init.d/functions这句脚本是没有任何的空格的,网上有出现空格的,百分百是复制出错

这样还会出现另外一个错误

chkconfig realserver on用下边这句设置脚本会报错

这时候需要在脚本最前边写上让其变成执行脚本:

#chkconfig: 2345 10 90

#description :realserver ....

也就是:

至于什么意思,自己搜,我这里就不做啰嗦

代码语言:javascript复制
chmod 750 realserver      #给此脚本赋予权限
chkconfig realserver on         #设置开机自启动此脚本
service realserver start          #开启此脚本
RealServer Start OK         #表示启动成功!
#ifconfig        #查看一下是否真的成功添加了lo:0接口

如图所示:

开始搭建负载均衡

LVS中提供了八种不同的调度算法

详情请参考:http://blog.csdn.net/u014649204/article/details/25115039

1:轮叫调度(Round-Robin Scheduling)

2: 加权轮叫调度(Weighted Round-Robin Scheduling)

3:最小连接调度(Least-Connection Scheduling)

4:加权最小连接调度(Weighted Least-Connection Scheduling)

5:基于局部性的最少链接(Locality-Based Least Connections Scheduling)

6:带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)

7:目标地址散列调度(Destination Hashing Scheduling)

8:源地址散列调度(Source Hashing Scheduling)

9:最短预期延时调度(Shortest Expected Delay Scheduling)

10:不排队调度(Never Queue Scheduling)

  对应: rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq

LVS负载均衡主机:

先看一下CentOs内核,如果内核是2.6版本以后,那么LVS虚拟机已经存在于内核中。

说一下什么是Keepalived?

keepalived的作用是检测web服务器的状态,如果有一台web服务器死机或者工作出现故障,keepalived将会检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常之后,keepalived自动将web服务器加入到集群中,这些工作都会自动完成

我们用yum install keepalived

yum -y install keepalived

安装完成之后,使用rpm -ql 命令,查看一下Keepalived的安装信息

rpm -ql keepalived

根据提示信息里Keepalived的配置文件路径,覆盖配置文件,写入以下命令。详细说明在最后说明。

配置文件位置:

代码语言:javascript复制
global_defs {                       
#   notification_email {             
#       myemail@aliyun.com
#   }
#   notification_email_from myemail@aliyun.com
#   smtp_server smtp.exmail.qq.com
#   smtp_connect_timeout 30
    router_id LVS_DEVEL             
}
vrrp_instance VI_1 {            
    state MASTER             #主    
    interface ens33           #在负载均衡主机上查看一下ip,我这里是ens33。这里要注意。     
    virtual_router_id 51        
    priority 100             #优先级        
    advert_int 1           
    authentication {        
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        192.168.159.128
    }
}
virtual_server 192.168.159.128 80 {
    delay_loop 6           
    lb_algo wrr            
    lb_kind DR                          
    nat_mask 255.255.255.0   
    persistence_timeout 0    
    protocol TCP                          
    real_server 192.168.159.132 80 {       #第一台HTTP
        weight 3                             
        TCP_CHECK {                     
            connect_timeout 10   
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.159.130 80 {        #第二台HTTP
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.159.131 80 {         #第三台HTTP
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

然后启动Keepalived服务,有时候虽然提示启动成功,但是未必,因为Keepalive并没有对配置文件的校验功能,最好查看一下日志。

代码语言:javascript复制
service keepalived start    //启动服务
tail -f /var/log/message     //查看日志

日志这里我就不说了,因为其他教程都是这样的,我这里使用的是ipvadm,使用说明我放在这

代码语言:javascript复制
# ipvsadm [选项]
//可以使用man命令获取更多ipvsadm用法
# man ipvsadm
IPVSADM常用参数说明:
-A:在内核的虚拟服务器表中添加一条新的虚拟服务器记录
-E:编辑内核虚拟服务器表中的一条虚拟服务器记录
-D:删除内核虚拟服务器表中的一条虚拟服务器记录
-C:清除内核虚拟服务器表中的所有记录
-R:恢复虚拟服务器规则
-S:保存虚拟服务器规则,输出为-R选项可读的格式
-a:在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录
-e:编辑一条虚拟服务器记录中的某条真实服务器记录
-d:删除一条虚拟服务器记录中的某条真实服务器记录
-L|-l:显示内核虚拟服务器表
-Z:虚拟服务表计数器清零(清空当前的连接数量等)
-set:- tcp tcpfin udp 设置连接超时值
--start-daemon:启动同步守护进程
--stop-daemon:停止同步守护进程
-h:显示帮助信息
-t:说明虚拟服务器提供的是TCP服务
-u:说明虚拟服务器提供的是UDP服务
-f:说明经过iptables标记过的服务类型
-s:使用的调度算法,常用选项 rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq
-p:持久服务
-r:真实的服务器
-g:指定LVS的工作模式为直接路由模式
-i:指定LVS的工作模式为隧道模式
-m:指定LVS的工作模式为NAT模式
-w:真实服务器的权值
-c:显示LVS目前的连接数
-timeout:显示 tcp tcpfin udp 的 timeout 值
--daemon:显示同步守护进程状态
--stats:显示统计信息
--rate:显示速率信息
--sort:对虚拟服务器和真实服务器排序输出
-n:输出IP地址和端口的数字形式

简易使用方式,如图

这里能够观测到三台http的访问状况

启动成功之后,浏览器访问192.168.159.128观察变化,这里分别是192.168.159.130/131/132

然后我们试着关掉一台HTTP服务器,观察访问发现,其他两台仍然可以正常访问,然后再启动一下刚才关闭的服务器,又恢复了之前。

这里很多朋友肯定会出现一个ping得通却无法访问的问题,我们需要注意防火墙的问题,所以我们需要在各自的HTTP机器将主机:192.168.159.128的80端口开通【如果粗暴点就关闭防火墙吧】

#iptables -A PREROUTING -t nat -p tcp -d 192.168.159.128 --dport 80 -j REDIRECT

接下来做负载均衡备用机

代码语言:javascript复制
global_defs {                       
#   notification_email {             
#       myemail@aliyun.com
#   }
#   notification_email_from myemail@aliyun.com
#   smtp_server smtp.exmail.qq.com
#   smtp_connect_timeout 30
    router_id LVS_DEVEL             
}
vrrp_instance VI_1 {            
    state BACKUP            #备 
    interface ens33           #在负载均衡主机上查看一下ip,我这里是ens33。这里要注意。     
    virtual_router_id 51        
    priority 100             #优先级        
    advert_int 1           
    authentication {        
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {         
        192.168.159.129
    }
}
virtual_server 192.168.159.129 80 {
    delay_loop 6           
    lb_algo wrr            
    lb_kind DR                          
    nat_mask 255.255.255.0   
    persistence_timeout 0    
    protocol TCP                          
    real_server 192.168.159.132 80 {       #第一台HTTP
        weight 3                             
        TCP_CHECK {                     
            connect_timeout 10   
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.159.130 80 {        #第二台HTTP
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
    real_server 192.168.159.131 80 {         #第三台HTTP
        weight 3
        TCP_CHECK {
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 80
        }
    }
}

配置完成之后,然后试着关掉主机,继续访问192.168.159.128,一切正常,主机开机之后,主机继续当主机,备机继续待命

最后还出现一个问题,就是当所有的HTTP机器都service realserver start后会出现无法访问的情况,但所有的都使用了service realserver stop后却可以完美访问,自然切换,有类似问题的网友如果知道解决问题,烦请告知我,我继续完善该博文

OK!完美!结束!

创作不易,如果能够解决您的问题,请给我点个赞,谢谢

0 人点赞