本文介绍的Mysql Dual-Master 复制实施方法可能不是最完美、最强大的。但是在我的应用环境下能很好的满足各项需求。

本文基于我们仅仅使用两台MySQL服务器的情况下,但是你会发现文章中介绍的方法可以很方便的应用于多台服务器的环境下。同样地,我们假设您将用于同步复制的数据库已经在其中一台MySQL服务器上建好了。最后,在开始所有工作之前,我们必须调整所有服务器的防火墙策略以保证彼此能访问对方的3306端口。

环境:

操作系统:CentOS 5.4 x86

MySQL版本:5.0.77

主服务器IP:10.10.1.1

从服务器IP:10.10.1.2

实现目标:主从两台机器MySQL数据双向同步

 
数据库准备工作
分别在两台服务器上执行锁表操作:
shell>mysql -u [user] -p  -e "FLUSH TABLES WITH READ LOCK"
将需要配置同步的数据库Dump出来:
shell>mysqldump -u [user] -p -c [database name] > /tmp/dumpeddb.sql
将dump出来的文件拷贝到另外一台服务器上,方法随意。我用scp
shell>scp -P 22000 /tmp/dumpeddb.sql user@anothermaster:/tmp
如果这台服务器已经建好库了,那么可以直接导数据:
shell>mysql -u [user] -p -D [database name] < /tmp/dumpeddb.sql
如果还没有该库,那么再导数据之前我们需要先建库。
shell>mysql -u [user] -p -e 'CREATE DATABASE "databasename"'
最后我们需要在两台服务器上别分创建一个账号,用来同步数据。
shell>mysql -u root -p
mysql>GRANT REPLICATION SLAVE, REPLICATION CLIENT, SUPER ON databasename.* To replicate IDENTIFIED BY 'replpassword';
mysql>FLUSH PRIVILEGES;
 
修改my.cnf
首先,我们需求修改bind-address选项。保证mysql监听在一个可以被对方访问到的网口上,当然如果你监听在0.0.0.0上就不会有这个问题了,但是这么做通常会带来一些安全问题。我一般会让它监听内网地址
bind-address = 10.10.1.1(主服务器)
bind-address = 10.10.1.2(从服务器)
 
将以下内容加到主服务器的my.cnf里
  1. server-id = 1
  2. auto-increment-increment = 2
  3. auto-increment-offset = 1
  4. log-bin = /var/log/mysql/log-bin.log
  5. binlog-do-db = databasename
  6. binlog-ignore-db = mysql
  7. binlog-ignore-db = test
server-id = 1
auto-increment-increment = 2
auto-increment-offset = 1
log-bin = /var/log/mysql/log-bin.log
binlog-do-db = databasename
binlog-ignore-db = mysql
binlog-ignore-db = test
server-id服务器标识,我们必须给两台机器分配不同的server-id.
log-bin,开启mysql的binlog(二进制日志).开启后mysql会将所有的修改操作记录到binlog中,可以用mysqlbinlog工具查看,里面都是一条一条的sql语句。slave I/O会读取主机的binlog,然后把读取到的内容在slave上执行,这就是mysql主从同步的基本原理。
binlog-do-db,设置哪些数据库写binlog。
binlog-ingore-db,设置哪些数据库不写binlog。
通过这两个选项我们就可以设置哪些库同步哪些库不同步。
auto-increment-incrment和auto-increment-offset这两个选项的设置是为了防止2台服务器互相复制产生关键字段的冲突。如果他们用不同的便宜,比如一个按照1,3,5,7增加而另外一台按照那个2,4,6,8增加。auto-incrment-increment=2自动增加的字段每次步进是2,auto-increment-offset=1自动增加的字段的初始值是1
 
将以下内容添加到从服务器
  1. server-id = 2 
  2. auto-increment-increment = 2
  3. auto-increment-offset = 2
  4. log-bin = /var/log/mysql/log-bin.log
  5. binlog-do-db = databasename
  6. binlog-ignore-db = mysql
  7. binlog-ignore-db = test
server-id = 2
auto-increment-increment = 2
auto-increment-offset = 2
log-bin = log-bin.log
binlog-do-db = demo1
binlog-ignore-db = mysql
binlog-ignore-db = test
binlog-ignore-db = demo
binlog-ignore-db = wang
注意这里auto_increment_offset选项的值跟主服务器上不一样。
 
分别重启mysql服务
shell>/etc/init.d/mysql restart
或者
shell>mysql -u root -p -e "RESET MASTER"
 
配置主机到从机同步
记录主机的master状态
mysql> show master status\G
*************************** 1. row ***************************
            File: log-bin.log.000001
        Position: 98
    Binlog_Do_DB: databasename
Binlog_Ignore_DB: mysql,test
1 row in set (0.00 sec)
根据主机显示结果在从机上配置master参数
mysql>CHANGE MASTER TO
    ->     MASTER_HOST='10.10.1.1',
    ->     MASTER_USER='replicate',
    ->     MASTER_PASSWORD='replpassword',
    ->     MASTER_LOG_FILE='log-bin.log.000001',
    ->     MASTER_LOG_POS=98;

CHANGE MASTER TO MASTER_HOST='192.168.1.108',MASTER_USER='replicate',MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000001',MASTER_LOG_POS=120;

其中MASTER_HOST、MASTER_USER、MASTER_PASSWORD这些参数可以在my.cnf里。但是我个人更喜欢在mysql里配置,一方面安全点,另一方面MASTER_LOG_FILE和MASTER_LOG_POS这些参数还是得在mysql里面配置,不如一块在myql里配置来的方便。
 
配置从机到主机同步(上一节的步骤反过来执行一遍)。
记录从机上的master状态
mysql> show master status\G
*************************** 1. row ***************************
            File: log-bin.log.000001
        Position: 98
    Binlog_Do_DB: databasename
Binlog_Ignore_DB: mysql,test
1 row in set (0.00 sec)
根据从机显示的结果在主机上配置master参数
mysql>CHANGE MASTER TO
    ->     MASTER_HOST='10.10.1.2',
    ->     MASTER_USER='replicate',
    ->     MASTER_PASSWORD='replpassword',
    ->     MASTER_LOG_FILE='log-bin.log.000001',
    ->     MASTER_LOG_POS=98
 
CHANGE MASTER TO MASTER_HOST='192.168.1.109',MASTER_USER='replicate',MASTER_PASSWORD='123456',MASTER_LOG_FILE='log-bin.000001',MASTER_LOG_POS=120; 
分别开启slave线程
mysql>start slave;
 
解锁
mysql>unlock tables;

MySQL Dual-Master 双向同步的更多相关文章

  1. MySQL伪master+Binlog+同步【转】

    MySQL 中drop 等高危误操作后恢复方法 实验目的: 本次实验以恢复drop操作为例,使用不同方法进行误操作的数据恢复. 方法: 利用master同步 :伪master+Binlog+同步(本文 ...

  2. Centos下MySQL数据库主从双向同步配置

    MYSQL支持单向.异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器.主服务器将更新写入二进制日志文件,并维护日志文件的一个索引以跟踪日志循环.当一个从服务器连接到主服务 ...

  3. MYSQL单双向同步

    Master:192.168.1.101 Slave  :192.168.1.102 单向同步(一) 进入Master启动MYSQL [root@localhost ~]# service mysql ...

  4. MySQL主从双向同步

    最近部署测试环境,涉及到MySQL数据库主从双向同步的部署,记录一下部署过程,正常读写都发生在主库,从库作为备选数据库(热备份),当主库发生异常,数据库自动切换到从库,这里面是怎么监控数据库异常并触发 ...

  5. MySQL 数据库双向同步复制

    MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的 ...

  6. windows下 MySQL数据库双向同步 配置步骤

          最近在项目中遇到了要实现服务器上MySql数据双向同步,在网上找了很多资料,但是大部分都是在liux系统下配置的, 而且都是互相转载,没有一个详细的步骤,于是决定写一个windows系统下 ...

  7. 配置MySQL主从双向同步

    原文地址:http://www.cnblogs.com/zhongshengzhen/ 原主数据库:192.168.137.33 原从数据库:192.168.137.197   需要先阅读并操作:ht ...

  8. Windows下MySQL双向同步及环形同步的实现

    记录一下这次做的双向同步及环形同步吧,都是最简单的实现: 具体实现之前,先说些与之有关的内容吧,大部分内容都是网上的,操作步骤则是亲自测试之后记录下的: 一. 数据同步的几种方式: 1. 触发器,在数 ...

  9. mysql 之 主从同步(单向同步和双向同步)

    一. 实验环境部署 主服务器(MySQL-01) IP: 192.168.8.241  端口3306  ,操作系统:Centos6.5 64位 从服务器(MySQL-02)  IP: 192.168. ...

随机推荐

  1. 我是一个程序猿 ——《不是书评 :<我是一只IT小小鸟>》有感

    读了刘未鹏先生的文章<不是书评 :<我是一只IT小小鸟>>,产生了诸多共鸣,更明白了不少道理. 首先是一个很平常的现象,进度条效应,在操作移动终端上的软件时,如果没有进度条,人 ...

  2. windows文件共享 防火墙规则设置

    防火墙入站规则.完成以下两项设置即可. 设置一 操作:允许连接协议类型:UDP本地端口:137, 138远程端口:所有端口 设置二 操作:允许连接协议类型:TCP本地端口:139, 445远程端口:所 ...

  3. jdk动态代理 要把目标对象 和自己都传进去;以便自己对目标对象的代理

  4. 神奇的Redis延迟

    最近在做某业务Redis的缩容工作,涉及到数据迁移,而Redis的数据迁移看起来蛮简单的,一对一的数据迁移只需要在slave行配置masterauth 和slaveof 两个参数即可,当然迁移过程中涉 ...

  5. oracle 创建表空间 与创建用户与分配用户权限

    创建一个表空间名为ABC create tablespace "ABC"     //貌似要大写 datafile 'D:\oracle\TBSPACES\ABC.dbf'   / ...

  6. hadoop2相对hadoop1有非常重大的改进

    hadoop2相对hadoop1有非常重大的改进. 下面看一下在HDFS和MapReduce方面的改进: HDFS Federation(HDFS联邦)federation-background[1] ...

  7. HGOI NOIP模拟4 题解

    NOIP国庆模拟赛Day5 题解 T1 马里奥 题目描述 马里奥将要参加 NOIP 了,他现在在一片大陆上,这个大陆上有着许多浮空岛,并且其中一座浮空岛上有一个传送门,马里奥想要到达传送门从而前往 N ...

  8. sql server 小技巧(7) 导出完整sql server 数据库成一个sql文件,包含表结构及数据

    1. 右健数据库 –> Tasks –> Generate Scripts   2. 选择所有的表   3. 下一步,选择Advanded, Types of data to script ...

  9. debian9使用systemd部署etcd集群

    在centos上,是可以直接使用yum安装etcd的: # yum list | grep etcd etcd.x86_64 3.2.9-3.el7 @extras 但是,在debian上却没有安装包 ...

  10. oracle递归查询(查询条件ID下得所有子集)

    一.CREATE TABLE TBL_TEST ( ID    NUMBER, NAME  VARCHAR2(100 BYTE), PID   NUMBER                       ...