mysql主主互备工作原理_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 status\G; 查询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 status\G; 查询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的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值