mysql master-slave搭建测试,附带双master FailOver导致数据结果不一致的一些想法

mysql主从复制:

首先修改master,slave中的配置文件,my.ini或my.conf,都加在[mysqld]域中;


master中的配置:

#replication option
server-id=1
log-bin=mysql-bin.log

slave中的配置:
#log-bin path slave option
server-id=2
log-bin="G:/MySQLbinlog/mysql-bin"
log-bin-index="G:/MySQLbinlog/mysql-bin.index"
log-slave-updates=1
relay-log="G:/MySQLbinlog/mysql-relay-bin"
relay-log-index="G:/MySQLbinlog/mysql-relay-bin.index"
max-binlog-size=200m
#这个是数据库启动的时候slave线程不自动启动,而是需要自己手动设置,给予自己一个修复的时间。如果在配置文件中把change master to的信息设死,则每次启动的时候可以
skip-slave-start=1
自动开启复制线程
read-only=1 
slave-skip-errors=1062,1053
#replicate-do-db=rep_test_db   这些复制过滤条件有时候不起作用,请慎用
#replicate-do-table=rep_test_db.user
#replicate-wild-do-table=rep_testdb.%
#replicate_ignore_table
#replicate_wild_ignore_table


然后开始下面操作:

进入master住进锁表:flush tables with read lock;

然后在没有写的情况下到处数据库逻辑备份(全部的话就是--all-databases)
D:\MySQLDATA\data>mysqldump --master-data --single-transaction -uroot -ptsixi rep_test_db > d:/dbbackup.sql

将该备份中的change master部分注销。


在slave端导入使两边数据同步
mysql -uroot -plumi rep_test_db < G:\update\dbbackup2.sql


做change master命令将slave指向master
mysql> change master to
    -> master_host='220.167.54.227',
    -> master_user='repl',
    -> master_password='tsixi',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=2179,
    -> master_port=32230;
Query OK, 0 rows affected (0.20 sec)


启动复制进程
mysql> start slave(要停止这两个线程就用start stop)
Query OK, 0 rows affected (0.00 sec)


然后进入master解锁:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)


slave端:
mysql> show processlist\G
*************************** 3. row ***************************
     Id: 4
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 122
  State: Waiting for master to send event
   Info: NULL
*************************** 4. row ***************************
     Id: 5
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 117
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
4 rows in set (0.00 sec)


master端:
mysql> show processlist\G;
*************************** 5. row ***************************
     Id: 25
   User: repl
   Host: 118.113.221.173:55464
     db: NULL
Command: Binlog Dump
   Time: 166
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL

*************************** 6. row ***************************


测试一切OK,如果想尝试双master搭建的话,在上面的基础上简单的修改就可以了~!

可以参考这个链接:http://www.linuxfly.org/post/592/1/2/

双master主要是为了一个写库的时候可以快速的采用一个从库来替代。当然不能两边同时写,因为复制是异步的,可能造成数据非一致性问题。

如果采用简单的HA方案,两个master。master1,master2。1挂了的话,自动切换到2,1好了又切换回1。

但始终感觉这个中间有问题。比如1挂的时候你切到了2,在2中执行update table1 set name="2" ,这句话执行完后,还没有复制到1中,这时候1好了

,又一句sql执行update table1 set name="1ok了",当这句话执行完后,master1的复制才过来,执行了update table1 set name="2" ,。这时候master2

的name就变成了"2"了。这样明显跟我们的期望是不相符的。

目前只想出来两种方法减少这种情况的发生:

1 -   就是切过去了,就不要再自动切回来了。。。目前有这种简单的HA现成解决方案么?试了amoeba和cobarClient,都给自动切回来了。。。。

2  - 切回来的时候,先锁住写库,确保复制全部完成之后,再切回来,放开锁。这种相当于停机了,不大可取。

3 -  尽量减少复制延迟。

 

你可能感兴趣的:(mysql master-slave搭建测试,附带双master FailOver导致数据结果不一致的一些想法)