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 )
无损半同步复制—抢占模式过程
配置过程
- 配置之前关闭防火墙和selinux。也可放行
- 在进行互相备份的时候,需要将数据库保持一致
如果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不能相同。
- 修改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 slave, 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 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的方式安装keepalived
yum install keepalived
进入配置文件目录下
cd /etc/keepalived/
- 需要检测mysql的状态所以需要先导入脚本check_slave.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 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查看)
- 从节点的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查看
}
}验证数据备份
- 在从库创建数据库

- 主库查看是否存在

ok了,完美实现主从同步
- 验证数据库的备份转移
主库执行代码systemctl stop mysqld.service ,停止数据库的服务

从库查看日志信息

- 远程登录mysql,验证故障切换
如果你要创建用户,记得关闭/etc/my.cnf中的下图所示,备份创建用户:


当吧db1断开后:
[root@localhost keepalived]# systemctl stop mysqld.service
远端查询数据库显示:

自动切换完毕
无损半同步复制—不抢占模式过程
和上述抢占模式配置相同,只是根据优先级进行选举主库从库,只需要改两个地方如下所示:
- keepalive.conf配置文件都改为backup,然后加上nopreempt

- 重启keepalived服务
systemctl restart keepalived
总结
到此这篇关于通过keepalived搭建mysql双主模式的mysql集群的文章就介绍到这了,更多相关keepalived搭建mysql集群内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论