我有一个 MongoDB 集群,我不小心弄了一个分片,我没有备份。恢复数据很容易,但是在发出 removeShard 命令后,它说它正在耗尽。但是,分片无法访问,并且将永远无法访问(我不再访问云IP地址,数据也没有了)。我只想告诉 mongo 永远忘记碎片。这可能吗?即你可以从 mongo 中删除一个分片而没有配置控制器访问它吗?
我有一个 Postgres 数据库,它已经增长到无法将所有内容存储在单个数据库节点上的大小。Customer我的架构中有一个表,其中每一行代表一个(惊喜!)客户。我的数据库中的每个其他表都是这个客户表上的外键,我想沿着客户范围对我的数据库进行分片。例如,我希望id1 - 100 的客户转到数据库节点 A,101 - 200 转到数据库节点 B,依此类推。
我找到了有关表分区的信息,但我发现很少有其他内容可以向我展示如何在 Postgres 中启用数据库分区。
在 Postgres 中分片数据库有哪些选择?如果无法进行分片,我的替代方案是什么?
在我的 mongodb 设置中,我有一个复合分片键{"region" : 1, "foo" : 1, "bar" : 1},我知道值区域可以是,并且每个区域应该在一个块上。
因此,我只想根据区域键进行预拆分。之后的分片状态应如下所示:
{ "region": { "$minKey" : 1 }, "foo": { "$minKey" : 1 }, "bar": { "$minKey" : 1 } } -> { "region": region1, "foo": { "$minKey" : 1 }, "bar": { "$minKey" : 1 } } on: shard1
{ "region": region1, "foo": { "$minKey" : 1 }, "bar": { "$minKey" : 1 } } -> { "region": region2, "foo": { "$minKey" : 1 }, "bar": …Run Code Online (Sandbox Code Playgroud) 我正在运行一个 mongo 集群。
块大小设置为 300 MB,但今天早上它在日志中显示块大小为 1024 字节。我检查了当前操作,它也显示了 1024 字节的块。我已经检查过 monos 并且所有配置服务器的块大小都是 300 MB。
请帮助我解决问题,因为它突然使我的分片设置失败。
这是 currentOp 的日志
{
"opid" : "shard0000:-1945000000",
"active" : true,
"secs_running" : 0,
"microsecs_running" : NumberLong(72072),
"op" : "query",
"ns" : "DB20150102.locationCount",
"query" : {
"splitVector" : "DB20150102.locationCount",
"keyPattern" : {
"articleId" : 1,
"host" : 1
},
"min" : {
"articleId" : { "$minKey" : 1 },
"host" : { "$minKey" : 1 }
},
"max" : {
"articleId" : { "$maxKey" : 1 …Run Code Online (Sandbox Code Playgroud) 做了所有正确的事情 - 选择了一个合适的分片键,水平扩展,将我的数据分布在几个分片中,我发现我现在没有真正的方法来确定数据在文档计数和数据大小方面的平衡程度。该sh.status()命令将告诉我块是如何根据计数分布的,但不会告诉我这些块是由什么组成的。
有很多方法可以推断出这些东西——但它们都有一个缺点。数据库大小计算方式的变幻莫测意味着如果数据库中有大量删除,统计数据可能无法准确反映数据分布。如果我查看每个分片的流量,这可能会给我一些线索,但前提是我的流量良好且可预测。
那么,我如何确定每个块中文档的分布、每个块的相对大小以及(当然)这些块当前所在的位置?
我有一个非常简单的 MongoDB 数据库结构。另外我有 5 个分片(其中 3 个是副本集)。但是我们正在测试数据库加载,目前似乎没有启用分片平衡。
在mongos我检查了下一个:
mongos> sh.getBalancerState()
true
mongos> sh.isBalancerRunning()
false
Run Code Online (Sandbox Code Playgroud)
我无法将 BalancerRunning 设置为 true。我试过:
sh.startBalancer()
Run Code Online (Sandbox Code Playgroud)
请帮助我为我所有的分片启动它。谢谢你。
我设置了 3 个分片,但容量不足,所以我又添加了 3 个分片。(每个分片都是一个副本集)。但是数据并没有均匀地分布在集群中。我的 chunkSize 设置为标准的 64mb:
mongos> db.settings.find( { _id:"chunksize" } )
{ "_id" : "chunksize", "value" : 64 }
Run Code Online (Sandbox Code Playgroud)
我认为这意味着当一个块达到 64mb 时,它会分成两个大小为 32mb 的相等块。这就是这里所展示的。那不正确吗?
这是我的分片分布:
mongos> db.accounts.getShardDistribution()
Shard rs_0 at rs_0/mongo_rs_0_member_1:27018,mongo_rs_0_member_2:27019,mongo_rs_0_member_3:27020
data : 137.62GiB docs : 41991598 chunks : 1882
estimated data per chunk : 74.88MiB
estimated docs per chunk : 22312
Shard rs_1 at rs_1/mongo_rs_1_member_1:27018,mongo_rs_1_member_2:27019,mongo_rs_1_member_3:27020
data : 135.2GiB docs : 41159069 chunks : 1882
estimated data per chunk : 73.56MiB
estimated docs per chunk …Run Code Online (Sandbox Code Playgroud) 所以我有一个带有多个 CPU 内核的服务器,它安装了一个数据库。你认为如果我们用docker安装多个数据库(数据分片),那么每个请求都会去不同的数据库是个好主意吗?每个数据库中的数据都不同,并且根据来自客户端的请求,它将查询不同的数据库。
我不知道这会比包含所有数据的专用数据库更糟糕吗?
performance sql-server optimization clustering sharding query-performance
JDBC 4.3 更新随 Java 9 2017-10一起发布。它的几个变化之一是关于和方法发出信号\xe2\x80\xa6 的新功能ConnectionbeginRequestendRequest
\n\n\n向驱动程序提示一个请求(一个独立的工作单元)正在此连接上开始。每个请求都独立于客户端或服务器上连接的本地状态的所有其他请求。beginRequest、endRequest 对之间完成的工作不依赖于连接上完成的任何其他工作,无论是作为另一个请求的一部分还是在任何请求之外。一个请求可能包含多个事务。可能存在对已提交数据库状态的依赖性,因为它不是连接本地的。
\n
\xe2\x80\xa6 和 \xe2\x80\xa6
\n\n\n\n\n\xe2\x80\xa6 是可选的,特定于供应商的,并且应该在很大程度上是透明的。
\n
\xe2\x9e\xa0 请解释一下此功能的用途。
\n\n它似乎是关于比事务更大的事情,但与两阶段提交无关。与JDBC 4.3 的主要新特性sharding有关吗?
\n\n我并不是在询问这些数据库是否已针对 JDBC 4.3 更新了JDBC 驱动程序。我问的是更大的情况,在跨连接的数据库连接上下文中“请求”的含义和目的是什么。
\n\n奇怪的是,JDBC 4.3 规范只提到了这一点,没有任何解释:
\n\n\nJDBC API 更改
\n\n对现有 JDBC 接口进行了以下更改。
\n\n\n\n
java.sql.Connection添加了方法 …
sharding ×9
mongodb ×6
postgresql ×2
clustering ×1
java ×1
jdbc ×1
optimization ×1
partitioning ×1
performance ×1
scalability ×1
sql-server ×1