使用MySQL 5在Debian Etch上设置四个节点上的Master-Master复制
版本1.0
作者:Falko Timme
本教程将介绍如何在四个MySQL节点(在Debian Etch上运行)上设置MySQL master-master复制。 与这两个节点的主 - 复制的区别在于如果您有两个以上的节点,则复制进行一个圆圈,即四个节点,复制从node1到node2,从node2到node3,从node3到node4,从node4到node1。
自版本5以来,MySQL自带内置的master-master复制支持,解决了自生产密钥可能发生的问题。 在以前的MySQL版本中,主 - 主复制的问题是如果节点A和节点B在同一个表上插入自动递增密钥,则会立即产生冲突。 master-master复制在传统主从复制方面的优点是,您不必修改应用程序,只能对主机进行写入访问,而且更容易提供高可用性,因为如果主器件失败,你还有另一个主人。
我不会保证这将为您工作!
1初步说明
在本教程中,我将展示如何在四个MySQL节点上复制数据库exampledb
:
-
server1.example.com:IP
地址192.168.0.100
-
server2.example.com:IP
地址192.168.0.101
-
server3.example.com:IP
地址192.168.0.102
-
server4.example.com:IP
地址192.168.0.103
每个节点同时是主节点和从属节点。 所有四个系统都运行Debian Etch; 然而,配置应该适用于几乎所有的配置,很少或没有修改。
复制将在一个圆圈中工作,即复制从server1
到server2
,从server2
到server3
,从server3
到server4
,从server4
返回到server1
:
... --> server1 --> server2 --> server3 --> server4 --> server1 --> ...
2安装MySQL 5.0
如果MySQL5.0尚未安装到server1
到server4上
,请立即安装:
server1 / server2 / server3 / server4:
apt-get install mysql-server-5.0 mysql-client-5.0
为了确保复制可以工作,我们必须让MySQL在所有接口上监听,因此我们在/etc/mysql/my.cnf中注释出了bind-address =
127.0.0.1
:
server1 / server2 / server3 / server4:
vi /etc/mysql/my.cnf
[...] # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. #bind-address = 127.0.0.1 [...] |
之后重启MySQL:
server1 / server2 / server3 / server4:
/etc/init.d/mysql restart
然后检查
server1 / server2 / server3 / server4:
netstat -tap | grep mysql
MySQL在所有接口上都是真正的监听:
server1:~# netstat -tap | grep mysql
tcp 0 0 *:mysql *:* LISTEN 2671/mysqld
server1:~#
然后,为用户root @ localhost
设置一个MySQL密码:
server1 / server2 / server3 / server4:
mysqladmin -u root password yourrootsqlpassword
接下来,我们为root@server1.example.com
, root@server2.example.com
, root@server3.example.com
和root@server4.example.com
创建MySQL 密码
:
server1:
mysqladmin -h server1.example.com -u root password yourrootsqlpassword
server2:
mysqladmin -h server2.example.com -u root password yourrootsqlpassword
server3:
mysqladmin -h server3.example.com -u root password yourrootsqlpassword
server4:
mysqladmin -h server4.example.com -u root password yourrootsqlpassword
现在我们设置一个可以由server2
使用的复制用户slaveuser_for_s2
来访问server1
上的MySQL数据库:
server1:
mysql -u root -p
在MySQL shell上,运行以下命令:
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser_for_s2'@'%' IDENTIFIED BY 'slave_user_for_server2_password';
FLUSH PRIVILEGES;
quit;
然后我们设置一个可以由server3
使用的复制用户slaveuser_for_s3
来访问server2
上的MySQL数据库...
server2:
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser_for_s3'@'%' IDENTIFIED BY 'slave_user_for_server3_password';
FLUSH PRIVILEGES;
quit;
...和复制用户slaveuser_for_s4
,可由server4
用于访问server3
上的MySQL数据库...
server3:
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser_for_s4'@'%' IDENTIFIED BY 'slave_user_for_server4_password';
FLUSH PRIVILEGES;
quit;
...最后一个复制用户slaveuser_for_s1
可以被server1
用来访问server4
上的MySQL数据库:
server4:
mysql -u root -p
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser_for_s1'@'%' IDENTIFIED BY 'slave_user_for_server1_password';
FLUSH PRIVILEGES;
quit;
3一些注释
在下面我将假定数据库exampledb
已经存在于server1上
,并且它中包含有记录的表。
在开始设置复制之前,我们在server2
, server3
和server4
上创建一个空数据库exampledb
:
server2 / server3 / server4:
mysql -u root -p
CREATE DATABASE exampledb;
quit;