我正在运行一个连接到 SQL 主机的服务器。我还有另一台服务器,我决定将其作为 SQL 备份运行。所以我有 3 台服务器。Srv A 是 SQL 主机,srv B 是备份。
我知道有 mysql 复制,但这根本不是我喜欢的(如果我错了请纠正我)。我想要分布式的东西,所以如果 srv A 恢复,它不会覆盖 srv B 停机期间构建的数据库。我只有 3 台服务器,所以设置集群不是一个选择。
如果有人能帮助我我会很高兴。
答案1
使用主从配置并从从属服务器获取备份是 MySQL 数据库的一个相当标准的策略。在故障转移和故障回复的恢复阶段,会处理保护数据免遭覆盖的过程。
通常,您会使用从属服务器 B 以一致的方式对数据库进行完整或增量备份 ( mysqldump -h serverB --all-databases --lock-tables --other-options
),而不会在转储期间通过锁定影响主数据库。这很有用,因为从属服务器是主服务器的相同副本。
首先,使用 mysql bin-log 指令配置主服务器 A,以使从服务器 B 可以进行复制,还可能包括从服务器 C、D 等。
但是从属 B 也配置为保留事务的 bin-log。(通常为空,因为它不应该记录复制更新,除非您正在链接从属)
一旦服务器 A 出现故障,主角色就会转移到服务器 B,并且服务器 B 现在开始记录到其自己的 bin-log 文件。在此刻故障转移操作中,您将手动禁用从 A 到 B 的复制,( mysql -h serverB -e 'stop slave'
)因为正如你提到的,您希望保护 B 免受服务器 A 故障的影响。
我所说的“主角色从服务器 A 移动到服务器 B”是指您将更改应用程序以将 CRUD 操作(创建、替换、更新、删除)写入服务器 B 地址。例如mysql -h serverB -e 'INSERT INTO table X'
。在 2 节点设置中,您还将迁移 SELECT 查询,因为您没有与主角色不同的集群只读角色。
现在系统管理员的任务是使 A 重新上线作为 B 的从属。
如果是一次干净的故障,A 现在比 B 落后一些事件,但 B 上的 binlog 包含这些事件的记录。因此,您可以将 masterB 的 binlog 重播到 slaveA 上(它包含基本的 SQL 语句)
如果服务器 A 被彻底摧毁,你可以选择使用从 B 获取的完整备份将 mysql 恢复到 A,可以使用最近的转储,或者使用来自xtrabackup 软件包。
您现在应该以相反的方向配置复制,以允许 slaveA 从 masterB 复制。
现在 A 和 B 应该相同了。如果您有充分的理由,例如从属 A 是一台规格更高的机器,那么您现在可以切换复制方向以恢复主 A-从属 B 配置。
处理这种情况(故障转移和故障恢复)的其他策略包括嗯、多主复制,或Percona 复制管理器工具(我还没有在生产中尝试过)
答案2
我只有 3 台服务器,因此设置集群不是一个选择。
如果您在它们之间传递数据,那么根据定义,它们就是一个集群。集群正是您所描述的目标。在 MyQL 中,有一种非常具体的配置类型,称为 NDB 集群 - 这可能不是适合您的解决方案。
因此,如果 srv A 恢复,它不会覆盖 srv B 停机期间构建的数据库
仅当您使用自动增量列或从序列生成的其他值时它才会这样做 - 并且 mysql 具有特定的功能来避免这种情况。
我正在运行一个连接到 SQL 主机的服务器。我还有另一台服务器,我决定将其作为 SQL 备份运行。所以我有 3 台服务器。Srv A 是 SQL 主机,srv B 是备份。
我不明白——您有三台数据库服务器吗?还是两台?
无论如何,您需要将它们设置为具有异步复制的主-主对(而不是主从)。如果您想添加第三个节点,则仅将其添加为从属节点。这样就不必担心在发生故障时升级从属节点 - 您只需将流量路由到另一个节点(这对于备份和架构更新也很方便)。有很多方法可以实现这一点 - 但最明智的方法是在客户端进行隔离或使用虚拟地址。
我不会在这里描述这个过程,因为篇幅有限,你需要确切了解你在做什么。互联网上也有很多指南——但你可能想去看看买一本好书(刚刚注意到 O'Reilly 有拿出了这个这更加贴切),并坚持那里描述的方法。