ProxySQL의 샤딩
샤딩은 ProxySQL의 또 다른 주요 사용 사례이며 기본적으로 샤딩에 대한 3x 주요 접근 방식이 있습니다.
- 사용자 기반 샤딩
- 스키마 기반 샤딩
- 데이터 기반 샤딩
다음 예제는 이러한 3x 특정 사용 사례를 다룹니다. 쿼리 규칙은 다른 많은 접근 방식을 지원할 수 있을 만큼 충분히 유연합니다.
사용자 기반 샤딩
이 가장 간단한 형태의 샤딩에서 ProxySQL은 연결에 정의된 "사용자"를 기반으로 적절한 샤드로 쿼리를 라우팅합니다. 우리가 해야 할 일은
"default_hostgroup"과 함께 MySQL 사용자를 정의하는 것뿐입니다. 이 접근 방식에는 쿼리 규칙이 필요하지 않습니다.
예를 들어:
INSERT INTO mysql_users
(username, password, active, default_hostgroup, comment)
VALUES
('accounts', 'shard0_pass', 1, 0, 'Routed to the accounts shard'),
('transactions', 'shard1_pass', 1, 1, 'Routed to the transactions shard'),
('logging', 'shard2_pass', 1, 2, 'Routed to the logging shard');
LOAD MYSQL USERS RULES TO RUNTIME;
SAVE MYSQL USERS RULES TO DISK;
ProxySQL 샤드 레이아웃에 대해 애플리케이션 디자인을 매핑하기 위해 애플리케이션에서 일종의 조회를 유지하는 것이 좋습니다. 예:
+--------------+--------------+-------------+
| app_module | shard_user | shard_pass |
+--------------+--------------+-------------+
| CRM | accounts | shard0_pass |
| OLTP | transactions | shard1_pass |
| Log Manager | logging | shard1_pass |
+--------------+--------------+-------------+
스키마 기반 샤딩
스키마 기반 샤딩도 간단합니다. 여기에서 스키마 이름이 "shard_xxx"라고 가정하고 "schemaname"을 적절한 "destination_hostgroup"에 매핑하는 쿼리 규칙을 정의해야 합니다.
INSERT INTO mysql_query_rules (rule_id, active, schemaname,
destination_hostgroup, apply)
VALUES
(1, 1, 'shard_0', 0, 1),
(2, 1, 'shard_1', 1, 1),
(3, 1, 'shard_2', 2, 1);
LOAD MYSQL QUERY RULES TO RUNTIME;
SAVE MYSQL QUERY RULES TO DISK;
데이터 기반 샤딩
데이터 기반 샤딩은 가장 복잡한 유형의 샤딩입니다.
- 쿼리가 쿼리 규칙에 맞춰지도록 하는 견고한 설계 원칙을 사용하여 처음부터 애플리케이션을 설계하는 것이 중요합니다.
- 일반적으로 "match_digest" 또는 "match_pattern"을 사용하여 여러 접근 방식을 구현할 수 있습니다.
- 데이터 기반 샤딩을 수행할 때 이는 전체 스키마가 아닌 특정 테이블을 샤딩한다는 의미입니다.
관련 매핑 테이블과 마찬가지로 MySQL 인스턴스에 users기반하여 저장하는 테이블의 간단한 예를 들어 보겠습니다 .locationloc_account_dataloc_mapping
# loc_account_data
+----------------------------------------+---------+---------+
| loc_id | user | acc_id |
+----------------------------------------+---------+---------+
| 20086020554955909836090724037181646035 | joe32 | 1 |
| 21503957780049285539986052866765125704 | sam57 | 2 |
| 75863560943999160082133817802533222835 | pam18 | 3 |
+----------------------------------------+---------+---------+
# loc_mapping
+----------------------------------------+---------+
| loc_id | region |
+----------------------------------------+---------+
| 20086020554955909836090724037181646035 | AMERICA |
| 21503957780049285539986052866765125704 | EMEA |
| 75863560943999160082133817802533222835 | OCEANIA |
+----------------------------------------+---------+
이제 이 테이블에 대해 실행할 모든 INSERT / UPDATE / DELETE / SELECT 문을 고려해야 합니다. 각 쿼리 다이제스트에 대해 쿼리 규칙을 구현해야 합니다. 예:
- INSERT INTO loc_account_data (loc_id, user, acc_id) VALUES (?, ?, ?);
- UPDATE loc_account_data SET user = ? WHERE loc_id = ? AND acc_id = ?;
- UPDATE loc_account_data SET acc_id = ? WHERE loc_id = ? AND user = ?;
- DELETE FROM loc_account_data WHERE loc_id = ? AND acc_id = ?;
- SELECT * FROM loc_account_data WHERE loc_id = ? AND user = ?;
다음 규칙은 INSERTS에 대한 요구 사항을 충족합니다(INSERTS에 대한 규칙은 UPDATES / DELETES / SELECTS보다 더 많은 INSERTS가 있을 것으로 예상되므로 먼저 구성됨).
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup,
apply)
VALUES
(1, 1, 'loc_account_data \(loc_id, user, acc_id\) VALUES
\(20086020554955909836090724037181646035', 0, 1),
(2, 1, 'loc_account_data \(loc_id, user, acc_id\) VALUES
\(20086020554955909836090724037181646035’, 1, 1),
(3, 1, 'loc_account_data \(loc_id, user, acc_id\) VALUES
\(20086020554955909836090724037181646035’, 2, 1);
다음 규칙은 UPDATES / DELETES / SELECTS에 대한 요구 사항을 다룹니다.
INSERT INTO mysql_query_rules (rule_id, active, match_pattern, destination_hostgroup,
apply)
VALUES
(4, 1, 'loc_id = 20086020554955909836090724037181646035', 0, 1),
(5, 1, 'loc_id = 21503957780049285539986052866765125704', 1, 1),
(6, 1, 'loc_id = 75863560943999160082133817802533222835', 2, 1);
테이블 에 값을 추가할 loc_mapping때 그에 따라 ProxySQL 쿼리 규칙 구성을 동기화해야 합니다.
샤딩 고려 사항
애플리케이션을 "샤딩 친화적"으로 만들기 위해 여전히 일부 논리를 구현해야 합니다.
더 간단한 "사용자" 또는 "스키마" 기반 접근 방식은 구현 및 유지 관리가 더 쉽습니다.
"크로스 샤드" 조인이 필요한 경우 이 논리는 애플리케이션의 일부
– 데이터 기반 샤딩을 구현할 때 샤드당 추가 규칙(예: RW 분할)을 추가해야
합니다.
'DB' 카테고리의 다른 글
ProxySQL - Query Logging (0) | 2023.01.19 |
---|---|
ProxySQL - Query Cache (0) | 2023.01.19 |
ProxySQL - 읽기/쓰기 분할 설정 방법 (0) | 2023.01.19 |
ProxySQL - 백엔드 서버 구성 (0) | 2023.01.19 |
ProxySQL 초기 설정 (0) | 2023.01.18 |