9

我有一个中央数据库,其中包含 MySQL 5.1-lastest-stable 中的所有数据。
我想以主主关系连接多个客户端。

问题

如何设置一个星型拓扑,中间有 1 个中央服务器和多个客户端数据库,以便一个客户端中的更改首先传播到中央服务器,然后从那里传播到所有其他客户端数据库?

数据库信息

我对所有表都使用了 inno-db,并且我已经启用了二进制日志。
除此之外,我还学会了如何在数据库之间进行主控。
所有表都有主键primary integer autoincrement。自动增量偏移量和开始调整到不同的客户端数据库永远不会发生主键冲突。

我为什么要这个

我有连接到笔记本电脑上本地 MySQL 数据库的客户端软件(不是网站或 php),这需要同步到中央数据库,以便所有在笔记本电脑上使用该程序的人都能看到其他人所做的所有其他更改.
我不想直接连接中央数据库,因为如果笔记本电脑和中央数据库之间的互联网连接断开,我的应用程序就会死掉。
在此设置中,应用程序继续进行,笔记本电脑只是在重新建立与中央数据库的连接之前不会从其他人那里获得更新。

4

3 回答 3

10

鉴于需要对浮动从属服务器使用 MySQL 循环复制作为同步 DB 的一种手段,这里有一个解决方案:

1 个 DB 主
站 4 个 DB 从站


DB MASTER 的设置

  1. 安装 MySQL 5.1.x
  2. 确保 /etc/my.cnf
          server-id=1
          log-bin=mysql-bin
          expire-logs-days=14
          default-storgae-engine=InnoDB
  3. 启动 MySQL
  4. 复位主;(从 DB Master 清除二进制日志)
  5. 将数据加载到 Master
  6. GRANT SELECT,REPLICATION SLAVE ON TOreplicator@'%' IDENTIFIED BY 'repl-password';

DB 从站的设置

  1. 安装 MySQL 5.1.x
  2. 确保 /etc/my.cnf
          server-id=(unique server id)
          log-bin=mysql-bin
          default-storage-engine=InnoDB
  3. 启动 MySQL
  4. CHANGE MASTER TO MASTER_HOST='DB Master的IP地址', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. 启动奴隶;(让复制赶上,检查 SHOW SLAVE STATUS\G)
  6. 停止奴隶;
  7. CHANGE MASTER TO MASTER_HOST='DB Distribution Master的IP地址', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  8. 启动奴隶;

进口流程

一旦每个 DB Slave 都准备好,现在 DB Master 和 DB Slave 之间的数据迁移可以进行如下(DB Master 为 DM,DB Slave 为 DS):

  1. 在 DS 上,运行 SHOW MASTER STATUS;
  2. 在 DS 上,记录二进制日志文件名和位置
  3. 在 DM 上,运行 CHANGE MASTER TO MASTER_HOST='IP Address of DS', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='LogFile From Step2', MASTER_LOG_POS=(LogPos From Step2);
  4. 在 DM 上,运行 START SLAVE;(让复制赶上;DS 向 DM 引入的端口更改)
  5. 在 DM 上,停止 SLAVE;
  6. 在 DS 上,记录 /var/lib/mysql/master.info(日志文件)的第 2 行
  7. 在 DS 上,记录 /var/lib/mysql/master.info 的第 3 行(日志位置)
  8. 在 DS 上,运行 CHANGE MASTER TO MASTER_HOST='IP Address of DM', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='LogFile From Step6', MASTER_LOG_POS=(LogPos From Step7);
  9. 在 DS 上,运行 START SLAVE;(让复制赶上;DM 向 DS 引入的端口更改)
  10. 在 DS 上,停止 SLAVE;

警告

导入过程很关键!!!您必须每次都正确记录准确的日志文件和日志位置。

试试看 !!!

让我知道事情的后续 !!!

于 2011-04-26T00:04:12.163 回答
2

这听起来像是一种特殊类型的 MySQL 复制拓扑的工作

我想到的拓扑结构被称为“分发主机”,它来自《高性能 MySQL:优化、备份、复制等》一书的第 368-370 页,小标题为“主机、分发主机和从机”。

您将需要以下内容

1 个 DB 主服务器
1 个 DB 分发主服务器(称为 /dev/null 从站,或黑洞从站) 任意
数量的 DB 从站


DB MASTER 的设置

  1. 安装 MySQL 5.1.x
  2. 确保 /etc/my.cnf
          server-id=1
          log-bin=mysql-bin
          expire-logs-days=14
          default-storgae-engine=InnoDB
  3. 启动 MySQL
  4. 复位主;(从 DB Master 清除二进制日志)
  5. 将数据加载到 Master
  6. GRANT SELECT,REPLICATION SLAVE ON TOreplicator@'%' IDENTIFIED BY 'repl-password';

DB 分配主站的设置

  1. 安装 MySQL 5.1.x
  2. 确保 /etc/my.cnf
          server-id=2
          log-bin=mysql-bin
          expire-logs-days=14
          default-storage-engine=BLACKHOLE
          skip-innodb
  3. 启动 MySQL
  4. CHANGE MASTER TO MASTER_HOST='DB Master的IP地址', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. 启动奴隶;
  6. GRANT SELECT,REPLICATION SLAVE ON TOreplicator@'%' IDENTIFIED BY 'repl-password';
  7. 对于不在 information_schema 数据库中且不在 mysql 数据库中的每个表,将每个表转换为 BLACKHOLE 存储引擎,如下所示: ALTER TABLE tblname ENGINE=BLACKHOLE;
  8. 复位主;(从 DB Distribution Master 清除二进制日志)

DB 从站的设置

  1. 安装 MySQL 5.1.x
  2. 确保 /etc/my.cnf
          server-id=3
          default-storage-engine=InnoDB
  3. 启动 MySQL
  4. CHANGE MASTER TO MASTER_HOST='DB Master的IP地址', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  5. 启动奴隶;(让复制赶上,检查 SHOW SLAVE STATUS\G)
  6. 停止奴隶;
  7. CHANGE MASTER TO MASTER_HOST='DB Distribution Master的IP地址', MASTER_PORT=3306, MASTER_USER='replicator', MASTER_PASSWORD='repl-password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=106;
  8. 启动奴隶;

设置的目的是让 DB Master 只处理仅用于 DB Master 的 SQL。要复制到 DB 从站的 SQL 由 DB Distribution Master 处理。这将减轻 DB Master 处理 SQL 到 Slave 的传输;这成为 DB Distribution Master 的责任。所有从站都从 DB Distribution Master 而不是 DB Master 读取 SQL 更改。

尽管我不完全了解您的应用程序,但此拓扑应该正确支持一个中央数据库和多个读取从属,而 I/O 不会限制中央数据库。只要每台笔记本电脑处理一组与其他笔记本电脑不同且不同的独特客户端,您的应用程序就应该组织对客户端数据库的 INSERT、UPDATE 和 DELETE。


警告

您可能必须对 DB 从站进行认真的测试,以确保数据不会因为 BLACKHOLE 设置而消失。如果发生这种情况,请尝试删除“default-storage-engine=BLACKHOLE”并重新加载所有内容。


这种性质的未来问题应该在dba.stackexchange.com中提出

于 2011-04-25T18:10:23.287 回答
0

是的,您可以在您描述的拓扑中设置多个 MySQL 数据库。

你想要做的就是复制。

这是 MySQL 5.1 手册中的复制部分。

于 2011-03-11T14:33:26.070 回答