Jenkins Consistency Hash 노드 스케줄링
9671 단어 Devop
Jenkins Consistency Hash 노드 스케줄링
일관성 Hash가 필요한 이유
이 화제는 좀 넓지만 지속적인 통합 분야에서 젠킨스를 CICD로 사용하는 것은 거의 하나의 표준이 되었다.지속적인 통합은 사용자의 측면에서 볼 때 매우 중요한 지표가 있다. 신속한 피드백을 주목한다. 예를 들어 사용자가 코드를 제출한 후에 개발하거나 테스트를 하면 코드의 질을 신속하게 알고 테스트 환경에 배치할 수 있다.
어떻게 해야만 Jenkins에서 사용자의 피드백 속도를 높일 수 있습니까?사실 구축 속도는 어느 정도 캐시에 따라 달라집니다.
우리는 Jenkins가 Slave를 통해 규모의 구축 관리를 하고 더 많은 Salve를 추가함으로써 그 연산 능력을 확대하며 모든 구축은 알고리즘을 통해 Salve에 스케줄링되어 실행되는 것을 알고 있다.
여기에서 알 수 있듯이, 만약 같은 작업의 여러 번 구축이 같은 슬레이브로 스케줄링될 수 있다면, 상술한 캐시를 다시 사용할 수 있다.우리가 얻고 싶은 똑똑한 Jenkins 개발자들도 Jenkins는 어떤 알고리즘을 통해 같은 Slave로 우선적으로 스케줄링할 수 있을까?답안이 제목과 같다.
일관성 Hash
만약 당신이 일치성 해시 알고리즘을 아직 이해하지 못한다면 이 글을 좀 읽어 보십시오. 비교적 통속적이고 알기 쉽게 쓰십시오. 5분 동안 일치성 해시 알고리즘을 이해하십시오.
구체적인 알고리즘 응용을 이해하기 전에 두 가지 중요한 개념이 있다.
이 두 목록은 하나의 클래스에 유지됩니다: MappingWorksheet.그것의 임무는 모든 Work Chunk에서 Executor Chunk까지의 映射 관계를 유지하는 것이다. 즉, 어떤 Work Chunk가 그 Executor Chunk로 스케줄링되어 실행되어야 한다는 것이다.
이 매핑 관계는 다른 확장된 LoadBalancer에서 일관성 Hash 알고리즘을 호출하여 생성됩니다.사용자 정의 스케줄링 알고리즘이 필요하다면, 자신의 LoadBalancer를 확장해서 실현할 수도 있다.
이 Hash 알고리즘 자체의 응용으로 돌아가 두 단계로 나뉜다.
List<ExecutorChunk> chunks = ws.works(i).applicableExecutorChunks();
Map<ExecutorChunk, Integer> toAdd = Maps.newHashMapWithExpectedSize(chunks.size());
for (ExecutorChunk ec : chunks) {
toAdd.put(ec, ec.size()*100);
}
hash.addAll(toAdd);
private boolean assignGreedily(Mapping m, Task task, List<ConsistentHash<ExecutorChunk>> hashes, int i) {
if (i==hashes.size()) return true; // fully assigned
String key;
try {
key = task.getAffinityKey();
} catch (RuntimeException e) {
LOGGER.log(Level.FINE, null, e);
// Default implementation of Queue.Task.getAffinityKey, we assume it doesn't fail.
key = task.getFullDisplayName();
}
key += i > 0 ? String.valueOf(i) : "";
for (ExecutorChunk ec : hashes.get(i).list(key)) {
// let's attempt this assignment
m.assign(i,ec);
if (m.isPartiallyValid() && assignGreedily(m,task,hashes,i+1))
return true; // successful greedily allocation
// otherwise 'ec' wasn't a good fit for us. try next.
}
// every attempt failed
m.assign(i,null);
return false;
}