MySQL集群搭建(4)-MMM+LVS+Keepalived

上篇文章 MySQL集群搭建(3)-MMM高可用架构 介绍了 MMM 高可用集群的搭建方法, 里面有提到 MMM 可以配置多个读 VIP, 今天这篇文章教大家怎么用 LVS 对这些读 VIP 做一个负载均衡。

1 LVS 介绍

1.1 简介

LVS 是 Linux Virtual Server 的简写,意即 Linux 虚拟服务器,是一个虚拟的服务器集群系统。本项目在 1998 年 5 月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。

LVS 集群采用 IP 负载均衡技术和基于内容请求分发技术。调度器具有很好的吞吐率,将请求均衡地转移到不同的服务器上执行,且调度器自动屏蔽掉服务器的故障,从而将一组服务器构成一个高性能的、高可用的虚拟服务器。

比如说,用 LVS 做 Web 负载均衡,那么请求 LVS 调度器的时候,请求会根据配置的算法分发给后端某台 Web 服务器,后端 Web 服务器机器对于请求者来说是透明的。

1.1 LVS 工作模式

LVS 包含以下三种常用工作模式

1). NAT 模式

NAT (Network Address Translation) 即网路地址装换,NAT 的工作原理是更改报文头(目标地址、源地址和端口等)后,转发请求都后端地址。流程如下

  1. 客户端请求 LVS 的 IP
  2. LVS 更改请求的目的 IP,改为后端服务器其中一个 IP,然后转发请求
  3. 后端服务器处理完,返回数据给 LVS,LVS 更改源 IP 为 LVS 机器的 IP 然后返回给请求端

NAT 模式的所有数据都会经过 LVS 服务器,简单来说就是从 LVS 进,从 LVS 出,如图

2). TUN 模式

在 NAT 的集群系统中,请求和响应的数据报文都需要通过 LVS 服务器,当真实服务器的数目在10台和20台之间时,负载调度器将成为整个集群系统的新瓶颈。大多数 Internet服务都有这样的特点:请求报文较短而响应报文往往包含大量的数据。如果能将请求和响应分开处理,即在负载调度器中只负责调度请求而响应直接返回给客户,将极大地提高整个集群系统的吞吐量。

IP 隧道(IP tunneling)是将一个IP报文封装在另一个IP报文的技术,这可以使得目标为一个IP地址的数据报文能被封装和转发到另一个IP地址。IP隧道技 术亦称为IP封装技术(IP encapsulation)。IP隧道主要用于移动主机和虚拟私有网络(Virtual Private Network),在其中隧道都是静态建立的,隧道一端有一个IP地址,另一端也有唯一的IP地址。

我们利用IP隧道技术将请求报文封装转发给后端服务器,响应报文能从后端服务器直接返回给客户(要求后端真实服务器与外部网络连接)。

TUN 模式工作流程如下:

  1. 客户端请求数据,调度器根据各个服务器的负载情况,动态地选择一台服务器, 将请求报文封装在另一个IP报文中,再将封装后的IP报文转发给选出的服务器
  2. 服务器收到报文后,先将报文解封获得原来目标地址为VIP的报文,服务器发 现VIP地址被配置在本地的IP隧道设备上,所以就处理这个请求,然后根据路由表将响应报文直接返回给客户。

3). DR 模式

DR 模式中,负载调度器中只负责调度请求,而服务器直接将响应返回给客户, DR 模式架构图

DR 模式的执行流程如下

  1. 客户端请求数据,调度器根据各个服务器的负载情况,动态地选择一台服务器,不修改也不封装IP报文,而是将数据帧的MAC 地址改为选出服务器的 MAC 地址,再将修改后 的数据帧在与服务器组的局域网上发送。
  2. 因为数据帧的 MAC 地址是选出的服务器,所以服务器肯定可以收到这个数据帧,从中可以获得该 IP 报文。当服务器发现 报文的目标地址VIP是在本地的网络设备上,服务器处理这个报文,然后根据路由表将响应报文直接返回给客户。

关于三种模式选择

NAT模式下,所有流量会经过 LVS 服务器, 很容易有瓶颈;TUN 模式需要内核支持,部署成本比较高;DR模式性能高、容易部署,一般使用这种模式。

本小节内容参考: LVS集群中的IP负载均衡技术

1.2 LVS 调度算法

这里简单介绍 LVS 的 8 种调度算法

静态调度

  1. 轮询调度(rr): 轮询调就是依次将请求调度不同的服务器,即每次调度执行i = (i + 1) mod n,并选出第i台服务器。算法的优点是其简洁性,它无需记录当前所有连接的状态,所以它是一种无状态调度。
  2. 加权轮询(wrr): 加权轮询算法可以解决服务器间性能不一的情况,它用相应的权值表示服务器的处理性能,服务器的缺省权值为1。假设服务器A的权值为1,B的 权值为2,则表示服务器B的处理性能是A的两倍。加权轮询调度算法是按权值的高低和轮叫方式分配请求到各服务器。
  3. 源地址散列(sh): 该算法正好与目标地址散列调度算法相反,它根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。
  4. 目标地址散列(dh): 该算法也是针对目标IP地址的负载均衡,但它是一种静态映射算法,通过一个散列(Hash)函数将一个目标IP地址映射到一台服务器。

动态调度

  1. 最少连接(lc): 最少连接是把新的连接请求分配到当前连接数最小的服务器。
  2. 加权最少连接(wlc): 加权最少连接算法是最小连接调度的超集,各个服务器用相应的权值表示其处理性能。
  3. 基于局部性的最少连接(lblc): 该算法是针对请求报文的目标IP地址的负载均衡调度,目前主要用于Cache集群系统,因为在Cache集群中 客户请求报文的目标IP地址是变化的。
  4. 带复制的基于局部性最少连接(lblcr): 该算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要 维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。

本小节内容参考: LVS集群的负载调度

2 Keepalived 简介

Keepalived 起初是为 LVS 件设计, 用来管理和监控 LVS 各个服务器节点状态的工具

Keepalived 采用 Master/Slave 模式, 在 Master 上设置配置文件的 VIP,当 Master 宕机后,VIP 自动漂移到另一台 Keepalived 服务器上

Keepalived 可以用来做各种软件的高可用集群,它会一直检测服务器的状态,如果有一台服务器宕机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后 Keepalived 自动将服务器加入到服务器群中。

简单来说,Keepalived 就是用来实现机器的高可用的,在使用 Keepalived 的情况下,只有一台服务器能够提供服务(通过 VIP 来实现),当 Master 主机宕机后,VIP 会自动飘移到另一台服务器

3 环境准备

3.1 服务器与 MySQL 环境

MySQL 环境采用上篇文章部署的那一套,然后新增一台服务器作为 LVS 的备用节点

节点信息

IP系统端口MySQL版本节点读写说明
10.0.0.247Centos6.533065.7.9Master读写主节点
10.0.0.248Centos6.533065.7.9Standby只读,可切换为读写备主节点
10.0.0.249Centos6.533065.7.9Slave只读从节点
10.0.1.24Centos6.5--MMM Monitor/LVS-MMM Monitor/LVS Keepalive Master
10.0.1.85Centos6.5--LVS-LVS Keepalive Slave

VIP 信息

简称VIP类型
RW-VIP10.0.0.237读写VIP
RO-VIP110.0.0.238读VIP
RO-VIP210.0.0.239读VIP
LVS-RO10.0.0.236LVS Keepalived VIP

3.2 Keepalved 安装配置

我们在10.0.1.2410.0.1.85上部署 Keepalived

1). yum 安装

如果有对应的 yum 源,直接安装就可以了

yum install -y keepalived

2). 源码安装

下载安装包, 下载地址 keepalived, 使用 1.2.24 版本举例

# 安装依赖
yum install -y gcc popt-devel openssl openssl-devel libssl-dev libnl-devel popt-devel libnfnetlink-devel

# 下载包
wget http://www.keepalived.org/software/keepalived-1.2.24.tar.gz

# 解压安装
tar -xvz -f  keepalived-1.2.24.tar.gz
cd keepalived-1.2.24
./configure --prefix=/usr/local/keepalived
make && make install

cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
mkdir /etc/keepalived/
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/

3). 配置 Keepalived

打开 /etc/keepalived/keepalived.conf 文件, 加上上面的配置

global_defs {
   notification_email {
   }
   router_id MYSQL_MMM
}

vrrp_instance MMM_TEST {
    state BACKUP
    interface eth0
    virtual_router_id 24
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.236
    }
}
  • router_id: 标识用的
  • state: MASTERBACKUP, 当其他节点起来的时候会重新选举,所以这里设为 BACKUP 就可以了
  • virtual_router_id: 用来区分 VRRP 组播的标记,取值 0-255
  • priority: 优先级
  • advert_int: 监控检测间隔
  • authentication: 认证相关
  • virtual_ipaddress: 要设置的 VIP

注意: 在同一个广播域内 virtual_router_id 不能重复

4). 启动

由于在priority都相同,所以先启动为 Master, 我们在10.0.1.2410.0.1.85上轮流启动Keepalived

/etc/init.d/keepalived start

启动后观察10.0.1.24 IP 状态

[root@chengqm ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:ee:ae:a1 brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.24/16 brd 10.0.255.255 scope global eth0
    inet 10.0.0.236/32 scope global eth0
    inet6 fe80::f816:3eff:feee:aea1/64 scope link 
       valid_lft forever preferred_lft forever

3.3 LVS 安装配置

本次测试,负载调度的算法采用 加权最少连接(wlc),工作模式采用 DR 模式

1). 安装

LVS 采用 yum 安装就可以了

yum install -y ipvsadm

2). 增加配置文件

继续打开 /etc/keepalived/keepalived.conf 文件, 在后面加上 LVS 配置, 转发VIP10.0.0.2363306端口到MMM的虚IP

virtual_server 10.0.0.236 3306 {  
    delay_loop 6    # 健康检查时间,单位是秒                    
    lb_algo wlc     # 负载调度的算法                 
    lb_kind DR      # LVS 工作模式
    nat_mask 255.255.255.255     # 掩码            
    persistence_timeout 0  
    protocol TCP                  
    real_server 10.0.0.237 3306 {     # 指定后端真实服务器的IP地址, 这里直接指到 MMM 虚 IP 上
        weight 1                      # 节点权重, 数字越大, 权重越大
        TCP_CHECK {                   # 检测参数
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }  
    }
    real_server 10.0.0.238 3306 {
        weight 3
        TCP_CHECK {  
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }  
    }
    real_server 10.0.0.239 3306 {
        weight 3
        TCP_CHECK {  
            connect_timeout 10
            nb_get_retry 3
            delay_before_retry 3
            connect_port 3306
        }  
    }
} 

更改完毕重启 keepalived

3). 后端真实服务器抑制 ARP 广播

由于 DR 模式的原理是 LVS 与后端真实服务器配置同一个 VIP,后端服务器 不允许arp广播,这样路由器接收到请求就会发给 LVSLVS 修改请求的 MAC 地址。这样路由器和后端服务器通过 MAC 地址进行通信,达到负载均衡的目的。

10.0.0.247, 10.0.0.248, 10.0.0.249 服务器上执行以下命令

VIP=10.0.0.236
ifconfig lo:0 $VIP netmask 255.255.255.255 broadcast $VIP
/sbin/route add -host $VIP dev lo:0
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

注意: 后端真实服务器的 VIP 绑在 lo 上

如果想取消,可以反着操作

ifconfig lo:0 down
route del VIP >/dev/null 2>&1
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

4). 检查 LVS 状态

[root@chengqm ~]# ipvsadm -l
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  10.0.0.236:mysql wlc
  -> 10.0.0.237:mysql             Route   1      0          0         
  -> 10.0.0.238:mysql             Route   3      0          0         
  -> 10.0.0.239:mysql             Route   3      0          0 

LVS 负载均衡已经生效

4 测试

4.1 负载均衡测试

LVS 配置好了,让我们测试一下效果, 目前 Keepalived Master10.0.1.24, 并且已经预先创建了一个测试账号,那么我们在其他机器发起请求看看

[root@mysql-test-83 ~]# mysql -umytest -p -h10.0.0.236 -P3306 -e "show variables like 'hostname'"
Enter password: 
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| hostname      | cluster01 |
+---------------+-----------+
[root@mysql-test-83 ~]# mysql -umytest -p -h10.0.0.236 -P3306 -e "show variables like 'hostname'"
Enter password: 
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| hostname      | cluster02 |
+---------------+-----------+

可以看到,LVS 负载均衡已经生效

4.2 高可用测试

10.0.1.2410.0.1.85部署了 Keepalived服务,我们停掉MasterKeepalived, VIP 会自动飘移到另一台机器

现在停掉10.0.1.24Keepalived

[root@chengqm ~]# /etc/init.d/keepalived stop
Stopping keepalived:                                       [  OK  ]

查看10.0.1.85的IP

[root@yexm ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:3c:81:1b brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.85/16 brd 10.0.255.255 scope global eth0
    inet6 fe80::f816:3eff:fe3c:811b/64 scope link 
       valid_lft forever preferred_lft forever
[root@yexm ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether fa:16:3e:3c:81:1b brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.85/16 brd 10.0.255.255 scope global eth0
    inet 10.0.0.236/32 scope global eth0
    inet6 fe80::f816:3eff:fe3c:811b/64 scope link 
       valid_lft forever preferred_lft forever

可以看到 VIP 已经飘移到另一台 LVS 服务器

5 结语

LVS + MMM下既可以实现多台 MySQL 节点的负载均衡,也避免了因为同步延迟、同步失败等问题造成的数据不一致问题,是一个非常不错的架构方式。

参考: http://www.linuxvirtualserver.org/zh/lvs1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值