keepalived mysql集群_Mysql进阶之keepalived搭建mysql高可用集群(理论)

本文继上一节Mysql进阶之使用haproxy搭建负载均衡集群

这里贴出上一节使用haproxy搭建负载均衡集群的拓扑图:

87fe25588a3ac300ae81e2f9aa9dc891.png

负载均衡集群拓扑图

之前我们搭建负载均衡的好处:

一个是提高读取性能

一个是当一台从节点挂掉,负载均衡节点会将请求平均的导到其他从节点,提高可用性。

但是之前的例子只有一台写服务器(主节点),一台负载均衡节点,如果主节点挂掉,那么web应用就不能进行写操作,如果负载均衡节点挂掉就无法读取数据。

为了避免这个问题,就要做一些冗余性操作:

多设置一台主节点的备份节点,当我们写入的时候只往主节点写入,不往这个备份节点写入,也就是说正常情况下,备份节点什么都不用干。只有当主机点挂掉了之后,web应用才往这个备份节点写入。而备份节点当然也和所有从节点是主从复制的关系。

备份节点和主节点是主主复制的关系,这样一方面平时备份节点会和主节点的新增数据同步;另一方面在主节点挂掉的期间,备份节点新增的数据也会写入到主节点里面(在主节点恢复正常后写入主节点)。

然后负载均衡节点也同样是这样操作,多架设一台负载均衡节点,平时也是不起作用,当原负载均衡节点挂掉的时候,另一台负载均衡节点就会起作用。

使用keepalived实现高可用

原理和过程:

cbd4b730319899438f6feff26a01b5c3.png节点正常时的虚拟IP指向

bc198d73d68548c40dff407b89fa3b38.png

节点宕机时的虚拟IP指向

在主节点和主节点的备份节点(叫做主节点2)都安装keepalived。并通过keepalived的配置文件指定同一个虚拟IP,该虚拟IP和两台主节点的IP段要一致才行。

当两台主节点都启动keepalived服务的时候,keepalived会在其中一台权重高的节点,即主节点1(权重可以在keepalived配置中指定)生成这个虚拟IP,另一个节点不会生成这个虚拟IP。

我们连接mysql服务的时候,在业务层指定连接的host是这个虚拟IP的IP,而不是两台主节点的ip。

此时虚拟IP是在主节点1中生成的,所以web应用其实连接的是主节点1。

此时,主节点1和主节点2是有互相通信的。当主节点1因为故障(如断电,死机等原因)导致主节点1的keepalived服务断开,主节点2的keepalived接收不到主节点1的keepalived的响应,那么主节点2的keepalived就会在主节点2上生成这个虚拟ip。此时web应用连接的就是主节点2。

当主节点1恢复过来,并且重启keepalived服务时,两个节点的通信恢复,而且主节点1权重比主节点2高,此时主节点1会重新生成该虚拟IP,柱节点2的虚拟IP就消失。那么相当于Web节点又连回主节点1。

两个主节点最好设置开机自启动keepalived,不然主节点所在主机挂掉之后再恢复,但是忘记重启keepalived,那么虚拟ip就一直都在备份节点那。

keepalived不仅仅只局限在mysql的高可用,其层面更高。

keepalived的安装和使

# 下载,解压,安装keepalived

tar -xzf keepalived-2.0.19.tar.gz

cd keepalived-2.0.19

./configure # 如果报错,请安装gcc-c++/openssl/openssl-devel这几个依赖

make && make install

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

此时 keepalive 的

配置文件在 /usr/local/etc/keepalived/keepalived.conf

命令文件在 /usr/local/sbin/keeplive

配置参数:

下面是最简单的配置,也是作者的配置:

global_defs {

router_id LVS_MASTER # 在每一个keepalived都有一个router_id,可以随便起,但相连通的keepalived的router_id不能一样。

}

vrrp_instance VI_1 {        # 配置实例

state MASTER    # 表示该keepalived的状态,有两种,MASTER和BACKUP。表示是主节点还是备份节点,但是并非在这里配置了MASTER就是主节点。而是要通过priority配置,优先级高的就是主节点。而且主节点的priority要比备份节点的起码高50才行

interface eth0      #表示虚拟ip所绑定的网卡

virtual_router_id 51    # 虚拟路由节点的id号,主节点和备份节点的虚拟路由id必须相同

priority 150    # 优先级,优先级高的是主节点,主节点平时处于工作状态,而备份节点平时不干事情,只有当主节点挂了才顶替主机点工作

advert_int 1    # 我们知道 主节点和备份节点的keepalived是互相通信的。这里是通信的时间间隔,单位秒。该值越小,越消耗性能。

authentication {    # 授权,有两种方式,默认使用PASS的方式

auth_type PASS  # 授权方式

auth_pass 1111  # 密码,连通的多台keepalived间的密码要相同

}

virtual_ipaddress {     # 要生成的虚拟IP地址,可以生成多个,可以随意指定,但是必须是和主节点以及备份节点相同的网段的ip才行

192.168.200.100/24   # 后面的/24表示子网掩码是255.255.255.0

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

接下来就可以启动了

keepalived -D -f /usr/local/etc/keepalived/keepalived.conf          # -D后台运行

然后执行

ip add

可以看到eth0网卡下有本机ip信息,还有虚拟ip的信息,就表示成功了:

inet 154.202.57.21/29 brd 154.202.57.225 scope global eth0

valid_lft forever preferred_lft forever

inet 154.202.57.100/24 scope global eth0

valid_lft forever preferred_lft forever

备份节点也安装keepalived,配置内容如下(和主节点的基本一样):

global_defs {

router_id LVS_BACKUP

}

vrrp_instance VI_1 {

state BACKUP

interface eth0

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

192.168.200.16/24

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

发现这里并没有虚拟ip的信息。这是对的,因为虚拟ip只会在一台节点上出现,如果主节点挂掉了,那么虚拟ip才会出现在备份节点上。

这里我设置了主节点的priority比备份节点的priority高50,所以当主节点重启keepalived服务的时候,虚拟ip会重新绑回到主节点上。

在业务层,我们就直接连接这个虚拟ip,而我们实际连的是这个虚拟ip所在的节点上,当主节点正常工作时,虚拟ip在主节点上,那么我们实际连的就是主节点;当主节点挂掉,虚拟ip就会出现备份节点上,我们此时实际连接的就是这个备份节点。

此时我们在本地连接一下这个虚拟IP的mysql(主节点和备份节点要关闭防火墙,而且要授权mysql用户给本地ip才行)

连成功就说明可以了。

PS:如果连不上,可能是防火墙没关;

还有可能是你指定的虚拟IP是一个真实IP,该真实IP已存在,是别人的服务器。

所以你必须绑定一个没有人用的ip作为虚拟ip才行。

keepalived的邮件参数

现在,假如主机点挂掉了,只剩下一台备份节点了,那么如果这个备份节点也挂掉了,那么就读取不了数据了。此时我们就要设置邮件报警,提示开发者只剩下一台节点了。

邮件报警写在global_defs这个全局配置中,如下:

global_defs{

noticatition_email{

wenzhangxiang@yeah.net # 收件者

}

notification_email from 1640632344@qq.com # 发件者

smtp_server localhost # 本地安装smtp服务

smtp_connect_timeout 30 # 超时时间

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

但是本地还没有安装smtp服务,还要自己安装smtp服务。

keepalived的负载均衡参数

keepalived不仅可以配置高可用集群,还可以配置负载均衡集群

其实就是在keepalived中指定服务,这里以指定mysql服务为例。

如果只是搭建高可用,不使用keepalived负载均衡的配置也行,只需要上面的最基本的配置即可。但是最基本的配置会有一个问题:

我们知道如果主节点的keepalived服务挂掉,那么虚拟IP就所代表的的真实IP就会转到备份节点。但是如果是mysql服务挂掉但是keepalived服务没有挂掉,那么keepalived就不会将虚拟IP转到备份节点,而我们的目的就是要对mysql服务进行高可用,这种情况下就没有达到我们的目的,所以还是要对keepalived的配置指定要绑定的服务的。

virtual_server 虚拟IP 3306 { # “虚拟IP 端口号” 虚拟IP是上面的virtual_ipaddress指定的IP,不含/24;端口号是你想指定的服务的端口号,如果想对网站进行负载均衡,就是80或443端口

delay_loop 6 #每隔6s检查一次联通性

lb_algo wrr # 负载均衡的算法,wrr/rr/wlc,rr是轮询

lb_kind DR # 负载均衡转发规则:DR/NAT/TUN,如果主节点和备份节点在同一网段下,用DR即可

persistence_timeout 60 #会话保持时间

protocol TCP # 协议

real_server 节点的真实IP 3306 { # 本机真实IP

weight 100 # 权重

notify_down /data/sh/mysql.sh

TCP_CHECK {

connect_timeout 10

nb_get_retry 3

delay_before_retry 3

connect_port 3306

}

}

}

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

这里提一下notify_down /data/sh/mysql.sh 这个配置。

表示当该节点的mysql服务挂掉是,要执行/data/sh/mysql.sh这个shell脚本。而这个脚本要做的事情就是将keepalived停止。原因很简单,mysql挂掉但是keepalived不挂掉,那么主节点会一直抢占着虚拟IP,为了将虚拟IP转移到备份节点,我们就要将主节点的keepalived杀死,这是/data/sh/mysql.sh这个脚本要做的事情,该脚本内容如下:

#!/bin/bash

pkill keepalive

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

当然我们还可以写一个用于发送邮件的Python脚本或者PHP脚本,并在mysql.sh这个bash脚本中执行发邮件的脚本。这样就可以在节点挂掉时通知管理员及时处理。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值