我有一个中央数据库,包含MySQL 5.1-lastest-stable中的所有数据
我想在主 - 主关系中连接多个客户端。
问题
如何在中间设置一个具有多个客户端数据库的中央服务器的星型拓扑,以便一个客户端中的更改首先传播到中央服务器并从那里传播到所有其他客户端数据库?
数据库信息
我在所有表中都使用了inno-db,并启用了二进制日志
除此之外,我已经学会了如何在数据库之间进行掌握
所有表都有主键primary integer autoincrement
。自动增量偏移和开始调整到不同的客户端数据库的地方永远不会有主键冲突。
为什么我要这个
我有连接到笔记本电脑上的本地MySQL数据库的客户端软件(不是网站或php),这需要同步到中央数据库,以便所有在他们的笔记本电脑上使用该程序的人看到所有其他更改其他人做的。
我不想直接连接到中央数据库,因为如果笔记本电脑和中央数据库之间的互联网连接中断,我的应用程序就会死亡
在此设置中,应用程序继续,在重新建立与中央数据库的连接之前,笔记本电脑不会从其他人那里获得更新。
3 个答案:
答案 0 :(得分:10)
鉴于需要对浮动从站使用MySQL循环复制作为同步DB的方法,这里有一个解决方案:
1 DB Master
4个DB从站
设置DB MASTER
- 安装MySQL 5.1.x
- 确保/etc/my.cnf
服务器ID = 1个
登录斌= mysql的斌
到期-日志天= 14
默认-storgae引擎= InnoDB的
- 启动MySQL
- RESET MASTER; (从DB Master清除二进制日志)
- 将数据加载到主文件
- GRANT SELECT,REPLICATION SLAVE ON 。 to replicator @'%'IDENTIFIED BY'repl-password';
醇>
设置DB SLAVES
- 安装MySQL 5.1.x
- 确保/etc/my.cnf
server-id =(唯一服务器ID)
登录斌= mysql的斌
默认存储引擎= InnoDB的
- 启动MySQL
- 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;
- START SLAVE; (让复制赶上来,查看SHOW SLAVE STATUS \ G)
- STOP SLAVE;
- 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; < / LI>
- START SLAVE;
醇>
导入流程
一旦准备好每个DB Slave,现在DB Master和DB Slave之间的数据迁移可以按如下方式进行(DB for DB Master,DS for DB Slave):
- 在DS上,运行SHOW MASTER STATUS;
- 在DS上,记录二进制日志文件名和位置
- 在DM上,运行CHANGE MASTER TO MASTER_HOST ='DS的IP地址',MASTER_PORT = 3306,MASTER_USER ='replicator',MASTER_PASSWORD ='repl-password',MASTER_LOG_FILE ='LogFile From Step2',MASTER_LOG_POS =(LogPos From步骤2);
- 在DM上,运行START SLAVE; (让复制赶上; DS引入DM的端口更改)
- 在DM上,停止SLAVE;
- 在DS上,记录/var/lib/mysql/master.info的第2行(日志文件)
- 在DS上,记录/var/lib/mysql/master.info的第3行(日志位置)
- 在DS上,运行CHANGE MASTER TO MASTER_HOST ='DM的IP地址',MASTER_PORT = 3306,MASTER_USER ='replicator',MASTER_PASSWORD ='repl-password',MASTER_LOG_FILE ='LogFile From Step6',MASTER_LOG_POS =(LogPos From第七步);
- 在DS上,运行START SLAVE; (让复制赶上; DM引入DS的端口更改)
- 在DS上,停止SLAVE;
醇>
<强> CAVEAT 强>
导入过程至关重要!!!您必须每次都正确记录确切的日志文件和日志位置。
试一试!!!
让我知道它是怎么回事!!!
答案 1 :(得分:2)
这听起来像是一种特殊类型的MySQL复制拓扑
我想到的拓扑被称为“分发大师”,它来自“{Master,分配大师和奴隶”小标题下的High Performance MySQL : Optimizations, Backups, Replication and more页的第368-370页。
您需要以下
1 DB主服务器
1 DB Distribution Master(称为/ dev / null Slave,或Blackhole Slave)
无论数量多少的DB奴隶
设置DB MASTER
- 安装MySQL 5.1.x
- 确保/etc/my.cnf
服务器ID = 1个
登录斌= mysql的斌
到期-日志天= 14
默认-storgae引擎= InnoDB的
- 启动MySQL
- RESET MASTER; (从DB Master清除二进制日志)
- 将数据加载到主文件
- GRANT SELECT,REPLICATION SLAVE ON 。 to replicator @'%'IDENTIFIED BY'repl-password';
醇>
设置数据库分发主机
- 安装MySQL 5.1.x
- 确保/etc/my.cnf
服务器ID = 2
登录斌= mysql的斌
到期-日志天= 14
默认存储引擎= BLACKHOLE
跳过innodb的
- 启动MySQL
- 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;
- START SLAVE;
- GRANT SELECT,REPLICATION SLAVE ON 。 to replicator @'%'IDENTIFIED BY'repl-password';
- 对于不在information_schema数据库中而不在mysql数据库中的每个表,将每个表转换为BLACKHOLE存储引擎,如下所示:ALTER TABLE tblname ENGINE = BLACKHOLE;
- RESET MASTER; (从DB Distribution Master中清除二进制日志)
醇>
设置DB SLAVES
- 安装MySQL 5.1.x
- 确保/etc/my.cnf
服务器ID = 3
默认存储引擎= InnoDB的
- 启动MySQL
- 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;
- START SLAVE; (让复制赶上来,查看SHOW SLAVE STATUS \ G)
- STOP SLAVE;
- 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; < / LI>
- START SLAVE;
醇>
设置的目的是让DB Master仅处理仅适用于DB Master的SQL。要复制到DB Slaves的SQL由DB Distribution Master处理。这将缓解DB Master处理SQL到Slave的传输;这成为DB Distribution Master的责任。所有Slaves都从DB Distribution Master而不是DB Master中读取SQL更改。
虽然我不完全了解您的应用程序,但是这种拓扑结构应该适当地支持一个中央数据库和多个读取从属,而不需要I / O绑定中央数据库。只要每台笔记本电脑处理与其他笔记本电脑不同且不同的唯一客户端集,您的应用程序就应该将INSERT,UPDATE和DELETE组织到客户端数据库。
CAVEAT
您可能必须对DB Slaves进行严格测试,以确保数据不会因BLACKHOLE设置而消失。如果发生这种情况,请尝试删除'default-storage-engine = BLACKHOLE'并重新加载所有内容。
这种性质的未来问题应该在dba.stackexchange.com
中提出
答案 2 :(得分:0)
是的,您可以在您描述的拓扑中设置多个MySQL数据库。
您要做的事情称为复制。
这是MySQL 5.1手册中的Replication部分。