标签: sharding

具有 SQL Server 2016、Shard 的多租户系统是否应该通过每个租户的单独数据库进行租户隔离?

鉴于用例:

  • 租户数据不应串扰,一个租户不需要另一个租户的数据。
  • 每个租户都可能拥有大量的历史数据。
  • SQL Server 托管在 AWS EC2 实例中。
  • 每个租户在地理上都很遥远。
  • 有意向使用第三方可视化工具,如 PowerBI Embedded
  • 数据量预计会随着时间的推移而增长
  • 系统的成本受到限制。
  • 解决方案必须是可维护的,无需 24/7 全天候生产 DBA
  • 该解决方案应该能够水平扩展。
  • 租户总数少于50人

推荐的架构是什么,此用例是否有任何参考实现?我相信很多人可能已经在企业软件开发中遇到过这个问题。

我认为这与在多租户数据库架构中处理越来越多的租户不同。该问题中提到的用例涉及更多租户,这与拥有很少 (50) 个大租户有很大不同。提到的架构可能是这里的一个解决方案,这也是我想了解的更多信息。

database-design sql-server scalability multi-tenant sharding

13
推荐指数
3
解决办法
9066
查看次数

MongoDB:在应用服务器上共同定位 mongos 进程

我想问一个关于本文档中描述的最佳实践的问题:

http://info.mongodb.com/rs/mongodb/images/MongoDB-Performance-Best-Practices.pdf

使用多个查询路由器。使用分布在多个服务器上的多个 mongos 进程。一个常见的部署是将 mongos 进程共置在应用程序服务器上,这允许应用程序和 mongos 进程之间进行本地通信。 mongos 进程的适当数量将取决于应用程序和部署的性质。

只是关于我们部署的一点背景知识。我们有很多应用服务器节点。他们每个人都使用无状态 RESTful WS 运行一个基于 JVM 的进程。正如这个最佳实践所建议的那样,每个应用程序服务器节点都运行自己的mongos进程,这意味着 JVM 进程的数量总是等于进程的数量mongos

所有mongos进程都连接到 3 个配置服务器和几个 mongo 分片(每个分片内都有副本集)。即使我们使用的是分片部署,我们并没有真正对我们的集合进行分片。事实上,我们有大量的数据库,它们在创建期间分布在所有分片上(这是我们目前分片的主要用例)。

由于最佳实践还表明“适当数量的 mongos 进程将取决于应用程序和部署的性质”,因此我开始怀疑我们的使用mongos是否真的合适,或者如果我们拥有多个专用mongos节点并让我们的应用服务器无需在mongos本地运行即可连接到它们。

对于决定多少个mongos实例与应用服务器实例数量或 MongoDB 集群的大小相关的最佳方法,您有什么看法?

最近,我们开始研究无状态 Web 服务的集群管理,我指的是 Docker、Apache Mesos 和 Kubernetes 等工具。如果我们使用 Docker,那么通常不鼓励在容器内运行多个进程的做法。考虑到这一事实,确保应用服务器容器和mongos容器始终位于同一物理节点上并具有相同数量的进程变得非常困难。这让我怀疑这个最佳实践是否仍然适用于我刚刚描述的集群架构。如果没有,您能否建议mongos在此架构中定位和部署流程的更好方法是什么?

mongodb best-practices deployment sharding docker

12
推荐指数
2
解决办法
6911
查看次数

有效处理10-1亿行无关数据行表

提高多达 1 亿行的表的读/写性能的常用方法是什么?

表有 column SEGMENT_ID INT NOT NULL,其中每个段有大约 100.000-1.000.000 行。写入 -SEGMENT_ID一次插入所有行,SEGMENT_ID之后不更新。读取 - 非常频繁,我需要良好的SELECT * FROM table WERE SEGMENT_ID = ?.

最明显的方法是SEGMENT_ID动态创建新表,但动态表意味着使用 ORM 甚至本机 SQL 查询框架进行黑客攻击。换句话说,你完成了有味道的代码。

您也可以使用分片,对吗?数据库是否在幕后创建新表?

我可以通过SEGMENT_ID. 但是,如果我一次插入所有与段相关的数据,我的插入是否会聚集在一起?

Postgres 还建议使用分区来处理非常大的表

也许有某种神奇的索引可以帮助我避免动态创建新表或配置分片?

还有其他选择吗?

postgresql performance partitioning sharding performance-tuning

12
推荐指数
2
解决办法
3万
查看次数

mongodb 分片块迁移 500GB 需要 13 天 - 这是慢还是正常?

我有 mongodb 分片集群,分片键是散列的。它有 2 个分片副本集。每个副本集有 2 台机器。

我通过添加另外 2 个分片副本集做了一个实验,它开始重新平衡。

然而,一段时间后我发现块迁移相当缓慢。移动 1.4GB 数据需要 1 小时。

这让我很担心,这意味着我必须等待 13 天才能完成 500GB 的块迁移!

我是这个东西的新手,无论是慢速、快速还是正常,我都没有上帝的感觉。但是,这些数字仍然不能说服我。

关于实验的附加说明: - 使用 m3 中型 aws 机器 - 没有其他进程在运行,只有块迁移 - 默认的 mongodb 分片安装,无需进一步配置 - shardkey 在对象 id (_id) 处使用散列 - 最大块大小 64MB

mongodb sharding

9
推荐指数
1
解决办法
4433
查看次数

mongodb 找不到匹配读取首选项 { mode: \"primary\" } 的主机?

我正在部署一个 monodb 分片,我在三台机器上部署了一个副本集:

dev41:27017,dev42:27017,dev193:27017
Run Code Online (Sandbox Code Playgroud)

configsvr在三台机器中:

dev41:27019,dev42:27019,dev193:27019
Run Code Online (Sandbox Code Playgroud)

还有机器中的mongos:

dev41:28000
Run Code Online (Sandbox Code Playgroud)

最后,我尝试将我的副本添加到 mongos 中:

mongo dev41:28000/admin
sh.addShard('rs0/dev41,dev42,dev193')
Run Code Online (Sandbox Code Playgroud)

然后我得到了错误:

{
    "ok" : 0,
    "errmsg" : "could not find host matching read preference { mode: \"primary\" } for set rs0",
    "code" : 133
}
Run Code Online (Sandbox Code Playgroud)

replication mongodb sharding

9
推荐指数
1
解决办法
3万
查看次数

验证 mongos 服务器是否连接到配置服务器

我一直在为分片副本集编写备份脚本,它几乎完成了。除了在一切都说完之后,我似乎无法让它成功启动平衡器备份。

这是我试图用来启动平衡器备份的命令;请记住,这是通过 SSH 在实际的 mongos 服务器上运行的。

sudo -s
mongo -u username -p password --authenticationDatabase db
use config
sh.setBalancerState(true)
exit
exit
exit
Run Code Online (Sandbox Code Playgroud)

每当脚本遇到startBalancer运行上述代码的函数时,我都会收到以下错误。

SyncClusterConnection::udpate prepare failed:  mongo-conf-0.foo.bar.com:27019:10276 
DBClientBase::findN: transport error: mongo-conf-0.foo.bar.com:27019 
ns: admin.$cmd query: { resetError: 1 }
Run Code Online (Sandbox Code Playgroud)

我试过检查mongoshell 进程的退出状态,使用类似

sudo -s
mongo -u username -p password --authenticationDatabase db
use config
sh.setBalancerState(true)
exit
exit
exit
Run Code Online (Sandbox Code Playgroud)

但不管 mongo-shell 中实际发生了什么,退出代码似乎总是 0。

关于如何在尝试重新启用平衡器之前验证 mongos 进程是否实际连接到所有三个配置的任何想法?我认为问题在于 mongos 服务器在 mongod 进程有机会完成启动之前尝试连接到配置服务器(分片副本集的备份过程的一部分正在关闭其中一个配置服务器

mongodb sharding

8
推荐指数
1
解决办法
2934
查看次数

MongoDB --- 全局初始化失败:无法打开“/var/log/mongodb/mongod-config.log”

我正在尝试为 mongodb 分片设置配置服务器。我创建了一个特定的配置文件,该文件设置为登录到/var/log/mongodb/mongod-config.log.

当我运行时mongod --config <path-to-config-file>,我收到此错误:

`F CONTROL  [main] Failed global initialization: FileNotOpen: Failed to open 
"/var/log/mongodb/mongod-config.log"`
Run Code Online (Sandbox Code Playgroud)

当我运行相同的命令但使用 时sudo,它运行但没有输出。

但是当我尝试在我的配置文件指定的端口 (27019) 上启动 mongo shell 时,我得到了这个:

MongoDB shell version v3.6.4
connecting to: mongodb://127.0.0.1:27019/test
2018-05-01T03:13:13.399+0000 W NETWORK  [thread1] Failed to connect to 
127.0.0.1:27019, in(checking socket for error after poll), reason: Connection 
refused
2018-05-01T03:13:13.400+0000 E QUERY    [thread1] Error: couldn't connect to 
server 127.0.0.1:27019, connection attempt failed :
connect@src/mongo/shell/mongo.js:251:13
@(connect):1:6
exception: connect failed
Run Code Online (Sandbox Code Playgroud)

我只是在关注MongoDB 分片文档

我在这里看到了一些以前的帖子,其中一个是同样的问题 …

mongodb configuration sharding

8
推荐指数
1
解决办法
3万
查看次数

横向扩展 SQL Server 并在多台机器上同步数据

我没有数据库架构方面的专业知识,而且我每天都在自学新东西。我想制作一个使用 SQL Server 作为数据存储的 Internet 规模的应用程序。我还没有在网上找到任何关于横向扩展 SQL Server 的好信息。

我的理解是横向扩展对写入吞吐量很有好处,但不一定能扩展读取。一个简单的例子(在我的情况下是相关的)是,如果数据是通过发布用户 ID 进行分片的,那么居住在分片 A 中的用户 X 发布的状态 1 将在整个联盟中拥有它的所有喜欢和评论。所以,如果我需要获取关于这个状态的评论,我需要点击每个数据库并在应用程序内存中合并和排序/过滤结果。这对数据库不利,因为它们一直很忙,对 Web 服务器不利,因为我将使用 CPU 和 RAM 对对象进行后处理。理想情况下,我想写入一个数据库并从一个数据库中读取以获得最大的可扩展性。

现在,我想做的是,不是通过发布用户 ID 进行分片,而是通过接收用户 ID 进行分片。因此,如果用户 X 发布状态 1,居住在分片 B 中的用户 Y 可以在分片 A 中插入评论,我可以在状态和评论之间强制执行父子关系。居住在分片C的用户Z可以在分片A中为评论插入一个赞,这样评论等就可以构成亲子关系。这种方法的好处是我只查询一个数据库来获取特定状态的所有评论和喜欢,而不是天真地查询每个分片。

但是,我需要得到诸如“男性或 18 岁以上的人对状态 1 的评论”之类的结果。这是我想要实现的一个关键功能。我仍然需要点击其他数据库来获取有关用户的信息。为了消除这种情况,我正在考虑创建一个同步组,其中一个数据库(集线器)将所有用户增量同步到所有分片(每 5 分钟)。我对最终一致性没问题,尽管它有自己的问题,例如,如果用户删除他们的帐户,从删除帐户到增量持久化到分片的时间,其他用户将看不到可能添加的更改子对象到该用户创建的对象。在我看来,这似乎是一个数据完整性问题。

我也知道通过复制和缓存来增加读取吞吐量。

我的问题是,我应该采用哪种方法?如果我选择第二个,我会在数百或数千台服务器之间同步数据吗?更不用说集线器本质上是单点故障。

sql-server data-synchronization sharding

7
推荐指数
1
解决办法
3232
查看次数

Mongos 不返回分片中的现有数据

所以我们有 2 个分片(每个是一个副本集)和一个分片集合的配置。

每个分片中大约有 1000 万条记录。我们使用的是 mongo 2.6.4 版本。我们已经使用hash_id分片键进行分片,我们为分片生成了特定的分片键。

我们正在通过idmongos中获取数据,并且大多数查询都有效,但是对于某些查询(大约 10k)mongos 返回null,尽管它们存在于分片之一中,我们可以直接从分片中获取它。

有谁知道为什么 mongos 或配置服务器没有某些 id 的信息,有没有办法修复它?是否有任何类型的操作可以刷新配置服务器中的数据以获取有关数据库中所有记录的信息?

谢谢,伊万

mongodb sharding

7
推荐指数
1
解决办法
432
查看次数

横向扩展SQL Server,分片分布式数据库

我想知道是否有任何方法可以跨多个节点分发 SQL Server(我使用的是 2012 版)数据库。我正在尝试比较 SQL Server 和 MongoDB 之间的 READ 查询性能。该发行版全部使用具有使用虚拟机的不同分片的 MongoDB 进行设置,我想为 SQL Server 进行类似的设置,但是我遇到了很多麻烦。

有没有关于如何做到这一点的材料?这个过程有看起来那么艰难吗?

performance sql-server distributed-databases sql-server-2012 sharding performance-testing

7
推荐指数
1
解决办法
2万
查看次数