LVS(Linux Virtual Server)即Linux 虚拟服务器,是一个的开源负载均衡项目,目前LVS 已经被集成到Linux 内核模块中。LVS 是四层负载均衡,也就是说建立在OSI 模型的第四层——传输层之上,传输层上有我们熟悉的TCP/UDP,LVS 支持TCP/UDP 的负载均衡。

一 环境

192.168.132.120    VIP
192.168.132.123   LVS01,keepalived
192.168.132.124   LVS02,keepalived
192.168.132.121   MySQL 主
192.168.132.122   MySQL 主

在192.168.132.123和192.168.132.124安装lvs的管理软件,以及安装keepalive(参考上篇)

[root@lvs01 ~]# yum install ‐y ipvsadm*

LVS 安装完成,查看当前LVS 集群

[root@lvs01 ~]#  ipvsadm -L -n

IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn

二 LVS介绍

2.1 LVS 工作模式

NAT 模式

TUN 模式

DR 模式

2.2 LVS 负载均衡调度算法

轮询调度(Round Robin 简称'RR')算法就是按依次循环的方式将请求调度到不同的服务器上,该算法最大的特点就是实现简单。轮询算法假设所有的服务器处理请求的能力都一样的,调度器会将所有的请求平均分配给每个真实服务器。

加权轮询(Weight Round Robin 简称'WRR')算法主要是对轮询算法的一种优化与补充,LVS 会考虑每台服务器的性能,并给每台服务器添加一个权值,如果服务器A 的权值为1,服务器B 的权值为2,则调度器调度到服务器B 的请求会是服务器A 的两倍。权值越高的服务器,处理的请求越多。

最小连接调度(Least Connections 简称'LC')算法是把新的连接请求分配到当前连接数最小的服务器。最小连接调度是一种动态的调度算法,它通过服务器当前活跃的连接数来估计服务器的情况。调度器需要记录各个服务器已建立连接的数目,当一个请求被调度到某台服务器,其连接数加1;当连接中断或者超时,其连接数减1。

加权最少连接(Weight Least Connections 简称'WLC')算法是最小连接调度的超集,各个服务器相应的权值表示其处理性能。服务器的缺省权值为1,系统管理员可以动态地设置服务器的权值。加权最小连接调度在调度新连接时尽可能使服务器的已建立连接数和其权值成比例。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

基于局部性的最少连接调度算法lblc

复杂的基于局部性最少的连接算法lblc目标地址散列调度算法 dh

源地址散列调度算法 sh

固定调度算法:rr,wrr,dh,sh

动态调度算法:wlc,lc,lblc,lblcr

NAT 模式:网络地址转换

DR 模式:直接路由

2.3 配置

LVS01配置:

[root@lvs01 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
router_id lvs01
} vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.132.120
}
} virtual_server 192.168.132.120 {
delay_loop
protocol TCP
lb_algo rr
lb_kind DR
real_server 192.168.132.121 {
TCP_CHECK {
connect_timeout
nb_get_retry
connect_port
delay_before_retry
}
}
real_server 192.168.132.122 {
TCP_CHECK {
connect_timeout
nb_get_retry
connect_port
delay_before_retry
}
}
}

LVS02配置

[root@lvs02 ~]# vim /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
router_id lvs02
} vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id
priority
nopreempt
advert_int
authentication {
auth_type PASS
auth_pass
}
virtual_ipaddress {
192.168.132.120
}
} virtual_server 192.168.132.120 {
delay_loop
protocol TCP
lb_algo rr
lb_kind DR
real_server 192.168.132.121 {
TCP_CHECK {
connect_timeout
nb_get_retry
connect_port
delay_before_retry
}
}
real_server 192.168.132.122 {
TCP_CHECK {
connect_timeout
nb_get_retry
connect_port
delay_before_retry
}
}
}

数据库配置脚本

master1和master2都操作

[root@master1 ~]# vim /opt/realserver.sh

#!/bin/bash
#description: Config realserver VIP=192.168.132.120 /etc/rc.d/init.d/functions case "$1" in
start)
/sbin/ifconfig lo: $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:
echo "" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/all/arp_announce
sysctl -p >/dev/null >&
echo "RealServer Start OK"
;;
stop)
/sbin/ifconfig lo: down
/sbin/route del $VIP >/dev/null >&
echo "" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "" >/proc/sys/net/ipv4/conf/all/arp_announce
echo "RealServer Stoped"
;;
*)
echo "Usage: $0 {start|stop}"
exit
esac

Realserver 配置:
arp_ignore

arp:请求包,响应包

0:响应任意网卡上接收到的对本机IP 地址的arp 请求(包括环回网卡上的地址),而不管该目的IP 是否在接收网卡上。

1:只响应目的IP 地址为接收网卡上的本地地址的arp 请求。

当arp_ignore 参数配置为0 时,eth1 网卡上收到目的IP 为环回网卡IP 的arp 请求,但是eth1 也会返回arp 响应,把自己的mac 地址告诉对端。

当arp_ignore 参数配置为1 时,eth1 网卡上收到目的IP 为环回网卡IP 的arp 请求,发现请求的IP 不是自己网卡上的IP,不会回arp 响应。

当arp_announce 参数配置为0 时,系统要发送的IP 包源地址为eth1 的地址,IP 包目的地址根据路由表查询判断需要 从eth2 网卡发出,这时会先从eth2 网卡发起一个arp 请求,用于获取目的IP 地址的MAC 地址。该arp 请求的源MAC 自然是eth2 网卡的MAC 地址,但是源IP 地址会选择eth1 网卡的地址。当arp_announce 参数配置为2 时,eth2 网卡发起arp 请求时,源IP 地址会选择eth2 网卡自身的IP 地址。

arp_announce

0:允许使用任意网卡上的IP 地址作为arp 请求的源IP,通常就是使用数据包的源IP。

1:尽量避免使用不属于该发送网卡子网的本地地址作为发送arp 请求的源IP 地址。

2:忽略IP 数据包的源IP 地址,选择该发送网卡上最合适的本地地址作为arp 请求的源IP 地址。源IP,源MAC,目的IP,目的MAC

arp_ignore 和arp_announce 参数在DR 模式下的作用

1. arp_ignore

因为DR 模式下,每个真实服务器节点都要在环回网卡上绑定虚拟服务IP。这时候,如果客户端对于虚拟服务IP 的arp请求广播到了各个真实服务器节点,如果arp_ignore 参数配置为0,则各个真实服务器节点都会响应该arp 请求,此时客户端就无法正确获取LVS 节点上正确的虚拟服务IP 所在网卡的MAC 地址。所以DR 模式下要求arp_ignore 参数要求配置为1。

2. arp_announce

每个机器或者交换机中都有一张arp 表,该表用于存储对端通信节点IP 地址和MAC 地址的对应关系。当收到一个未知IP 地址的arp 请求,就会再本机的arp 表中新增对端的IP 和MAC 记录;当收到一个已知IP 地址(arp 表中已有记录的地址)的arp 请求,则会根据arp 请求中的源MAC 刷新自己的arp 表。

如果arp_announce 参数配置为0,则网卡在发送arp 请求时,可能选择的源IP 地址并不是该网卡自身的IP 地址,这时候收到该arp 请求的其他节点或者交换机上的arp 表中记录的该网卡IP 和MAC 的对应关系就不正确,可能会引发一些未知的网络问题,存在安全隐患。所以DR 模式下要求arp_announce 参数要求配置为2。

[root@master1 ~]# chmod +x /opt/realserver.sh

[root@master1 ~]# chmod +x /opt/realserver.sh

[root@master1 ~]# /opt/realserver.sh start

[root@master1 ~]# chmod +x /etc/rc.d/init.d/functions

[root@master1 ~]# /opt/realserver.sh start

/etc/rc.d/init.d/functions: line : return: can only `return' from a function or sourced script
SIOCADDRT: File exists
RealServer Start OK

把这个脚本加入开机自启动

[root@master1 ~]# vim  /etc/rc.d/rc.local

/opt/realserver.sh  start

[root@master1 ~]# chmod +x /etc/rc.d/rc.local

master2相同配置方法

lvs启动keepalived

[root@lvs01 ~]# systemctl start keepalived

[root@lvs01 ~]# systemctl status keepalived

keepalived.service - LVS and VRRP High Availability Monitor
Loaded: loaded (/usr/lib/systemd/system/keepalived.service; enabled; vendor preset: disabled)
Active: active (running) since Thu -- :: EDT; 12s ago

四 验证

4.1 查看虚拟IP

[root@lvs02 ~]# ip addr

: lo: <LOOPBACK,UP,LOWER_UP> mtu  qdisc noqueue state UNKNOWN qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::f0::c9 brd ff:ff:ff:ff:ff:ff
inet 192.168.132.123/ brd 192.168.132.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::a6b5:aa2c:b3c7:/ scope link
valid_lft forever preferred_lft forever
: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::f0::d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.254.123/ brd 192.168.254.255 scope global ens34
valid_lft forever preferred_lft forever
inet6 fe80::c37e:949c:9d3:d204/ scope link
valid_lft forever preferred_lft forever

[root@lvs01 ~]# ip addr

: lo: <LOOPBACK,UP,LOWER_UP> mtu  qdisc noqueue state UNKNOWN qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::ac:6a: brd ff:ff:ff:ff:ff:ff
inet 192.168.132.124/ brd 192.168.132.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.132.120/ scope global ens33 #虚拟IP
valid_lft forever preferred_lft forever
inet6 fe80:::c431:914d:1a31/ scope link
valid_lft forever preferred_lft forever
: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::ac:6a: brd ff:ff:ff:ff:ff:ff
inet 192.168.254.124/ brd 192.168.254.255 scope global ens34
valid_lft forever preferred_lft forever
inet6 fe80::d4b5:199b:3d5a:ff0f/ scope link
valid_lft forever preferred_lft forever

4.2 使用192.168.132.125连接数据库

[root@localhost ~]#  mysql -uroot -h192.168.132.120  -p1234567

MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master1 |
| master2 |
| mysql |
| performance_schema |
| sys |
+--------------------+

4.3 查看192.168.132.120所在服务器

[root@lvs02 ~]# ipvsadm -L -n

IP Virtual Server version 1.2. (size=)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.132.120: rr
-> 192.168.132.121: Route
-> 192.168.132.122: Route

则keepalived+lvs实现负载均衡高可用配置完成

4.4 负载均衡验证

LVS负载均衡,在发现如果后端的mysql不能连接,就不会把数据发送给服务器

[root@master1 ~]# systemctl stop mysqld

[root@lvs02 ~]# tail -f /var/log/messages

Jul  :: lvs02 Keepalived_healthcheckers[]: Removing service [192.168.132.121]:tcp: to VS [192.168.132.120]:tcp:3306
Jul 11 10:25:52 lvs02 Keepalived_healthcheckers[1386]: Received EPOLLHUP for fd 8 #同时一直看状态

[root@master1 ~]# systemctl start mysqld

[root@lvs02 ~]# tail -f /var/log/messages

Jul  :: lvs02 Keepalived_healthcheckers[]: TCP connection to [192.168.132.121]:tcp: success.
Jul :: lvs02 Keepalived_healthcheckers[]: Adding service [192.168.132.121]:tcp: to VS [192.168.132.120]:tcp:

4.5 高可用验证

当lVS的其中一台宕机,虚拟盘就会跳到另一台上去

[root@lvs02 ~]# systemctl stop keepalived
[root@lvs02 ~]# ip addr

: lo: <LOOPBACK,UP,LOWER_UP> mtu  qdisc noqueue state UNKNOWN qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::ac:6a: brd ff:ff:ff:ff:ff:ff
inet 192.168.132.124/ brd 192.168.132.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80:::c431:914d:1a31/ scope link
valid_lft forever preferred_lft forever
: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::ac:6a: brd ff:ff:ff:ff:ff:ff
inet 192.168.254.124/ brd 192.168.254.255 scope global ens34
valid_lft forever preferred_lft forever
inet6 fe80::d4b5:199b:3d5a:ff0f/ scope link
valid_lft forever preferred_lft forever

[root@lvs01 ~]# ip addr

: lo: <LOOPBACK,UP,LOWER_UP> mtu  qdisc noqueue state UNKNOWN qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::f0::c9 brd ff:ff:ff:ff:ff:ff
inet 192.168.132.123/ brd 192.168.132.255 scope global ens33
valid_lft forever preferred_lft forever
inet 192.168.132.120/ scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::a6b5:aa2c:b3c7:/ scope link
valid_lft forever preferred_lft forever
: ens34: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UP qlen
link/ether :0c::f0::d3 brd ff:ff:ff:ff:ff:ff
inet 192.168.254.123/ brd 192.168.254.255 scope global ens34
valid_lft forever preferred_lft forever
inet6 fe80::c37e:949c:9d3:d204/ scope link
valid_lft forever preferred_lft forever

继续连接数据库

[root@localhost ~]#  mysql -uroot -h192.168.132.120  -p1234567

MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master1 |
| master2 |
| mysql |
| performance_schema |
| sys |
+--------------------+

mysql主从之LVS+keepalived+双主MySQL 负载均衡的更多相关文章

  1. MySQL主从复制与lvs+keepalived单点写入读负载均衡高可用实验【转】

    一.环境Master(主机A):192.168.1.1Slave(主机B) :192.168.1.2  W-VIP(写入)  :192.168.1.3 R-VIP(读取)  :192.168.1.4  ...

  2. LVS+Keepalived 实现高可用负载均衡

    前言 在业务量达到一定量的时候,往往单机的服务是会出现瓶颈的.此时最常见的方式就是通过负载均衡来进行横向扩展.其中我们最常用的软件就是 Nginx.通过其反向代理的能力能够轻松实现负载均衡,当有服务出 ...

  3. LVS+Keepalived 实现高可用负载均衡集群

    LVS+Keepalived  实现高可用负载均衡集群     随着网站业务量的增长,网站的服务器压力越来越大?需要负载均衡方案!商业的硬件如 F5 ,Array又太贵,你们又是创业型互联公司如何有效 ...

  4. LVS+Keepalived实现高可用负载均衡(转)

    LVS+Keepalived实现高可用负载均衡   一.原理         1.概要介绍         如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具 ...

  5. lvs+keepalived+nginx实现高性能负载均衡集群【转】

    转自 lvs+keepalived+nginx实现高性能负载均衡集群 - 青衫lys - 博客园http://www.cnblogs.com/liuyisai/p/5990645.html 一.为什么 ...

  6. 【架构师之路】 LVS+Keepalived实现高可用负载均衡

    一.原理        1.概要介绍        如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态, ...

  7. Windows+IIS结合LVS+Keepalived是实现Linux负载均衡软件

    在Discuz!NT的最新版本(企业版)中,支持目前主流LINUX平台上的负载均衡解决方案,比如NGINX,HAPROXY,LVS等.本文与其说是解决方案,倒不如说是介绍如何搭建Discuz!NT负载 ...

  8. 【Nginx】(主从热备)LVS+Keepalived+Nginx实现高性能负载均衡集群

    一.LVS 1.1 概述 1.2 Nginx与LVS区别什么 二.Keepalived 2.1 概述 2.2 keepalived和其工作原理 三.LVS+Keepalived+Nginx 搭建双机主 ...

  9. Nginx+Keepalived双主轮询负载均衡

    双主模式使用两个VIP,前段有2台服务器,互为主从,两台服务器同时工作,不存在资源浪费情况.同时在前端的DNS服务器对网站做多条A记录,实现了Nginx的负载均衡,当一台服务器故障时候,资源会转移到另 ...

随机推荐

  1. 用select提取List元素自身序号

    var cs = currentCitys.Select((c, i) => new { id = c.CITY_ID, 序号 = (i + 1).ToString(), 城市类型 = c.IS ...

  2. 归并排序及应用 (nyoj 117 求逆序数)

    求逆序数 时间限制:2000 ms  |  内存限制:65535 KB 难度:5   描述 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中 ...

  3. IO NIO AIO及常用框架概述

    概述 nio 同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步: 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需 ...

  4. 如何安装 btsync

    本文告诉大家如何在 windows 和 Linux 安装使用 Btsync 而且分享一些小东西给大家 btsync 是分布式网盘 在这高速运作的信息化时代,使用云端来衔接工作和生活的点滴已是寻常事.可 ...

  5. TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    TP-Admin即基于ThinkPHP5的web后台管理系统(总结一套自己的后台管理系统,方便自己后续的项目开发.) 主要特性:自适应手机端.支持国际化.吸取其他CMF框架优点.多站点部署.日志记录. ...

  6. Android 自定义界面的弹出框(可输入数据)

    上午写了一篇博文,介绍了如何定义从屏幕底部弹出PopupWindow,写完之后,突然想起之前写过自定义内容显示的弹出框,就随手写了两个实例,分享出来: 第一种实现方式:继承Dialog 1.1 线定义 ...

  7. Bootstrap之Form表单验证神器: BootstrapValidator(转)

    前言:做Web开发的我们,表单验证是再常见不过的需求了.友好的错误提示能增加用户体验.博主搜索bootstrap表单验证,搜到的结果大部分都是文中的主题:bootstrapvalidator.今天就来 ...

  8. git 生成秘钥连接远程仓库

    二.打开GitBash ,用cd命令进入本地项目目,然后把初始化一下,把本地的目录变成git本地仓库, git status 可以查看本地目录的状态信息 git init git status 三.将 ...

  9. Python基础知识汇总

    1.执行脚本的两种方式 Python a.py     直接调用Python解释器执行文件 chomd +x a.py   ./a.py    #修改a.py文件的属性,为可执行,在用  ./  执行 ...

  10. uni-app学习记录03-路由跳转

    <template> <view class="content"> <!-- v-show是相对于display: none --> <v ...