一、原理
Mysql集群具有高可用、可扩展、易管理、低成本的特点。这里简单介绍mysql双主互备的架构,主要设计思路是通过mysql replication技术将两台mysql server互相将对方作为自己的master,自己同时做为对方的slave来进行复制。同时将采用keepalived来实现mysql的自动failover。这个架构中,虽然两台mysql server互为主从,但同一时刻,只有一个mysql server可读写,另一个mysql server只具有读的操作,这样可保持数据的一直性!!
二、MySQL主主互备模式的配置
Mysql主从复制的配置还是比较简单,只需要修改mysql的配置文件就行。
主机名 操作系统 Mysql版本 主机IP Mysql VIP
DB1 Centos 7 Mysql5.6.17 192.168.0.119 192.168.0.120
DB2 Centos7 Mysql5.6.17 192.168.0.105
修改mysql配置文件
在主机DB1上,编辑/etc/my.cnf在“[mysqld]”下添加以下内容
server-id=1
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
replicate-wild-ignore-table=performance_schema.%
然后在主机DB2上,做同样的修改
server-id=2
log-bin=mysql-bin
relay-log=mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
replicate-wild-ignore-table=performance_schema.%
三、创建复制用户并授权
首先在DB1的mysql库中创建复制用户,
grant replication slave on . to ‘wpd’@’192.168.0.105’ identified by ‘’;
查看节点的状态
show master status;
在DB2上将DB1设为自己的主服务器
change master to
master_host=’192.168.0.119’,
master_user=’wpd’,
master_password=’’,
master_log_file=’mysql-bin.000001’,
master_log_pos=329;
这里需要注意的是master_log_file和master_log_pos这两个选项是DB1上 show master status 查询到的结果。
接着就可以在DB2上启动slave服务了,start slave,查看slave的运行状态 show slave status \G;如果一切运行正常,到这样DB1到DB2的mysql主从复制已经完成。接下来就是DB2到DB1的主从复制,配置和上面的过程完全相同!这样,DB1和DB2的双主模式已经配置完成!
四、配置keepalived实现mysql双主高可用
首先在DB1和DB2上安装keepalived,安装完成后进行keepalived的配置!
在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
}
vrrp_instance HA_1{
state BACKUP #在DB1和DB2上均配置为BACKUP
interface eth0
virtual_router_id 80
priority 100
advent_int 2
nopreempt #不抢占模式,只在优先级高的机器上设置即可
authentication{
auth_type PASS
auth_pass qweasdzxc
}
track_script{
check_mysqld
}
virtual_ipaddress{
192.168.0.120/24 dev eth0 #mysql的对外服务IP
}
}
紧接着将配置好的文件,复制到DB2主机上,然后在DB2上把keepalived.conf中priority的值改为90,同时去掉nopreempt选项!
在完成所有配置后,分别在DB1和DB2上启动keepalived服务。
五、测试mysql主从同步功能
在远程客户端登录VIP测试
数据复制功能测试
测试keepalived实现mysql故障转移
PS:check_slave.pl的内容为:
#!/usr/bin/perl -w
Use DBI;
Use DBD::mysql;
#CONFIGVARIABLES
$SBM = 120;
$db = “ixdba”;
$host = $ARGV[0];
$port = 3306;
$user = “root”;
$pw = “xxxxxx”;
#SQLquery
$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= “NO” || $Slave_SQL_Running= “NO”){
exit 1;
}else{
if($Seconds_Behind_Master>$SBM){
exit 1;
}else{
exit 0;
}
}
这个是用perl写的检测mysql复制状态的脚本,ixdba是本例中的一个数据库名,只需要修改文件中的数据库名,数据库端口,用户名和密码即可直接使用,但是要保证脚本具有执行权限!