Apr 26

[原]搭建Master-Master Mysql Replication 集群 晴

linuxing , 18:24 , 数据库 » Mysql , 评论(0) , 引用(0) , 阅读(64407) , Via 本站原创 | |


三、构建主主集群
※ 注意,进行下述操作时,不要对需要同步的数据库进行读、写操作。
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

在B机上,为A机创建授权用户:
引用
mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@192.168.228.137 IDENTIFIED BY 'slave';
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

然后,重启B机数据库。
再A机上,打开slave 服务:
引用
mysql> START SLAVE;
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

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)

查看A机数据库信息:
引用
mysql> SELECT * FROM t1;
+----+
| 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机,就会出现主键冲突的问题。

实际上,在高负载的情况下,若同时对两服务器写入数据,这是很常见的现象。(可以想象为日志未完全同步,新数据就插入了)因此,在5.1版本的mysql,提供了两个全局变量:
auto_increment_incrementauto_increment_offset
这两个变量有效的解决了该问题。原来很简单,通过控制初始值和步进值,使得每台参与集群的数据库,其新建键值不同。
例如:A 查奇数ID,B插偶数ID,在这里我们在A,B上加入参数,以实现奇偶插入
A:my.cnf上加入参数
引用
auto_increment_offset = 1
auto_increment_increment = 2

这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了。

B:my.cnf 上加入参数
引用
auto_increment_offset = 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')'

出现这样的问题,需要手动干预,通常按以下步骤:
方法一:
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)

然后,在备机上改变当前日志起始文件及位置信息:
引用
mysql> STOP 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的进程看看是否有监听的进程


配置文件:
五、参考文档
Advanced MySQL Replication Techniques
How to Set Up Replication
MySQL Server 5.5 System Variables
内文分页: [1] [2]
Tags: , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]