[Redis][Lettuce] 클러스터+커넥션풀 시 마스터가 뻗어버려서 set이 계속 에러날때. 흔한 전산쟁이의 삽질일기

보통 클러스터를 걸면 마스터몇개 슬레이브 몇개 걸리게 되는데, 내가 테스트할때는 3마스터에 6슬레이브 그러니까
1마스터-2슬레이브 기준으로 돌렸다. 

근데 lettuce로 자동 재연결을 걸어놔 봤자. 마스터가 뻗으면 set이 안되드라. 심지어는 마스터 3개중 2번 IP만 연결하고 중간에 1번을 죽이면 1번 셋 안된다고 맛이감.
그래서 이게 뭔가 봤더니...

일단. 오토 리커넥트 false하든 true하든 상관이 음따.

<애초에 꺼졌는데 무슨>


애초에 껐기 때문이지. 언제켜질지 모르고... 그리고 토폴로지 리프래시를 하던지 안하던지 크게 상관이 없다. 
리프래시 주기가 짧으면 쓸데없는 낭비가 커지고 리프래시 주기가 길면 그동안의 데이터는 너무 쌓인다. (Redis쓰는용도가 뭔데..)

갑자기 딴데로 샜는데, 토폴로지라는게 보통 할당한 Host IP를 조사해서 이건 마스터, 이건 슬레이브 판단을 하는데, 
마스터라 판단한게 맛이간거다. 이럴때는 보통 토폴로지를 갱신 해주면 다시 지가 돌거다.

<다 쓸데없는소리고 reloadPatitions()가 핵심>




걍 에러 발생하면 그때 갱신을 한번 해주자. 그러면 효율이 좀 증가한다. 왠지는 모르겠지만 autoreconnect true하고 해도
에러난건 수습이 안되더라. 이게 왜 그러냐면.....

이건 프로그램 짠거의 문제인데. 구조가 
1.클러스터 클라이언트
2.클러스터 스레드풀
3.스레드 풀 익스큐터

즉 클러스터인데, 스레드풀을 쓰고, 멀티스레드로 막 돌리는거라....
리로드고 나발이고 일단 커넥션 반환 (pool.returnObject(connection);) 해놓고 redis 정보를 업데이트 한 다음 
다시 커넥션을 가져와야(connection = pool.borrowObject();) 처리가 되는거다.

단순하게 클러스터 데모 할때는 상관이 없지만, 이런 복합상황은 lib는 문제가없는데 로직 구성의 문제로, 이부분을 생각을 잘 해야한다.


ps. 생각보다 redis의 성능은 만드는놈의 실력에 크게 좌우되는거 같다.

덧글

댓글 입력 영역