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. SDUT-2116_数据结构实验之链表一:顺序建立链表

    数据结构实验之链表一:顺序建立链表 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 输入N个整数,按照输入的顺序建立单链 ...

  2. @codeforces - 631E@ Product Sum

    目录 @desription@ @solution@ @accepted code@ @details@ @desription@ 给定一个序列 a,定义它的权值 \(c = \sum_{i=1}^{ ...

  3. OpenStack组件系列☞glance搭建

    第一步:glance关于数据库的操作 mysql -u root -p #登入数据库 CREATE DATABASE glance; #新建库keystone GRANT ALL PRIVILEGES ...

  4. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  5. BERT大火却不懂Transformer?读这一篇就够了 原版 可视化机器学习 可视化神经网络 可视化深度学习

    https://jalammar.github.io/illustrated-transformer/ The Illustrated Transformer Discussions: Hacker ...

  6. oracle用WHERE替代ORDER BY

    ORDER BY 子句只在两种严格的条件下使用索引. ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. ORDER BY中所有的列必须定义为非空. WHERE子句使用的索引和 ...

  7. tensorflow入门——5tensorflow安装

    你将把你学到的神经网络的知识,借助 TensorFlow ,一个 Google 开源的深度学习框架,应用在真实的数据集中. 你将使用 TensorFlow 来辨别 notMNIST 数据集.它是一个由 ...

  8. NIO 中文乱码自我解决的简单DEMO

    import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStrea ...

  9. PyTorch之前向传播函数自动调用forward

    参考:1. pytorch学习笔记(九):PyTorch结构介绍 2.pytorch学习笔记(七):pytorch hook 和 关于pytorch backward过程的理解 3.Pytorch入门 ...

  10. H3C MP-Group方式配置PPP MP