首页 > 数据库技术 > 详细

mysql 主主互备实现

时间:2016-03-27 15:55:57      阅读:392      评论:0      收藏:0      [点我收藏+]

     今天星期天,么事就写个MYSQL的主主架构的博客,原理如下图,不是我画的网上找的。

技术分享


主机作用操作系统mysql版本对应IPvip数据库
mysqlA(主)centos6.4
mysql 5.5.48192.168.48.129192.168.48.126
mysqlB(备)centos6.4mysql 5.5.48192.168.48.132


  一: 在每个节点安装mysql数据库:

       《1》到官网去下载最新的yum仓库,并安装

        http://dev.mysql.com/downloads/repo/yum/  

        yum install mysql-community-server

       《2》用第三方yum

            1、导入第三方源webtatic

                rpm -Uvh http://repo.webtatic.com/yum/el6/latest.rpm
            2、如果已安装低版本的mysql就删除

                yum remove mysql mysql-*
            3、安装libmysqlclient15

                yum install libmysqlclient15 --enablerepo=webtatic
            4、安装mysql5.5
                yum install mysql55 mysql55-server --enablerepo=webtatic

       《3》安装MariaDB  我这里用的这安装的

            1、vi /etc/yum.repos.d/MariaDB.repo  加个文件在yum仓库中

 [mariabd]

            name=MariaDB

            baseurl=http://yum.mariadb.org/5.5.48/centos6-x86/

            gpgkey=http://yum.mariadb.org/RPM-GPG-KEY-MariaDB

            gpgcheck=1
 yum install -y MariaDB-server MariaDB-client  ##安装数据库
 service mysql start  ##启动服务
 GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "123456";##设置ROOT密码;
 update mysql.user set authentication_string=password(‘123456‘) where user=‘root‘ ;##mysql5.7这样更新密码。

 flush privileges;##刷新

      《4》下面是我安装的数据库的一些信息

      技术分享

     技术分享

二、 在Mysql上配置my.cnf

    《1》配置MysqlA

    innodb_file_per_table = on

    skip_name_resolve = on

    server-id = 1

    log-bin = mysql-bin

    relay-log = mysql-relay-bin   #单个主从这个可以不写

    replicate-wild-ignore-table=mysql.%

    replicate-wild-ignore-table=test.%

    replicate-wild-ignore-table=information_schema.%

    《2》配置MysqlB

     

    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=information_schema.%

   注释:

   server-id 是节点的标识,主从节点不能相同,必须唯一。

   log-bin 表示开启mysql的binlog日志功能。

  ‘mysql-bin’表示日志文件的名称,也可以叫aa.log 看你自己了,mysql会在名称后面加上数字,mysql-bin.000001、mysql-bin.000002等日志文件

   relay-log 用来定义relay-log日志文件

   replicate-wild-ignore-table是复制过程过滤选项,可以过滤不需要的数据库和表,例如 ‘mysql.%‘ 表示不复制mysql库

   replicate-wild-do_table  明确指定复制那个数据库和表

   注意:不要在主库上使用binlog-do-db 或者 binlog-ignore-db 选项,也不要在从库上使用replicate-do-db或者replicate-ignore-db选项,因为这样可能产生跨库更新失败的问题,建    议在从库使用replicate-wild-do-table和replicate-wild-ignore-table连个选项解决复制过滤的问题。

三、 手动同步一次数据,新数据库不用这部分

  可以直接锁定  flush tables with read lock; 或者直接关闭数据库打包目录/var/lib/mysql  到从服务器恢复。

  tar zcvf /var/lib/mysql.tar.gz  /var/lib/mysql  到备的上面解压。

  技术分享

  技术分享

  在my.cnf  添加read-only=1开启只读  目的都是保证复制前数据都是一样的。

四、配置MysqlA---MysqlB的主从配置

《1》在MysqlA创建复制用户并且授权。

     grant replication slave on *.* to ‘tao‘@‘192.168.48.%‘ identified by ‘www.daxia.help‘;

《2》在B服务器上设置主服务器信息:

 change master to \

 master_host=‘192.168.48.129‘,

 master_user=‘tao‘,

 master_password=‘www.daxia.help‘,

 master_log_file=‘mysql-bin。000005‘

 master_log_pos=405;

技术分享

五、配置MysqlB---MysqlA的主从配置

《1》在MysqlA创建复制用户并且授权

     grant replication slave on *.* to ‘tao‘@‘192.168.48.%‘ identified by ‘www.daxia.help‘;

《2》在A服务器上设置主服务器信息:

 change master to \

 master_host=‘192.168.48.132‘,

 master_user=‘tao‘,

 master_password=‘www.daxia.help‘,

 master_log_file=‘mysql-bin‘

 master_log_pos=106;

技术分享

技术分享

注意:

 我在主上执行了自己同步自己了 要取消用这个命令 change master to master_host=‘ ‘;

技术分享


六:在MysqlA和MysqlB上测试数据的复制情况


技术分享

技术分享

《2》在MysqlB上建立库,表和插入数据在MysqlA上查看;

技术分享

技术分享


  《3》我在test下面建立了一个表,是不能同步过来的,说明过滤也对的

七:配置keepalived实现mysql双主高可用。

keepalived 配置主和从的配置就是priority 优先级一个100一个90 从的取消nopreempt选项即可。

! Configuration File for keepalived
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_mysqld {
script "/etc/keepalived/check_slave.pl 127.0.0.1"
interval 2
weight 21
}
vrrp_instance HA_1 {
    state BACKUP      ###  在MYSQLA和MysqlB上都配置为BACKUP
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 2
    nopreempt            ## 不抢占模式,只在优先权高的服务器上设置,优先级第的可以不设置
    authentication {
        auth_type PASS
        auth_pass daxia.help
    }
    track_script {
check_mysqld
}
    virtual_ipaddress {
        192.168.48.126
    }
}

 check_slave.pl脚本如下:

#!/usr/bin/perl -w
use DBI;
USE DBD::mysql;
#CONFIG VARIABLES
$SBM = 120;
$db = "IXDBA";
$host = $ARGV[0];
$port = 3306
$user = "root"
$pw = "123456"
#sql query
$squery = "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 = "";
 $senconds_behind_master = "";
 while (my $ ref = $sqlQuery->fetchrow_hashref()) {
 $slave_io_running = $ref->{‘slave_io_running‘};
 $slave_sql_running = $ref->{‘slave_sql_running‘};
 $senconds_behind_master = $ref->{‘senconds_behind_master‘};
 }
 $sqlQuery->finish;
 $dbh->disconnect();
 if ( $slave_io_running eq "NO"|| $slave_sql_running eq "NO" ) {
 exit 1;
 }else {
 if ( $seconds_behind_mater > $SBM){
 exit 1;
 }else {
 exit 0;
 }
 }

八、进行测试:

《1》登录

技术分享

《2》建立库和表看看各个节点的信息是否正确。

在远程上建立信息:

技术分享

在MysqlB和MYSQLA上查看都有信息:

技术分享

《3》把mysqlB弄故障,看切换的正确可行:

技术分享

经过我尝试七中用perl写的脚本不行,后来换成了八中的shell,有10几秒的时间等待。

八、用shell脚本配置Keepalived,连个就是下面检测自己的ip3306端口就行我贴一个主机的

! Configuration File for keepalived
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_instance HA_1 {
    state BACKUP
    interface eth0
    virtual_router_id 80
    priority 100
    advert_int 2
    nopreempt
    authentication {
        auth_type PASS
        auth_pass daxia.help
    }
    virtual_ipaddress {
        192.168.48.126
    }
   
virtual_server 192.168.48.126 3306 {        ///检测自己的3306端口不通就执行下面的Mysql.sh脚本重启keepalived服务让vip飘到另外的机器上去
delay_loop 6
lb_algo wrr
lb_kind DR 
nat_mask 255.255.255.0
persistence_timeout 50
real_server 192.168.48.129 3306 {
weight 1
notify_down /etc/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 10    
nb_get_retry    3
connect_port 3306 
}
}
}

mysql.sh脚本如下

[root@test1 keepalived]# vi mysql.sh 
#!/bin/bash
/etc/init.d/keepalived  stop
sleep 10
/etc/init.d/keepalived  start

我停止mysql 就会触发脚本让vip飘到另外一个机器上下面是keepalive的信息:

技术分享


技术分享


技术分享

配置完成!!!



mysql 主主互备实现

原文:http://shaonian.blog.51cto.com/2975261/1757212

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!