읽어볼거리

Setup Highly Available MySQL Cluster with ProxySQL

Leedo1982 2021. 2. 25. 19:24

*단순 요약 번역한 글입니다. *

proxySQL 을 사용하여 고가용성 Mysql 클러스터 설정

공식문서에 정의된것 처럼, ProxySQL 은 mysql과 forks(percona server 및 mariaDB)를 위한
high performance, high availablility, 프로토콜 인식 proxy 입니다. 이름에서 알수 있듯이 ProxySQL 은 백엔드 Mysql 클러스터로 들어오는 트래픽을 프록시 합니다. ProxySQL 은 DBA 를 위해, DBA 에 의해 개발되었으므로 들어오는 트래픽을 proxy 전달에만 국한하지는 않는다. ProxySQL 은 DBA 가 읽기/쓰기 분할, 멀티플랙싱, 쿼리 캐싱 등과 같은 다양한 기능을 통해 일상적인 문제를 쉽게 해결하여 Mysql 클러스터의 high availablility 와 scalability 를 제공할 수 있도록 도와 줍니다.

여기에서 ProxySQL 기능이 MySql 클러스터를 high availablility 로 만드는데 어떻게 도움이 되는지를 알아보겠다. 우리는 주로 아키텍처를 설계하기 위해 주로 ProxySQL 의 주어진 기느에 초점을 맞출 것이다.

  • Multiplexing
  • Read/Write split
  • Load balancing with hostgroup weights

Multiplexing

대용량 트래픽 애플리케이션을 확장하는 경우, mysql의 max connections limits 문제인 경우가 있다. Mysql 의 max connections limits 은 서버의 사용가능 리소스에 의해 결정되므로 조정할 수없다. 조절한다 해도 성능이 저하 될 수 있다.

이문제를 해결하기 위해 애플리케이션 서버와 mysql 서버간의 연결 풀링을 활성화하는 프록시를 도입합니다.
ProxySQL 은 스레드 풀을 사용하여 백엔드 서버에 연결하는 멀티플렉싱 기능을 제공합니다. 따라서 요청이 완료될 때마다 ProxySQL 의 호스트 그룹 관리자는 연결을 다시 사용할 수 있는지 확인합니다. Multiplexing 을 사용하면 수천개의 연결 요청을 수백개의 백엔드 연결로 확장할 수 있습니다.

우리가 ProxySQL 을 도입하면 다음과 같은 모양이 됩니다.
image1

위 아키텍처의 문제

애플케이션이 더많은 트래픽을 제공하기 위해 서버를 확장하기 전까지는 위 아키텍처는 잘 동작할 것입니다. 결국 ProxySQL 리소스 제한에 도달하게 될것이고, 위의 토폴로지에서 새연결이 필요할때마다 네트워크의 ProxySQL 에 연결해야 하므로 각 데이터베이스의 연결에 대한 대기기간은 늘어납니다. ProxySQL 는 서버에 가깝게 유지하는 것이 좋으며, 실제로 로컬로 실행하는 것이 좋습니다. 애플리케이션 서버에서 ProxySQL 를 실행하는 경우 아키텍처는 다음과 유사합니다.

image2

Query Caching

ProxySQL 은 기본적으로 쿼리 캐싱 매커니즘을 제공합니다. 프록시에 쿼리 규칙을 추가하여 캐시할 쿼리 유형과 시간을 알릴 수 있습니다. ProxySQL 은 캐시할 수 있는 쿼리를 더 잘 결정할 수 있도록 많은 통계를 제공합니다. 아래 쿼리를 실행하면 ProxySQL 이 실행한 쿼리 패턴 목록과 쿼리가 실행 된 횟수 및 소요 된 시간의 합계가 제공됩니다.

SELECT count_star, sum_time, hostgroup, digest, digest_text FROM stats_mysql_query_digest_reset ORDER BY sum_time DESC;

캐시 할 쿼리가 식별되면 캐시 ttl 을 사용하여 쿼리 규칙을 추가하여 주어진 쿼리 패턴 또는 쿼리 다이제스트에 대한 쿼리 캐싱을 적용할 수 있습니다.

INSERT INTO mysql_query_rules (active, digest, cache_ttl, apply) VALUES (1, '0xE8930CB2CC9E68D7', 2000,1);

로컬에서 실행되는 프록시 인스턴스와 쿼리 캐싱을 사용하면 캐시 된 쿼리를 실행하기 위해 백엔드 서버에 연결되지 않고 결과가 메모리 캐시에 반환됩니다.

Why do we need a centralized ProxySQL instance?

로컬에서 각각 네트워크를 연결하게 되면, 해커에게 더많은 허점을 노출하여 보안 위험이 더 높아진다. 적절한 보항느로 구성된 하나의 ProxySQL 인스턴스 위에 모든 백엔드 서버를 유지하는것이 좋으며 로컬에서 실행되는 모든 ProxySQL 인스턴스는 중앙 집중식 프록시 서버에 연결해야 합니다.
image3

중앙 집중식 ProxySQL 인스턴스의 백엔드 서버에서 실행 된 모든 쿼리에 대한 쿼리 통계를 집계했기 때문에 매트릭에도 도움이 됩니다. 또한 중앙 집중식 프록시를 사용하여 백엔드 서버로의 연결을 제한하며 향후 애플리케이션 확장에 도움이 됩니다.

Single Point of Failure!!

중앙집중식 ProxySQL 이 실행되면 아키텍처에 단일 실패지점이 있는 홉이 도입됩니다. 중앙집중식 프록시가 다운되면 전체 애플리케이션이 DB에 연결할 수 없다. 아키텍처에 SPoF 가 있는경우 일반적으로 잘못된 설계로 간주됩니다. 이를 해결하기 위해 Read / Write 분할 기능을 활용할 수 있습니다. ProxySQL 에서 각 밴엔드 서버는 호스트 구룹간에 분류 될 수 있으며 각 그룹에서 트래픽라우팅을 위해 각 백엔드 서버에 가중치를 할당 할 수 있습니다. 이기능을 사용하면 두개의 중앙집중식 ProxySQL 인스턴스를 실행할 수 있습니다.

image4

위의 아키텍처에서 볼수 있듯이 로컬에서 실해되는 모든 ProxySQL 인스턴스는 99% 쓰기 트래픽을 중앙집중식 ProxySQL 인스턴스에 라우팅하도록 구성하고, 1% 쓰기 트래픽을 다른 중앙집중식 ProxySQL 서버에 할당합니다. 이경우 하나가 다운되면 해당 프록시가 차단되도 전체트래픽이 다른 중앙집중식 ProxySQL 인스턴스에 할당됩니다.

Conclusion

ProxySQL 서버 아키텍처의 몇가지 모범사례를 정의했습니다. 소규모 애플리케이션의 경우 이 아키텍처는 과도하지만 트레이드오프를 통해 애플리케이션의 요구에 따라 고유한 디자인을 설계 할 수 있습니다. 매우 높은 로드를 제공하고 높은 SLA 를 가져야 한다면 이상적인 아키텍처로 보입니다.

참조

Setup Highly Available MySQL Cluster with ProxySQL