2023

ProxySQL - 백엔드 서버 구성

운좋은하루 2023. 1. 19. 17:17
728x90
반응형

ProxySQL에서 백엔드 MySQL 서버 구성

MySQL 서버는 mysql_servers및 (선택 사항) mysql_replication_hostgroups테이블에서 구성됩니다.

참고 : 다음 섹션을 읽기 전에 ProxySQL에서 사용 하는 다중 계층 구성 시스템 을 이해해야 합니다.
구체적으로:

  • mysql_servers및 mysql_replication_hostgroups테이블 의 변경 사항은 LOAD MYSQL SERVERS TO RUNTIME 실행 없이 적용되지 않습니다.
  • SAVE MYSQL SERVERS TO DISK 실행 하여 디스크에 저장하지 않으면 다시 시작/충돌 후 의 변경 사항 mysql_servers및 mysql_replication_hostgroups테이블 이 손실됩니다 .

mysql_servers및 mysql_replication_hostgroups테이블 의 모든 변경 사항은 LOAD MYSQL SERVERS TO RUNTIME 가 실행될 때까지 적용되지 않으며 SAVE MYSQL SERVERS TO DISK가 실행 되지 않는 한 지속되지 않습니다.
변경 사항 은 구성 파일 mysql_servers을 mysql_replication_hostgroups저장하거나 서비스를 다시 로드하지 않고 구성 파일을 편집하는 것으로 간주됩니다.

중요 : 아래의 모든 예는 LOAD MYSQL SERVERS TO RUNTIME 실행될 때까지 적용되지 않습니다 . ProxySQL을 다시 시작해도 구성을 유지하려면 SAVE MYSQL SERVERS TO DISK 필요합니다.

메모리에서 런타임으로 mysql 서버 복사

메모리 내 데이터베이스에서 런타임 데이터 구조로 MySQL 서버 및 복제 호스트 그룹을 로드합니다.

Admin> LOAD MYSQL SERVERS TO RUNTIME;

허용되는 다른 별칭:

  • LOAD MYSQL SERVERS TO RUN
  • LOAD MYSQL SERVERS FROM MEM
  • LOAD MYSQL SERVERS FROM MEMORY

메모리에서 디스크로 mysql 서버 복사

메모리 내 데이터베이스에서 온디스크 데이터베이스로 MySQL 서버 및 복제 호스트 그룹 유지

Admin> SAVE MYSQL SERVERS TO DISK;

허용되는 다른 별칭:

  • SAVE MYSQL SERVERS FROM MEM
  • SAVE MYSQL SERVERS FROM MEMORY

런타임에서 메모리로 mysql 서버 복사

런타임 데이터 구조에서 메모리 내 데이터베이스로 MySQL 서버 및 복제 호스트 그룹을 유지합니다.

Admin> SAVE MYSQL SERVERS TO MEMORY;

허용되는 다른 별칭:

  • SAVE MYSQL SERVERS TO MEM
  • SAVE MYSQL SERVERS FROM RUN
  • SAVE MYSQL SERVERS FROM RUNTIME

mysql 서버를 디스크에서 메모리로 복사

온디스크 데이터베이스에서 메모리 내 데이터베이스로 MySQL 서버 및 복제 호스트 그룹을 로드합니다.

Admin> LOAD MYSQL SERVERS TO MEMORY;

허용되는 다른 별칭:

  • LOAD MYSQL SERVERS TO MEM
  • LOAD MYSQL SERVERS FROM DISK

새 서버 추가

새로운 서버를 추가하기 위해서는 테이블에 새로운 행을 삽입하여 정의해야 합니다 mysql_servers.
테이블에는 기본값이 있는 여러 열이 있습니다.

다음은 모든 기본 구성으로 새 백엔드를 추가합니다.

Admin> SELECT * FROM mysql_servers;
Empty set (0.00 sec)

Admin> INSERT INTO mysql_servers (hostname) VALUES ('172.16.0.1');
Query OK, 1 row affected (0.00 sec)

Admin> SELECT * FROM mysql_servers\G
*************************** 1. row ***************************
       hostgroup_id: 0
           hostname: 172.16.0.1
               port: 3306
          gtid_port: 0
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 1000
max_replication_lag: 0
            use_ssl: 0
     max_latency_ms: 0
            comment: 
1 row in set (0.00 sec)

호스트 그룹에 새 서버 추가

Admin> SELECT hostgroup_id,hostname FROM mysql_servers;
+--------------+------------+
| hostgroup_id | hostname   |
+--------------+------------+
| 0            | 172.16.0.1 |
+--------------+------------+
1 row in set (0.00 sec)

Admin> INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (1, '172.16.0.2'), (1,'172.16.0.3');
Query OK, 2 rows affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname FROM mysql_servers;
+--------------+------------+
| hostgroup_id | hostname   |
+--------------+------------+
| 0            | 172.16.0.1 |
| 1            | 172.16.0.2 |
| 1            | 172.16.0.3 |
+--------------+------------+
3 rows in set (0.00 sec)

백엔드에 대한 연결 수 제한

Admin> SELECT hostgroup_id,hostname,max_connections FROM mysql_servers;
+--------------+------------+-----------------+
| hostgroup_id | hostname   | max_connections |
+--------------+------------+-----------------+
| 0            | 172.16.0.1 | 1000            |
| 1            | 172.16.0.2 | 1000            |
| 1            | 172.16.0.3 | 1000            |
+--------------+------------+-----------------+
3 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET max_connections=10 WHERE hostname='172.16.0.2';
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,max_connections FROM mysql_servers;
+--------------+------------+-----------------+
| hostgroup_id | hostname   | max_connections |
+--------------+------------+-----------------+
| 0            | 172.16.0.1 | 1000            |
| 1            | 172.16.0.2 | 10              |
| 1            | 172.16.0.3 | 1000            |
+--------------+------------+-----------------+
3 rows in set (0.00 sec)

백엔드의 가중치를 변경하여 트래픽 우선 순위 지정

가중치는 호스트 그룹 내에서만 관련이 있습니다.

Admin> SELECT hostgroup_id,hostname,weight FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname   | weight |
+--------------+------------+--------+
| 0            | 172.16.0.1 | 1      |
| 1            | 172.16.0.2 | 1      |
| 1            | 172.16.0.3 | 1      |
+--------------+------------+--------+
3 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET weight=1000 WHERE hostname NOT IN ('172.16.0.2', '172.16.0.1') AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,weight FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname   | weight |
+--------------+------------+--------+
| 0            | 172.16.0.1 | 1      |
| 1            | 172.16.0.2 | 1      |
| 1            | 172.16.0.3 | 1000   |
+--------------+------------+--------+
3 rows in set (0.00 sec)

특정 백엔드에 SSL 연결 사용

이 예는 백엔드에 대해 SSL을 구성하는 방법을 보여줍니다. SSL을 전역적으로 구성하는 방법을 보여주지는 않지만. SSL을 전체적으로 구성하는 방법에 대한 자세한 내용은 여기 를 확인 하십시오.

Admin> SELECT hostgroup_id,hostname,use_ssl FROM mysql_servers;
+--------------+------------+---------+
| hostgroup_id | hostname   | use_ssl |
+--------------+------------+---------+
| 0            | 172.16.0.1 | 1       |
| 1            | 172.16.0.2 | 0       |
| 1            | 172.16.0.3 | 0       |
+--------------+------------+---------+
3 rows in set (0.00 sec)

복제 지연으로 슬레이브 자동 회피

max_replication_lag모니터 모듈은 서버가 0이 아닌 값으로 설정된 경우 정기적으로 복제 지연을 확인합니다 .

Admin> SELECT hostgroup_id,hostname,max_replication_lag FROM mysql_servers;
+--------------+------------+---------------------+
| hostgroup_id | hostname   | max_replication_lag |
+--------------+------------+---------------------+
| 0            | 172.16.0.1 | 0                   |
| 1            | 172.16.0.2 | 0                   |
| 1            | 172.16.0.3 | 0                   |
+--------------+------------+---------------------+
3 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET max_replication_lag=30 WHERE hostname='172.16.0.3';
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,max_replication_lag FROM mysql_servers;
+--------------+------------+---------------------+
| hostgroup_id | hostname   | max_replication_lag |
+--------------+------------+---------------------+
| 0            | 172.16.0.1 | 0                   |
| 1            | 172.16.0.2 | 0                   |
| 1            | 172.16.0.3 | 30                  |
+--------------+------------+---------------------+
3 rows in set (0.00 sec)

이 구성을 사용하면 복제 지연이 마스터보다 30초를 초과하는 경우에만 서버 172.16.0.3이 회피됩니다. max_replication_lag가 0으로 설정된 경우(SET max_replication_lag=0), 모니터 모듈은 복제 지연을 전혀 확인하지 않습니다 . 더 많은 정보는 mysql-monitor_slave_lag_when_null 확인하세요.

서로 다른 두 호스트 그룹에 서버 추가

테이블 의 기본 키 mysql_servers는 로 정의됩니다 PRIMARY KEY (hostgroup_id, hostname, port). 즉, 동일한 서버가 두 개의 서로 다른 호스트 그룹에 있을 수 있으며 이를 구성해야 하는 여러 가지 이유가 있습니다.
예를 들어, 하나의 마스터와 2개의 슬레이브가 있는 복제 토폴로지에서 어떤 이유로 슬레이브가 사라지는 경우(슬레이브가 죽거나 너무 많이 지연되기 때문에) 마스터에 읽기를 보내려고 합니다.
예를 들면 다음과 같습니다.

Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
+--------------+------------+--------+---------------------+
| hostgroup_id | hostname   | weight | max_replication_lag |
+--------------+------------+--------+---------------------+
| 0            | 172.16.0.1 | 1      | 0                   |
| 1            | 172.16.0.2 | 1      | 0                   |
| 1            | 172.16.0.3 | 1000   | 30                  |
+--------------+------------+--------+---------------------+
3 rows in set (0.00 sec)

Admin> INSERT INTO mysql_servers(hostgroup_id,hostname) VALUES (1,'172.16.0.1');
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
+--------------+------------+--------+---------------------+
| hostgroup_id | hostname   | weight | max_replication_lag |
+--------------+------------+--------+---------------------+
| 0            | 172.16.0.1 | 1      | 0                   |
| 1            | 172.16.0.2 | 1      | 0                   |
| 1            | 172.16.0.3 | 1000   | 30                  |
| 1            | 172.16.0.1 | 1      | 0                   |
+--------------+------------+--------+---------------------+
4 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET max_replication_lag=30, weight=1000;
Query OK, 4 rows affected (0.00 sec)

Admin> UPDATE mysql_servers SET weight=1 WHERE hostname='172.16.0.1' AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,weight,max_replication_lag FROM mysql_servers;
+--------------+------------+--------+---------------------+
| hostgroup_id | hostname   | weight | max_replication_lag |
+--------------+------------+--------+---------------------+
| 0            | 172.16.0.1 | 1000   | 30                  |
| 1            | 172.16.0.2 | 1000   | 30                  |
| 1            | 172.16.0.3 | 1000   | 30                  |
| 1            | 172.16.0.1 | 1      | 30                  |
+--------------+------------+--------+---------------------+
4 rows in set (0.00 sec)

위의 예에서 읽기 트래픽을 제공하도록 HG1을 구성하면 트래픽의 99.95%가 172.16.0.2 및 172.16.0.3으로 전송되고 트래픽의 0.05%는 일반적으로 172.16.0.1로 전송됩니다. 172.16.0.2 및 172.16.0.3을 사용할 수 없게 되면 172.16.0.1이 모든 읽기 트래픽을 가져옵니다.
참고: max_replication_lag는 슬레이브에만 적용됩니다. 서버에서 복제가 활성화되지 않은 경우 Monitor는 어떠한 조치도 취하지 않습니다.

백엔드 서버에서 압축 활성화

압축을 활성화하려면 mysql_servers. compression 이 0이 아닌 값으로 설정해야 합니다. 압축은 설정이 런타임에 로드된 후 시작된 새 연결에만 사용됩니다.

Admin> SELECT hostgroup_id,hostname,compression FROM mysql_servers;
+--------------+------------+-------------+
| hostgroup_id | hostname   | compression |
+--------------+------------+-------------+
| 0            | 172.16.0.1 | 0           |
| 1            | 172.16.0.2 | 0           |
| 1            | 172.16.0.3 | 0           |
| 1            | 172.16.0.1 | 0           |
+--------------+------------+-------------+
4 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET compression=1 WHERE hostname='172.16.0.2' AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,compression FROM mysql_servers;
+--------------+------------+-------------+
| hostgroup_id | hostname   | compression |
+--------------+------------+-------------+
| 0            | 172.16.0.1 | 0           |
| 1            | 172.16.0.2 | 1           |
| 1            | 172.16.0.3 | 0           |
| 1            | 172.16.0.1 | 0           |
+--------------+------------+-------------+
4 rows in set (0.00 sec)

백엔드 서버를 정상적으로 비활성화

백엔드 서버를 정상적으로 비활성화하려면 OFFLINE_SOFT로 변경해야 status합니다 . 활성 트랜잭션 및 연결은 계속 사용되지만 새 트래픽은 노드로 전송되지 않습니다.

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname   | status |
+--------------+------------+--------+
| 0            | 172.16.0.1 | ONLINE |
| 1            | 172.16.0.2 | ONLINE |
| 1            | 172.16.0.3 | ONLINE |
| 1            | 172.16.0.1 | ONLINE |
+--------------+------------+--------+
4 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET status='OFFLINE_SOFT' WHERE hostname='172.16.0.2';
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname   | status       |
+--------------+------------+--------------+
| 0            | 172.16.0.1 | ONLINE       |
| 1            | 172.16.0.2 | OFFLINE_SOFT |
| 1            | 172.16.0.3 | ONLINE       |
| 1            | 172.16.0.1 | ONLINE       |
+--------------+------------+--------------+
4 rows in set (0.00 sec)

백엔드 서버 즉시 비활성화

백엔드 서버를 즉시 비활성화하려면 OFFLINE_HARD로 변경해야 status합니다 . 모든 현재 트래픽은 즉시 종료되며 새로운 트래픽은 전송되지 않습니다.

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname   | status       |
+--------------+------------+--------------+
| 0            | 172.16.0.1 | ONLINE       |
| 1            | 172.16.0.2 | OFFLINE_SOFT |
| 1            | 172.16.0.3 | ONLINE       |
| 1            | 172.16.0.1 | ONLINE       |
+--------------+------------+--------------+
4 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET status='OFFLINE_HARD' WHERE hostname='172.16.0.1' AND hostgroup_id=1;
Query OK, 1 row affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname   | status       |
+--------------+------------+--------------+
| 0            | 172.16.0.1 | ONLINE       |
| 1            | 172.16.0.2 | OFFLINE_SOFT |
| 1            | 172.16.0.3 | ONLINE       |
| 1            | 172.16.0.1 | OFFLINE_HARD |
+--------------+------------+--------------+
4 rows in set (0.00 sec)

오프라인/비활성화 백엔드 서버 재활성화

오프라인 백엔드에서 다시 활성화하려면 상태를 다시 ONLINE 으로 변경하면 됩니다.

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------------+
| hostgroup_id | hostname   | status       |
+--------------+------------+--------------+
| 0            | 172.16.0.1 | ONLINE       |
| 1            | 172.16.0.2 | OFFLINE_SOFT |
| 1            | 172.16.0.3 | ONLINE       |
| 1            | 172.16.0.1 | OFFLINE_HARD |
+--------------+------------+--------------+
4 rows in set (0.00 sec)

Admin> UPDATE mysql_servers SET status='ONLINE' WHERE status NOT IN ('ONLINE');
Query OK, 2 rows affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname   | status |
+--------------+------------+--------+
| 0            | 172.16.0.1 | ONLINE |
| 1            | 172.16.0.2 | ONLINE |
| 1            | 172.16.0.3 | ONLINE |
| 1            | 172.16.0.1 | ONLINE |
+--------------+------------+--------+
4 rows in set (0.00 sec)

백엔드 서버 제거

백엔드 서버를 mysql_servers 테이블에서 삭제하여 완전히 제거할 수 있습니다 .

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname   | status |
+--------------+------------+--------+
| 0            | 172.16.0.1 | ONLINE |
| 1            | 172.16.0.2 | ONLINE |
| 1            | 172.16.0.3 | ONLINE |
| 1            | 172.16.0.1 | ONLINE |
+--------------+------------+--------+
4 rows in set (0.00 sec)

Admin> DELETE FROM mysql_servers WHERE hostgroup_id=1 AND hostname IN ('172.16.0.1','172.16.0.2');
Query OK, 2 rows affected (0.00 sec)

Admin> SELECT hostgroup_id,hostname,status FROM mysql_servers;
+--------------+------------+--------+
| hostgroup_id | hostname   | status |
+--------------+------------+--------+
| 0            | 172.16.0.1 | ONLINE |
| 1            | 172.16.0.3 | ONLINE |
+--------------+------------+--------+
2 rows in set (0.00 sec)

내부적으로 백엔드를 삭제하거나 OFFLINE_HARD 설정하는 것은 동일한 방식으로 처리됩니다. LOAD MYSQL SERVERS TO RUNTIME 가 실행 되면 Hostgroup_Manager는 백엔드 서버가 삭제되었음을 감지하고 내부적으로 OFFLINE_HARD 로 표시합니다.

728x90
반응형

'2023' 카테고리의 다른 글

ProxySQL - Sharding  (0) 2023.01.19
ProxySQL - 읽기/쓰기 분할 설정 방법  (0) 2023.01.19
ProxySQL 초기 설정  (0) 2023.01.18
ProxySQL - MySQL 8.0 지원  (0) 2023.01.18
ProxySQL - Global Variables (글로벌 변수)  (0) 2023.01.18