지난 글에서 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 발생하기 때문