我正在寻找一种方法来运行2个数据库;办公室1个,数据中心1个。在办公室时,员工会在本地连接,但在办公室外,他们会远程连接到数据中心。两个数据库都将完全同步。这意味着员工可以登录并更新数据中心的记录,并且该更改将立即复制到办公室服务器(反之亦然)。因此,任何一个用户都可以编辑相同的记录。
因此,auto_increment_offset等的典型情况不起作用,因为在这种情况下,每个服务器必须能够更新相同的记录。
我错过了一些明显的东西吗?我想不出一个可行的办法来处理这个问题。 1 db上的2个用户可以修改相同的记录,因此在这种类型的设置中有一种方法可以做同样的事情。我想不出一个。
答案 0 :(得分:0)
使用异步复制无法可靠地执行此操作。考虑这个简单的例子:
site A: update foo set bar = 1
site B: update foo set bar = 2
一段时间后(以毫秒或小时为单位),事务将复制到每个站点:
site A: update foo set bar = 2
site B: update foo set bar = 1
foo.bar现在在站点A上为2,在站点B上为1。在MySQL中没有任何内容可以检测到这一点或阻止它发生。
对问题进行分区,以便主人“拥有”数据的不同部分或为所有更新选择主要主人。或者实现一些全局锁定机制。
对于一个数据库,事情完全不同,因为内部有同步锁定。
答案 1 :(得分:0)
以下是我们如何做到的:
在主 - 主配置中,有2个主设备和2个从设备。两者同时是主人和奴隶:
master1 => SLAVE1 [master2]
[slave1] master1< = slave2
在主服务器上启用binlogging - [mysqld]部分下的my.cnf文件:
登录斌= MySQL的-bin.log
relay_log =中继bin.log
server-id = 1
登录奴隶更新
auto_increment_increment = 10
auto_increment_offset = 1
您可能需要添加:
skip-slave-start选项也是为了防止在数据库启动时启动slave。
注意:
每个服务器应使用不同的server-id
auto_increment_offset应该不同
自动增量选项:
auto_increment_increment控制连续的AUTO_INCREMENT值之间的增量。
auto_increment_offset确定AUTO_INCREMENT列值的起始点。
auto_increment_increment = 10且auto_increment_offset = 5,auto_inc值为5,15,25 ..
专用用户:
授予复制权从。到'复制'@'%'通过'some_password'识别;
使用LVM创建MySQL数据库的一致二进制备份(需要设置复制),但相同的步骤将适用于ZFS / UFS快照和其他常用技术:
连接到master(server1)上的MySQL数据库并运行“FLUSH TABLES WITH READ LOCK”。完成刷新操作可能需要几秒钟,它将锁定所有表!记住它是很重要的,因为在某些情况下这种操作可能会影响生产负荷。最好将复制设置安排到峰值关闭时间。
创建LVM快照(server1):lvcreate -L10G -s -n mysqlbackup / dev / vg / lvm_mysql_partition
获取有关主要职位的信息。使用以前创建的数据库连接运行:SHOW MASTER STATUS;获取有关当前binlog,位置等的所有信息。
在某处复制粘贴输出 - 供将来使用。
取消锁定所有表格:UNLOCK TABLES;
挂载以前创建的文件系统:mount / dev / vg / mysqlbackup(这将允许您访问创建的数据的shapshot)。
现在您可以直接将此数据复制到第二台服务器到数据目录。在启动数据库之前,先将上述参数添加到my.cnf文件中,更改server-id的值。
现在,将主信息复制到某处并将数据库文件传播到slave,您可以删除master上的快照:lvremove -f / dev / vg / mysqlbackup。(/ p>
现在,您可以登录server2来检查权限(取决于用于复制文件的用户,您需要更正它),然后启动MySQL实例。数据库应该启动,执行InnoDB恢复(如果您已经签名),稍后,您将能够使用命令行客户端登录。由于skip-slave-start,您的slave将无法默认启动。
现在,在两台服务器上,您需要通过设置主主机名,主端口,密码,用户和有关位置的信息来配置复制线程:
将MASTER更改为master_host ='IP_addr_of_server1',master_port = 3306,master_user ='复制',master_password ='some_password',master_log_file ='info_from_MASTER_STATUS',master_log_pos ='info_from_MASTER_STATUS';
现在你可以开始复制了:START SLAVE;
检查以确保:SHOW SLAVE STATUS \ G(在新机器上)
Seconds_Behind_Master可能不等于0,因为在释放所有表之后对数据库进行了更改但是使用复制工作slave应该很快捕获master。
从服务器赶上master后,启动master-master(server1-server2)设置。锁定server2上的所有表(FLUSH TABLES WITH READ LOCK;)并运行SHOW MASTER STATUS;。在CHANGE MASTER TO上的server1设置复制 当然,您需要将master_host更改为有效的IP地址,master_log_file和master_log_pos值。之后,在server2上解锁TABLES,在server1上使用START SLAVE。
现在,您应该具有master-master-slave配置,并在server1和server2之间进行主 - 主复制。