웹 개발/Spring Framework

[Redisson] SearchDomainUnknownHostException 이슈 해결

희랍인 조르바 2023. 6. 18. 02:30

이건 무지성 해결 방법 공유이다.

Failed to resolve '{레디스 호스트}' [A(1)] and search domain query for configured domains failed as well: [여러 도메인들]

 
Spring에서 Redisson을 쓰고 있는데 이런 에러가 계속 발생했다. 구글링을 해보니 아래 방법으로 해결할 수 있다고한다.
 

import io.netty.channel.socket.DatagramChannel;
import io.netty.channel.socket.nio.NioDatagramChannel;
import io.netty.resolver.ResolvedAddressTypes;
import io.netty.resolver.dns.DnsAddressResolverGroup;
import io.netty.resolver.dns.DnsNameResolverBuilder;
import io.netty.resolver.dns.DnsServerAddressStreamProvider;
import io.netty.resolver.dns.DnsServerAddressStreamProviders;

public class DnsAddressResolverGroupFactory implements AddressResolverGroupFactory {
    
    @Override
    public DnsAddressResolverGroup create(Class<? extends DatagramChannel> channelType,
            DnsServerAddressStreamProvider nameServerProvider) {
        DnsAddressResolverGroup group = new DnsAddressResolverGroup(new DnsNameResolverBuilder()
                .channelType(NioDatagramChannel.class)
                .nameServerProvider(DnsServerAddressStreamProviders.platformDefault())
                .resolvedAddressTypes(ResolvedAddressTypes.IPV4_ONLY));
        return group;
    }

}

 
위의 코드를 RedissonClient에 Config로 넣어주면 된단다.
 
출처는 https://github.com/redisson/redisson/issues/1944
 
근데 레디슨 커미터가 해결했다고 하는데, 그 버전을 안 쓸 이유가 없었다. 지금 프로젝트가 실서비스 전이라 버전 업에 대해서 부담이 없다.
 
해당 커밋으로 이슈를 해결했다고 한다.
 
이슈를 읽어보면 Redis와 연결하기 위해 Netty를 사용하면서 Netty와 Redisson 사이에서 발생하는 이슈였던 것으로 보인다.
 
네티쪽 이슈는 여기다. 코멘트가 많아서 이해하려다 포기했다..(대략, "여러개 네임서버를 사용할 때 NXDOMAIN 에러를 받으면 재시도 안하고 예외 처리했는데, 네임서버가 인증되지 않았다는 에러를 받으면 다음 네임서버를 시도하는 방식으로 바꿨다"고 얘기하는듯. 참고: https://github.com/netty/netty/pull/8731)
 
이 글에서 문제가 됐떤 에러 로깅을 보면 에러는 네티에서 발생하는 것이라 네티 이슈가 해결되면서 자연스러 해결됐겠지만, 여전히 발생했는지 레디슨 커밋 코드로는 동시성 이슈를 처리한 것으로 보인다.
 
레디슨 3.18 버전부터 해결됐다는데 3.20 버전에서 이슈가 재연되었다. 그렇다고 레디슨이 동작이 안하는건 아니고 log에 찍히기만 하는 상황이었다.
 
3.22 버전으로 업그레이드하니 에러 로깅이 사라졌고 무슨 차이가 있는지 보려하니 3.20 버전과 3.22 버전간의 file changed를 도저히 볼 수 없을만큼 많다.
 
SequentialDnsAddressResolverFactory 클래스에서 AysncSemaphore의 숫자를 8 -> 6으로 바꿨다뿐.. 여기의 숫자는 AutomicInteger로 동기화를 위해 사용하는듯하다. 그런데 그게 에러가 사라지는데 큰 의미가 있을까? 다른데서의 차이가 있을 듯 싶다.
 
이 이상 파고들기에는 시간이 필요이상일듯 하여 여기서 마무리.
 
레디슨을 3.22까지 버전업이 가능하다면 버전업으로 처리하자. 안된다면 깃허브 이슈에 있는 방법을 써보자.