본문 바로가기

Proxy/ProxySQL

ProxySQL 기본설명

목적


LVS의 keepalived나 Hardware 적인 Switch 없이 Application에서 들어오는 process들에 대해 load balancing 할 수 있게끔 만들기 위함입니다.

 

ProsySQL이란?


ProxySQL은 기본적으로 C++로 짜여져 있는 open source proxy 프로그램입니다.

총 4개의 database schema를 가지고 proxy를 컨트롤 및 모니터링이 가능 하게끔 짜여져 있습니다.

기본적으로 mysql이 설치되어 있어야 합니다. 만약 server에 mysql이 설치되어 있지 않다면 설치를 해 주셔야 합니다.

source 설치를 하려고 하면 CentOS의 경우 CentOS 7이상에서 compile을 해야 source 설치가 가능하며 제가 테스트한 CentOS 6.7에서는 rpm 설치로 간단하게 설치가 가능 합니다.

 

ProxySQL은 복잡함을 가지고 있지만 시스템 구성을 사용함에 있어서 아래와 같은 것들을 제공하기 때문에 쉽게 다가갈 수 있습니다.

  • 설정을 업데이트 한 것을 자동으로 쉽게 허용합니다.
  • runtime에서 변경된 많은 것들이 daemon 재시작 없이 허용됩니다.
  • 잘못된 구성들은 쉽게 롤백할 수 있습니다.

 

기본 구조로는 아래와 같이 4가지 part가 존재합니다. 번호에 대해서는 맨 아래에서 설명하도록 하겠습니다.

https://github.com/sysown/proxysql/wiki/Configuring-ProxySQL


RUNTIME

  • RUNTIME은 요청된 것들을 관리하는 thread를 사용함으로써 ProxySQL의 in-memory 데이터 구조를 가집니다.
  • proxy에 접속할 수 있는 Mysql user목록 또는 hostgroup으로 그룹지어진 backend server들의 목록들은 global variables를 사용한 값으로 구성됩니다.
  • operator들은 runtime 구성 세션에 절대로 직접적으로 수정할 수 없다는 것을 알고 있어야 합니다. 명령어를 통해 in-memory에서 RUNTIME으로 전송해야합니다.

MEMORY(때떄로 main으로 불립니다)

SQLite3 database를 사용합니다. 사용자들은 Mysql Client를 이 인터페이스를 통해 접속 가능하고 다른 테이블과 데이터베이스에 쿼리를 날릴 수 있습니다. 인터페이스들은 아래와 같습니다.

  • mysql_servers - backend server들의 목록입니다.
  • mysql_users - ProxySQL을 접속할 수 있는 자격이 부여된 유저들의 목록. ProxySQL은 자격이 잘 부여된 connection에서만 잘 작동됩니다.
  • mysql_query_rules - 다른 backend 서버들의 트래픽 경로 설정을 위한 목록. 이러한 rule들이 결과를 캐싱하거나 query의 재삽입을 야기시킬 수 있습니다.
  • global_variables -runtime에 있는 것을 바꾸기 위한 global variables 목록입니다.
  • mysql_collections - proxy가 일할 수 있게끔 하는 Mysql collation 목록입니다. client library로 부터 직접적으로 추출 할 수 있습니다.

DISK

on-disk SQLite3 database를 사용합니다. $(DATADIR)/proxysql.db에 위치하는 기본 파일로, restart할때, in-memory config는 휘발성이라 사질 것입니다. 그래서 disk에 in-memory 데이터를 잘 저장해서 비휘발성 데이터를 만들어야 합니다.

CONFIG

config 파일은 기본적인 config file입니다. 이 config는 아래에서 설명하는 startup과 관련이 있습니다.

STARTUP

일반적인 start-up은 ProxySQL이 config file을 읽어서 datadir을 결정합니다.

  • 만약 database file을 찾았다면, proxySQL은 초기 in-memory에 on-disk database로부터 정보를 가지고 와서 구성을 합니다. 그래서 disk는 memory를 구성하고, runtime 구성을 하게끔 전파하게 됩니다.
  • 만약 database file을 찾을 수 없고 config file이 존재한다면 config file이 parse 되어 집니다. 그리고 이것을 가지고 in-memory database를 구성하고 on-disk database와 runtime을 구성하게 됩니다.
  • 만약 database file이 존재한다면 config file이 parse되어 지지 않습니다.

INITIAL STARTUP

initial startup에서 MEMORY와 RUNTIME은 database file이 아닌 config file로 부터 구성됩니다. 가능하면 처음에 실행할 경우 강제로 --initial flag를 가지고 initial startup을 해야합니다.

initial startup을 한 이후 일반적인 startup으로 재시작하게 되면 on-disk database file을 가지고 구성하게 될 것입니다.

runtime 구성 수정하기

ProxySQL의 MysSQL 관리 port를 통해서 runtime 구성을 수정할 수 있습니다. 연결한 이후에는 아래의 테이블에 대해서 수정을 할 수 있습니다.

  • mysql_servers
  • mysql_users
  • mysql_query_rules
  • global_variables
  • mysql_collations
  • debug_levels

이러한 테이블은 중간 레이어(in-memory database)에 나타나게 됩니다. 명령어를 통해서 해당 layer에서 다른 layer로 upload & download가 가능하게끔 설계되어 있습니다.

table과 field들에 대한 좀 더 디테일한 설명에 대해서는 다른 문서에 기재할 것입니다.

Layer간의 config 이동하기

3개의 layer들 사이에서 config 이동을 명령하기 위해선 admin 인터페이스에서 각각의 다른 명령어를 실행시켜야 합니다. 한번 세개의 layer에 대해서 이해를 한다면 보다 명확하게 쓸 수 있을 것입니다.

위의 그림에 써져있는 번호들 순서대로 명령어를 이해하시면 됩니다.

Mysql users 컨트롤

  • [1] LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
    – in-memory database로부터 Mysql users 정보를 가지고 와서 RUNTIME에 반영시킵니다.
  • [2] SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
    – runtime data structure들로 부터 Mysql users 정보를 in-memory database에 반영시킵니다.
  • [3] LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
    – on-disk database로부터 Mysql users정보를 가지고 와서 in-memory database에 반영시킵니다.
  • [4] SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
    – in-memory database로부터 Mysql users 정보를 in-memory database에 반영시킵니다.
  • [5] LOAD MYSQL USERS FROM CONFIG
    – config file에서 users 정보를 가지고 와서 in-memory database에 반영시킵니다.

Mysql servers 컨트롤

  • [1] LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
    – in-memory database로부터 Mysql servers 정보를 가지고 와서 RUNTIME에 반영시킵니다.
  • [2] SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
    – runtime data structure들로 부터 Mysql servers 정보를 in-memory database에 반영시킵니다.
  • [3] LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
    – on-disk database로부터 Mysql servers 정보를 가지고 와서 in-memory database에 반영시킵니다.
  • [4] SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
    – in-memory database로부터 Mysql servers 정보를 in-memory database에 반영시킵니다.
  • [5] LOAD MYSQL SERVERS FROM CONFIG
    – config file에서 servers 정보를 가지고 와서 in-memory database에 반영시킵니다.

Mysql query rules 컨트롤

  • [1] LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME
    – in-memory database로부터 Mysql query rules 정보를 가지고 와서 RUNTIME에 반영시킵니다.
  • [2] SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME
    – runtime data structure들로 부터 Mysql query rules 정보를 in-memory database에 반영시킵니다.
  • [3] LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK
    – on-disk database로부터 Mysql query rules 정보를 가지고 와서 in-memory database에 반영시킵니다.
  • [4] SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK
    – in-memory database로부터 Mysql query rules 정보를 in-memory database에 반영시킵니다.
  • [5] LOAD MYSQL QUERY RULES FROM CONFIG
    – config file에서 query rules 정보를 가지고 와서 in-memory database에 반영시킵니다.

Mysql variables 컨트롤

  • [1] LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME
    – in-memory database로부터 Mysql variables 정보를 가지고 와서 RUNTIME에 반영시킵니다.
  • [2] SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME
    – runtime data structure들로 부터 Mysql variables 정보를 in-memory database에 반영시킵니다.
  • [3] LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK
    – on-disk database로부터 Mysql variables 정보를 가지고 와서 in-memory database에 반영시킵니다.
  • [4] SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK
    – in-memory database로부터 Mysql variables 정보를 in-memory database에 반영시킵니다.
  • [5] LOAD MYSQL VARIABLES FROM CONFIG
    – config file에서 variables 정보를 가지고 와서 in-memory database에 반영시킵니다.

admin variables 컨트롤

  • [1] LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME
    – in-memory database로부터 admin variables 정보를 가지고 와서 RUNTIME에 반영시킵니다.
  • [2] SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME
    – runtime data structure들로 부터 admin variables 정보를 in-memory database에 반영시킵니다.
  • [3] LOAD ADMIN VARIABLES  TO MEMORY / LOAD ADMIN VARIABLES FROM DISK
    – on-disk database로부터 admin variables 정보를 가지고 와서 in-memory database에 반영시킵니다.
  • [4] SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK
    – in-memory database로부터 admin variables 정보를 in-memory database에 반영시킵니다.

여기에서 줄임말을 쓸 수 있는데, MEMORY를 MEM으로, RUNTIME을 RUN으로 줄일 수 있습니다.

예를들면 SAVE ADMIN VARIABLES TO MEMORY -> SAVE ADMIN VARIABLES TO MEM으로 바꿀 수 있는 것입니다.

 

현재 글에서는 ProxySQL의 기본적인 구조와 config 파일을 변경하는 법을 썼습니다. 아래의 글로는 설치 및 schema 정보, variables, monitoring 지표 등을 쓰도록 하겠습니다.

 

참조


https://github.com/sysown/proxysql/blob/master/doc/configuration_system.md

http://www.proxysql.com/

http://severalnines.com/blog

'Proxy > ProxySQL' 카테고리의 다른 글

ProxySQL : Shunned value modify  (0) 2016.10.01
ProxySQL : Too Many Open Files Error  (0) 2016.10.01
Global Variable : Admin Setting  (0) 2016.10.01
ProxySQL Global Variable  (0) 2016.10.01