我们的用户需要能够查询大部分是最新的数据库。数据可能会过时长达 24 小时,这是可以接受的。使用生产副本获取和保持第二个数据库最新的最低成本方法是什么?有没有我没有想到的方法?
我们有一个第三方应用程序用于监控股票交易活动。白天,作为各种工作流程的一部分,会发生许多小的变化(是的,这笔交易是有效的。不,这是可疑的,等等)。晚上,我们执行基于大集合的操作(加载前一天的交易)。
我们使用数据库快照。晚上 10 点,我们删除并重新创建快照。然后开始 ETL 处理。这显然对我们的磁盘造成了负担,但允许我们的用户能够在不锁定数据库的情况下查询数据库(他们使用 Access 前端)。他们在深夜和清晨使用它,因此他们会注意到停机时间。
这种方法的问题有两方面。首先,万一夜间处理失败,这种情况并不少见,我们可以恢复导致快照被删除的数据库。另一个问题是我们的处理时间超过了 SLA。在确定了写得不好的查询和缺乏索引后,我们正试图通过与供应商合作来解决这个问题。数据库快照也是造成这种放缓的罪魁祸首,这一点可以从存在与不存在时的速度差异中得到证明——我知道,这令人震惊。
我们打开了数据库集群,但这并没有解决使数据可用的需求,而且通常只会使管理员的生活变得复杂。它已被关闭。
我们上周开始研究复制。我们的理论是,我们可以建立第二个目录并与生产数据库同步。在 ETL 开始之前,我们将切断连接,只有在 ETL 过程完成后才重新启用它。
管理员从快照复制开始,但他担心需要多天的高 CPU 使用率来生成快照以及所需的磁盘消耗。他表示,它似乎在向订阅者发送之前将所有数据写入物理文件,因此我们的 .6TB 数据库将花费 1.8TB 的存储成本。此外,如果生成快照需要数天时间,则它不符合所需的 SLA。
阅读完这篇好文章后,似乎 Snapshot 可能是初始化订阅者的方式,但之后我们希望切换到事务复制以保持同步。我假设打开/关闭事务复制不会强制完全重新初始化?否则,我们将打破我们的时间窗口
我们的数据库处于完全恢复模式,因此数据库镜像是一种选择,但我对它的了解甚至比复制还要少。我确实找到了指示“数据库镜像阻止直接访问数据,镜像数据只能通过数据库快照访问”的SO 答案。
听起来日志传送也可能是一种选择,但这是我一无所知的另一件事。它会是比其他任何解决方案(实施和维护)成本更低的解决方案吗?基于 Remus 的评论“日志传送允许对副本副本进行只读访问,但在应用收到的下一个备份日志时(例如,每 15-30 分钟)将断开所有用户的连接。” 我不确定停机时间会转化为多长时间,因此可能会导致用户有些焦虑。
我上周末才听说使用Sync,还没有研究它。我不想为像这个问题那样具有高知名度的东西引入新技术,但如果它是最好的方法,那就这样吧。
我们在这里做了大量的 SSIS,所以生成几百个 SSIS 包来保持辅助同步对我们来说是一种选择,尽管这是一个丑陋的选择。我不喜欢这样做,因为我不希望我的团队承担很多维护开销。
过去,我听说我们的管理员使用一些 SAN 技术对整个磁盘进行即时备份。也许有一些 EMC …
普通的旧流复制。PostgreSQL:9.2.7 Windows 8.1 64 位
我的主要和次要集群在同一台Windows 机器上。我已经完成了pg_start_backup()和所有事情,所以两个节点都有完全相同的数据。
现在复制的问题是从服务器的“复制连接”无法连接到主服务器,但我可以使用 psql shell 使用相同的参数进行连接。我认为罪魁祸首是 slave 的 recovery.conf 中的连接字符串:
primary_conninfo = 'host = 127.0.0.1 port = 5432 user = postgres password = postgres'
Run Code Online (Sandbox Code Playgroud)
我尝试了 localhost, 0.0.0.0, lan IP 除了 pg log 之外的所有内容:
FATAL: could not connect to the primary server: FATAL: no pg_hba.conf entry for replication connection from host "127.0.0.1", user "postgres", SSL off
Run Code Online (Sandbox Code Playgroud)
现在看看我的Master的pg_hba.conf:
host all all 0.0.0.0/0 trust
host all postgres 127.0.0.1/0 trust
# IPv6 local connections:
host …Run Code Online (Sandbox Code Playgroud) 我们建立的复制已中断(在停机期间“请求的 WAL 段已被删除”)我们不能轻易地再次停止主服务器。
我们可以吗
pg_start_backup(),rsync ${PGDATA}/ 主人对奴隶, pg_stop_backup()...而master postgresql 仍处于满负荷状态?(或者会pg_start_backup()导致
换句话说,会不会pg_start_backup()影响我们的申请?
我的要求是:
目前,我们将高 CPU 超大实例的连接数最大化为 700。所有 8 个内核都已达到最大值。我们认为这是并发连接数,因为内存很好。写入本身非常简单(验证缓慢)。要扩展到 3000,我们需要转到多台服务器,当前选项:
要处理这个数量的连接,有几个问题:
如果我没有很好地描述我的问题,我深表歉意。请提问。
几个问题
Slave 条目是否会一直保留,直到对 Master 上的表进行可能影响 Slave 的插入/更新/删除操作?
如果没有,我如何确保从站与主站同步(通过删除从站条目或手动将该条目复制到主站)?
最重要的是,如何检测表不同步?
我正在开发一个在客户端 PC (Win) 上运行的应用程序,它配置了一个 MySQL 服务器 5.1 实例,它将充当远程主站的只读从站。远程主服务器有几十个模式,但我每个客户端只需要一个,所以我在 my.ini 中提供了replication-do-db设置以仅复制客户端需要的模式。复制有效,但是当我们的客户进入只能通过 3G 无线网络访问互联网的地区时,他们会迅速超出数据计划限制并遇到昂贵的问题。
据我了解,MySQL 将所有模式的所有事务写入单个 binlog 文件,这意味着每个客户端必须下载在主服务器上的每个模式上执行的所有事务,然后在下载后,对每个复制应用数据库过滤器 -客户端的 my.ini 文件中的do-db设置。
为了最大限度地减少这种低效率,我采用了slave_compressed_protocol = 1设置,这似乎将传输的数据减少了 50%,但仍然导致我们的客户快速超过他们的数据限制,从而增加了 3G 账单。
我无法想象我是唯一面临这个问题的人,所以我相信我会通过设置 x = y 来获得关于如何实现这一目标的大量答案。但是,我找不到有关此类设置的任何文档,也找不到推荐的方法。
到目前为止,这是我对可能解决方案的想法,请提供反馈或替代路线:
这应该导致客户端仅提取其架构的二进制日志数据。缺点(据我所知)是它极大地增加了我们设置的复杂性,可能使其更加脆弱。
想法?这种方法甚至会奏效吗?
请注意,我们在 RedHat 上运行 MySQL 5.0 服务器,但如果它产生解决方案,我们可以升级到 5.5。
MySQL 5.1.x | InnoDB | 视窗
我的 mysql 数据目录开始被 bin 日志填满。
我目前在 Windows mysql 服务器中配置了以下设置:
[mysqld]
log-bin
server-id=1
binlog-do-db=foodb1
binlog-do-db=foodb2
expire_logs_days=25
Run Code Online (Sandbox Code Playgroud)
我打算将 expire_logs_days 设置更改为expire_logs_days=10并退回 mysql 服务。进行此更改后,我希望旧的 bin 日志多久能清除。
这是否仅作为夜间计划任务的一部分完成?或者这应该是立即的?
我在主从设置中有 MySQL (5.5) 并创建了另一个从服务器。
我停止了原来的奴隶,转储了数据,复制并重新导入,它工作正常。我记下了原始从站的 master_log pos 并使用这些命令在新从站上设置它
CHANGE MASTER TO MASTER_HOST='<ipaddress>',
MASTER_USER='<username>', MASTER_PASSWORD='<password>',
MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000851',
MASTER_LOG_POS=15824150,
MASTER_CONNECT_RETRY=10;
Run Code Online (Sandbox Code Playgroud)
当我开始新的奴隶时,我得到了
Last_IO_Error:从二进制日志读取数据时从主服务器得到致命错误 1236:'日志事件条目超过 max_allowed_packet; 在 master 上增加 max_allowed_packet'
但是,当我启动原始从站时,它赶上了,现在处于同步状态。
所以问题:
当前值是16M,我怎么知道要走多大?(我宁愿避免在生产服务器上反复试验)。
为什么我需要在原来的奴隶应付得很好的情况下增加主人的价值,问题真的出在新的奴隶身上吗?
更新
我将 max_allowed_packet 增加到 1073741824,正如 Rolando 在 master、old slave 和 new slave 上建议的那样,并重新启动它们(SET GLOBAL max_allowed_packet = 1073741824;由于某种原因似乎没有采取)
现在最后一个IO错误和以前一样,但现在我明白了
Last_SQL_Error:中继日志读取失败:无法解析中继日志事件条目。可能的原因有:master的二进制日志损坏(可以通过运行'mysqlbinlog'查看二进制日志),slave的relay log损坏(可以通过运行'mysqlbinlog'查看relay log),a网络问题,或者 master 或 slave 的 MySQL 代码中的错误。如果您想检查主站的二进制日志或从站的中继日志,您将能够通过在此从站上发出“显示从站状态”来知道它们的名称。
如果我在 master 的文件上做一个 mysqlbinlog,它会很高兴地滚动过去很长时间的命令 - 文件是 722M - 如果我为从中继日志这样做,我会得到
错误:Log_event::read_log_event() 中的错误:“健全性检查失败”,data_len:38916267,event_type:69
错误:无法读取偏移量 253 处的条目:日志格式错误或读取错误。
我检查了变量,但更改有效
mysql> 显示变量 LIKE '%max_allowed_packet%';
在新的从站上显示max_allowed_packet …
语境:
假设在 Postgres 9.1 集群上使用流式复制/热备时,备用节点出现故障。它会停留一天,在此期间主服务器上会发生大量 DML。备用数据库的 recovery.conf 不包含“restore_command”条目(用于从 WAL 日志文件恢复),但包含“primary_conninfo”字符串(用于流式复制)。
题:
如果我在主服务器上更改一天后再次启动备用服务器。它是否会仅使用流式复制“赶上”(最终进入反映主服务器的状态)?或者我是否必须启用 WAL 文件归档并让它应用在中断期间归档的文件以确保货币?
我检查了WAL归档/流复制文档在这里,它说,你不必同时启用WAL归档和流复制,但目前还不清楚追赶是否会发生没有WAL文件归档被启用。
谢谢!
我有一个带有 VARCHAR(20) 列的大表,我需要将其修改为 VARCHAR(50) 列。通常,在此特定表上执行 ALTER TABLE(添加 TINYINT)大约需要 90-120 分钟才能完成,因此我实际上只能在周六或周日晚上执行此操作以避免影响数据库的用户。如果可能,我想在此之前进行此修改。
该列也被索引,我认为这会使 ALTER TABLE 变慢,因为它必须在修改列长度后重建索引。
Web 应用程序设置在 MySQL 复制环境中(26 个从站和一个主站)。我记得曾经在某处读到过一种方法是首先在每个从站上执行 ALTER TABLE(最大限度地减少对用户的影响),然后在主站上执行此操作,但那不会尝试将 ALTER TABLE 命令复制到从站吗?
所以我的问题是:对我来说,在对用户的干扰最小的情况下修改此表的最佳方法是什么?
编辑:该表是 InnoDB。
replication ×10
mysql ×6
postgresql ×3
mysql-5.1 ×2
mysql-5.5 ×2
alter-table ×1
binlog ×1
cassandra ×1
index ×1
innodb ×1
mongodb ×1
mysql-5 ×1
mysql-5.0 ×1
sql-server ×1