阅读了Using Replication for Scale-Out,我如何将不同的查询路由到不同的服务器,例如,SELECT我想路由到从服务器和NON-SELECT主服务器。我假设作为负载均衡器我可以使用haproxy,但我没有发现可以在haproxy级别上区分查询?另外,假设有人直接到达了master,master如何识别这是SELECT查询和显示发送到slave,或loadbalancer。
我们正在运行的应用程序收集数据的速度比我们预期的要快得多。为了适应这一点,我们正在重新设计数据库。读完这个、这个和这个后,我不确定我们设计的最佳方法是什么......考虑到我们的硬件非常简陋。
三个主要表导致了问题:
目前我们只有一张表来存储数据。它们之间的关系是:
目前我们每天执行大约 100 次扫描。也就是说,每天向 VALUES 中插入大约 20,400,000 个项目。
我们正在考虑将 VALUES 表拆分为一个“VALUE_table_per_month”:
在这两种情况下,如果我们增加每天的扫描次数,似乎没有一个解决方案具有可扩展性。
此时,出于可扩展性的原因,将所有数据保存到集中式数据库中似乎不是最佳选择……但与此同时,分布式系统将显着增加加载时间。
什么是合理的方法?我确信我们不是第一个发现这个问题的团队!:P
编辑
每个查询读取多少数据?
这取决于扫描。并非所有扫描都具有相同数量的数据。范围变化如下:
该信息在前端呈现给最终用户。因此,我们将查询请求的方式拆分到后端,以避免服务器过载,但在某些情况下,由于 VALUES 数量较多,这还不够。
什么时候读取数据?
这完全取决于最终用户。有时他们每天会读 10 篇 SCANS,有时则不读,有时甚至每天读 …
如果我错了,请纠正我,但我想通过添加更多机器或平衡多个服务器之间的负载来处理更多请求和负载是水平扩展。那么,如果我添加更多服务器,我该如何分发数据库?我是否创建一个数据库来保存多台服务器的用户记录?还是我也要拆分数据库?数据库完整性如何?如何同步呢?不然我怎么办?我是一个新手,真的很困惑,但渴望学习。我想在我的项目中使用 postgres,并且想在开始之前了解一些基本的东西。我正在考虑使用两个小的 ec2 实例。但是我对数据库感到困惑。我如何着手创建数据库。我需要为此进行分片吗?根据 postgres,水平缩放的最佳方法是什么?如果您能向我解释一下,我将不胜感激。谢谢!
编辑:
如何使用多台机器进行负载均衡并管理数据库?
我有一个用户可以上传视频的应用程序,它将使用 Elastic Transcoder 转换为 mp4。用户约10k。那么,如何使用多台机器进行负载均衡并管理数据库呢?我想做的是性能负载平衡。我在很多帖子中读到添加更多机器可以利用它。所以我认为水平缩放。但是由于水平扩展很可怕,我如何负载平衡和管理我的数据库?
我有一个使用 Azure SQL 数据库的网站,我有一些问题:
我有一个相对较大的 4-deep 关系数据设置,如下所示:
client_applications: (可能有 1,000 条记录)
- ...
- account_id
-deleted_at
client_application_versions:(可能有 10,000 条记录)
- ...
- client_application_id
-deleted_at
cloud_logs:(可能有 1,000,000 条记录)
- ...
- client_application_version_id
-deleted_at
logs:(可能有 1,000,000,000 条记录)
- ...
- cloud_log_id
- time_stamp
-deleted_at
我仍在开发中,所以结构和设置不是一成不变的,但我认为设置没问题。使用 Rails 3.2.11 和 InnoDB MySQL。数据库充满了一个小的(与最终的数据库大小相比)数据集(logs只有 700,000 行)我有 4 个查询,其中 3 个有问题,以检索日志。
account_id, client_application_id, client_application_version_id(超过 100 秒)account_id, client_application_id(超过 100 秒)account_id(超过 100 …正如您可以在此处找到水平应用程序扩展的最佳实践,垂直扩展比水平扩展昂贵得多:
垂直扩展成本呈指数增长,而水平扩展成本是线性的。
为什么会这样?
垂直扩展意味着“为现有机器增加更多能力”,而水平扩展意味着“添加更多机器”。
在我看来,升级现有机器应该更便宜,因为有些部件已经存在,你只需要购买额外的处理器、内存等,而购买全新的机器应该会导致更高的成本。
我有一个用例,其中数据是多对多的,并且需要广泛的查询功能。
参与者和事件
一个用户/参与者可以注册多个事件。每个事件可以有很多参与者。这是一个多对多的关系。
考虑这样的数据集。
需要以下查询:
用于处理查询 1和查询 2
EventParticipantTable :(eventId,participantId):1000 x 10M 记录
这需要搜索 1000 x 10M 的记录吗?
数据集可以按 eventId 拆分为块,以使其理想地仅扫描 10M 记录,但不确定如何在 PostgreSQL 中处理。
用于处理查询 3
事件表 + EventParticipantTable 加入
这需要连接两个表,其中我首先获取即将发生的事件的 Events 表(基于开始和结束时间戳),并且对于每个匹配的 eventId 需要查找查询的参与者 ID 是否存在于 EventParticipantTable 中。
这需要搜索 1000 个事件 * (1000 * 10M) 个事件参与者表条目?
在这种情况下,每表 1000 x 10M 记录不是问题吗?
我正在评估 MySQL Cluster 作为 InnoDB 架构的可能替代品。到目前为止,我已经用 10s MB 的数据对其进行了测试,发现 MySQL Cluster 比 InnoDB 慢;但是,有人告诉我 MySQL Cluster 的扩展性要好得多。
需要多少数据才能显示 MySQL 集群与 InnoDB 模式的性能优势?或者,是否有更好的方式来展示 MySQL Cluster 的优点?
编辑
也许重要的一点是:我的集群目前是一个有 4 台机器的异构集群。在每台机器上,我都给了等量的数据和索引内存;分别为 4GB、2GB、2GB 和 1GB。这些机器运行 i7 并通过千兆局域网连接。NumOfReplicas 设置为 2。
编辑
此应用程序是一个使用率较低的分析数据库,它大约有 3 个表 >= 200M 行和 5 个表 <= 10K 行。当我们使用它时,运行我们的聚合函数需要 15 秒。我的老板让我研究 MySQL Cluster,看看我们是否可以提高性能,因为我们认为聚合函数可以很好地并行运行。
我很好奇如何扩展巨大的数据库,例如 facebook DB。我所知道的是,应用程序以某种方式部署到多个数据中心,这意味着每个数据中心中的每个“节点”都应该能够快速访问该大数据库。
首先,我无法想象他们如何部署,但这是另一个问题(我猜?)。
因此,如果我没记错的话,问题是这么多独立的节点如何访问庞大的数据库,并且一切都一致、稳定、性能良好且可扩展?
专门运行 PostgreSQL 11.2 服务器(带有 TimescaleDB 扩展)的 Ubuntu 18.04 服务器将很快耗尽磁盘空间,因此需要向计算机添加新的 SSD 磁盘以支持不断增长的数据库大小。
数据预计将以相同/更高的速率继续增加,因此需要不断增加存储硬件,直到机器用完 2.5 英寸驱动器托架。只有这时才会考虑将数据库分布在多台机器上,因为所涉及的复杂性增加。
想法
联合文件系统mergerfs可以将驱动器集中在一起,轻松解决存储扩展问题。但这会增加数据库操作的延迟,因此不建议这样做。可以通过底层 RAID-1/5/6/10 或使用 SnapRAID 添加冗余。
RAID-0 和 RAID-10 允许将 RAID 阵列扩展到新添加的驱动器中,并通过条带化提高性能。然而,每个添加的驱动器都会增加一个故障点。此外,许多人声称镜像 SSD 的用途有限,因为RAID-0 中的两个 SSD 可能会同时发生故障。所以也许这意味着 RAID-10 并不比 RAID-0 更好。此外,故障率随着每增加一个 SSD 而线性增加。
RAID-5/6 由于奇偶校验计算和写入 2 个驱动器而降低了性能,从而使有效 IOPS 降低了 75%。对于数据库来说似乎是一个糟糕的选择。
PostgreSQLTABLESPACES可用于将每个表分配到特定驱动器。然而,使用表空间会使恢复变得非常复杂。此外,是否可以在新驱动器上创建新表空间并让 Postgres 自动决定将新记录写入何处?
ZFS、BTRFS?对他们不熟悉,愿意探索他们是否合适。
问题: 2020年推荐的PostgreSQL机器扩容方法是什么,如果扩容频繁(一年1-2次),性能应该不会受到太大影响,恢复也不会太复杂可能会导致数据丢失?
RAID-10 对我来说似乎是一个好主意,但 RAID-1 的使用似乎有限,同时会导致“损失”一半的磁盘空间,随着驱动器数量的增加,故障点也会增加,情况会变得更糟。
由于预算限制,我们无法一次性将 2U 机箱中的 16 个驱动器托架全部装满 SSD,因此必须逐步完成。
任何意见是极大的赞赏!
编辑:在研究了 ZFS 之后,这似乎可能是我的案例的解决方案之一。
仅包含镜像 ZFS vdev(每个 …
scalability ×10
mysql ×4
postgresql ×3
innodb ×2
big-data ×1
cloud ×1
index ×1
ndbcluster ×1
raid ×1
replication ×1
tablespaces ×1
timescaledb ×1