forked from serverdensity/mongodb-balance-check
-
Notifications
You must be signed in to change notification settings - Fork 0
/
balanced.py
70 lines (53 loc) · 1.85 KB
/
balanced.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import pymongo
from clint.textui import puts, indent, colored
def is_balanced(output=False):
connection = pymongo.Connection("localhost", 27017)
chunks = {}
nss = {}
# Loop through each of the chunks, tallying things up
for chunk in connection["config"]["chunks"].find():
if "ns" in chunk:
# Chunks per shard
if chunk["ns"] in chunks:
if chunk["shard"] in chunks[chunk["ns"]]:
chunks[chunk["ns"]][chunk["shard"]] = chunks[chunk["ns"]][chunk["shard"]] + 1
else:
chunks[chunk["ns"]][chunk["shard"]] = 1
else:
chunks[chunk["ns"]] = {}
chunks[chunk["ns"]][chunk["shard"]] = 1
# Total chunks for the ns
if chunk["ns"] in nss:
nss[chunk["ns"]] = nss[chunk["ns"]] + 1
else:
nss[chunk["ns"]] = 1
shardsCount = connection["config"]["shards"].count()
chunksCount = connection["config"]["chunks"].count()
# Different migration thresholds depending on cluster size
# http://docs.mongodb.org/manual/core/sharding-internals/#sharding-migration-thresholds
if chunksCount < 20:
threshold = 2
elif chunksCount < 80 and chunksCount > 21:
threshold = 4
else:
threshold = 8
isBalanced = True
balanceStatus = {}
# Loop through each ns and determine if it's balanced or not
for ns in nss:
balanced = nss[ns] / shardsCount
if output == True:
print ns
balanceStatus[ns] = True
for shard in chunks[ns]:
if chunks[ns][shard] > balanced - threshold and chunks[ns][shard] < balanced + threshold:
if output == True:
with indent(4):
puts(shard + colored.green(" balanced ") + "(" + str(chunks[ns][shard]) + ")")
else:
isBalanced = False
balanceStatus[ns] = False
if output == True:
with indent(4):
puts(shard + colored.red(" unbalanced ") + "(" + str(chunks[ns][shard]) + ")")
return { "isBalanced" : isBalanced, "chunks" : chunks, "balanceStatus" : balanceStatus }