| 
														
															@@ -90,19 +90,72 @@ public final class HaClusterEvenAllocator { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															         int numClients = clients.size(); 
														 | 
														
														 | 
														
															         int numClients = clients.size(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         int numServers = servers.size(); 
														 | 
														
														 | 
														
															         int numServers = servers.size(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        int baseSize = numClients / numServers;  // 각 서버에 기본적으로 할당할 개수 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        int remainder = numClients % numServers; // 남는 개수 (마지막 서버에 할당) 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															- 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        int allocateSize = numClients / numServers;     // 각 서버에 기본적으로 할당할 개수 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        int remainder = numClients % numServers;        // 남는 개수 (마지막 서버에 할당) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         int clientIndex = 0; 
														 | 
														
														 | 
														
															         int clientIndex = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-        for (int i = 0; i < numServers; i++) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            int allocationSize = baseSize + (i < remainder ? 1 : 0); // 마지막 서버에 여분 추가 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            String server = servers.get(i); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															-            for (int j = 0; j < allocationSize; j++) { 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                allocation.get(server).add(clients.get(clientIndex++)); 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 여분을 앞쪽 서버에 우선 배정하는 방식 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        int startIdx = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        for (int ii = 0; ii < numServers; ii++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            String server = servers.get(ii); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            List<String> serverAllocation = allocation.get(server); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            int additional = (ii < remainder) ? 1 : 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            int endIdx = Math.min(startIdx + allocateSize + additional, numClients); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            for (int jj = startIdx; jj < endIdx; jj++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//                serverAllocation.add(clients.get(jj)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            startIdx = endIdx; // 다음 서버의 시작 인덱스 업데이트 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            // 기본적으로 모든 서버에 allocateSize 씩 배정됩니다. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            // 남는 1개(remainder)는 i < remainder 조건에 따라 앞에서부터 순서대로 하나씩 더 추가돼요. 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            int allocationSize = allocateSize + (ii < remainder ? 1 : 0); // 마지막 서버에 여분 추가 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+            for (int jj = 0; jj < allocationSize; jj++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                serverAllocation.add(clients.get(clientIndex++)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															             } 
														 | 
														
														 | 
														
															             } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         } 
														 | 
														
														 | 
														
															         } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 여분을 뒤쪽 서버에 우선 배정하는 방식 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        clientIndex = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        for (int ii = 0; ii < numServers; ii++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            String server = servers.get(ii); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+// 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            // 뒤에서부터 여분을 부여하기 위해 'numServers - i - 1' < remainder 조건 사용 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            int extra = ((numServers - ii - 1) < remainder) ? 1 : 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            int allocationSize = allocateSize + extra; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+// 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            List<String> serverAllocation = allocation.get(server); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            for (int j = 0; j < allocationSize && clientIndex < numClients; j++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//                serverAllocation.add(clients.get(clientIndex++)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 가장 적은 서버부터 추가로 할당하는 방식 (사전 정렬 기반 로드 밸런싱) 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+        // 서버별 현재 할당 수를 추적하기 위한 Map 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        Map<String, Integer> loadMap = new HashMap<>(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        for (String server : servers) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            loadMap.put(server, 0); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        clientIndex = 0; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        while (clientIndex < clients.size()) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            // 현재까지 가장 적게 할당된 서버를 찾음 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            String minLoadServer = Collections.min(loadMap.entrySet(), Map.Entry.comparingByValue()).getKey(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            allocation.get(minLoadServer).add(clients.get(clientIndex++)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            loadMap.put(minLoadServer, loadMap.get(minLoadServer) + 1); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+ 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        int numClients = clients.size(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        int clusterSize = servers.size(); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        int countPerCluster = (int)Math.ceil((double) numClients / clusterSize); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        log.info("numClients: {}, clusterSize: {}, countPerCluster: {}", numClients, clusterSize, countPerCluster); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        for (int ii = 0; ii < clusterSize; ii++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            int startIdx = ii * countPerCluster; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            int endIdx = Math.min(startIdx + countPerCluster, numClients); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            List<String> serverAllocation = allocation.get(servers.get(ii)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            for (int jj = startIdx; jj < endIdx; jj++) { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//                serverAllocation.add(clients.get(jj)); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//            } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//        } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         return allocation; 
														 | 
														
														 | 
														
															         return allocation; 
														 | 
													
												
											
												
													
														| 
														 | 
														
															     } 
														 | 
														
														 | 
														
															     } 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
										
											
												
													
														 | 
														
															@@ -114,8 +167,9 @@ public final class HaClusterEvenAllocator { 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 "L21", "L22", "L23", "L24", "L25", "L26", "L28", "L29", "L30", "L31", 
														 | 
														
														 | 
														
															                 "L21", "L22", "L23", "L24", "L25", "L26", "L28", "L29", "L30", "L31", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 "L32", "L33", "L34", "L35", "L36", "L37", "L39", "L40", "L41", "L42", 
														 | 
														
														 | 
														
															                 "L32", "L33", "L34", "L35", "L36", "L37", "L39", "L40", "L41", "L42", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															                 "L43", "L44", "L45", "L46", "L47", "L48", "L49", "L50", "L51", "L52", 
														 | 
														
														 | 
														
															                 "L43", "L44", "L45", "L46", "L47", "L48", "L49", "L50", "L51", "L52", 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                "L53", "L54", "L55", "L56", "L57", "L58", "L59", "L60", "L65", "L66", 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															-                "L67", "L77", "L90", "L91", "L95" 
														 | 
														
														 | 
														
															 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                "L53", "L54", "L55", "L56", "L57", "L58", "L59", "L60", "L65", "L66", "L67" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+//                , "L77", "L90" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															 
														 | 
														
														 | 
														
															+                //, "L91", "L95" 
														 | 
													
												
											
												
													
														| 
														 | 
														
															         ); 
														 | 
														
														 | 
														
															         ); 
														 | 
													
												
											
												
													
														| 
														 | 
														
															  
														 | 
														
														 | 
														
															  
														 | 
													
												
											
												
													
														| 
														 | 
														
															 //        Map<String, List<String>> allocation = HaClusterEvenAllocator.allocate(serverList, clientList); 
														 | 
														
														 | 
														
															 //        Map<String, List<String>> allocation = HaClusterEvenAllocator.allocate(serverList, clientList); 
														 |