mysql主主复制+keepalived部署

警告
本文最后更新于 2020-05-30 17:09,文中内容可能已过时。

环境:

mysql-master-01:10.0.0.30

mysql-master-02:10.0.0.35

vip:10.0.0.39

 

安装mysql5.7.20

可参考:https://soulchild.cn/266.html

 

开始配置主主环境

一、修改mysql配置

master-01:

[mysqld]
basedir=/application/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
server_id=1
port=3306
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%

[mysql]
socket=/tmp/mysql.sock
prompt=master-01[\\d]>

[mysqld_safe]
log-error=/var/log/mysql.log

 

master-02:

[mysqld]
basedir=/application/mysql
datadir=/data/mysql
socket=/tmp/mysql.sock
server_id=11
port=3306
log-bin=mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%

[mysql]
socket=/tmp/mysql.sock
prompt=master-02[\\d]>

[mysqld_safe]
log-error=/var/log/mysql.log

 

二、配置msater-01主,master-02从

1.添加主从复制用户,master-01执行

grant replication slave on *.* to 'repl'@'10.0.0.%' identified by 'replpass';
grant all on blog.* to 'blog'@'10.0.0.%' identified by 'blog123';
#记录两个值File和Position
show master status;

 

2.master-02中执行,指定master-01服务器作为主服务器

#mysql-bin.000001和704为上面获取的值
change master to master_host='10.0.0.30',master_user='repl',master_password='replpass',master_log_file='mysql-bin.000001',master_log_pos=704;
strart slave;
show slave status\G

 

三、配置msater-02主,master-01从

1.添加主从复制用户,master-02执行

grant replication slave on *.* to 'repl'@'10.0.0.%' identified by 'replpass';
grant all on blog.* to 'blog'@'10.0.0.%' identified by 'blog123';
#记录两个值File和Position
show master status;

2.master-01中执行,指定master-02服务器作为主服务器

#mysql-bin.000003和704为上面获取的值
change master to master_host='10.0.0.35',master_user='repl',master_password='replpass',master_log_file='mysql-bin.000003',master_log_pos=704;
strart slave;
show slave status\G

 

测试数据同步:

master-01[blog]>create database blog;

master-01[blog]>use blog;

master-01[blog]>create table user(

`username` char(10),

`password` char(10)

);

master-02[blog]>show databases;

master-02[blog]>use blog;

master-02[blog]>show tables;

master-02[blog]>insert into `user` (username,password) values('li','123');

master-01[blog]>select * from user;

 

四、安装配置keepalived

1.两个节点安装

yum install -y keepalived

master-01的keepalived配置文件(此配置未考虑脑裂问题):

global_defs {
   notification_email {
     742899387@qq.com
   }
   notification_email_from keepalived@local.com
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql-master-01
}

vrrp_script check_mysql {
    script "/server/scripts/keepalived/check_mysql.pl"
    interval 2
}

vrrp_instance mysql {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        10.0.0.39
    }
    track_script {
        check_mysql
    }
}

master-02的keepalived配置文件

global_defs {
   notification_email {
     742899387@qq.com
   }
   notification_email_from keepalived@local.com
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id mysql-master-02
}

vrrp_script check_mysql {
    script "/server/scripts/keepalived/check_mysql.pl"
    interval 2
}

vrrp_instance mysql {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        10.0.0.39
    }
    track_script {
        check_mysql
    }
}

2.编写状态检测脚本

mkdir /server/scripts/keepalived/ -p
cd /server/scripts/keepalived/
vim check_mysql.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;
    }
}
chmod +x check_mysql.pl

 

  1. 开启keepalived
systemctl start keepalived
systemctl enable keepalived

 

4.连接测试

mysql -ublog -p -h 10.0.0.39

show variables like ‘%hostname%’;

关闭master-01

mysql -ublog -p -h 10.0.0.39

 

 

请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%