MySQL Dual-Master 双向同步

本文介绍的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 [email protected]:/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;

时间: 2024-10-12 04:27:03

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

后端分布式系列:分布式存储-MySQL 数据库双向同步复制

MySQL 复制问题的最后一篇,关于双向同步复制架构设计的一些设计要点与制约. 问题和制约 数据库的双主双写并双向同步场景,主要考虑数据完整性.一致性和避免冲突.对于同一个库,同一张表,同一个记录中的同一字段的两地变更,会引发数据一致性判断冲突,尽可能通过业务场景设计规避.双主双写并同步复制可能引发主键冲突,需避免使用数据库自增类主键方案.另外,双向同步潜在可能引发循环同步的问题,需要做回环控制. 如上图所示,复制程序写入时也会产生 binlog,如何识别由复制程序产生的 binlog 并将其过

linux下数据库双向同步之mysql

环境:lamp 下搭建一个博客   然后实现同步 这里:以wordpress为例,进行实施 具体操作如下: 一.环境配置 1.自动获取ip地址,虚拟机设置为桥接 2.[[email protected] ~]# yum install wget #换成163的yum源: cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.save wget mirrors.163.com/.help/CentOS5-Base-163.repo #wg

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

      最近在项目中遇到了要实现服务器上MySql数据双向同步,在网上找了很多资料,但是大部分都是在liux系统下配置的, 而且都是互相转载,没有一个详细的步骤,于是决定写一个windows系统下的完整配置,与大家分享,如有不足之处, 请大家指正.   工具/原料 两台服务器,操作系统均为window2012 数据中心版,其中一台服务器为A,IP地址为:192.168.1.2,另外一台为B,IP地址为:192.168.1.3 mysql  的版本最好保持一致,大版本号一定要一致,小更新不影响

MySQL双机主从同步与双向同步

第一部分:主从关系的同步 master端 192.168.0.1 slave端  192.168.0.2 1.MASTER端 a.进入mysql,创建一个数据库abc:       create database abc; b.创建一个用来同步的用户,指定只能在192.168.0.2登录:       grant replication slave on *.* to 'ha'@'192.168.0.2' identified by 'hapwd'; c.修改master端的/etc/my.cn

mysql主从同步-双向同步2

数据库同步复制功能的设置都是在mysql的配置文件(liunx 下是为/etc/my.cnf)中体现的.主要工作原理为slave端记录并且执行master端的操作日志.? 分别登录master机和slave机的mysql:mysql –u root –p? 创建数据库:create database repl;? 1.设置同步master? 编辑配置文件 /etc/my.cnf 确保有如下行? 创建一个mysql的账号为同步专用? 重启master mysql? 查看master状态? 查看进程

mysql实现,一主多从+级联同步+双向同步

实验: 一主多从 3307配置: [mysqld] log-slave-updates #中间者需要开这个 log-bin = /data/3307/mysql-bin expire_logs_days = 7                 #binlog保存多少天 find –mtime +7 防止从库被写忽略同步db.或者从库回收权限: [mysqld] slave-skip-errors = 1032,1062 replicate-ignore-db = mysql binlog-ign

源码安装mysql,及主从同步

源码安装mysql [可选] 如果用源码安装cmake软件: cd /home/oldboy/tools/ tar xf cmake-2.8.8.tar.gz cd cmake-2.8.8 ./configure #CMake has bootstrapped. Now run gmake. gmake gmake install cd ../ 依赖包安装(这里直接可以用yum安装cmake) # yum install cmake gcc gcc-c++ gcc-g77 autoconf au

部署MySQL主主双向主从复制 M-M

通过MySQL主主:进行MySQL双向同步数据库HA的配置配置node-1它有两种身份:身份1: node-1的主. 身份2: node-2的从. 安装MySQL 5.7版本上传mysql-5.7.tar.gz到Linux主机上,并解压:注:mysql-5.7.tar.gz 中包括了安装mysql5.7主要的软件包. 这样部署起来更方便下载并解压安装[[email protected] ~]# wget https://cdn.mysql.com//Downloads/MySQL-5.7/mys

mysql 集群+主从同步

SQL节点: 给上层应用层提供sql访问. 管理节点(MGM):  管理整个集群. 启动,关闭集群. 通过ndb_mgmd命令启动集群 存储/数据节点: 保存cluster中的数据.  数据节点,可以提供副本.实现数据冗余. NDB引擎:是一种 "内存中"的存储引擎 , 它具有可用性高和数据一致性好的特点. 缺陷 基于内存,数据库的规模受集群总内存的大小限制 基于内存,断电后数据可能会有数据丢失,这点还需要通过测试验证. 多个节点通过网络实现通讯和数据同步.查询等操作,因此整体性受网络