in src/main/java/com/aliyun/openservices/log/sample/ShardBalanceTool.java [46:99]
public static void main(String[] args) throws LogException, InterruptedException {
int count = 24;
ArrayList<String> res = Split(count);
System.out.println(res);
Client client = new Client(endpoint, accesskeyId, accesskey);
while (res.size() > 0) {
ArrayList<Shard> shards = client.ListShard(project, logstore).GetShards();
System.out.println("list shards: " + shards);
HashSet<String> eraseHash = new HashSet<String>();
for (Shard shard : shards) {
if (shard.getStatus().compareToIgnoreCase("readwrite") == 0) {
for (String hash : res) {
if (shard.getInclusiveBeginKey().compareToIgnoreCase(hash) != 0 && Contain(shard.getInclusiveBeginKey(), shard.getExclusiveEndKey(), hash)) {
System.out.println("split shard: " + shard.toString());
client.SplitShard(project, logstore, shard.GetShardId(), hash);
eraseHash.add(hash);
break;
} else if (shard.getInclusiveBeginKey().compareToIgnoreCase(hash) == 0) {
eraseHash.add(hash);
break;
}
}
}
}
ArrayList<String> newRes = new ArrayList<String>();
for (String hash : res) {
if (!eraseHash.contains(hash)) newRes.add(hash);
}
res = newRes;
if (res.size() > 0) Thread.sleep(60 * 1000);
}
Thread.sleep(60 * 1000);
res = SplitWithBound(count);
boolean mloop = true;
while (mloop) {
mloop = false;
ArrayList<Shard> shards = client.ListShard(project, logstore).GetShards();
for (int i = 1; i < res.size(); ++i) {
String bh = res.get(i - 1), eh = res.get(i);
ArrayList<Shard> rangeShards = new ArrayList<Shard>();
for (Shard s : shards) {
if (s.getStatus().compareToIgnoreCase("readwrite") == 0 && Contain(bh, eh, s.getInclusiveBeginKey())) {
rangeShards.add(s);
}
}
if (rangeShards.size() > 1) {
System.out.println("merge shard: " + rangeShards.get(0).toString());
client.MergeShards(project, logstore, rangeShards.get(0).GetShardId());
mloop = true;
}
}
Thread.sleep(60 * 1000);
}
}