MySQL을 사용하다 보면 중간에 프록시를 끼워서 부하를 분산하거나 읽기/쓰기를 분리하려는 경우가 종종 있죠. 그런 상황에서 많이 쓰는 게 바로 Amoeba라는 미들웨어예요. 저도 한 프로젝트에서 Amoeba를 활용해 읽기/쓰기 분리를 구현하던 중에 황당한 오류 하나를 만났어요. 바로 java.lang.Exception: poolName=slaves, no valid pools
라는 에러였죠. 솔직히 처음엔 멘붕이었어요. 도대체 왜 이런 에러가 나는지 감도 안 잡히더라고요.
그래서 삽질(?) 끝에 원인을 찾고 해결하게 됐는데요, 혹시 저처럼 이 오류 때문에 고생하시는 분이 계실까봐 이렇게 정리해보려고 해요. 그리고 이미지에 나오는 설정 캡처와 로그도 함께 공유드릴게요 — 복잡해 보이지만 천천히 따라가시면 금방 해결하실 수 있어요!
문제 상황: 갑자기 끊기는 MySQL 연결
우선 문제가 발생한 상황을 간단히 설명드릴게요. 로컬에서 Amoeba를 통해 MySQL 데이터베이스에 연결하려고 했는데, 처음에는 잘 되다가 어느 순간 MySQL server has gone away
라는 메시지와 함께 접속이 끊기는 문제가 발생했어요. 아래처럼 말이죠.

ERROR 2006 (HY000): MySQL server has gone away

저는 처음에 단순한 타임아웃 문제겠거니 했는데, 재연결 시도 후에도 계속 연결이 안 되더라고요. 확인해 보니 Amoeba 자체는 실행되고 있었고, MySQL도 서비스 중이었어요. 그런데 클라이언트에서 접속하려고 하면 끊어지고, 로그를 보니 익숙하지 않은 오류 메시지가 찍히기 시작했어요.
오류 원인: Slaves 풀 유효성 문제
Amoeba 로그를 자세히 들여다보니 다음과 같은 에러 메시지가 반복되고 있었어요.
java.lang.Exception: poolName=slaves, no valid pools

이건 무슨 뜻일까요? 결론부터 말하면, Amoeba 설정 파일 내에서 slave 풀에 지정된 데이터베이스 연결 설정이 유효하지 않다는 의미예요. 실제로 제 설정을 보니 <property name="schema">
부분이 test
로 되어 있었는데, 실제로 MySQL에선 해당 스키마가 없었어요. 그니까 Amoeba 입장에선 “어? 연결할 slave가 없네?” 하고 에러를 던진 거죠.
해결은 간단했어요. schema
설정 값을 MySQL에 실제로 존재하는 DB 이름으로 바꾸기만 하면 됐어요. 예를 들면 이렇게요:
<property name="schema">mysql</property>
추가 설정: 비밀번호와 사용자 권한 확인하기
근데 여기서 끝나진 않았어요. schema
문제는 해결했는데, 여전히 연결이 불안정하더라고요. 로그를 다시 보니 이번엔 Access denied
에러가 나기 시작했어요. 권한 문제였죠.
MySQL에서 다음 명령어로 사용자 권한을 재설정해줬어요:
mysql> grant all on *.* to 'test'@'192.168.220.%' identified by '1234.Com';
이걸 실행한 후, 다시 Amoeba를 재시작하고 연결을 시도하니 오류 없이 정상적으로 작동했어요. 결국은 schema
와 사용자 권한 이 두 가지가 핵심 포인트였던 거죠.
설정 샘플: Amoeba 설정 XML 파일 참고
아래는 실제로 문제가 있었던 amoeba.xml 일부와 수정한 후의 모습이에요. 설정값이 어디에서 꼬였는지를 이해하는 데 도움이 될 거예요. 주의해서 보셔야 할 부분은 <property name="schema">
와 <property name="password">
입니다.
잘못된 설정 예시:
<property name="schema">test</property>
수정한 설정 예시:
<property name="schema">mysql</property>
<property name="user">test</property>
<property name="password">1234.Com</property>

중요 포인트는요, Amoeba는 실제로 존재하지 않는 스키마나 잘못된 사용자 인증 정보를 절대 받아들이지 않아요. 이 설정 중 하나라도 틀리면 no valid pools
같은 애매한 오류를 던지기 때문에 초심자 입장에선 원인을 파악하기가 쉽지 않죠.
실시간 테스트 로그 분석
실제로 MySQL에 접속해보면서 테스트 로그를 확인했을 때 다음과 같은 메시지가 나왔어요. (이 부분은 이미지로 첨부한 로그를 그대로 사용하셔도 돼요!)
ERROR 2013 (HY000): Lost connection to MySQL server during query
이 메시지가 의미하는 바는 MySQL 연결 중간에 세션이 끊겼다는 거예요. 근데 이게 네트워크 문제일 수도 있고, 사용자 인증이나 권한 문제일 수도 있어서 좀 헷갈릴 수 있죠. 하지만 Amoeba 로그와 MySQL 로그를 같이 확인해보면 답이 나와요. 에러 메시지에선 잘 안 보이는 근본 원인을 Amoeba가 아주 직설적으로 알려주거든요.
실무 팁: 자주 틀리는 설정 체크리스트
Amoeba를 처음 설정할 때 제가 겪었던 시행착오를 토대로, 자주 틀리는 항목만 따로 정리해봤어요. 혹시라도 비슷한 상황이라면 아래 체크리스트를 먼저 점검해보세요.
- Amoeba XML 파일 내
schema
가 MySQL에 실제 존재하는 DB 이름인지 확인 user
,password
정보가 정확히 입력됐는지 확인- 해당 사용자에 대해 MySQL에서 IP 제한 없이 권한이 부여됐는지 확인 (
grant
명령어 사용) - slave DB 서버가 실제로 살아있는지 ping 또는 telnet 테스트
- Amoeba 재시작 시 설정 파일이 올바르게 로드됐는지 로그 확인
이 다섯 가지만 체크해도 대부분의 no valid pools
문제는 해결될 거예요.
Q&A: 자주 묻는 질문 정리
Q1. Amoeba에서 ‘no valid pools’ 에러가 나는 가장 흔한 원인은 뭐예요?
A1. 대부분은 schema
설정이 MySQL에 존재하지 않는 DB 이름으로 되어 있거나, DB 접근 계정의 권한 설정이 잘못되어 있을 때 발생해요.
Q2. MySQL에서 사용자 권한은 어떻게 줘야 하나요?
A2. 아래 명령어처럼 grant
명령어를 사용해 주시면 돼요. IP 범위를 %
로 설정하면 전체 허용도 가능합니다.
grant all on *.* to 'user'@'192.168.0.%' identified by 'password';
Q3. Amoeba 설정 변경 후 재시작이 꼭 필요한가요?
A3. 네, 설정 변경 사항은 자동으로 반영되지 않기 때문에 Amoeba를 반드시 재시작해야 합니다. 재시작하지 않으면 이전 설정이 그대로 유지돼요.
Q4. 로그에서 어떤 메시지를 중점적으로 확인해야 하나요?
A4. poolName=slaves
나 Access denied
, Lost connection
같은 키워드를 중심으로 보면 문제의 원인을 좁히는 데 도움이 됩니다.
Q5. 하나의 Amoeba 설정으로 읽기/쓰기 분리를 제대로 하려면 어떻게 해야 하나요?
A5. master와 slave 각각의 <dbServer>
블록을 잘 구분하고, weight
와 writeable
속성을 정확히 설정해야 돼요. 그리고 실제로 slave에 연결이 가능해야 하니, 상태 확인도 자주 해줘야 해요.
마무리: 에러는 피할 수 없어도, 해결은 할 수 있어요
처음에 java.lang.Exception: poolName=slaves, no valid pools
에러를 마주했을 때 진짜 당황했어요. 설정도 다 맞는 것 같고, 서비스도 돌고 있는데 도무지 원인을 모르겠더라고요. 그런데 결국엔 schema
이름 하나, 사용자 권한 하나가 문제였던 거죠. 뻔한 실수인데, 로그에 명확히 안 나오니까 더 헷갈리는 것 같아요.
이 글이 여러분이 겪는 유사한 문제 해결에 도움이 되면 좋겠어요. 혹시 여전히 문제가 해결되지 않는다면, 위에서 소개한 설정 체크리스트를 하나하나 따라가보시길 추천드려요. 그리고 혹시 다른 오류나 궁금한 점 있으시면 댓글로 공유해 주세요! 다음엔 Amoeba의 쓰기 지연 문제에 대해 정리해볼게요 🙂