작성
·
109
·
수정됨
0
안녕하세요. 1,2 강의 전부 잘봤습니다!! 많은 도움 되었습니다.
근데 강의에 대한 질문은 아닌데 도저히 여쭤볼 사람이 딱히 없어서요..
현재 백엔드 취준생인데 프로젝트에 mysql 레플리카를 도입해서 master / slave1,2 아키텍처를 구성 하였습니다.
--master
[mysqld]
log_bin = mysql-bin
server_id = 10
binlog_do_db = reservation
default_authentication_plugin = mysql_native_password
-- slave
[mysqld]
log_bin = mysql-bin
server_id = 11
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = ON
read_only = ON
default_authentication_plugin = mysql_native_password
master와 slave에 맞게 설정을 해주고 master의 LOG_FILE, LOG_POS를 토대로 각각의 슬레이브에 설정하여
Slave_IO_Running
, Slave_SQL_Running
slave1,2 각각 YES 인걸 확인하고 데이터 복제 및 인덱스 복제 까지 잘 동작하는것 까지 확인하였습니다.
그래서 백엔드 로직에서 ReadOnly 쿼리 비지니스로직은 SLAVE1,2의 dataSource가 할당 되어서 동작 하도록 구성하였고 실제로 테스트 해봤는데 master가 아닌 SLAVE1,2에서만 읽는것을 확인 하였습니다.
근데 여기서 문제인게 읽기작업에 대해서만 부하를 줘서 성능테스트를 진행하였는데 실제로 레플리카를 도입하기 이전 1대의 mysql 서버만 존재했을때가 성능이 20~30% 가 더좋게 나옵니다.
저는 실제로 이미 쓰기작업을 끝낸 데이터에 대해 읽기 작업을 slave1,2가 트래픽을 분산(라운드 로빈 방식으로 정확히 50프로 확률로 분산) 하여 처리하니까 성능이 올라갈것으로 기대했는데 왜그런지 도저히 모르겠습니다.
추가로 쓰기작업(JPA 긍정적 락), 읽기작업을 동시에 요청하는 부하테스트도 진행 했는데 물론 이 경우도 쓰기는 master만 진행하고 읽기작업은 나머지 slave1,2에서만 진행하는걸 확인했지만 성능 결과 1대의 mysql서버가 읽기,쓰기를 다 처리하는것이 성능이 더 좋았습니다.
그래서 제가 내린 결론은 만약 제가 한 테스트 방법이 잘못되지 않았다고 가정할 경우
SLAVE 아키텍처를 가져 갈 경우 성능 향상보다는 부하를 분산시켜 최대 허용 TPS 향상 및 아키텍쳐의 안정성을더 해주는게 의미가 있다고 생각되고,
만약에 SLAVE1,2를 두었는데 무조건 읽기작업의 성능향상이 이뤄져야 한다고 말씀 하시면 어떤 부분에서
제가 무엇을 잘못 설정한걸 수 도있는지 아니면 어떤 이유가 존재할 수도 있는지 해결가능성이 있는 키워드정도 알려주시면 정말 감사하겠습니다.
추가로 상황에 따라 다르겠지만, 마스터 슬레이브 간의 동기화 문제를 해결하는 가장 보편적이고 추천 해주실만한 방법(제가 생각한 방법은 쓰기작업 직후의 읽기작업은 슬레이브가 아닌 마스터에서 하는 방식)이
있는지 알려주시면 정말 감사하겠습니다!
긴글 읽어주셔서 감사합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
성능측정달인123님, 질문 감사합니다.
먼저, 마스터/슬레이브 아키텍처의 성능 저하 문제를 고민하시는 것 같네요. 말씀하신 대로 슬레이브 서버를 통해 읽기 작업을 분산하여 성능 향상을 기대했으나, 실제로는 그렇지 못했다면 몇 가지 점검해 볼 부분이 있습니다.
복제 지연(Lag) 문제: 슬레이브 서버에 데이터 복제 시 일정 시간 지연이 있게 됩니다. 이런 경우 읽기 작업이 마스터보다 늦게 수행될 수 있습니다. 복제 지연 시간을 모니터링하고 이를 줄이는 방법에 대해 고민해보세요.
네트워크와 I/O 병목현상: 슬레이브 노드에 데이터가 전송되고 저장되는 과정에서 네트워크 대역폭이나 슬레이브의 디스크 I/O가 병목이 될 수 있습니다. 이 부분을 확인해보시고, 네트워크 속도나 디스크 성능을 개량해 보시는 게 좋겠습니다.
적절한 쿼리 분배 확인: 라운드 로빈 방식으로 쿼리를 분배한다고 하셨지만, 실제로 쿼리를 어떻게 분배하는지 정확한 확인이 필요합니다. 과다한 쿼리가 특정 슬레이브에 집중되지 않도록 확인해 보세요.
캐싱 및 쿼리 최적화: 슬레이브에서 읽는 데이터가 최신 상태로 유지되지 못해서 성능이 낮게 나올 수도 있습니다. 캐싱 전략이나 쿼리 자체의 최적화를 고려해보세요.
마스터-슬레이브 동기화 문제를 다루실 때는 두 번째 언급하신 방법처럼, 최신성이 중요한 읽기 작업은 마스터에게 할당하는 방법을 고려할 수 있습니다. 또 다른 방법으로는 읽기와 쓰기 쿼리의 우선순위 및 트랜잭션 격리 수준 조정을 통해 개선할 수 있습니다.
이 문제가 해결되기를 바랍니다. 추가 질문이 있으시다면 언제든지 질문 주십시오!
이미지 :
출처: Apache Kafka 3.6 Documentation