Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > KeepAlived搭建Mysql集群

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

作者:maomao大哥闯天下

在构建高可用的MySQL集群时,Keepalived是一个常用的工具,它可以实现双主模式,确保在主节点发生故障时,备节点可以接替其功能,保证系统的连续性和可用性,这篇文章主要介绍了通过KeepAlived搭建MySQL双主模式的Mysql集群的相关资料,需要的朋友可以参考下

MySQL主主互备模式架构图

主要设计思路是通过MySQL Replication技术将两台MySQL Server互相将对方作为自己的Master,自己又同时作为对方的Slave来进行复制。这样就实现了高可用构架中的数据同步功能,同时,将采用KeepAlived来实现Mysql的自动failovero在这个构架中,虽然两台MySQL Server互为主从,但同一时刻只有一个MySQL Server可读写,另一个MysQL Server只能进行读操作,这样可保证数据的一致性。

MySQL主主互备环境说明

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

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

配置过程

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

        如果DB1上已经有mysql数据,那么在执行主主互备之前,需要将DB1和DB2上两个mysql的数据保持同步。首先在DB1上备份mysql数据,执行如下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的data目录下对应的auto.cnf文件中。两个库的UUID不能相同。

[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
[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 SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.123.%';
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.123.129',  #主节点配置ip
SOURCE_USER = 'repl_user',        #主节点创建的用户
SOURCE_PASSWORD = 'Fe216474@',    #主节点创建的密码
SOURCE_AUTO_POSITION = 1;
START SLAVE;
mysql> SHOW SLAVE STATUS\G;

当如下显示则表示开启从主复制了。现在是DB2->DB1的复制

CREATE USER 'repl_user'@'192.168.123.%' IDENTIFIED WITH mysql_native_password BY 'Fe216474@';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'repl_user'@'192.168.123.%';
CHANGE REPLICATION SOURCE TO
SOURCE_HOST = '192.168.123.100',#从节点的ip
SOURCE_USER = 'repl_user',    #从节点创建的用户
SOURCE_PASSWORD = 'Fe216474@',
SOURCE_AUTO_POSITION = 1;

yum install keepalived

进入配置文件目录下

cd /etc/keepalived/
#!/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 slave 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;
$Slave_IO_Running =  "";
$Slave_SQL_Running = "";
$Seconds_Behind_Master = "";
while (my $ref = $sqlQuery->fetchrow_hashref()) {
    $Slave_IO_Running = $ref->{'Slave_IO_Running'};
    $Slave_SQL_Running = $ref->{'Slave_SQL_Running'};
    $Seconds_Behind_Master = $ref->{'Seconds_Behind_Master'};
}
$sqlQuery->finish;
$dbh->disconnect();
if ( $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) {
    exit 1;
} else {
    if ( $Seconds_Behind_Master > $SBM ) {
        exit 1;
    } else {
        exit 0;
    }
}

紧接着修改keepalived.conf配置文件,记得更换为自己的网卡(通过ifconfig查看)

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查看
    }
}
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查看
    }
}

验证数据备份

ok了,完美实现主从同步

主库执行代码systemctl stop mysqld.service ,停止数据库的服务

从库查看日志信息

如果你要创建用户,记得关闭/etc/my.cnf中的下图所示,备份创建用户:

当吧DB1断开后:

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

远端查询数据库显示:

自动切换完毕

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

和上述抢占模式配置相同,只是根据优先级进行选举主库从库,只需要改两个地方如下所示:

systemctl restart keepalived

总结

到此这篇关于通过KeepAlived搭建MySQL双主模式的Mysql集群的文章就介绍到这了,更多相关KeepAlived搭建Mysql集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文