我正在运行一个连接到 SQL 主机的服务器。我有另一台服务器,我决定将其作为 SQL 备份运行。所以,我有 3 个。srv A 是 SQL 主机,srv B 是备份。
我知道有 mysql 复制,但它根本不是我喜欢的(如果我错了请纠正我)。我想要分布式的东西,所以如果 srv A 回来,它不会覆盖在 srv B 停机期间建立的数据库。我只有 3 个服务器,所以设置集群不是一个选项。
如果有人可以帮助我,我会很高兴。
我正在运行一个连接到 SQL 主机的服务器。我有另一台服务器,我决定将其作为 SQL 备份运行。所以,我有 3 个。srv A 是 SQL 主机,srv B 是备份。
我知道有 mysql 复制,但它根本不是我喜欢的(如果我错了请纠正我)。我想要分布式的东西,所以如果 srv A 回来,它不会覆盖在 srv B 停机期间建立的数据库。我只有 3 个服务器,所以设置集群不是一个选项。
如果有人可以帮助我,我会很高兴。
使用主从配置,并从从属服务器上取下备份是 MySQL 数据库的一个相当标准的策略。在故障转移和故障回复的恢复阶段解决了防止数据被覆盖的过程。
通常,您会使用从属服务器 B 以
mysqldump -h serverB --all-databases --lock-tables --other-options
一致的方式对数据库 ( ) 进行完整或增量备份,而不会在转储期间使用锁影响主数据库。这很有用,因为从服务器是主服务器的相同副本。首先,master A 配置了 mysql bin-log 指令,使复制对 slaves B .. 和潜在的 C、D 等可用。
但从属 B 也配置为保留事务的二进制日志。(这通常是空的,因为它不应该记录复制更新,除非你链接奴隶)
一旦 serverA 出现故障,master 角色将转移到 serverB,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 上的二进制日志包含这些事件的记录。因此,您可以将 masterB binlog 重播到 slaveA(它包含基本的 SQL 语句)
如果服务器 A 被完全破坏,您可以选择使用从 B 获取的完整备份,使用最近的转储,或使用xtrabackup 包中的 percona innobackex 脚本之类的工具,将 mysql 恢复到A。
您现在应该在相反的方向配置复制,以允许 slaveA 从 masterB 复制。
现在 A 和 B 应该是相同的。如果你有充分的理由,比如 slaveA 是一个更高规格的机器,那么你现在可以切换复制方向以恢复 masterA-slaveB 配置。
处理这种情况(故障转移和故障回复)的其他策略包括MMM、多主复制或percona 复制管理器工具(我没有在生产中尝试过)
如果您在它们之间传递数据,那么根据定义,它们就是一个集群。集群正是您所描述的目标。在 MyQL 中,有一种非常特殊的配置类型,称为 NDB 集群——这可能不是适合您的解决方案。
它只会在您使用自动递增列或从序列生成的其他值时执行此操作——而 mysql 具有避免这种情况的特定功能。
我不明白 - 你有三个数据库服务器吗?还是2?
无论您需要将它们设置为具有异步复制的主-主对(不是主从)。如果要添加第三个节点,则仅将其添加为从节点。这避免了在发生故障时升级从节点的担忧——您只需要将流量路由到另一个节点(它对于备份和模式更新也很方便)。有很多方法可以实现这一点——但最明智的方法是在客户端进行隔离或使用虚拟地址。
我不打算在这里描述这个过程,因为空间有限,你需要准确地理解你在做什么。互联网上也有很多指南——但您可能想去买一本好书(只是注意到 O'Reilly推出了这本更合适的书)。并坚持那里描述的方法。