暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

keepalived+双主

原创 Lucky 2024-05-07
1242

一、Keepalived+双主架构

双master配合Keepalived这种MySQL高可用架构设计也是基于主从复制的原理而搭建的。使用MySQL双主复制技术+Keepalived是一种简单、便捷的解决方案,在高可用集群环境中,Keepalived使用vip,利用Keepalived自带的服务监控功能和自定义脚本实现MySQL故障时的自动切换。

1.1 Keepalived介绍

  Keepalived是基于VRRP协议(Virtual Redundent Routing Protocol 虚拟冗余路由协议)的,是为了解决静态路由器单点故障引起的网络失效问题而设计的一套主备协议。两台互为主备的MySQL服务器运行Keepalived,master会向backup节点发送广播信号,当backup节点接收不到master节点发送的VRRP包时,会认为master宕机,这时就会根据VRRP的优先级来选举出一个backup来充当master,则这个master就会持有vip,从而保证了线上现有业务的正常运行。
  所谓VRRP的优先级就是它会根据优先级来确定其在集群中的地位,用0--255来表示,数字越小表示优先级越低,数字越大表示优先级越高。其取值范围为1--254,因为当值为0时,代表master放弃持有vip,当值为255时,表示当前master的优先级最高并持有vip。

1.2 什么是虚拟冗余路由协议

虚拟路由器冗余协议(VRRP)是一种选择协议,它可以把一个虚拟路由器的责任动态分配到局域网上的 VRRP 路由器中的一台。控制虚拟路由器 IP 地址的 VRRP 路由器称为主路由器,它负责转发数据包到这些虚拟 IP 地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,这就允许虚拟路由器的 IP 地址可以作为终端主机的默认第一跳路由器。使用 VRRP 的好处是有更高的默认路径的可用性而无需在每个终端主机上配置动态路由或路由发现协议。 VRRP 包封装在 IP 包中发送。

使用 VRRP ,可以通过手动或 DHCP 设定一个虚拟 IP 地址作为默认路由器。虚拟 IP 地址在路由器间共享,其中一个指定为主路由器而其它的则为备份路由器。如果主路由器不可用,这个虚拟 IP 地址就会映射到一个备份路由器的 IP 地址(这个备份路由器就成为了主路由器)。 VRRP 也可用于负载均衡。 VRRP 是 IPv4 和 IPv6 的一部分。

1.3依赖包安装过程

①安装需要的依赖包

yum -y install openssl-devel popt-devel libnfnetlink = 1.0.0-1.el6 libnl* popt*

gcc* kernel-devel make libnl* 

②安装必须的rpm包

rpm -ivh popt-static-1.13-7.el6.x86_64.rpm

rpm -ivh libnfnetlink-devel-1.0.0-1.el6.x86_64.rpm

1.3.1什么是LVS

LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org。

  现在LVS已经是Linux标准内核的一部分,在Linux2.4内核以前,使用LVS时必须要重新编译内核以支持LVS功能模块,但是从Linux2.4内核以后,已经完全内置了LVS的各个功能模块,无需给内核打任何补丁,可以直接使用LVS提供的各种功能。

  LVS主要用于服务器集群的负载均衡。其优点有:

  • 工作在网络层,可以实现高性能,高可用的服务器集群技术;
  • 廉价,可把许多低性能的服务器组合在一起形成一个超级服务器;
  • 易用,配置非常简单,且有多种负载均衡的方法;
  • 稳定可靠,即使在集群的服务器中某台服务器无法正常工作,也不影响整体效果;
  • 可扩展性也非常好。

1.3.2安装ipvsadm

linux内核2.4版本以上的基本都支持LVS,要使用LVS,只需要再安装一个LVS的管理工具:ipvsadm。

安装方式:

①yum install ipvsadm

②安装ipvsadm包

# ln -s /usr/src/kernels/2.6.32-642.el6.x86_64 /usr/src/linux

# tar zxvf ipvsadm-1.29.tar.gz

# cd ipvsadm-1.29

# make && make install

1.3.3 ipvsadm用法

其实LVS的本身跟iptables很相似,而且连命令的使用格式都很相似,其实LVS是根据iptables的框架开发的,那么LVS的本身分成了两个部分:

  • 第一部分是工作在内核空间的一个IPVS的模块,其实LVS的功能都是IPVS模块实现的;
  • 第二部分是工作在用户空间的一个用来定义集群服务的一个工具ipvsadm,这个工具的主要作用是将管理员定义的集群服务列表传送给工作在内核空间中的IPVS模块。

①LVS的三种包转发方式

LVS提供了三种包转发方式:NAT(网络地址映射)、IP Tunneling(IP隧道)、Direct Routing(直接路由)。不同的转发模式决定了不同的cluster的网络结构,

下面对三种转发方式分别介始:

  • NAT(网络地址映射)

 NAT方式可支持任何的操作系统,以及私有网络,并且只需一个Internet IP地址,但是整个系统的性能受到限制。因为执行NAT每次需要重写包,有一定的延迟;另外,大部分应用有80%的数据是从服务器流向客户机,也就是用户的请求非常短,而服务器的回应非常大,对负载均衡器形成很大压力,成为了新的瓶颈。

  • IP Tunneling(IP隧道)

  director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。

  • Direct Routing(直接路由)

  与IP Tunneling类似,负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用物理层(修改MAC地址)技术,所有服务器都必须在一个物理网段。

②LVS的八种调度算法

  • rr 轮叫(Round Robin)

调度器通过"轮叫"调度算法将外部请求按顺序轮流分配到集群中的真实服务器上,它均等地对待每一台服务器,而不管服务器上实际的连接数和系统负载。

  • wrr 加权轮叫(Weighted Round Robin)

调度器通过"加权轮叫"调度算法根据真实服务器的不同处理能力来调度访问请求。这样可以保证处理能力强的服务器处理更多的访问流量。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  • lc 最少链接(Least Connections)

调度器通过"最少连接"调度算法动态地将网络请求调度到已建立的链接数最少的服务器上。如果集群系统的真实服务器具有相近的系统性能,采用"最小连接"调度算法可以较好地均衡负载。

  • wlc 加权最少链接(Weighted Least Connections)

在集群系统中的服务器性能差异较大的情况下,调度器采用"加权最少链接"调度算法优化负载均衡性能,具有较高权值的服务器将承受较大比例的活动连接负载。调度器可以自动问询真实服务器的负载情况,并动态地调整其权值。

  • lblc 基于局部性的最少链接(Locality-Based Least Connections)

"基于局部性的最少链接" 调度算法是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。该算法根据请求的目标IP地址找出该目标IP地址最近使用的服务器,若该服务器是可用的且没有超载,将请求发送到该服务器;若服务器不存在,或者该服务器超载且有服务器处于一半的工作负载,则用"最少链接"的原则选出一个可用的服务器,将请求发送到该服务器。

  • lblcr带复制的基于局部性最少链接(Locality-Based Least Connections with Replication)

"带复制的基于局部性最少链接"调度算法也是针对目标IP地址的负载均衡,目前主要用于Cache集群系统。它与LBLC算法的不同之处是它要维护从一个目标IP地址到一组服务器的映射,而LBLC算法维护从一个目标IP地址到一台服务器的映射。该算法根据请求的目标IP地址找出该目标IP地址对应的服务器组,按"最小连接"原则从服务器组中选出一台服务器,若服务器没有超载,将请求发送到该服务器,若服务器超载;则按"最小连接"原则从这个集群中选出一台服务器,将该服务器加入到服务器组中,将请求发送到该服务器。同时,当该服务器组有一段时间没有被修改,将最忙的服务器从服务器组中删除,以降低复制的程度。

  • dh 目标地址散列(Destination Hashing)

"目标地址散列"调度算法根据请求的目标IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

  • sh 源地址散列(Source Hashing)

"源地址散列"调度算法根据请求的源IP地址,作为散列键(Hash Key)从静态分配的散列表找出对应的服务器,若该服务器是可用的且未超载,将请求发送到该服务器,否则返回空。

1.3.4 ipvsadm参数

-A --add-service #在内核的虚拟服务器表中添加一条新的虚拟服务器记录。也就是增加一台新的虚拟服务器。

-E --edit-service #编辑内核虚拟服务器表中的一条虚拟服务器记录。

-D --delete-service #删除内核虚拟服务器表中的一条虚拟服务器记录。

-C --clear #清除内核虚拟服务器表中的所有记录。

-R --restore #恢复虚拟服务器规则

-S --save #保存虚拟服务器规则,输出为-R 选项可读的格式

-a --add-server #在内核虚拟服务器表的一条记录里添加一条新的真实服务器记录。也就是在一个虚拟服务器中增加一台新的真实服务器

-e --edit-server #编辑一条虚拟服务器记录中的某条真实服务器记录

-d --delete-server #删除一条虚拟服务器记录中的某条真实服务器记录

-L|-l --list #显示内核虚拟服务器表

-Z --zero #虚拟服务表计数器清零(清空当前的连接数量等)

--set tcp tcpfin udp #设置连接超时值

--start-daemon #启动同步守护进程。他后面可以是master 或backup,用来说明LVS Router 是master 或是backup。在这个功能上也可以采用keepalived 的VRRP 功能。

--stop-daemon #停止同步守护进程

-h --help #显示帮助信息

-t --tcp-service service-address #说明虚拟服务器提供的是tcp 的服务[vip:port] or [real-server-ip:port]

-u --udp-service service-address #说明虚拟服务器提供的是udp 的服务[vip:port] or [real-server-ip:port]

-f --fwmark-service fwmark #说明是经过iptables 标记过的服务类型。

-s --scheduler scheduler #使用的调度算法,有这样几个选项rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq,默认的调度算法是: wlc.

-p --persistent [timeout] #持久稳固的服务。这个选项的意思是来自同一个客户的多次请求,将被同一台真实的服务器处理。timeout 的默认值为300 秒。

-M --netmask #子网掩码

-r --real-server server-address #真实的服务器[Real-Server:port]

-g --gatewaying #指定LVS 的工作模式为直接路由模式(也是LVS 默认的模式)

-i --ipip #指定LVS 的工作模式为隧道模式

-m --masquerading #指定LVS 的工作模式为NAT 模式

-w --weight weight #真实服务器的权值

--mcast-interface interface #指定组播的同步接口

-c --connection #显示LVS 目前的连接 如:ipvsadm -L -c

--timeout #显示tcp tcpfin udp 的timeout 值 如:ipvsadm -L --timeout

--daemon #显示同步守护进程状态

--stats #显示统计信息

--rate #显示速率信息

--sort #对虚拟服务器和真实服务器排序输出

--numeric -n #输出IP 地址和端口的数字形式

1.4安装keepalived

cd /u01/keepalived-2.0.6

./configure --prefix=/usr/local/keepalived

make && make install

cp /u01/keepalived-2.0.6/keepalived/etc/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/
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/

1.5配置keepalived.conf文件

[root@bogon keepalived-1.2.24]# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs { #global_defs全局配置标识,表面这个区域{}是全局配置

notification_email { #表示发送通知邮件时邮件源地址是谁

acassen@firewall.loc

failover@firewall.loc

sysadmin@firewall.loc

}

notification_email_from Alexandre.Cassen@firewall.loc #指定发件人

smtp_server 192.0.2.128 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现

smtp_connect_timeout 30 #指定smtp连接超时时间

router_id LVS_DEVEL #运行keepalived机器的一个标识

vrrp_skip_check_adv_addr #默认是不跳过检查。检查收到的VRRP通告中的所有地址可能会比较耗时,设置此命令的意思是,如果通告与接收的上一个通告来自相同的master路由器,则不执行检查(跳过检查)。

#vrrp_strict #严格遵守VRRP协议。下列情况将会阻止启动Keepalived:1. 没有VIP地址。2. 单播邻居。3. 在VRRP版本2中有IPv6地址。

vrrp_garp_interval 0 #在一个接口发送的两个免费ARP之间的延迟。可以精确到毫秒级。默认是0

vrrp_gna_interval 0

}

vrrp_instance HA_1 {

state BACKUP   #指定该keepalived节点的初始状态,在DB1和DB2上均配置为BACKUP

interface eth1 #设置实例绑定的网卡

virtual_router_id 90 #VPID标记

priority 100 #优先级,高优先级竞选为master

advert_int 1 #检查间隔,默认1秒

nopreempt   #不抢占模式,只有优先级高的机器上设置即可,优先级低的机器可不设置

authentication { #设置认证

auth_type PASS #认证方式, PASS简单密码认证(推荐),AH:IPSEC认证(不推荐)。

auth_pass 1111 #认证密码,最多8位

}

virtual_ipaddress { #设置vip

192.0.2.130

}

}

virtual_server 192.0.2.130 3306 {

delay_loop 2 #健康检查的时间间隔

lb_algo wrr # rr|wrr|lc|wlc|lblc|sh|dh:LVS调度算法

lb_kind DR # NAT|DR|TUN:LVS模式。

persistence_timeout 60  #会话保持时间

protocol TCP #TCP|UDP|SCTP:4层协议

real_server 192.0.2.128 3306 {

weight 3 #给服务器指定权重。默认是1.

notify_down /root/shutdown.sh  #检测到服务down后执行的脚本

TCP_CHECK {

connect_timeout 10  #连接超时时间

nb_get_retry 3  #重连次数

delay_before_retry 3   #重连间隔时间

connect_port 3306   #健康检查端口

}

}

}

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

[root@bogon ~]# cat /root/shtdown.sh

#!/bin/bash

killall keepalived

注:此脚本是上面配置文件notify_down选项所用到的,keepalived使用notify_down选项来检查real_server的服务状态,当发现real_server服务故障时,便触发此脚本;我们可以看到,脚本就一个命令,通过killall keepalived强制杀死keepalived进程,从而实现了MySQL故障自动转移。另外,我们不用担心两个MySQL会同时提供数据更新操作,因为每台MySQL上的keepalived的配置里面只有本机MySQL的IP+VIP,而不是两台MySQL的IP+VIP

启动keepalived并查看日志

1.6测试vip切换

①初始化状态

一节点

二节点

②在远程客户端通过vip登陆测试

③停止mysql1主机上的mysql,查看故障是否自动转移

  • 初始状态

一节点

二节点

  • 一节点关闭数据库后日志变化情况:

Service mysqld stop

一节点日志

二节点

  • Vip飘动情况:

一节点:

二节点

  • 数据库状态变化情况如下:

一节点

二节点

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论