热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql从lvs_mysql主从之LVS+keepalived+双主MySQL负载均衡

LVS(LinuxVirtualServer)即Linux虚拟服务器,是一个的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中。LVS是四层

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.1 (size=4096)

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 模式:网络地址转换

eb3d0df6bc5c9f8b6e101a43e9f1a3c7.png

DR 模式:直接路由

5aae95b484a7f8ecc946b9dfcc2f003c.png

2.3 配置

LVS01配置:

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

! Configuration File forkeepalived

global_defs {

router_id lvs01

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id51priority100nopreempt

advert_int1authentication {

auth_type PASS

auth_pass1111}

virtual_ipaddress {192.168.132.120}

}

virtual_server192.168.132.120 3306{

delay_loop6protocol TCP

lb_algo rr

lb_kind DR

real_server192.168.132.121 3306{

TCP_CHECK {

connect_timeout3nb_get_retry3connect_port3306delay_before_retry3}

}

real_server192.168.132.122 3306{

TCP_CHECK {

connect_timeout3nb_get_retry3connect_port3306delay_before_retry3}

}

}

LVS02配置

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

! Configuration File forkeepalived

global_defs {

router_id lvs02

}

vrrp_instance VI_1 {

state BACKUP

interface ens33

virtual_router_id51priority90nopreempt

advert_int1authentication {

auth_type PASS

auth_pass1111}

virtual_ipaddress {192.168.132.120}

}

virtual_server192.168.132.120 3306{

delay_loop6protocol TCP

lb_algo rr

lb_kind DR

real_server192.168.132.121 3306{

TCP_CHECK {

connect_timeout3nb_get_retry3connect_port3306delay_before_retry3}

}

real_server192.168.132.122 3306{

TCP_CHECK {

connect_timeout3nb_get_retry3connect_port3306delay_before_retry3}

}

}

数据库配置脚本

master1和master2都操作

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

#!/bin/bash

#description: Config realserver

VIP=192.168.132.120

/etc/rc.d/init.d/functionscase "$1" instart)/sbin/ifconfig lo:0 $VIP netmask 255.255.255.255broadcast $VIP/sbin/route add -host $VIP dev lo:0

echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce

sysctl-p >/dev/null 2>&1

echo "RealServer Start OK";;

stop)/sbin/ifconfig lo:0down/sbin/route del $VIP >/dev/null 2>&1

echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announceecho "RealServer Stoped";;*)echo "Usage: $0 {start|stop}"exit1

esac

Realserver 配置:

arp_ignore

arp:请求包,响应包

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

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

1f5048355c6d035978ea083c7f5e8fdb.png

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

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

ea84a17fadf46279852c4bedb14f894d.png

当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 地址。

88b3b4b864b7e2fe323306e8aaa9ad80.png

6f44bd3768a60b9eb0fb64ac7b38cf58.png

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

61b92f8ebd8affee240883efbdbd7167.png

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

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

/etc/rc.d/init.d/functions: line 690: 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 Thu2019-07-11 10:05:21 EDT; 12s ago

四 验证

4.1 查看虚拟IP

[root@lvs02 ~]# ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet127.0.0.1/8scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128scope host

valid_lft forever preferred_lft forever2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:f0:04:c9 brd ff:ff:ff:ff:ff:ff

inet192.168.132.123/24 brd 192.168.132.255scope global ens33

valid_lft forever preferred_lft forever

inet6 fe80::a6b5:aa2c:b3c7:3415/64scope link

valid_lft forever preferred_lft forever3: ens34: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:f0:04:d3 brd ff:ff:ff:ff:ff:ff

inet192.168.254.123/24 brd 192.168.254.255scope global ens34

valid_lft forever preferred_lft forever

inet6 fe80::c37e:949c:9d3:d204/64scope link

valid_lft forever preferred_lft forever

[root@lvs01 ~]# ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet127.0.0.1/8scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128scope host

valid_lft forever preferred_lft forever2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:ac:6a:38brd ff:ff:ff:ff:ff:ff

inet192.168.132.124/24 brd 192.168.132.255scope global ens33

valid_lft forever preferred_lft forever

inet192.168.132.120/32scope global ens33 #虚拟IP

valid_lft forever preferred_lft forever

inet6 fe80::2333:c431:914d:1a31/64scope link

valid_lft forever preferred_lft forever3: ens34: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:ac:6a:42brd ff:ff:ff:ff:ff:ff

inet192.168.254.124/24 brd 192.168.254.255scope global ens34

valid_lft forever preferred_lft forever

inet6 fe80::d4b5:199b:3d5a:ff0f/64scope 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.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags->RemoteAddress:Port Forward Weight ActiveConn InActConn

TCP192.168.132.120:3306rr-> 192.168.132.121:3306 Route 1 0 1

-> 192.168.132.122:3306 Route 1 1 0

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

4.4 负载均衡验证

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

[root@master1 ~]# systemctl stop mysqld

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

Jul 11 10:25:46 lvs02 Keepalived_healthcheckers[1386]: Removing service [192.168.132.121]:tcp:3306 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 11 10:27:52 lvs02 Keepalived_healthcheckers[1386]: TCP connection to [192.168.132.121]:tcp:3306success.

Jul11 10:27:52 lvs02 Keepalived_healthcheckers[1386]: Adding service [192.168.132.121]:tcp:3306 to VS [192.168.132.120]:tcp:3306

4.5 高可用验证

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

[root@lvs02 ~]# systemctl stop keepalived

[root@lvs02 ~]# ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet127.0.0.1/8scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128scope host

valid_lft forever preferred_lft forever2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:ac:6a:38brd ff:ff:ff:ff:ff:ff

inet192.168.132.124/24 brd 192.168.132.255scope global ens33

valid_lft forever preferred_lft forever

inet6 fe80::2333:c431:914d:1a31/64scope link

valid_lft forever preferred_lft forever3: ens34: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:ac:6a:42brd ff:ff:ff:ff:ff:ff

inet192.168.254.124/24 brd 192.168.254.255scope global ens34

valid_lft forever preferred_lft forever

inet6 fe80::d4b5:199b:3d5a:ff0f/64scope link

valid_lft forever preferred_lft forever

[root@lvs01 ~]# ip addr

1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet127.0.0.1/8scope host lo

valid_lft forever preferred_lft forever

inet6 ::1/128scope host

valid_lft forever preferred_lft forever2: ens33: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:f0:04:c9 brd ff:ff:ff:ff:ff:ff

inet192.168.132.123/24 brd 192.168.132.255scope global ens33

valid_lft forever preferred_lft forever

inet192.168.132.120/32scope global ens33

valid_lft forever preferred_lft forever

inet6 fe80::a6b5:aa2c:b3c7:3415/64scope link

valid_lft forever preferred_lft forever3: ens34: mtu 1500 qdisc pfifo_fast state UP qlen 1000link/ether 00:0c:29:f0:04:d3 brd ff:ff:ff:ff:ff:ff

inet192.168.254.123/24 brd 192.168.254.255scope global ens34

valid_lft forever preferred_lft forever

inet6 fe80::c37e:949c:9d3:d204/64scope 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 |

+--------------------+



推荐阅读
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 本文详细介绍了在 Ubuntu 系统上搭建 Hadoop 集群时遇到的 SSH 密钥认证问题及其解决方案。通过本文,读者可以了解如何在多台虚拟机之间实现无密码 SSH 登录,从而顺利启动 Hadoop 集群。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • Nacos 0.3 数据持久化详解与实践
    本文详细介绍了如何将 Nacos 0.3 的数据持久化到 MySQL 数据库,并提供了具体的步骤和注意事项。 ... [详细]
  • Docker 环境下 MySQL 双主同步配置指南
    本文介绍了如何在 Docker 环境中配置 MySQL 的双主同步,包括目录结构的创建、配置文件的编写、容器的创建与设置以及最终的验证步骤。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送www方式的数据。HTTP协议采用了请求响应模型。客服端向服务器发送一 ... [详细]
  • 本文介绍了如何使用Flume从Linux文件系统收集日志并存储到HDFS,然后通过MapReduce清洗数据,使用Hive进行数据分析,并最终通过Sqoop将结果导出到MySQL数据库。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
author-avatar
lovejiao2012
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有