MySQL主主复制

来源:互联网 发布:fakethunder for mac 编辑:程序博客网 时间:2024/04/27 21:47

from:http://zhumeng8337797.blog.163.com/blog/static/10076891420113194139138/?suggestedreading&wumii

MySQL主主复制结构区别于主从复制结构。在主主复制结构中,两台服务器的任何一台上面的数据库存发生了改变都会同步到另一台服务器上,这样两台服务器互为主从,并且都能向外提供服务。

 
下面是配置步骤
 
需要两台MySQL主机做服务器:
Server-1:192.168.0.1
Server-2:192.168.0.2
 

一、创建并授权用户

这一步在每一台(主)服务器上创建一个用户,并为之授权,使它们可以互相访问彼此的数据库
 
在Server-1上:
创建一个充许Server-1来访问的用户server2,密码为:server2
mysql> GRANT REPLICATION SLAVE,file ON *.*
     > TO 'server2'@'192.168.0.2'  IDENTIFIED BY 'server2';
     
在Server-2上:
创建一个充许Server-1来访问的用户server1,密码为:server1
mysql> GRANT REPLICATION,file SLAVE ON *.*
     > TO 'server1'@'192.168.0.1'  IDENTIFIED BY 'server1';
     
     

二、修改MySQL主配置文件

在MySQL的主配置文件中修改/添加如下内容:
Server-1上:
 [mysqld]
#####add for proc master-slave ####
server-id=1
binlog-do-db=myMasterTestDb
binlog-ignore-db=mysql
log-slave-updates
slave-skip-errors
#####add for master-master
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1


保存退出

# service mysqld restart
 
Server-2上
 [mysqld]
#####add for proc master slave ####
server-id=3
binlog-do-db=myMasterTestDb
binlog-ignore-db=mysql
log-slave-updates
slave-skip-errors
#####add for master-master
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2


注:二都只有server-id不同和 auto-increment- offset不同
    auto-increment-offset是用来设定数据库中自动增长的起点的,回为这两能服务器都设定了一次自动增长值2,所以它们的起点必须得不同,这样才能避免两台服务器数据同步时出现主键冲突
    replicate-do-db 指定同步的数据库,我们只在两台服务器间同步mydb数据库
另:auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两台服务器,所以值设为2
 
 

三、复制其中一台服务器的数据库到别外一台服务器

这一步中谁做为源数据不重要,重要的是在正式的复制(Replication)开始之前两台服务都能准备的反应彼此的数据。
我们可以先从源数据库中导出数据到备份文件,这里我们使用mysqldump命令
 
Server-1上数据库为源数据库
备份数据前先锁表,保证数据一致性
mysql> FLUSH TABLES WITH READ LOCK;
     > SHOW MASTER STATUS;
+-----------------+------------+----------------+--------------------+
|File             | Position   |  Binlog_Do_DB  |  Binlog_Ignore_DB  |  
+-----------------+------------+----------------+--------------------+
|mysql-bin.000006 |       213  |                |                    |
+-----------------+------------+----------------+--------------------+
1 row in set (0.01 sec)
该结果显示,源服务器现在处于6号二进制文件的213位置
 
开始备份数据库
# mysqldump --user=root -p myMasterTestDb > /tmp/myMasterTestDb.sql
备份完毕,现在可以解锁数据库表
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

四、将备份数据导入Server-2

先在Server-2上创建一个与mydb同名的空数据库
# mysql
    > CREATE DATABASE myMasterTestDb;
    >\q
# scp 192.168.0.1:/tmp/myMasterTestDb.sql  ./
# mysql -uroot -p myMasterTestDb< /tmp/myMasterTestDb.sql
 
此时,我们需要注意当前服务器的二进制日志的位置
# mysql
    > LOCK TALBES WITH READ LOCK;
    > SHOW MASTER STATUS;
+-----------------+------------+----------------+--------------------+
|File             | Position   |  Binlog_Do_DB  |  Binlog_Ignore_DB  |  
+-----------------+------------+----------------+--------------------+
|mysql-bin.000001 |       106  |                |                    |
+-----------------+------------+----------------+--------------------+
1 row in set (0.00 sec)
    > UNLOCK TABLES;
    > \q

五、互相通告二进制日志位置
 
在Server-1上:
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.2',MASTER_USER='server1',MASTER_PASSWORD='server1',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=106;
mysql>start slave;

mysql>show slave status\G;
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
说明配置配置成功了

在Server-2上:
mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_HOST='192.168.0.1',MASTER_USER='server2',MASTER_PASSWORD='server2',MASTER_LOG_FILE='mysql-bin.000006',MASTER_LOG_POS=213 ;
mysql>start slave;

mysql>show slave status\G;
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes
说明配置配置成功了

测试:

在Server-1或Server-2的myMasterTestDb中,创建一个表a,会看到Server-2或Server-1以及它们的slave中中也出现了表a。