Apr
26
[原]搭建Master-Master Mysql Replication 集群
三、构建主主集群
※ 注意,进行下述操作时,不要对需要同步的数据库进行读、写操作。
1、修改配置文件
修改B机设置成如下内容(红色为新增加配置,使用默认值):
引用
# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
server-id=2
master-host=192.168.228.137
master-user=replication
master-password=slave
master-port=3306
log-bin
binlog-do-db=think
binlog-ignore-db=mysql
binlog-ignore-db=test
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
server-id=2
master-host=192.168.228.137
master-user=replication
master-password=slave
master-port=3306
log-bin
binlog-do-db=think
binlog-ignore-db=mysql
binlog-ignore-db=test
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
在B机上,为A机创建授权用户:
引用
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@192.168.228.137 IDENTIFIED BY 'slave';
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
修改A机配置:
引用
# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
log-bin=/var/lib/mysql/mysql-bin
max_binlog_size=2000M
binlog-do-db=think
binlog-ignore-db=mysql
binlog-ignore-db=test
server-id=1
master-host=192.168.228.138
master-user=replication
master-password=slave
master-port=3306
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1
log-bin=/var/lib/mysql/mysql-bin
max_binlog_size=2000M
binlog-do-db=think
binlog-ignore-db=mysql
binlog-ignore-db=test
server-id=1
master-host=192.168.228.138
master-user=replication
master-password=slave
master-port=3306
[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
然后,重启B机数据库。
再A机上,打开slave 服务:
引用
mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
用下面的命令查看两服务器状态是否正常:
引用
mysql> SHOW MASTER STATUS;
mysql> SHOW SLAVE STATUS\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> SHOW SLAVE STATUS\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2、测试
在B机上向表插入数据:
引用
mysql> USE think;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO t1 VALUE (''),('');
Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 2
mysql> SELECT * FROM t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec)
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> INSERT INTO t1 VALUE (''),('');
Query OK, 2 rows affected, 2 warnings (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 2
mysql> SELECT * FROM t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.00 sec)
查看A机数据库信息:
引用
mysql> SELECT * FROM t1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.01 sec)
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+----+
5 rows in set (0.01 sec)
两机器的think数据库已完全同步。
四、常见问题
Q:备机关闭重启后,会否自动向主机同步?
会的。
备机在起来后,会自动从停止节点起,向当前主机最新的节点同步日志数据。这可在备机用SHOW SLAVE STATUS命令,查看Seconds_Behind_Master 的值,为还有几条未同步日志。
在启动命令mysqld_safe后加入"--skip-slave-start"参数,可屏蔽同步功能来启动,进入后,用START SLAVE 或SLAVE STAR 恢复同步。
Q:主主集群时,能否同时对两机器读写?
对于mysql 4.1版本,建议不要同时对两机器进行读写操作。因很容易会导致键值冲突的问题。例如某种特殊情况:
引用
关闭A机,在B机上插入一条数据,ID为5;
关闭B机,启动A机,在A机上插入一条数据,其ID也会是5;(ID为自增列)
这时,启动B机,就会出现主键冲突的问题。
关闭B机,启动A机,在A机上插入一条数据,其ID也会是5;(ID为自增列)
这时,启动B机,就会出现主键冲突的问题。
实际上,在高负载的情况下,若同时对两服务器写入数据,这是很常见的现象。(可以想象为日志未完全同步,新数据就插入了)因此,在5.1版本的mysql,提供了两个全局变量:
auto_increment_increment和auto_increment_offset
这两个变量有效的解决了该问题。原来很简单,通过控制初始值和步进值,使得每台参与集群的数据库,其新建键值不同。
例如:A 查奇数ID,B插偶数ID,在这里我们在A,B上加入参数,以实现奇偶插入
A:my.cnf上加入参数
引用
auto_increment_offset = 1
auto_increment_increment = 2
auto_increment_increment = 2
这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了。
B:my.cnf 上加入参数
引用
auto_increment_offset = 2
auto_increment_increment = 2
auto_increment_increment = 2
这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了。
可以看出,你的 auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4 台,或者N台服务器,只要保证auto_increment_increment = N,再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID 重复,也就不会产生上述故障。可惜,4.1版本是不支持该参数的。
Q:万一出现同步失效的问题,如何解决?
例如下面的错误:
引用
Last_Errno: 1062
Last_Error: Error 'Duplicate entry '11' for key 1' on query. Default database: 'think'. Query: 'insert into t2 value('','name11')'
Last_Error: Error 'Duplicate entry '11' for key 1' on query. Default database: 'think'. Query: 'insert into t2 value('','name11')'
出现这样的问题,需要手动干预,通常按以下步骤:
方法一:
1、从主机拷贝新数据库到备机
停止两机器,然后从/var/lib/mysql 目录中手动把主机上的数据库拷贝到备机上:
# tar czvf - think/ |(ssh 192.168.228.138 'tar xzf - -C /var/lib/mysql')
2、在备机上重置日志开始索引
先从主机上,看看当前Master的日志信息:
引用
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 | 273 | think | mysql,test |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000008 | 273 | think | mysql,test |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后,在备机上改变当前日志起始文件及位置信息:
引用
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
-> MASTER_LOG_FILE='mysql-bin.000008',
-> MASTER_LOG_POS=273;
mysql> START SLAVE;
mysql> CHANGE MASTER TO
-> MASTER_LOG_FILE='mysql-bin.000008',
-> MASTER_LOG_POS=273;
mysql> START SLAVE;
方法二:
如果你不想直接拷贝数据库文件,可用下面的方式导出SQL文件:
# mysqldump think --master-data > think.sql
该SQL中,会包含表格式、INSERT数据,以及:
引用
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=175;
接着,停止同步
引用
mysql> STOP SLAVE;
然后,重新导入备机中:
# mysql think < think.sql
也就是说,可以在导入数据的同时,进行同步日志初始化的工作。
最后,重新打开备机同步:
引用
mysql> START SLAVE;
※ 注意,这两种方法,也适用于给现有数据库主机,创建新的备机数据库时使用。
其他一些相关命令:
引用
mysql> SHOW VARIABLES; //查看环境变量
mysql> SHOW VARIABLES LINK 'auto%'; //查看auto开头的环境变量
mysql> SHOW PROCESSLIST\G //可以查看mysql的进程看看是否有监听的进程
mysql> SHOW VARIABLES LINK 'auto%'; //查看auto开头的环境变量
mysql> SHOW PROCESSLIST\G //可以查看mysql的进程看看是否有监听的进程
配置文件:
下载文件
五、参考文档
Advanced MySQL Replication Techniques
How to Set Up Replication
MySQL Server 5.5 System Variables
内文分页: [1] [2]