首页 游戏 软件 资讯 排行榜 专题
首页
数据库
通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

热心网友
45
转载
2026-04-23

MySQL主主互备模式架构图

这个架构的核心思路,是利用MySQL的复制技术,让两台服务器互为“主”和“从”。简单来说,就是DB1把DB2当作自己的主库来同步数据,同时DB2也把DB1当作自己的主库。这样一来,数据就在两台机器间实现了双向同步,为高可用打下了基础。不过,这里有个关键点:虽然两台服务器互为主从,但为了保证数据绝对一致,同一时刻只能有一台服务器接受写入操作,另一台则处于只读状态。自动故障切换的任务,我们交给KeepAlived来完成。

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

MySQL主主互备环境说明

操作系统:redhat
MySQL : mysql8.0.42
Keepalived : Keepalived2.2.8
两台主机:172.16.213.181(DB1)、172.16.213.189 ( DB2 )

无损半同步复制—抢占模式过程

配置过程

  1. 配置之前关闭防火墙和selinux。也可放行
  2. 在进行互相备份的时候,需要将数据库保持一致

如果DB1上已经存在数据,那么在搭建主主互备之前,必须确保DB2的数据与DB1完全一致。操作的第一步,是在DB1上锁定数据库并备份数据。执行下面这条SQL语句:

mysql>FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)

注意,执行这个命令的终端不能关闭,否则锁会立即释放。我们需要在这个终端保持连接的状态下,另开一个终端,直接打包MySQL的数据目录。具体操作如下:

[root@DB1 ~]# cd /usr/local/mysql
[root@DB1 mysql]# tar zcvf data.tar.gz data
[root@DB1 mysql]# scp data.tar.gz DB2:/usr/local/mysql

将数据包传输到DB2并解压后,分别重启DB1和DB2上的MySQL服务。

这里有个细节需要特别注意:如果两个数据库是通过直接拷贝数据文件得来的,那么必须修改其中一台服务器的UUID。UUID文件位于MySQL数据目录下的auto.cnf中,务必确保两个库的UUID不同,否则复制会出问题。

  • 修改mysql的配置文件为无损半同步复制(yum安装的方式,配置文件在/etc/my.cnf)
  • 主节点服务器DB1配置如下:
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
gtid_mode=ON  #方便维护
enforce_gtid_consistency=ON  #确保复制正确性
server-id = 1   #节点的标识
log-bin=mysql-bin   #启用mysql-bin日志文件
relay-log = mysql-relay-bin    #启用中继日志文件
replicate-wild-ignore-table=mysql.%  #忽略备份系统库
replicate-wild-ignore-table=test.%#忽略备份表
replicate-wild-ignore-table=information_schema.%  #忽略备份表
plugin_load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so"  #加载指定的插件
rpl_semi_sync_source_enabled=1  #开启插件
rpl_semi_sync_replica_enabled=1  #开启插件
log_replica_updates=ON
  • 备节点服务器DB2配置如下:
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/logs/mysqld.log
pid-file=/usr/local/mysql/logs/mysqld.pid
gtid_mode=ON  #方便维护
enforce_gtid_consistency=ON  #确保复制正确性
server-id = 2   #节点的标识
log-bin=mysql-bin   #启用mysql-bin日志文件
relay-log = mysql-relay-bin    #启用中继日志文件
replicate-wild-ignore-table=mysql.%  #忽略备份系统库
replicate-wild-ignore-table=test.%#忽略备份表
replicate-wild-ignore-table=information_schema.%  #忽略备份表
plugin_load = "rpl_semi_sync_source=semisync_source.so;rpl_semi_sync_replica=semisync_replica.so"  #加载指定的插件
rpl_semi_sync_source_enabled=1  #开启插件
rpl_semi_sync_replica_enabled=1  #开启插件
log_replica_updates=ON
  • 主节点创建数据库备份用户(修改为自己的网段)
CREATE USER 'repl_user'@'192.168.123.%' IDENTIFIED WITH mysql_native_password BY 'Fe216474@';
  • 主节点执行授权(修改为自己的网段)
GRANT REPLICATION SLA VE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.123.%';
  • 备用服务器运行实现主从复制的脚本(在备用节点的mysql中执行,记得修改为自己配置的信息)
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.123.129',  #主节点配置ip
SOURCE_USER = 'repl_user',        #主节点创建的用户
SOURCE_PASSWORD = 'Fe216474@',    #主节点创建的密码
SOURCE_AUTO_POSITION = 1;
  • 启动备用服务器DB2从库并查看是否启动成功
START SLA VE;
mysql> SHOW SLA VE STATUS\G;

当看到如下输出时,就说明DB2到DB1的复制链路已经成功建立了。

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

  • 接下来配置反向复制,即从DB1复制到DB2。在DB1上执行下面命令,创建复制用户并授权(请修改为自己的信息)
CREATE USER 'repl_user'@'192.168.123.%' IDENTIFIED WITH mysql_native_password BY 'Fe216474@';
GRANT REPLICATION SLA VE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.123.%';
  • 在DB1上执行脚本,指向DB2作为其主库
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.123.100',#从节点的ip
SOURCE_USER = 'repl_user',    #从节点创建的用户
SOURCE_PASSWORD = 'Fe216474@',
SOURCE_AUTO_POSITION = 1;

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

  • 通过yum的方式安装keepalived
yum install keepalived

安装完成后,进入其配置文件目录:

cd /etc/keepalived/
  • 为了让Keepalived能感知MySQL状态,需要先准备一个检测脚本check_sla ve.pl(记得修改其中的密码和连接信息)
#!/usr/bin/perl -w
use DBI;
use DBD::mysql;
# CONFIG VARIABLES
$SBM = 120;
$db = "mysql";
$host = $ARGV[0];
$port = 3306;
$user = "root";
$pw = "123456";
# SQL query
$query = "show sla ve status";
$dbh = DBI->connect("DBI:mysql:$db:$host:$port", $user, $pw, { RaiseError => 0,PrintError => 0 });
if (!defined($dbh)) {
    exit 1;
}
$sqlQuery = $dbh->prepare($query);
$sqlQuery->execute;
$Sla ve_IO_Running =  "";
$Sla ve_SQL_Running = "";
$Seconds_Behind_Master = "";
while (my $ref = $sqlQuery->fetchrow_hashref()) {
    $Sla ve_IO_Running = $ref->{'Sla ve_IO_Running'};
    $Sla ve_SQL_Running = $ref->{'Sla ve_SQL_Running'};
    $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'};
}
$sqlQuery->finish;
$dbh->disconnect();
if ( $Sla ve_IO_Running eq "No" || $Sla ve_SQL_Running eq "No" ) {
    exit 1;
} else {
    if ( $Seconds_Behind_Master > $SBM ) {
        exit 1;
    } else {
        exit 0;
    }
}

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

脚本准备好之后,接下来修改Keepalived的主配置文件keepalived.conf,别忘了将配置中的网卡名称换成你自己服务器的(可以通过ifconfig命令查看)。

  • 从节点的keepalive.conf配置:
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_httpd {
    script "killall -0 httpd"
    interval 2
    }
vrrp_instance HA_1 {
    state BACKUP  #主节点是MASTER
    interface ens33  #记得更换为自己的网卡ifconfig查看
    virtual_router_id 80
    priority 80#主节点的权重需要设置高一些
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass qwaszx
    }
    notify_master "/etc/keepalived/master.sh "
    notify_backup "/etc/keepalived/backup.sh"
    notify_fault "/etc/keepalived/fault.sh"
    track_script {
    check_httpd
    }
    virtual_ipaddress {
        192.168.123.80/24 dev ens33 #记得更换为自己的网卡ifconfig查看
    }
}
  • 主节点的keepalive.conf配置:
global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
vrrp_script check_httpd {
    script "killall -0 httpd"
    interval 2
    }
vrrp_instance HA_1 {
    state MASTER  #
    interface ens33 #记得更换为自己的网卡ifconfig查看
    virtual_router_id 80
    priority 100#主节点的权重需要设置高一些
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass qwaszx
    }
    notify_master "/etc/keepalived/master.sh "
    notify_backup "/etc/keepalived/backup.sh"
    notify_fault "/etc/keepalived/fault.sh"
    track_script {
    check_httpd
    }
    virtual_ipaddress {
        192.168.123.80/24 dev ens33 #记得更换为自己的网卡ifconfig查看
    }
}

验证数据备份

  • 在从库创建数据库

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

  • 主库查看是否存在

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

可以看到,数据已经成功同步,主从复制配置生效。

  • 验证数据库的故障转移

现在,我们来模拟主库故障。在主库DB1上执行systemctl stop mysqld.service,停止MySQL服务。

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

此时观察从库DB2的日志信息。

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

  • 远程登录mysql,验证故障切换

这里有个前提:如果你需要远程创建用户,记得先临时关闭配置文件/etc/my.cnf中关于忽略系统库复制的设置,否则复制账户无法创建。如下图所示:

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

当DB1故障后:

[root@localhost keepalived]# systemctl stop mysqld.service 

从远端查询数据库,显示连接正常:

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

至此,故障自动切换验证完成,VIP已成功漂移到健康的DB2节点。

无损半同步复制—不抢占模式过程

不抢占模式的配置与上述抢占模式大体相同,区别在于主库选举策略。它不依赖初始优先级强行抢占,而是根据状态进行选举。只需要修改两个地方:

  • 将两台服务器的keepalive.conf配置文件中的state都改为BACKUP,并添加nopreempt参数。

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

  • 修改完成后,重启keepalived服务使其生效。
systemctl restart keepalived

总结

通过以上步骤,我们完成了一个基于MySQL双主复制与Keepalived的高可用集群搭建。这种架构不仅实现了数据的双向同步,还通过虚拟IP(VIP)和自动故障检测机制,保证了数据库服务在单点故障时的业务连续性。无论是选择抢占模式还是不抢占模式,核心都在于根据实际业务场景,权衡故障恢复的速度与服务的稳定性。

来源:https://www.jb51.net/database/362665c6u.htm
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程
数据库
通过KeepAlived搭建MySQL双主模式的Mysql集群图文教程

MySQL主主互备模式架构图 这个架构的核心思路,是利用MySQL的复制技术,让两台服务器互为“主”和“从”。简单来说,就是DB1把DB2当作自己的主库来同步数据,同时DB2也把DB1当作自己的主库。这样一来,数据就在两台机器间实现了双向同步,为高可用打下了基础。不过,这里有个关键点:虽然两台服务器

热心网友
04.23
《Cat‘s Meow》9月15日发布:互动桌面养猫,支持简中壁纸
手机教程
《Cat‘s Meow》9月15日发布:互动桌面养猫,支持简中壁纸

8 月 28 日消息,开发商 DevRegu 今日宣布,在电脑桌面壁纸上养猫的软件《Cat s Meow Live Wallpaper》将于 9 月 15 日登陆 Steam 平台,游戏支持简体中

热心网友
03.26
欢聚集团2025年Q4及全年财报:营收重回增长轨道
科技数码
欢聚集团2025年Q4及全年财报:营收重回增长轨道

3月11日消息,北京时间2026年3月11日,欢聚集团(NASDAQ:JOYY,简称“欢聚”或“集团”)发布2025年第四季度及全年财报。2025年第四季度,集团营收5 819亿美元,环比增长7 7

热心网友
03.11
任天堂树屋直播2月25日举行 Switch2新作实机抢先看
游戏攻略
任天堂树屋直播2月25日举行 Switch2新作实机抢先看

任天堂宣布,将于北京时间为2月25日早6点举办“Nintendo Treehouse: Live”直播活动,届时将带来《超级马里奥兄弟:奇迹 - Nintendo Switch 2版》的试玩演示,以

热心网友
02.26
歌之王子殿下Switch版2026年日服发售,闪耀现场即将登场
游戏攻略
歌之王子殿下Switch版2026年日服发售,闪耀现场即将登场

Broccoli宣布,原定于2024年10月发售的NintendoSwitch游戏《歌之王子殿下:闪耀现场》(Uta no Prince-sama: Shining Live​​​​​​​)将于20

热心网友
01.13

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

2026年腊八节祝福语大全
礼仪与书信
2026年腊八节祝福语大全

时光流转,节气更迭。转眼间,腊八的脚步声就近了。在这个温暖的传统节日里,为亲朋好友送上一份祝福,是再应景不过的事了。我们精心整理了一份2026年腊八节祝福语合集,希望能为你传递心意提供一些灵感。 2026年腊八节祝福语大全 1 腊八节到了,送你八碗“宝粥”:一碗快乐粥,烦恼见了绕道走;一碗好运粥,

热心网友
04.23
2026腊八节祝福语
礼仪与书信
2026腊八节祝福语

【2026腊八节祝福语】 1 腊八一到,祝福就跟着来报到了。一碗腊八饭下肚,新年的脚步可就真的近了——算算日子,离春节不过二十二天半。在此,先祝你腊八节快乐,顺便也把新年的祝福提前送上,愿幸福绵延不绝! 2 腊八节到了,送你一份“八财八气”大礼包:所谓“八财”,指的是大财小财、正财偏财、金财银财

热心网友
04.23
腊八节祝福
礼仪与书信
腊八节祝福

腊八节祝福语 老话说得好:过了腊八就是年。眼瞅着年关将近,为了你能顺顺利利、准点回家团圆,有件事儿得提醒你——车票该提前张罗起来了。别光顾着盯着手机傻乐了,赶紧行动起来才是正事。万一回不去,我可真要“画个圈圈”念叨你了。 腊八节到了,特意为你定制了一份“八宝饭”,配方很特别:主料是真心、思念和快乐,

热心网友
04.23
给情人腊八节祝福语
礼仪与书信
给情人腊八节祝福语

【给情人腊八节祝福语】 腊八节到了,想好怎么向你的TA表达心意了吗?一碗热腾腾的腊八粥,配上几句暖心的祝福,就是最应景的甜蜜。下面这些精心准备的祝福语,或许能给你带来灵感。 1 腊八节,送你一碗“八宝粥”,再附赠一份“八保粥”:保平安、保健康、保快乐、保幸福、保好运、保吉祥、保发财、保富贵。愿你腊

热心网友
04.23
2026腊八节祝福语精选
礼仪与书信
2026腊八节祝福语精选

【2026腊八节祝福语精选】 腊八到,祝福到。一碗热粥,几句暖言,是寒冬里最熨帖的问候。下面这份精选的祝福语合集,希望能帮你把最美好的祈愿,传递给心里惦记的那个人。 1 添一瓢好运,舀一勺快乐,用健康搅拌,以成功调味,为你熬一碗甜蜜如意腊八粥。在腊八节时送给你,愿你畅饮幸福,品尝吉祥,温暖心房,一

热心网友
04.23