在我们的数据中心断电后,从属 MySQL 数据库陷入困境。
这是其中一个奴隶的日志:
100118 10:05:56 [Note] Slave I/O thread: connected to master 'repl@db1:3306', replication started in log 'bin-log.004712' at position 724207814
100118 10:05:56 [ERROR] Error reading packet from server: Client requested master to start replication from impossible position ( server_errno=1236)
100118 10:05:56 [ERROR] Got fatal error 1236: 'Client requested master to start replication from impossible position' from master when reading data from binary log
100118 10:05:56 [Note] Slave I/O thread exiting, read up to log 'bin-log.004712', position 724207814
Run Code Online (Sandbox Code Playgroud)
控制台显示了更多细节: …
解释问题的背景:
我们有一个在 Linux 服务器上运行的本土 PHP 应用程序(用于运行在线语言学习课程),并在本地主机上使用 MySQL 来保存用户数据(例如,所采取的测试结果、提交的工作标记、在不同页面上花费的时间)课程等)。
由于我们有来自不同地理位置的学生,我们目前在这些位置(西班牙、英国和香港)附近托管了 3 个虚拟服务器,并且用户被添加到离他们最近的服务器(他们通过不同的 URL 访问,例如 europe.domain.com 、uk.domain.com 和 asia.domain.com)。这是有效的,但这是一个管理噩梦,因为我们必须记住特定用户在哪个服务器上,并且用户只能连接到一个服务器。我们希望以某种方式集中信息,以便所有用户在任何服务器上都可见,并且用户可以连接到 3 个服务器中的任何一个。
问题是,我们应该使用什么方法来实现这一点。这一定是很多人都遇到过的问题,但经过一番谷歌搜索后,我没有找到任何结论。我见过的最接近解决方案的是:
类似于 master-master 复制,但我已经阅读了很多帖子,表明这不是一个好主意,因为 auto_increment 字段之类的东西可能会破坏。
循环复制,这听起来很完美,但引用 O'Reilly 的高性能 MySQL,“一般来说,环是脆弱的,最好避免”
我们不反对在应用程序中重写代码以使其适用于所需的任何解决方案,但我不确定复制是否正确使用。
谢谢,
安迪
PS 我应该补充一点,我们尝试写入中央数据库,然后使用从本地数据库读取,但不同服务器之间的响应时间非常糟糕,而且写入的数据可以立即读取也很重要,因此如果复制是太慢这可能会导致返回过时的数据。
编辑:我一直在考虑编写我自己的基本复制脚本,其中包括让每个用户都有一个服务器 ID 来说明哪个是他的“家庭服务器”,例如亚洲的用户将被标记为将香港服务器作为他们自己的服务器. 然后复制脚本(这将是一个设置为合理频繁地作为 cron 作业运行的 PHP 脚本,例如每 15 分钟左右)将在系统中的每个服务器上独立运行。他们将遍历数据库并将有关用户的任何信息分发到系统中的所有其他数据库,并将“主服务器”设置为运行脚本的服务器。他们还需要吸收已添加到“家庭服务器”所在系统上的任何其他数据库中的新信息。flag 是运行脚本的服务器。我需要弄清楚细节并建立逻辑来处理冲突,但我认为这是可能的,但是我想确保没有正确的解决方案已经存在,因为它似乎必须是许多人已经遇到的问题。
我正在寻找有关如何提高 mysql 从站复制速度的指针。它对于正常生产来说足够快,但如果由于某种原因落后,则需要很长时间才能赶上。(如果服务器关闭或复制停止了几个小时等)
一些数据:
可以做些什么来提高这个速度?
(是的,改进硬件是一种选择,但我们希望确保在花费大量资金之前检查过其他选项)
编辑:
回复@3molo 问题的一些数据:
如果瓶颈是磁盘(6 个磁盘 raid 10 设置),除了增加 raid 之外还有其他选择吗?还是我们必须这样做?
我只是花了几个小时构建一个新的数据库服务器来替换mysqldump一个月前创建的文件中的2 个失败的服务器,然后使用我的服务器的 bin-logs 将其mysqldump更新。现在我有这个新的数据库服务器在线,并且已经运行了几天,我需要完成服务器设置并重新实施备份策略。
我需要将(至少)一个 MySQL Replication Slave 联机以供新服务器使用,并开始创建可用备份以备再次失败时使用。
在我进一步行动之前:
innodb-file-per-table选项my.cnf。二进制日志现在在新的 MySQL 服务器上启用,但 inno file per table 选项几乎是一个非修复,直到我可以导入另一个逻辑备份(我可能最终会启动第二个从站,并提升第一个从站掌握并放弃当前的主人 - 因为配置不是我需要的地方)。所以,问题是:
我需要备份 MySQL 服务器,但我不能让新的 MySQL 服务器脱机。我需要继续进行写入,并在几乎没有停机时间的情况下提供读取服务。这种“几乎没有停机时间”的要求被定义为少于 10 分钟。我的数据目前在服务器上使用了大约 100GB 的空间(mysql 数据文件),逻辑备份大约是 50GB(这是很多索引......哈哈)。我不关心这个备份是合乎逻辑的,还是从 MySQL 数据目录中复制一份数据文件。在线后,我可以从从属设备创建逻辑备份。
而且,问题是:
您将如何创建这个所需的备份?我知道这并不容易,很多人会说这是不可能的。但我拒绝相信这是不可能的,必须有办法完成它。
关于服务器的说明:它运行的是 Ubuntu 10.04、MySQL 5.1.41,并且存储数据的文件系统是 ext3。服务器在 Rackspace Cloud 上运行,所以文件系统几乎“就是它本来的样子”,除非我可以重新分区根设备并使用另一个 FS(可能是 XFS?)重新分区来做快照。
我读过Perconas XtraBackup Tool,但它只适用于 InnoDB 表。他们有一个 MyISAM …
mysql backup mysql-replication incremental-backup database-backup
问题的根源:在正在运行的主机上创建从机的所有说明中都需要flush tables with read lock. 我们使用MyISAM,所以我们不能只使用--single transaction 来获得一致的表数据。
奴隶因各种“正常”原因而失败——平均每周一次。所以我关闭了站点,使用读取锁定主数据库刷新表,mysqldump(单个事务,带有主记录),推送到从属,重置主(带有日志位置),并启动从属等。
为了在不停机的情况下做到这一点,我尝试了基本相同的步骤,然后使用START SLAVE UNTIL- 然后在运行 SELECT MASTER_POS_WAIT(); 时暂停实时数据库几秒钟;在奴隶上。我似乎无法让奴隶追上来。
为了让从数据库再次赶上主数据库,以下步骤中遗漏了什么(或不必要的)?一个简单的start slave工作?
#!/bin/bash
##
mysqldump --allow-keywords --add-drop-table --comments --extended-insert --master-data \
--debug-info --single-transaction -u $LOCALDB_USER_NAME -p$LOCALDB_PASS $LOCALDB_NAME > $DBFILENAME
## get master position from file for use later
echo
echo "############# MASTER STATUS #############"
cat $DBFILENAME | grep "CHANGE MASTER"
echo
echo "compressing"
gzip $DBFILENAME
echo "sending to $REMOTE_SERVER"
[...]
echo "uncompresing remote db"
sudo ssh $REMOTE_SERVER_USERNAME@$REMOTE_SERVER "cd …Run Code Online (Sandbox Code Playgroud) 我正在设置一个 MySQL 主数据库,它复制到几个从数据库。
我的问题是监视和/或测试从属数据库是否是最新的最佳实践是什么,并且在出现导致复制停止的错误时会提醒管理员。
我已经搜索了监控工具,但找不到任何合适的工具。
此外,测试从站之间同步的“最佳实践”方法是什么。有没有类似 db 复制的单元测试?
如果我对此事的无知冒犯了任何人,我深表歉意。
我们的主服务器上只有 450 GB 的 nvme 空间,并且二进制日志使用了大量空间,即使它们只保留了两天。
将 MySQL 二进制日志写入较慢的磁盘(如远程目录)是否会降低 MySQL 的性能?
我正在配置 MySQL 复制并打算使用基于行的复制,但我也在阅读基于混合的复制。
这是基于语句的默认设置,然后在某些情况下(http://dev.mysql.com/doc/refman/5.1/en/binary-log-mixed.html)MySQL将切换到基于行。
该列表何时切换到基于行的内容非常多。
我的问题是:
有人混合使用吗?如果是,你为什么选择这个而不是只使用一个?
提前致谢
我有一个 mysql 只读复制从属设置,目前正在为大约 10 个数据库工作,我需要添加 3 个新数据库。我找不到有关如何添加其他信息的任何信息。有没有人对如何做到这一点有一些指导?
谢谢。
我正计划复制 Web 服务器以实现高可用性目的。该服务器在 Hyper-V 中作为 Ubuntu 15.04 虚拟机运行,并安装了 MariaDB 10.0、Apache 2.4 和 PHP-FPM 5.6。
第二个虚拟机将作为该虚拟机的直接副本启动,但位于美国。第一个虚拟机位于欧洲。(延迟约为 80-120 毫秒)
我想让服务器保持同步,以便它们都可以向我的客户端提供相同的内容,并且客户端将使用最近的服务器(为此我将使用 Route 53)
服务器之间的数据交换是安全的,这很重要,以保护数据库中的联系方式和其他信息,并防止更改 /var/www 目录中的文件。
我已经考虑为此使用以下选项:
SSL(TLS)
我已经考虑使用 SSH 进行数据库和文件复制。但是我不确定文件复制部分使用哪个应用程序。
SSL 可用于数据库复制,但它需要生成需要时不时更换的证书,这可能会花钱。
我的最后一个选择是使用 openvpn,但我不确定是否可以将其设置为附加网络,而不是通过它路由我的所有流量。这个方法好像也需要生成证书文件。。
mysql ubuntu mysql-replication replication high-availability