mysql双主互备

一、安装mysql 

    各种方式太多了

二、摘录自:https://linux.cn/thread-14135-1-1.html

1)首先在DB1上my.cnf 中[mysqld] 字段中添加如下内容:
server-id = 1 //数据库ID号, 为1时表示为Master,其中master_id必须为1到232–1之间的一个正整数值;
log-bin=mysql-bin //启用二进制日志; 
relay-log=mysql-relay-bin  //用来定义relay-log日志文件命名格式
replicate-wild-ignore-table=mysql.%                           //replicate-wild-ignore-table是个过滤复制选项,可以过滤不需要复制的数据库
replicate-wild-ignore-table=test.%                             //mysql.%表示不复制mysql库下的所有对象
replicate-wild-ignore-table=infomation_schema.%    //与此对应的是/replicate-wild-do-table,用来指定需要复制的数据库或表

//这里需要注意的是,不要在主库上使用binlog-do-db或binlog-ignore-db选项,也不要在从库上使用replicate-do-db或replicate-ignore-db选项;因为这样可能产生跨库更新失败的问题。
//推荐从库上使用replicate-wild-ignore-table和replicate-wild-do-table两个选项来解决复制过滤问题。

2)然后修改DB2上mysql配置文件my.cnf 
server-id = 2 
log-bin=mysql-bin 
relay-log=mysql-relay-bin  
replicate-wild-ignore-table=mysql.%                       
replicate-wild-ignore-table=test.%                          
replicate-wild-ignore-table=infomation_schema.%   

3)手动同步数据库
//如果DB1上已有数据,那么在执行主主互备之前,需要将DB1和DB2上的两个mysql的数据保持同步,首先在DB1上备份mysql数据,执行如下sql语句:
mysql>FLUSH TABLES WITH READ LOCK;   //注意,执行完这个命令后,不要退出这个终端,否则这个锁就失效了。
#cd /var/lib
#tar zcvf mysql_bak.tar.gz mysql
#scp mysql_bak.tar.gz DB2:/var/lib   //将数据传到DB2后,依次重启DB1和DB2上的MySQL

4)创建复制用户,并授权
mysql>grant replication slave on *.* to repl_user@192.168.1.22 identified by 'repl_user' ;
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |   106   |       |         |
+------------------+----------+--------------+------------------+ 

a)然后在DB2上将DB1设为自己的主服务器,操作如下:
mysql>CHANGE MASTER TO MASTER_HOST='192.168.1.11',MASTER_USER='repl_user', MASTER_PASSWORD='repl_user',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=106; 
//注意,MASTER_LOG_FILE和MASTER_LOG_POS两个选项,这两个选项的值刚好是在DB1上通过show master status查询到的结果;

b)接着就可以在DB2上启动slave服务了,sql命令如下:
mysql>start slave;
//可通过sql语句 show slave statusG; 查询DB2上slave的运行状态详细信息;

到这里,从DB1到DB2的MySQL主从复制就已经完成。接下来开始配置从DB2到DB1的MySQL主从。

5)首先在DB2上创建复制用户;
mysql>grant replication slave on *.* to repl_user@192.168.1.11 identified by 'repl_user' ;
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |   106   |       |         |
+------------------+----------+--------------+------------------+ 

a)然后在DB1上将DB2设为自己的主服务器,操作如下:
mysql>CHANGE MASTER TO MASTER_HOST='192.168.1.22',MASTER_USER='repl_user', MASTER_PASSWORD='repl_user',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=106; 
//注意,MASTER_LOG_FILE和MASTER_LOG_POS两个选项,这两个选项的值刚好是在DB1上通过show master status查询到的结果;

b)接着就可以在DB1上启动slave服务了,sql命令如下:
mysql>start slave;
//可通过sql语句 show slave statusG; 查询DB1上slave的运行状态详细信息;

至此,MySQL双主互备模式的主从复制就已配置完毕。

6)配置keepalived实现MySQL双主高可用
在进行高可用配置之前,首先需要在DB1和DB2上安装keepalived软件。关于keepalived安装,这里就不在详细说明,直接进入keepalived配置过程。
a)下面是DB1服务器上/etc/keepalived/keepalived.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 MySQLHA_DEVEL
}

vrrp_script check_mysqld {
    script "/etc/keepalived/mysqlcheck/check_slave.pl 127.0.0.1"  #检测MySQL复制状态的脚本
    interval 2
    weight  21
    }

    vrrp_instance HA_1 {
    state BACKUP        #在DB1上和DB2上都设置为BACKUP
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 2
    nopreempt        #不抢占模式,只在优先级高的机器上设置即可;优先级低的可不用设置。

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
    check_mysqld
    }

    virtual_ipaddress {
        192.168.1.33/24 dev eth0        #MySQL的对外服务IP,即VIP。
    }
}

其中,/etc/keepalived/mysqlcheck/check_slave.pl文件的内容如下:
#!/usr/bin/perl -w
use DBI;
use DBD::mysql;

#config variables
$SBM = 120;
$db = "hamysql"
$host = $ARGV[0];
$port = 3306;
$user = "root";
$pw = "root"

#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;
    }
}

//这是用Perl写的检测mysqlMySQL复制状态脚本,只需修改文件中的MySQL数据库、数据的端口号、用户名和密码可直接使用;并且要保证此文件有可执行权限。

b)接着将DB1上的keepalived.conf文件和check_slave.pl文件拷贝到DB2上对应的位置。
并修改DB2上的keepalived.conf文件中的priority值为80,由于配置的是不抢占模式,因此,还需去掉nopreempt选项。
在完成配置后,分别在DB1上和DB2上启动keepalived服务,在正常情况下VIP地址应该运行在DB1上。

三、注意点

   如果mysql是拷贝的  那么uuid会有问题 需要修改,找到my.cnf中datadir所指目录,修改auto.cnf中service-uuid的值。

原文地址:https://www.cnblogs.com/orangeNo5/p/5038448.html