使用MySQL 5在四个节点上设置主 - 主复制在Debian Etch

使用MySQL 5在四个节点上设置主 - 主复制在Debian Etch 本教程解释如何设置MySQL master-master 复制...

使用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; 然而,配置应该适用于几乎所有的配置,很少或没有修改。

复制将在一个圆圈中工作,即复制从server1server2 ,从server2server3 ,从server3server4 ,从server4返回到server1

... --> server1 --> server2 --> server3 --> server4 --> server1 --> ...

2安装MySQL 5.0

如果MySQL5.0尚未安装到server1server4上 ,请立即安装:

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.comroot@server2.example.comroot@server3.example.comroot@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上 ,并且它中包含有记录的表。

在开始设置复制之前,我们在server2server3server4上创建一个数据库exampledb

server2 / server3 / server4:

mysql -u root -p

CREATE DATABASE exampledb;
quit;