前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux利用lvs+Keepalived实现负载均衡

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

原创
作者头像
黄啊码
修改2021-07-23 18:03:49
9660
修改2021-07-23 18:03:49
举报
文章被收录于专栏:黄啊码【CSDN同名】

负载均衡:两台(一主一备)  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!完美!结束!

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 在每台(HTTP服务器)真实服务器网上上添加LO:0接口,并设置虚拟IP在此接口上
    • chkconfig realserver on用下边这句设置脚本会报错
    相关产品与服务
    负载均衡
    负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档