지난 글에서 spider engine 을 구성하고 샤딩하는 방법에 대해서 살펴보았습니다.
이번 글에서는 spider engine의 data node 를 HA 하는 방법에 대해서 살펴보겠습니다.
1. HA 구성하기
1) 모든data node에서 HA용 테이블 생성
Create table backend_repl.sbtest like backend.sbtest;
2) spider node 연결server 추가
Create server backend1_repl Foreign data wrapper mysql Options ( Host ’11.111.111.11’, Database ‘backend_repl’, User ‘spider_test’, Password ‘test123’, Port 3311);
=>backend1 서버를바라보는서버생성, 파티션pr2를받도록설정할것임
create server backend2_repl foreign data wrapper mysql Options( Host ’22.222.222.22’, Database ‘backend_repl’, User ‘spider_test’, Password ‘test123’, Port 3311 );
=>backend2 서버를 바라보는 서버생성, 파티션 pr1를 받도록 설정할 것임
3) spider node table 재생성
Create table backend.sbtest . . engine=spider comment=‘database “backend”, table “sbtest”’ Partition by key (id) ( Partition pr1 comment=‘srv “backend1 backend2_repl”’,mbk “2”, mkd “2”, msi “3311”, link_status “0 0”’, Partition pr2 comment=‘srv “backend2 backend1_repl”’ , mbk “2”, mkd “2”, msi “3311”, link_status “0 0”’ );
=> srv : partition pr1 에 대해 backend1 서버와 backend2_repl 서버에서 관리함. 서로 HA 관계
mbk,mkd : monitoring kind로 2일땐 where 절 없이 테이블 모니터링 하는상태
msi : mariadb port
link_status
-
Description:Change status of the remote backend server link.
- 0Doesn't change status.
- 1Changes status to OK.
- 2Changes status to RECOVERY.
- 3Changes status to no more in group communication.
- Default Table Value:0
- DSN Parameter Name:lst
4) spider table 재생성 후 상태 확인
mysql> select db_name,table_name,link_id,server,tgt_table_name,link_status from mysql.spider_Tables; +---------+--------------+---------+---------------+----------------+-------------+ | db_name | table_name | link_id | server | tgt_table_name | link_status | +---------+--------------+---------+---------------+----------------+-------------+ | backend | sbtest#P#pr1 | 0 | backend1 | sbtest | 1 | | backend | sbtest#P#pr1 | 1 | backend2_repl | sbtest | 1 | | backend | sbtest#P#pr2 | 0 | backend2 | sbtest | 1 | | backend | sbtest#P#pr2 | 1 | backend1_repl | sbtest | 1 | +————+--------------+---------+---------------+----------------+-------------+
=> backend.sbtest 테이블 파티션 pr1은 backend1 서버 / backend2_repl 서버에 저장
파티션 pr2는 backend2 서버 / backend1_repl 서버에 저장함
2. data node 관제용 monitoring 설정
1) monitoring 서버 에러
mysql> insert into backend.sbtest select * from sbtest.sbtest1; ERROR 1032 (HY000): Can't find record in ‘spider_link_mon_servers'
=>앞에서 HA 설정을 했기 때문에 HA를 관제 할 monitoring 설정 필요
2) data node mornitoring 용 서버 생성
mysql> create server mon -> foreign data wrapper mysql -> options -> ( -> host '33.333.333.33', -> database 'backend', -> user 'spider_test', -> password 'test123', -> port 3311);
=> spider node 인 33.333.333.33 에서 HA관제용도 server 생성
3) spider engine monitoring 서버 등록
mysql> desc mysql.spider_link_mon_servers; +------------------------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +------------------------+------------------+------+-----+---------+-------+ | db_name | char(64) | NO | PRI | | | | table_name | char(64) | NO | PRI | | | | link_id | char(5) | NO | PRI | | | | sid | int(10) unsigned | NO | PRI | 0 | | server | char(64) | YES | | NULL | | | scheme | char(64) | YES | | NULL | | | host | char(64) | YES | | NULL | | | port | char(5) | YES | | NULL | | | socket | text | YES | | NULL | | | username | char(64) | YES | | NULL | | | password | char(64) | YES | | NULL | | | ssl_ca | text | YES | | NULL | | | ssl_capath | text | YES | | NULL | | | ssl_cert | text | YES | | NULL | | | ssl_cipher | char(64) | YES | | NULL | | | ssl_key | text | YES | | NULL | | | ssl_verify_server_cert | tinyint(4) | NO | | 0 | | | default_file | text | YES | | NULL | | | default_group | char(64) | YES | | NULL | | +————————————+------------------+------+-----+---------+-------+
mysql> insert into mysql.spider_link_mon_servers (db_name,table_name,link_id,sid,servers) values (‘%','%','%',3311,'mon');
3. HA 구성 확인
1) backend1 서버 데이터 확인
mysql> select count(*) from backend.sbtest; +----------+ | count(*) | +----------+ | 50449 | +----------+ 1 row in set (0.01 sec) mysql> select count(*) from backend_repl.sbtest; +----------+ | count(*) | +----------+ | 49551 | +----------+ 1 row in set (0.01 sec)
2) backend2 서버 데이터 확인
mysql> select count(*) from backend.sbtest; +----------+ | count(*) | +----------+ | 49551 | +----------+ 1 row in set (0.01 sec) mysql> select count(*) from backend_repl.sbtest; +----------+ | count(*) | +----------+ | 50449 | +----------+ 1 row in set (0.01 sec)
3) spider_table 상태확인
mysql> select db_name,table_name,link_id,server,tgt_table_name,link_status from mysql.spider_tables order by table_name; +---------+--------------+---------+---------------+----------------+-------------+ | db_name | table_name | link_id | server | tgt_table_name | link_status | +---------+--------------+---------+---------------+----------------+-------------+ | backend | sbtest#P#pr1 | 1 | backend2_repl | sbtest | 1 | | backend | sbtest#P#pr1 | 0 | backend1 | sbtest | 1 | | backend | sbtest#P#pr2 | 0 | backend2 | sbtest | 1 | | backend | sbtest#P#pr2 | 1 | backend1_repl | sbtest | 1 | +————+--------------+---------+---------------+----------------+-------------+
4. HA TEST
1) data node shutdown
mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)
2) Spider node 에서 데이터 조회
mysql> select count(*) from backend.sbtest partition(pr1); No connection. Trying to reconnect... ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/engn001/masvc01/TEST_10.2.12/mysql/mysql.sock' (111) ERROR: Can't connect to the server mysql> select count(*) from backend.sbtest partition(pr2); +----------+ | count(*) | +----------+ | 49551 | +----------+ 1 row in set (0.05 sec) mysql> select count(*) from backend.sbtest partition(pr1); +----------+ | count(*) | +----------+ | 50449 | +----------+ 1 row in set (0.04 sec)
=> 잠시 data node shutdown으로 인해 lost connection 된 후 복제본에서 읽어옴
3) spider_tables 상태 확인
mysql> select db_name,table_name,link_id,server,tgt_table_name,link_status from mysql.spider_tables order by table_name; +---------+--------------+---------+---------------+----------------+-------------+ | db_name | table_name | link_id | server | tgt_table_name | link_status | +---------+--------------+---------+---------------+----------------+-------------+ | backend | sbtest#P#pr1 | 1 | backend2_repl | sbtest | 1 | | backend | sbtest#P#pr1 | 0 | backend1 | sbtest | 3 | | backend | sbtest#P#pr2 | 0 | backend2 | sbtest | 1 | | backend | sbtest#P#pr2 | 1 | backend1_repl | sbtest | 3 | +---------+--------------+---------+---------------+----------------+-------------+ 4 rows in set (0.00 sec)
=>11.111.111.11 서버를 shutdown 시켰기 때문에 해당 서버를 바라보는 backend1 번서버 ,backend1_repl가 정지상태인 link_status 3 으로 확인 됨.
=> 유지보수 모드로 변경 후 데이터를 복구해줘야함
4) spider node 상태 변경
mysql> alter table backend.sbtest engine=spider comment='wrapper "mysql", table "sbtest"' partition by key (id) ( partition pr1 comment='srv "backend1 backend2_repl", mbk "2",mkd "2", msi "3311", link_status "2 0"', partition pr2 comment='srv "backend2 backend1_repl", mbk "2", mkd "2", msi "3311", link_status"0 0”');
=> 파티션 pr1의 backend1 을 유지보수 상태인 2로 변경
5) spider_copy_tables function을 이용하여 손상 노드 복구
mysql> select spider_Copy_Tables('backend.sbtest#P#pr1','1','0'); +----------------------------------------------------+ | spider_Copy_Tables('backend.sbtest#P#pr1','1','0') | +----------------------------------------------------+ | 1 | +----------------------------------------------------+ 1 row in set (4.91 sec)
=>mysql.spider_table 조회 시 테이블명이 backend.sbtest + pr1 중에서 link_id가 1번인 것,
즉 backend2에 있는 backend2_repl server를 이용하여 backend1 pr1을 복구함
backend1 과 backend2_repl 은 둘 다 같은 대상 pr1 을바라보기 때문에 데이터가 같음
복구성공시1 , 실패시0
SPIDER_COPY_TABLES(spider_table_name, source_link_id, destination_link_id_list [,parameters])
6) spider engine 상태 변경
mysql> alter table backend.sbtest -> engine=spider comment='wrapper "mysql", table "sbtest"' -> partition by key(id) -> ( -> partition pr1 comment='srv "backend1 backend2_repl" mbk "2", mkd"2", msi "3311", link_status "1 0"', -> partition pr2 comment='srv "backend2 backend1_repl" mbk "2", mkd"2", msi "3311", link_status "0 0”');
=> 위에서 backend1 복구 성공 했으므로 link_status를 정상동작 상태인 1 로 변경해줌
7) spider table 상태 확인
mysql> select db_name,table_name,link_id,server,tgt_table_name,link_status from mysql.spider_tables order by table_name; +---------+--------------+---------+---------------+----------------+-------------+ | db_name | table_name | link_id | server | tgt_table_name | link_status | +---------+--------------+---------+---------------+----------------+-------------+ | backend | sbtest#P#pr1 | 0 | backend1 | sbtest | 1 | | backend | sbtest#P#pr1 | 1 | backend2_repl | sbtest | 1 | | backend | sbtest#P#pr2 | 1 | backend1_repl | sbtest | 3 | | backend | sbtest#P#pr2 | 0 | backend2 | sbtest | 1 | +---------+--------------+---------+---------------+----------------+-------------+ 4 rows in set (0.00 sec)
* 이후 아직 lintk_status 3인 backend1_repl 도 위와 같은 방법으로 복구 해주면 복구완료
5. 추가 테스트
Data node 하나가 down 된 상태에서 dml 이 가능할까?
1) backend1 번 서버 shutdown
mysql> shutdown; Query OK, 0 rows affected (0.00 sec) mysql> select count(*) from backend.sbtest; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/engn001/masvc01/TEST_10.2.12/mysql/mysql.sock' (2) ERROR: Can't connect to the server
2) spider node에서 insert
mysql> insert into backend.sbtest values (100002,123,’test','test'); Query OK, 1 row affected (0.00 sec) mysql> commit; Query OK, 0 rows affected (0.01 sec) mysql> select count(*) from backend.sbtest partition (pr2); +----------+ | count(*) | +----------+ | 49551 | +----------+ 1 row in set (0.05 sec) mysql> select count(*) from backend.sbtest partition (pr1); +----------+ | count(*) | +----------+ | 50450 | +----------+ 1 row in set (0.06 sec)
=> backend1 이 바라보는 pr1 에 1건 insert 됨
mysql> select count(*) from backend_Repl.sbtest; +----------+ | count(*) | +----------+ | 50450 | +----------+ 1 row in set (0.01 sec)
=> pr1 을 같이 바라보는 backend2번 노드의 backend2_repl 에 dml 발생하기 때문