当前位置: 首页 > news >正文

生产LVS负载均衡与keepalive的高可用实践

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

LVS负载DR模式高可用

环境

  • centos7
  • keepalived

三种工作模式

VS/NAT模式(Network address translation) VS/TUN模式(tunneling) DR模式(Direct routing):常用;内网单用卡

八种调度算法

官方: http://www.linuxvirtualserver.org/zh/lvs4.html

固定调度算法:rr,wrr,dh,sh 轮询调度(Round-Robin Scheduling) 加权轮询调度(Weighted Round-Robin Scheduling) 目标地址散列调度(Destination Hashing Scheduling) 源地址散列调度(Source Hashing Scheduling)

动态调度算法:wlc,lc,lblc,lblcr 最小连接调度(Least-Connection Scheduling) 加权最小连接调度(Weighted Least-Connection Scheduling) 基于局部性的最少链接(Locality-Based Least Connections Scheduling) 带复制的基于局部性最少链接(Locality-Based Least Connections with Replication Scheduling)

基础配置

vip:10.0.1.15

Director节点 lvs-1:10.0.1.8 (master) Director节点 lvs-2:10.0.1.9 (backup)

在lvs主机上执行 keepalived shell

Real server1 web1:10.0.1.4 Real server1 web2:10.0.1.5

在后端主机上执行 lvs_rs.sh shell

服务部署

yum在线装

yum -y install keepalived

开启转发

echo 1 > /proc/sys/net/ipv4/ip_forward
grep  ip_forward  /etc/sysctl.conf &>/dev/null || echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf

主服务器配置

/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
       admin@attacker.club
   }

notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server smtp.qq.com
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_sync_group VG1 {
        group{
        VI_1
                }
                    }
vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        // 虚拟的路由ID两台参数必须一致
        priority 100
        // 定义优先级,谁大就是master
        advert_int 1
        // 超出1s如果对方没有反应它就接管
        nopreempt  //不抢占,master节点

        authentication {
        auth_type PASS
        auth_pass lvsPASS0
                        }

        virtual_ipaddress {
        10.0.1.15
		// 定义一个VIP
        }
		}
		

        virtual_server 10.0.1.15 80 {
        delay_loop 5
		// 每隔5秒查询realserver状态
        lb_algo rr
		// lvs 算法
        lb_kind DR
		// DR模式
        // persistence_timeout 60
		// 会话保持时间
        protocol TCP

                real_server 10.0.1.4 80 {
                weight 1 // 权重
                inhibit_on_failure
                // 服务器健康失败,将weight设置为0,而不删除
                // notify_down /root/MySQL.sh  //检测到服务down后执行的脚本
                TCP_CHECK {
                connect_timeout 5
                // 连接超时时间;秒
                nb_get_retry 3
                // 重连次数
                delay_before_retry 3
                // 重连间隔时间
                connect_port 80
                // 健康检查端口
                          }
                                              }
                real_server 10.0.1.5 80 {
                weight 1
                inhibit_on_failure
                TCP_CHECK {
                connect_timeout 5
                nb_get_retry 3
                delay_before_retry 3
                connect_port 80
                          }
                                              }

}

备服务器配置

替换

% s/MASTER/BACKUP/
% s/priority 100/priority 90/
g/nopreempt/d

启动服务

systemctl start keepalived
systemctl enable  keepalived

状态查看

ip add # 查看浮动ip地址
systemctl status keepalived # 查看状态

ipvsadm -ln
ipvsadm -ln --stats
ipvsadm -ln --rate

Real server (后端服务)

/opt/lvs_rs.sh

#read -p "请输入vip地址:" vip
vip=10.0.1.15

#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
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

nginx两台配置

server {
listen 80 default_server;
default_type application/json;
server_name _;
return 200 '{"date":"$time_local","host":"web-2","result":"nginx json"}';
access_log  /usr/local/nginx/logs/default.log;
}

持续连接

1)持久连接(lvs persistence)模板:
    实现无论使用任何调度算法,在一段时间内(默认360s),能够实现将来自同一个地址的请求始终发往同一个RS
        ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]
            -p # :定义持久时长

2)持久连接实现方式:
    每端口持久(PPC):每个端口对应定义为一个集群服务,每个集群服务单独调度,同一服务持久
    每防火墙标记持久(PFWMC ):基于防火墙标记定义集群服务,可实现将多个端口上的应用统一调度,即所谓的port Affinity,同一防火墙标记持久
    每客户端持久(PCC ):基于0端口(表示所有服务)定义集群服务,即将客户端对所有应用的请求都调度至后端主机,必须定义为持久模式,所有服务持久将vip的端口定义为0,则表示所有请求都将发送后台服务器。
    
3)具体实现
    在VS上进行如下操作
        [root[@centos7](https://my.oschina.net/centos7) ~]#ipvsadm -E -f 12 -s rr -p 300   
        [root[@centos7](https://my.oschina.net/centos7) ~]#ipvsadm -Ln
            IP Virtual Server version 1.2.1 (size=4096)
            Prot LocalAddress:Port Scheduler Flags
              -> RemoteAddress:Port           Forward Weight ActiveConn InActConn      
            FWM  12 rr persistent 300
              -> 192.168.74.129:0             Route   1      0          0         
              -> 192.168.74.133:0             Route   1      0          0

session保存机制(会话机制)

session绑定(session sticky)
    始终将同一个请求者的请求发送到同一台RS(第一次请求由算法调度)
    缺陷:没有容错能力,若此RS宕机,则会话丢失,并且将同一请求发送到同一RS有损均衡效果。
session复制(session cluster)
    在RS之间同步session,因此每个RS都保持集群中的所有session
    缺陷:增加了RS的负担,对大规模的集群不适用
session服务器(session server),redis:
    用单独一组服务器来管理session

转至:https://www.cnblogs.com/shenxm/p/8461303.html

ftp负载均衡

lMySQL-ha

!Configuration File for keepalived  
  
global_defs {  
         notification_email {  
         xiaolin0199@gmail.com  
           }  
         notification_email_from xiaolin0199@gmail.com  
         smtp_server 127.0.0.1  
         smtp_connect_timeout 30  
         router_id MySQL-ha  
         }  
  
vrrp_instance VI_1 {  
        state BACKUP   #两台配置此处均是BACKUP  
        interface eth0  
        virtual_router_id 51  
        priority 100   #优先级,另一台改为90  
        advert_int 1  
        nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置  
        authentication {  
          auth_type PASS  
          auth_pass 1111  
        }  
        virtual_ipaddress {  
          192.168.0.200  
        }  
        }  
  
virtual_server 192.168.0.200 3306 {  
        delay_loop 2   #每个2秒检查一次real_server状态  
        lb_algo wrr   #LVS算法  
        lb_kind DR    #LVS模式  
        persistence_timeout 60   #会话保持时间  
        protocol TCP  
        real_server 192.168.0.219 3306 {  
        weight 3  
        notify_down /usr/local/MySQL/bin/MySQL.sh  #检测到服务down后执行的脚本  
        TCP_CHECK {  
          connect_timeout 10    #连接超时时间  
          nb_get_retry 3       #重连次数  
          delay_before_retry 3   #重连间隔时间  
          connect_port 3306   #健康检查端口  
        }  
        }  
        }  

编写检测服务down后所要执行的脚本

/usr/local/MySQL/bin/MySQL.sh

 #!/bin/sh
 pkill keepalived

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;
我们可以看到,脚本就一个命令,通过pkill keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。

转至:https://xiaolin0199.iteye.com/blog/2017997

FTP负载均衡

https://blog.51cto.com/11091005/2115025

keepalived 日志定义

/etc/sysconfig/keepalived

KEEPALIVED_OPTIONS= "-D -S 0 -d"

-D是让keepalived详细记录log -d是在日志里打出keepalived读到的配置信息 -S 0是到会将日志发送给syslog,且日志定为LOCAL0

echo "local0.* /var/log/keepalived.log">> /etc/rsyslog.conf
# 让syslog帮忙把接收到的日志写到文件

systemctl restart  rsyslog
# 重启服务

tail /var/log/keepalived.log
# 查看日志

转载于:https://my.oschina.net/attacker/blog/2252427

相关文章:

  • SQL数据库字段数据类型详细说明
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • Mysql密码重置
  • hadoop之旅6-windows本地MapReducer离线单词统计
  • 获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录
  • 【火炉炼AI】机器学习053-数据降维绝招-PCA和核PCA
  • 兄弟连区块链教程Fabric1.0源代码分析Ledger(账本)一
  • 简单远程遥控程序【网络程序设计 - 简单远程遥控程序,C实现】
  • CStringArray error C2248: 'CObject::CObject' : cannot access private member declared in class
  • js 在光标处插入内容
  • fastcgi_param 详解
  • dup
  • 常用STL用法总结
  • SQLServer之事务简介
  • 个人笔记:ORACLE大页内存hugepage和SGA、PGA的经验,SGA并不是越大越好
  • 30天自制操作系统-2
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • es6要点
  • ESLint简单操作
  • Java编程基础24——递归练习
  • Js基础——数据类型之Null和Undefined
  • select2 取值 遍历 设置默认值
  • sublime配置文件
  • 聊聊flink的TableFactory
  • 使用权重正则化较少模型过拟合
  • 数据可视化之 Sankey 桑基图的实现
  • 交换综合实验一
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • #在 README.md 中生成项目目录结构
  • (k8s中)docker netty OOM问题记录
  • (定时器/计数器)中断系统(详解与使用)
  • (二)正点原子I.MX6ULL u-boot移植
  • (九十四)函数和二维数组
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (十一)c52学习之旅-动态数码管
  • (四)c52学习之旅-流水LED灯
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)scrum常见工具列表
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .Net 8.0 新的变化
  • .net CHARTING图表控件下载地址
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 发送邮件
  • .NET 反射的使用
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @RequestMapping 的作用是什么?
  • @SentinelResource详解