:meta-keywords: high availability, cubrid node, cubrid replication, cubrid slave, database replication, database slave :meta-description: CUBRID HA is an implementation of High Availability. CUBRID HA ensures database synchronization among multiple servers when providing service. When an unexpected failure occurs in the system which is operating services, this feature minimizes the service down time by allowing the other system to carry out the service automatically. ********* CUBRID HA ********* High Availability(HA)란, 하드웨어, 소프트웨어, ë„¤íŠ¸ì›Œí¬ ë“±ì— ìž¥ì• ê°€ ë°œìƒí•´ë„ ì§€ì†ì ì¸ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí•˜ëŠ” 기능ì´ë‹¤. ì´ ê¸°ëŠ¥ì€ í•˜ë£¨ 24시간 1ë…„ ë‚´ë‚´ 서비스를 ì œê³µí•´ì•¼ 하는 네트워킹 컴퓨팅 부분ì—서 필수ì ì¸ ìš”ì†Œì´ë‹¤. HA ì‹œìŠ¤í…œì€ ë‘ ëŒ€ ì´ìƒì˜ 서버 시스템으로 구성하여 시스템 구성 요소 ì¤‘ì˜ í•œ ìš”ì†Œì— ìž¥ì• ê°€ ë°œìƒí•´ 서비스를 중단 ì—†ì´ ì œê³µí• ìˆ˜ 있다. High Availability ê¸°ëŠ¥ì„ CUBRIDì— ì 용한 ê²ƒì´ CUBRID HA 기능ì´ë‹¤. CUBRID HA ê¸°ëŠ¥ì€ ì—¬ëŸ¬ 서버 시스템ì—서 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ í•ìƒ ë™ê¸°í™”ëœ ìƒíƒœë¡œ ìœ ì§€í•˜ì—¬ 서비스를 ì œê³µí•œë‹¤. 서비스를 수행 ì¤‘ì¸ ì‹œìŠ¤í…œì— ì˜ˆìƒì¹˜ 못한 ìž¥ì• ê°€ ë°œìƒí•˜ë©´ ìžë™ìœ¼ë¡œ 다른 ì‹œìŠ¤í…œì´ ì„œë¹„ìŠ¤ë¥¼ 수행하ë„ë¡ í•˜ì—¬ 서비스 중단 ì‹œê°„ì„ ìµœì†Œí™”í•œë‹¤. CUBRIDì˜ HA ê¸°ëŠ¥ì€ shared-nothing 구조ì´ë©°, 액티브 서버(active server)ì—서 ìŠ¤íƒ ë°”ì´ ì„œë²„(standby server)로 ë°ì´í„°ë¥¼ ë™ê¸°í™”하기 위해 ë‹¤ìŒ ë‘ ë‹¨ê³„ë¥¼ 수행한다. #. 트랜ìžì…˜ 로그 다중화: 액티브 서버ì—서 ìƒì„±ë˜ëŠ” 트랜ìžì…˜ 로그를 실시간으로 다른 ë…¸ë“œì— ë³µì œí•œë‹¤. #. 트랜ìžì…˜ 로그 ë°˜ì˜: 실시간으로 ë³µì œëœ íŠ¸ëžœìžì…˜ 로그를 ë¶„ì„하여 ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ë°ì´í„°ë¥¼ ë°˜ì˜í•œë‹¤. CUBRID HA ê¸°ëŠ¥ì€ ìœ„ ë‘ ë‹¨ê³„ë¥¼ 수행하여 액티브 서버와 ìŠ¤íƒ ë°”ì´ ì„œë²„ì— í•ìƒ ë™ê¸°í™”ëœ ë°ì´í„°ë¥¼ ìœ ì§€í•œë‹¤. ë”°ë¼ì„œ, 서비스를 ì œê³µ 중ì´ë˜ 마스터 노드(master node)ì— ì˜ˆìƒì¹˜ 못한 ìž¥ì• ê°€ ë°œìƒí•˜ì—¬ 액티브 서버가 ì •ìƒì 으로 ë™ìž‘하지 못하면 ìŠ¬ë ˆì´ë¸Œ 노드(slave node)ì˜ ìŠ¤íƒ ë°”ì´ ì„œë²„ê°€ 액티브 서버를 ëŒ€ì‹ í•˜ì—¬ 중단 없는 서비스를 ì œê³µí• ìˆ˜ 있다. CUBRID HA ê¸°ëŠ¥ì€ ì‹œìŠ¤í…œê³¼ CUBRIDì˜ ìƒíƒœë¥¼ 실시간으로 ê°ì‹œí•˜ê³ ìž¥ì• ê°€ ë°œìƒí•˜ë©´ ìžë™ failover를 수행하기 위해 heartbeat 메시지를 사용한다. .. image:: /images/image13.png CUBRID HA 기본 ê°œë… =================== 노드와 그룹 ----------- 노드는 CUBRID HA를 구성하는 논리ì ì¸ ë‹¨ìœ„ë¡œ, 노드는 ìƒíƒœì— ë”°ë¼ ë§ˆìŠ¤í„° 노드(master node), ìŠ¬ë ˆì´ë¸Œ 노드(slave node), ë ˆí”Œë¦¬ì¹´ 노드(replica node) 등으로 나눈다. * **마스터 노드**: ë³µì œì˜ ëŒ€ìƒì´ ë˜ëŠ” 노드로, 액티브 서버를 사용한 ì½ê¸°, 쓰기 등 ëª¨ë“ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí•œë‹¤. * **ìŠ¬ë ˆì´ë¸Œ 노드**: 마스터 노드와 ë™ì¼í•œ ë‚´ìš©ì„ ê°–ëŠ” 노드로, 마스터 ë…¸ë“œì˜ ë³€ê²½ì´ ìžë™ìœ¼ë¡œ ë°˜ì˜ëœë‹¤. ìŠ¤íƒ ë°”ì´ ì„œë²„ë¥¼ 사용한 ì½ê¸° 서비스를 ì œê³µí•˜ë©° 마스터 노드 ìž¥ì• ì‹œ failoverê°€ ì¼ì–´ë‚œë‹¤. * **ë ˆí”Œë¦¬ì¹´ 노드**: 마스터 노드와 ë™ì¼í•œ ë‚´ìš©ì„ ê°–ëŠ” 노드로, 마스터 ë…¸ë“œì˜ ë³€ê²½ì´ ìžë™ìœ¼ë¡œ ë°˜ì˜ëœë‹¤. ìŠ¤íƒ ë°”ì´ ì„œë²„ë¥¼ 사용한 ì½ê¸° 서비스를 ì œê³µí•˜ë©° 마스터 노드 ìž¥ì• ì‹œ failoverê°€ ì¼ì–´ë‚˜ì§€ 않는다. CUBRID HA ê·¸ë£¹ì€ ìœ„ì™€ ê°™ì€ ë…¸ë“œë“¤ë¡œ ì´ë£¨ì–´ì§€ë©°, ê·¸ë£¹ì˜ ë©¤ë²„ëŠ” **cubrid_ha.conf** ì˜ **ha_node_list** ë° **ha_replica_list** 로 ì„¤ì •í• ìˆ˜ 있다. 그룹 ë‚´ì˜ ë…¸ë“œë“¤ì€ ë™ì¼í•œ ë‚´ìš©ì„ ê°€ì§€ë©°, 주기ì 으로 ìƒíƒœ í™•ì¸ ë©”ì‹œì§€ë¥¼ ì£¼ê³ ë°›ê³ ë§ˆìŠ¤í„° ë…¸ë“œì— ìž¥ì• ê°€ ë°œìƒí•˜ë©´ failoverê°€ ì¼ì–´ë‚œë‹¤. 노드ì—는 마스터 프로세스(cub_master), ë°ì´í„°ë² ì´ìФ 서버 프로세스(cub_server), ë³µì œ 로그 복사 프로세스(copylogdb) ë° ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤(applylogdb) ë“±ì´ í¬í•¨ëœë‹¤. .. image:: /images/image14.png 프로세스 -------- CUBRID HA 노드는 í•˜ë‚˜ì˜ ë§ˆìŠ¤í„° 프로세스(cub_master), 하나 ì´ìƒì˜ ë°ì´í„°ë² ì´ìФ 서버 프로세스(cub_server), 하나 ì´ìƒì˜ ë³µì œ 로그 복사 프로세스(copylogdb), 하나 ì´ìƒì˜ ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤(applylogdb)로 ì´ë£¨ì–´ì ¸ 있다. í•˜ë‚˜ì˜ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ì„¤ì •í•˜ë©´ ë°ì´í„°ë² ì´ìФ 서버 프로세스, ë³µì œ 로그 복사 프로세스, ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ 구ë™ëœë‹¤. ë³µì œ ë¡œê·¸ì˜ ë³µì‚¬ì™€ ë°˜ì˜ì€ 서로 다른 í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ 수행ë˜ë¯€ë¡œ ë³µì œ ë°˜ì˜ì˜ ì§€ì—°ì€ ì‹¤í–‰ ì¤‘ì¸ íŠ¸ëžœìžì…˜ì— ì˜í–¥ì„ 주지 않는다. * **마스터 프로세스(cub_master)** : heartbeat 메시지를 ì£¼ê³ ë°›ìœ¼ë©° CUBRID HA ë‚´ë¶€ 관리 í”„ë¡œì„¸ìŠ¤ë“¤ì„ ì œì–´í•œë‹¤. * **ë°ì´í„°ë² ì´ìФ 서버 프로세스(cub_server)** : 사용ìžì—게 ì½ê¸°, 쓰기 ë“±ì˜ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí•œë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`ha-server` 를 ì°¸ê³ í•œë‹¤. * **ë³µì œ 로그 복사 프로세스(copylogdb)** : 그룹 ë‚´ì˜ ëª¨ë“ íŠ¸ëžœìžì…˜ 로그를 복사한다. ë³µì œ 로그 복사 프로세스가 ëŒ€ìƒ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìФ 서버 í”„ë¡œì„¸ìŠ¤ì— íŠ¸ëžœìžì…˜ 로그를 ìš”ì²í•˜ë©´, 해당 ë°ì´í„°ë² ì´ìФ 서버 프로세스는 ì ì ˆí•œ 로그를 ì „ë‹¬í•œë‹¤. 트랜ìžì…˜ 로그가 복사ë˜ëŠ” 위치는 **cubrid_ha.conf**\ ì˜ **ha_copy_log_base**\ 로 ì„¤ì •í• ìˆ˜ 있다. ë³µì‚¬ëœ ë³µì œ ë¡œê·¸ì˜ ì •ë³´ëŠ” :ref:`cubrid-applyinfo` ìœ í‹¸ë¦¬í‹°ë¡œ 확ì¸í• 수 있다. ë³µì œ 로그 복사는 SYNC, ASYNCì˜ ë‘ ê°€ì§€ 모드가 있으며, 모드는 **cubrid_ha.conf**\ ì˜ **ha_copy_sync_mode**\ 로 ì„¤ì •í• ìˆ˜ 있다. ëª¨ë“œì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`log-multiplexing` 를 ì°¸ê³ í•œë‹¤. .. image:: /images/image15.png * **ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤(applylogdb)** : ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ ë³µì‚¬ëœ ë¡œê·¸ë¥¼ ë…¸ë“œì— ë°˜ì˜í•œë‹¤. ë°˜ì˜í•œ ë³µì œ ì •ë³´ëŠ” ë‚´ë¶€ 카탈로그(db_ha_apply_info)ì— ì €ìž¥í•˜ë©°, ì´ ì •ë³´ëŠ” :ref:`cubrid-applyinfo` ìœ í‹¸ë¦¬í‹°ë¡œ 확ì¸í• 수 있다. .. image:: /images/image16.png .. _ha-server: 서버 ---- 서버란 ë°ì´í„°ë² ì´ìФ 서버 프로세스를 논리ì 으로 표현하는 단어로, ìƒíƒœì— ë”°ë¼ ì•¡í‹°ë¸Œ 서버(active server), ìŠ¤íƒ ë°”ì´ ì„œë²„(standby server)로 나눈다. * **액티브 서버** : 마스터 ë…¸ë“œì— ì†í•˜ëŠ” 서버로, active ìƒíƒœì´ë‹¤. 액티브 서버는 사용ìžì—게 ì½ê¸°, 쓰기 등 ëª¨ë“ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí•œë‹¤. * **ìŠ¤íƒ ë°”ì´ ì„œë²„** : 마스터 노드 ì™¸ì˜ ë…¸ë“œì— ì†í•˜ëŠ” 서버로, standby ìƒíƒœì´ë‹¤. ìŠ¤íƒ ë°”ì´ ì„œë²„ëŠ” 사용ìžì—게 ì½ê¸° ì„œë¹„ìŠ¤ë§Œì„ ì œê³µí•œë‹¤. 서버 ìƒíƒœëŠ” 노드 ìƒíƒœì— ë”°ë¼ ë³€ê²½ëœë‹¤. :ref:`cubrid-changemode` ìœ í‹¸ë¦¬í‹°ë¥¼ ì´ìš©í•˜ë©´ 서버 ìƒíƒœë¥¼ ì¡°íšŒí• ìˆ˜ 있다. maintenance 모드는 ìš´ì˜ íŽ¸ì˜ë¥¼ 위한 것으로, **cubrid changemode** ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³€ê²½í• ìˆ˜ 있다. .. image:: /images/image17.png * **active** : ì¼ë°˜ì 으로 마스터 노드ì—서 실행 ì¤‘ì¸ ì„œë²„ë“¤ì€ active ìƒíƒœì´ë‹¤. ì½ê¸°, 쓰기 등 ëª¨ë“ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí•œë‹¤. * **standby** : ìŠ¬ë ˆì´ë¸Œ 노드 ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드ì—서 실행 ì¤‘ì¸ ì„œë²„ë“¤ì€ standby ìƒíƒœì´ë‹¤. ì½ê¸° ì„œë¹„ìŠ¤ë§Œì„ ì œê³µí•œë‹¤. * **maintenance** : ìš´ì˜ íŽ¸ì˜ë¥¼ 위해 수ë™ìœ¼ë¡œ 변경 가능한 ìƒíƒœë¡œ, 로컬 í˜¸ìŠ¤íŠ¸ì˜ csqlë§Œ ì ‘ì†í• 수 있으며, 사용ìžì—게는 서비스를 ì œê³µí• ìˆ˜ 없다. * **to-be-active** : ìŠ¤íƒ ë°”ì´ ì„œë²„ê°€ failover ë“±ì˜ ì´ìœ 로 ì¸í•´ 액티브 서버가 ë˜ê¸° ì „ì˜ ìƒíƒœì´ë‹¤. ê¸°ì¡´ì˜ ë§ˆìŠ¤í„° 노드로부터 ë°›ì€ íŠ¸ëžœìžì…˜ 로그를 ìžì‹ ì˜ ì„œë²„ì— ë°˜ì˜í•˜ëŠ” 등 액티브 서버가 ë˜ê¸° 위한 준비를 한다. 해당 ìƒíƒœì˜ 노드ì—는 SELECT 질ì˜ë§Œ ìˆ˜í–‰í• ìˆ˜ 있다. * 기타: ë‚´ë¶€ì 으로 사용하는 ìƒíƒœì´ë‹¤. 노드 ìƒíƒœê°€ 변경ë˜ë©´ cub_master 프로세스 로그와 cub_server 프로세스 ë¡œê·¸ì— ê°ê° 다ìŒê³¼ ê°™ì€ ì—러 메시지가 ì €ìž¥ëœë‹¤. 단, **cubrid.conf**\ì—서 **error_log_level**\ì˜ ê°’ì´ **error** ì´í•˜ì¸ ê²½ìš°ì— ì €ìž¥ëœë‹¤. * cub_master í”„ë¡œì„¸ìŠ¤ì˜ ë¡œê·¸ ì •ë³´ëŠ” **$CUBRID/log/**\ *<hostname>*\ **_master.err** 파ì¼ì— ì €ìž¥ë˜ë©° 다ìŒì˜ ë‚´ìš©ì´ ê¸°ë¡ëœë‹¤. :: HA generic: Send changemode request to the server. (state:1[active], args:[cub_server demodb ], pid:25728). HA generic: Receive changemode response from the server. (state:1[active], args:[cub_server demodb ], pid:25728). * cub_server í”„ë¡œì„¸ìŠ¤ì˜ ë¡œê·¸ ì •ë³´ëŠ” **$CUBRID/log/server/**\ *<db_name>_<date>_<time>*\ **.err** 파ì¼ì— ì €ìž¥ë˜ë©° 다ìŒì˜ ë‚´ìš©ì´ ê¸°ë¡ëœë‹¤. :: Server HA mode is changed from 'to-be-active' to 'active'. heartbeat 메시지 ---------------- HA ê¸°ëŠ¥ì„ ì œê³µí•˜ê¸° 위한 핵심 구성 요소로, 마스터 노드, ìŠ¬ë ˆì´ë¸Œ 노드, ë ˆí”Œë¦¬ì¹´ 노드가 다른 ë…¸ë“œì˜ ìƒíƒœë¥¼ ê°ì‹œí•˜ê¸° 위해 ì£¼ê³ ë°›ëŠ” 메시지ì´ë‹¤. 마스터 프로세스는 그룹 ë‚´ì˜ ëª¨ë“ ë§ˆìŠ¤í„° 프로세스와 주기ì 으로 heartbeat 메시지를 ì£¼ê³ ë°›ëŠ”ë‹¤. heartbeat 메시지는 **cubrid_ha.conf** ì˜ **ha_port_id** 파ë¼ë¯¸í„°ì— ì„¤ì •ëœ UDP í¬íŠ¸ë¡œ ì£¼ê³ ë°›ëŠ”ë‹¤. heartbeat 메시지 주기는 ë‚´ë¶€ì 으로 ì„¤ì •ëœ ê°’ì„ ë”°ë¥¸ë‹¤. 마스터 ë…¸ë“œì˜ ìž¥ì• ê°€ ê°ì§€ë˜ë©´ ìŠ¬ë ˆì´ë¸Œ 노드로 failoverê°€ ì´ë£¨ì–´ì§„다. .. image:: /images/image18.png failover와 failback ------------------- failover란, 마스터 ë…¸ë“œì— ìž¥ì• ê°€ ë°œìƒí•˜ì—¬ 서비스를 ì œê³µí• ìˆ˜ 없는 ìƒíƒœê°€ ë˜ë©´ ìš°ì„ ìˆœìœ„ê°€ 가장 ë†’ì€ ìŠ¬ë ˆì´ë¸Œ 노드가 ìžë™ìœ¼ë¡œ 마스터 노드가 ë˜ëŠ” 것ì´ë‹¤. 마스터 프로세스는 수집한 CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œë“¤ì˜ ì •ë³´ë¥¼ 바탕으로 스코어를 계산하여 ì ì ˆí•œ 시ì ì— í•´ë‹¹ 프로세스가 ì†í•œ ë…¸ë“œì˜ ìƒíƒœë¥¼ 마스터 노드로 ë³€ê²½í•˜ê³ , 관리 í”„ë¡œì„¸ìŠ¤ì— ë³€ê²½ëœ ìƒíƒœë¥¼ ì „íŒŒí•œë‹¤. failbackì€ ë§ˆìŠ¤í„° ë…¸ë“œì˜€ë˜ ìž¥ì• ë…¸ë“œê°€ 복구ë˜ë©´ ìžë™ìœ¼ë¡œ 다시 마스터 노드가 ë˜ëŠ” 것ì´ë©°, CUBRID HA는 ì„œë²„ì˜ failbackì„ ì§€ì›í•˜ì§€ 않는다. .. image:: /images/image19.png heartbeat 메시지가 ì •ìƒì 으로 ì „ë‹¬ë˜ì§€ 않으면 failoverê°€ ì¼ì–´ë‚˜ë¯€ë¡œ, 네트워í¬ê°€ ë¶ˆì•ˆì •í•œ 환경ì—서는 ìž¥ì• ê°€ ë°œìƒí•˜ì§€ ì•Šì•„ë„ failoverê°€ ì¼ì–´ë‚ 수 있다. ì´ì™€ ê°™ì€ ìƒí™©ì—서 failoverê°€ ì¼ì–´ë‚˜ëŠ” ê²ƒì„ ë§‰ê¸° 위해 **ha_ping_hosts** 를 ì„¤ì •í• ìˆ˜ 있다. **ha_ping_hosts** 를 ì„¤ì •í•˜ë©´, heartbeat 메시지가 ì •ìƒì 으로 ì „ë‹¬ë˜ì§€ ëª»í–ˆì„ ë•Œ **ha_ping_hosts** 로 ì„¤ì •í•œ 노드로 ping 메시지를 보내서 ì›ì¸ì´ ë„¤íŠ¸ì›Œí¬ ë¶ˆì•ˆì •ì¸ì§€ 확ì¸í•˜ëŠ” ì ˆì°¨ë¥¼ 거친다. **ha_ping_hosts** ì„¤ì •ì— ëŒ€í•œ 좀 ë” ìžì„¸í•œ ì„¤ëª…ì€ :ref:`cubrid-ha-conf` 를 ì°¸ê³ í•œë‹¤. .. _broker-mode: 브로커 모드 ----------- 브로커는 DB ì„œë²„ì— **Read Write**, **Read Only**, **Standby Only** ì´ë ‡ê²Œ 세 가지 모드 중 한 가지로 ì ‘ì†í• 수 있으며, 사용ìžê°€ 브로커 모드를 ì„¤ì •í• ìˆ˜ 있다. 브로커는 DB 서버 ì—°ê²° ìˆœì„œì— ì˜í•´ ì—°ê²°ì„ ì‹œë„하여 ìžì‹ ì˜ ëª¨ë“œì— ë§žëŠ” DB 서버를 ì„ íƒí•˜ì—¬ 연결한다. ì¡°ê±´ì´ ë§žì§€ 않아 ì—°ê²°ë˜ì§€ 않으면 ë‹¤ìŒ ìˆœì„œì˜ ì—°ê²°ì„ ì‹œë„í•˜ê³ , ëª¨ë“ ìˆœì„œë¥¼ ìˆ˜í–‰í•´ë„ ì ì ˆí•œ DB 서버를 찾지 못하면 해당 브로커는 DB 서버 ì—°ê²°ì— ì‹¤íŒ¨í•œë‹¤. 브로커 모드 ì„¤ì • ë°©ë²•ì€ :ref:`ha-cubrid-broker-conf`\ 를 ì°¸ê³ í•œë‹¤. DB 서버 ì—°ê²°ì€ **cubrid_broker.conf**\ ì˜ **PREFERRED_HOSTS**, **CONNECT_ORDER**\ 와 **MAX_NUM_DELAYED_HOSTS_LOOKUP** 파ë¼ë¯¸í„°ì˜ ì˜í–¥ì„ 받는다. ì´ë“¤ì— ì˜í•œ ì˜í–¥ì€ :ref:`ha-connect-broker-db`\ ì„ ì°¸ê³ í•œë‹¤. 다ìŒì€ ìœ„ì˜ íŒŒë¼ë¯¸í„°ë“¤ì„ ì„¤ì •í•˜ì§€ ì•Šì€ ê²½ìš°ì— ëŒ€í•œ 설명ì´ë‹¤. **Read Write** "ACCESS_MODE=RW" ì½ê¸°, 쓰기 서비스를 ì œê³µí•˜ëŠ” 브로커ì´ë‹¤. ì´ ë¸Œë¡œì»¤ëŠ” ì¼ë°˜ì 으로 액티브 ì„œë²„ì— ì—°ê²°í•˜ë©°, ì—°ê²° 가능한 액티브 서버가 없으면 ì¼ì‹œì 으로 ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ì—°ê²°í•œë‹¤. ë”°ë¼ì„œ Read Write 브로커는 ì¼ì‹œì 으로 ìŠ¤íƒ ë°”ì´ ì„œë²„ì™€ ì—°ê²°ë 수 있다. ì¼ì‹œì 으로 ìŠ¤íƒ ë°”ì´ ì„œë²„ì™€ ì—°ê²°ë˜ë©´ 트랜ìžì…˜ì´ ëë‚ ë•Œë§ˆë‹¤ ìŠ¤íƒ ë°”ì´ ì„œë²„ì™€ ì—°ê²°ì„ ëŠê³ , ë‹¤ìŒ íŠ¸ëžœìžì…˜ì´ 시작ë˜ë©´ 다시 액티브 서버와 ì—°ê²°ì„ ì‹œë„한다. ìŠ¤íƒ ë°”ì´ ì„œë²„ì™€ ì—°ê²°ë˜ë©´ ì½ê¸° 서비스만 가능하며, 쓰기 ìš”ì²ì— 대해서는 서버ì—서 오류가 ë°œìƒí•œë‹¤. ë‹¤ìŒ ê·¸ë¦¼ì€ **db-host** ì„¤ì •ì„ í†µí•´ í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•˜ëŠ” 예ì´ë‹¤. .. image:: /images/image20.png databases.txtì˜ db-hostê°€ node B:node C:node A 순ì´ë¯€ë¡œ, *B*, *C*, *A* 순으로 ì ‘ì†ì„ 시ë„한다. ì´ë•Œ db-hostì— ëª…ì‹œëœ "node B:node C:node A"는 /etc/hosts 파ì¼ì— ì •ì˜ëœ ì‹¤ì œ 호스트 ì´ë¦„ì´ë‹¤. * Example 1. *node B* 는 ë¹„ì •ìƒ ì¢…ë£Œëœ ìƒíƒœì´ê³ , *node C* 는 standby ìƒíƒœì´ë©°, *node A* 는 active ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node A* 와 연결한다. * Example 2. *node B* 는 ë¹„ì •ìƒ ì¢…ë£Œëœ ìƒíƒœì´ê³ , *node C* 는 active ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node C* 와 연결한다. **Read Only** "ACCESS_MODE=RO" ì½ê¸° 서비스를 ì œê³µí•˜ëŠ” 브로커ì´ë‹¤. ì´ ë¸Œë¡œì»¤ëŠ” 가능한 ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ì—°ê²°í•˜ë©°, ìŠ¤íƒ ë°”ì´ ì„œë²„ê°€ 없으면 액티브 ì„œë²„ì— ì—°ê²°í•œë‹¤. ë”°ë¼ì„œ Read Only 브로커는 ì¼ì‹œì 으로 액티브 서버와 ì—°ê²°ë 수 있다. 액티브 서버와 ì—°ê²°ëœ í›„ :ref:`RECONNECT_TIME <reconnect_time>` ì„¤ì • ì‹œê°„ì´ ì§€ë‚˜ë©´ ì—°ê²°ì„ ëŠê³ ìž¬ì—°ê²°ì„ ì‹œë„한다. ë˜ëŠ” **cubrid broker reset** ëª…ë ¹ì„ ì‹¤í–‰í•˜ì—¬ 기존 ì—°ê²°ì„ ëŠê³ 새ë¡ê²Œ ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ì—°ê²°í• ìˆ˜ 있다. Read Only ë¸Œë¡œì»¤ì— ì“°ê¸° ìš”ì²ì´ ì „ë‹¬ë˜ë©´ 브로커ì—서 오류가 ë°œìƒí•˜ë¯€ë¡œ, 액티브 서버와 ì—°ê²°ë˜ì–´ë„ ì½ê¸° 서비스만 가능하다. ë‹¤ìŒ ê·¸ë¦¼ì€ **db-host** ì„¤ì •ì„ í†µí•´ í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•˜ëŠ” 예ì´ë‹¤. .. image:: /images/image21.png databases.txtì˜ db-hostê°€ node A:node B:node C 순ì´ë¯€ë¡œ, *A*, *B*, *C* 순으로 ì ‘ì†ì„ 시ë„한다. ì´ë•Œ db-hostì— ëª…ì‹œëœ "node A:node B:node C"는 /etc/hosts 파ì¼ì— ì •ì˜ëœ ì‹¤ì œ 호스트 ì´ë¦„ì´ë‹¤. * Example 1. *node A* 는 active ìƒíƒœì´ê³ , *node B* 는 standby ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node B* 와 ì—°ê²°ëœë‹¤. * Example 2. *node A* 는 active ìƒíƒœì´ê³ , *node B* 는 ë¹„ì •ìƒ ì¢…ë£Œëœ ìƒíƒœì´ë©°, *node C* 는 standby ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node C* 와 ì—°ê²°ëœë‹¤. * Example 3. *node A* 는 active ìƒíƒœì´ê³ , *node B* 와 *node C* 는 ë¹„ì •ìƒ ì¢…ë£Œëœ ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node A* 와 ì—°ê²°ëœë‹¤. **Standby Only** "ACCESS_MODE=SO" ì½ê¸° 서비스를 ì œê³µí•˜ëŠ” 브로커ì´ë‹¤. ì´ ë¸Œë¡œì»¤ëŠ” ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ì—°ê²°í•˜ë©°, ìŠ¤íƒ ë°”ì´ ì„œë²„ê°€ 없으면 서비스를 ì œê³µí•˜ì§€ 않는다. ë‹¤ìŒ ê·¸ë¦¼ì€ **db-host** ì„¤ì •ì„ í†µí•´ í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•˜ëŠ” 예ì´ë‹¤. .. image:: /images/image22.png databases.txtì˜ db-hostê°€ node A:node B:node C 순ì´ë¯€ë¡œ, *A*, *B*, *C* 순으로 ì ‘ì†ì„ 시ë„한다. ì´ë•Œ db-hostì— ëª…ì‹œëœ "node A:node B:node C"는 /etc/hosts 파ì¼ì— ì •ì˜ëœ ì‹¤ì œ 호스트 ì´ë¦„ì´ë‹¤. * Example 1. *node A* 는 active ìƒíƒœì´ê³ , *node B* 는 standby ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node B* 와 ì—°ê²°ëœë‹¤. * Example 2. *node A* 는 active ìƒíƒœì´ê³ , *node B* 는 ë¹„ì •ìƒ ì¢…ë£Œëœ ìƒíƒœì´ë©°, *node C* 는 standby ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 *node C* 와 ì—°ê²°ëœë‹¤. * Example 3. *node A* 는 active ìƒíƒœì´ê³ , *node B* 와 *node C* 는 ë¹„ì •ìƒ ì¢…ë£Œëœ ìƒíƒœì´ë‹¤. ë”°ë¼ì„œ 최종ì 으로 ì–´ë–¤ ë…¸ë“œì™€ë„ ì—°ê²°ë˜ì§€ 않는다. ì´ ë¶€ë¶„ì´ Read Only ë¸Œë¡œì»¤ì™€ì˜ ì°¨ì´ì ì´ë‹¤. CUBRID HA 기능 ============== 서버 ì´ì¤‘í™” ----------- 서버 ì´ì¤‘화란 CUBRID HA ê¸°ëŠ¥ì„ ì œê³µí•˜ê¸° 위해 물리ì ì¸ í•˜ë“œì›¨ì–´ 장비를 중복으로 구성하여 ì‹œìŠ¤í…œì„ êµ¬ì¶•í•˜ëŠ” 것ì´ë‹¤. ì´ëŸ¬í•œ êµ¬ì„±ì„ í†µí•´ í•˜ë‚˜ì˜ ìž¥ë¹„ì— ìž¥ì• ê°€ ë°œìƒí•´ë„ ì‘ìš© 프로그램ì—서는 ì§€ì†ì ì¸ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí• ìˆ˜ 있다. **서버 failover** 브로커는 ì„œë²„ì˜ ì ‘ì† ìˆœì„œë¥¼ ì •ì˜í•˜ê³ ê·¸ ìˆœì„œì— ë”°ë¼ ì„œë²„ì— ì ‘ì†í•œë‹¤. ì ‘ì†í•œ ì„œë²„ì— ìž¥ì• ê°€ ë°œìƒí•˜ë©´ 브로커는 ë‹¤ìŒ ìˆœìœ„ë¡œ ì„¤ì •ëœ ì„œë²„ì— ì ‘ì†í•˜ë©°, ì‘ìš© 프로그램ì—서는 별ë„ì˜ ì²˜ë¦¬ê°€ í•„ìš” 없다. 브로커가 ë‹¤ìŒ ì„œë²„ì— ì ‘ì†í• ë•Œì˜ ë™ìž‘ì€ ë¸Œë¡œì»¤ì˜ ëª¨ë“œì— ë”°ë¼ ë‹¤ë¥¼ 수 있다. ì„œë²„ì˜ ì ‘ì† ìˆœì„œ ë° ë¸Œë¡œì»¤ ëª¨ë“œì˜ ì„¤ì • ë°©ë²•ì€ :ref:`ha-cubrid-broker-conf`\ 를 ì°¸ê³ í•œë‹¤. .. image:: /images/image24.png **서버 failback** CUBRID HA는 ìžë™ìœ¼ë¡œ 서버 failbackì„ ì§€ì›í•˜ì§€ 않는다. ë”°ë¼ì„œ failbackì„ ìˆ˜ë™ìœ¼ë¡œ ì ìš©í•˜ë ¤ë©´ ë¹„ì •ìƒ ì¢…ë£Œë˜ì—ˆë˜ 마스터 노드를 복구하여 ìŠ¬ë ˆì´ë¸Œ 노드로 구ë™í•œ 후, failover로 ì¸í•´ ìŠ¬ë ˆì´ë¸Œì—서 마스터로 ì—í• ì´ ë°”ë€ ë…¸ë“œë¥¼ ì˜ë„ì 으로 종료하여 다시 ê° ë…¸ë“œì˜ ì—í• ì„ ì„œë¡œ 바꾼다. 예를 들어 *nodeA*\ ê°€ 마스터, *nodeB*\ ê°€ ìŠ¬ë ˆì´ë¸Œì¼ 때 failover ì´í›„ì—는 ì—í• ì´ ë°”ë€Œì–´ *nodeB*\ ê°€ 마스터, *nodeA*\ ê°€ ìŠ¬ë ˆì´ë¸Œê°€ ëœë‹¤. *nodeB*\ 를 종료(**cubrid heartbeat stop**)한 후, *nodeA*\ ê°€ 마스터, 즉 노드 ìƒíƒœê°€ active로 바뀌었는지 확ì¸(**cubrid heartbeat status**) 한다. ê·¸ë¦¬ê³ ë‚˜ì„œ *nodeB*\ 를 시작(**cubrid heartbeat start**) 하면, *nodeB*\ 는 ìŠ¬ë ˆì´ë¸Œê°€ ëœë‹¤. .. _duplexing-brokers: 브로커 ì´ì¤‘í™” ------------- CUBRID는 3-tier DBMS로, ì‘ìš© 프로그램과 ë°ì´í„°ë² ì´ìФ 서버를 중계하는 ì—í• ì„ ìˆ˜í–‰í•˜ëŠ” 브로커ë¼ëŠ” 미들웨어가 있다. CUBRID HA ê¸°ëŠ¥ì„ ì œê³µí•˜ê¸° 위해 ë¸Œë¡œì»¤ë„ ë¬¼ë¦¬ì ì¸ í•˜ë“œì›¨ì–´ë¥¼ 중복으로 구성하여, í•˜ë‚˜ì˜ ë¸Œë¡œì»¤ì— ìž¥ì• ê°€ ë°œìƒí•´ë„ ì‘ìš© 프로그램ì—서는 ì§€ì†ì ì¸ ì„œë¹„ìŠ¤ë¥¼ ì œê³µí• ìˆ˜ 있다. 브로커 ì´ì¤‘í™”ì˜ êµ¬ì„±ì€ ì„œë²„ ì´ì¤‘í™”ì˜ êµ¬ì„±ì— ë”°ë¼ ê²°ì •ë˜ëŠ” ê²ƒì´ ì•„ë‹ˆë©°, 사용ìžì˜ ì„ í˜¸ì— ë§žê²Œ ë³€í˜•ì´ ê°€ëŠ¥í•˜ë‹¤. ë˜í•œ, 별ë„ì˜ ìž¥ë¹„ë¡œ 분리가 가능하다. ë¸Œë¡œì»¤ì˜ failover, failback ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ JDBC, CCI ë˜ëŠ” PHPì˜ ì ‘ì† URLì— **altHosts** ì†ì„±ì„ 추가해야 한다. ì´ì— 대한 ì„¤ëª…ì€ JDBC ì„¤ì •, CCI ì„¤ì • ë˜ëŠ” PHP ì„¤ì •ì„ ì°¸ê³ í•œë‹¤. 브로커를 ì„¤ì •í•˜ë ¤ë©´ **cubrid_broker.conf** 파ì¼ì„ ì„¤ì •í•´ì•¼ í•˜ê³ , ë°ì´í„°ë² ì´ìФ ì„œë²„ì˜ failover 순서를 ì„¤ì •í•˜ë ¤ë©´ **databases.txt** 파ì¼ì„ ì„¤ì •í•´ì•¼ 한다. ì´ì— 대한 ì„¤ëª…ì€ :ref:`quick-broker-config`\ ì„ ì°¸ê³ í•œë‹¤. 다ìŒì€ 2ê°œì˜ Read Write(RW) 브로커를 구성한 예ì´ë‹¤. application URLì˜ ì²« 번째 ì ‘ì† ë¸Œë¡œì»¤ë¥¼ *broker B1* 으로 í•˜ê³ ë‘ ë²ˆì§¸ ì ‘ì† ë¸Œë¡œì»¤ë¥¼ *broker B2* 로 ì„¤ì •í•˜ë©´, applicationì´ *broker B1* ì— ì ‘ì†í• 수 없는 경우 *broker B2* ì— ì ‘ì†í•˜ê²Œ ëœë‹¤. ì´í›„ *broker B1* ì´ ë‹¤ì‹œ ì ‘ì† ê°€ëŠ¥í•´ì§€ë©´ applicationì€ *broker B1* ì— ìž¬ì ‘ì†í•˜ê²Œ ëœë‹¤. .. image:: /images/image25.png 다ìŒì€ 마스터 노드, ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ê° ìž¥ë¹„ ë‚´ì— Read Write(RW) 브로커와 Read Only(RO) 브로커를 구성한 예ì´ë‹¤. *app1*ê³¼ *app2* URLì˜ ì²« 번째 ì ‘ì†ì€ ê°ê° *broker A1* (RW), *broker B2* (RO) ì´ê³ , ë‘ ë²ˆì§¸ ì ‘ì†(**altHosts**)ì€ ê°ê° *broker A2* (RO), *broker B1* (RW)ì´ë‹¤. *nodeA* 를 í¬í•¨í•œ 장비가 ê³ ìž¥ë‚˜ë©´, *app1*ê³¼ *app2*는 *nodeB* 를 í¬í•¨í•œ ìž¥ë¹„ì˜ ë¸Œë¡œì»¤ì— ì ‘ì†í•œë‹¤. .. image:: /images/image26.png 다ìŒì€ 브로커 장비를 별ë„로 구성하여 Read Write 브로커 한 ê°œ, Preferred Host Read Only 브로커 ë‘ ê°œë¥¼ ë‘ê³ , 한 ê°œì˜ ë§ˆìŠ¤í„° 노드와 ë‘ ê°œì˜ ìŠ¬ë ˆì´ë¸Œ 노드를 구성한 예ì´ë‹¤. Preferred Host Read Only ë¸Œë¡œì»¤ë“¤ì€ ê°ê° *nodeB* 와 *nodeC* ì— ì—°ê²°í•¨ìœ¼ë¡œì¨ ì½ê¸° 부하를 분산하였다. .. image:: /images/image27.png **브로커 failover** 브로커 failover는 시스템 파ë¼ë¯¸í„°ì˜ ì„¤ì •ì— ì˜í•´ ìžë™ìœ¼ë¡œ failoverë˜ëŠ” ê²ƒì´ ì•„ë‹ˆë©°, JDBC, CCI, PHP ì‘ìš© 프로그램ì—서는 ì ‘ì† URLì˜ **altHosts**\ ì— ë¸Œë¡œì»¤ í˜¸ìŠ¤íŠ¸ë“¤ì„ ì„¤ì •í•´ì•¼ 브로커 failoverê°€ 가능하다. ì„¤ì •í•œ ìš°ì„ ìˆœìœ„ê°€ 가장 ë†’ì€ ë¸Œë¡œì»¤ì— ì ‘ì†í•˜ê³ , ì ‘ì†í•œ ë¸Œë¡œì»¤ì— ìž¥ì• ê°€ ë°œìƒí•˜ë©´ ì ‘ì† URLì— ë‹¤ìŒ ìˆœìœ„ë¡œ ì„¤ì •í•œ ë¸Œë¡œì»¤ì— ì ‘ì†í•œë‹¤. ì‘ìš© 프로그램ì—서는 ì ‘ì† URLì˜ **altHosts**\ 를 ì„¤ì •í•˜ëŠ” 것 외ì—는 별ë„ì˜ ì²˜ë¦¬ê°€ í•„ìš” 없으며, JDBC, CCI, PHP 드ë¼ì´ë²„ ë‚´ë¶€ì—서 처리한다. **브로커 failback** 브로커 failover ì´í›„ ìž¥ì• ë¸Œë¡œì»¤ê°€ 복구ë˜ë©´ 기존 브로커와 ì ‘ì†ì„ ëŠê³ ì´ì „ì— ì—°ê²°í–ˆë˜ ìš°ì„ ìˆœìœ„ê°€ 가장 ë†’ì€ ë¸Œë¡œì»¤ì— ë‹¤ì‹œ ì ‘ì†í•œë‹¤. ì‘ìš© 프로그램ì—서는 별ë„ì˜ ì²˜ë¦¬ê°€ í•„ìš” 없으며, JDBC, CCI, PHP 드ë¼ì´ë²„ ë‚´ë¶€ì—서 처리한다. 브로커 failbackì„ ìˆ˜í–‰í•˜ëŠ” ì‹œê°„ì€ JDBC ì ‘ì† URLì— ì„¤ì •í•œ ê°’ì„ ë”°ë¥¸ë‹¤. ì´ì— 대한 ì„¤ëª…ì€ :ref:`ha-jdbc-conf`\ ì„ ì°¸ê³ í•œë‹¤. .. _log-multiplexing: 로그 다중화 ----------- CUBRID HA는 CUBRID HA ê·¸ë£¹ì— í¬í•¨ëœ ëª¨ë“ ë…¸ë“œì— íŠ¸ëžœìžì…˜ 로그를 ë³µì‚¬í•˜ê³ ì´ë¥¼ ë°˜ì˜í•¨ìœ¼ë¡œì¨ CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œë¥¼ ë™ì¼í•œ DB로 ìœ ì§€í•œë‹¤. CUBRID HAì˜ ë¡œê·¸ 복사 구조는 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드 사ì´ì˜ ìƒí˜¸ 복사 형태로, ì „ì²´ ë¡œê·¸ì˜ ì–‘ì´ ë§Žì•„ì§€ëŠ” 단ì ì´ ìžˆìœ¼ë‚˜ ì²´ì¸ í˜•íƒœì˜ ë³µì‚¬ 구조보다 구성 ë° ìž¥ì• ì²˜ë¦¬ 측면ì—서 ìœ ì—°í•˜ë‹¤ëŠ” 장ì ì´ ìžˆë‹¤. .. image:: /images/image28.png 트랜ìžì…˜ 로그를 복사하는 모드는 **SYNC**, **ASYNC**\ ì˜ ë‘ ê°€ì§€ê°€ 있으며, 사용ìžê°€ :ref:`cubrid-ha-conf`\ 로 ì„¤ì •í• ìˆ˜ 있다. **SYNC 모드** 트랜ìžì…˜ì´ 커밋ë˜ë©´, ë°œìƒí•œ 트랜ìžì…˜ 로그가 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë³µì‚¬ë˜ì–´ 파ì¼ì— ì €ìž¥ë˜ê³ ì´ì— 대한 성공 여부를 ì „ë‹¬ë°›ì€ í›„ì— íŠ¸ëžœìžì…˜ ì»¤ë°‹ì´ ì™„ë£Œëœë‹¤. ë”°ë¼ì„œ **ASYNC** ëª¨ë“œì— ë¹„í•´ 커밋 수행 ì‹œê°„ì´ ê¸¸ì–´ì§ˆ 수 있지만, failoverê°€ ë°œìƒí•´ë„ ë³µì‚¬ëœ íŠ¸ëžœìžì…˜ 로그는 ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ë°˜ì˜ë˜ì–´ 있ìŒì„ ë³´ìž¥í• ìˆ˜ 있으므로 가장 ì•ˆì „í•˜ë‹¤. **ASYNC 모드** 트랜ìžì…˜ì´ 커밋ë˜ë©´, ìŠ¬ë ˆì´ë¸Œ 노드로 트랜ìžì…˜ 로그가 ì „ì†¡ 완료ë˜ì—ˆëŠ”ì§€ 확ì¸í•˜ì§€ ì•Šê³ ì»¤ë°‹ì´ ì™„ë£Œëœë‹¤. ë”°ë¼ì„œ 마스터 노드ì—서 ì»¤ë°‹ì´ ì™„ë£Œëœ íŠ¸ëžœìžì…˜ì´ ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë°˜ì˜ë˜ì§€ 못하는 경우가 ë°œìƒí• 수 있다. **ASYNC** 모드는 로그 ë³µì œë¡œ ì¸í•œ 커밋 수행 시간 ì§€ì—°ì€ ê±°ì˜ ì—†ìœ¼ë¯€ë¡œ ì„±ëŠ¥ìƒ ìœ ë¦¬í•˜ì§€ë§Œ, 노드 ê°„ì˜ ë°ì´í„°ê°€ ì™„ì „ížˆ ì¼ì¹˜í•˜ì§€ ì•Šì„ ìˆ˜ 있다. .. note:: **SEMISYNC** 모드는 ì‚¬ìš©ì´ ì¤‘ë‹¨ë ì˜ˆì •(deprecated)ì´ë©°, 현재 **SYNC** 모드와 ë™ì¼í•˜ê²Œ ë™ìž‘한다. ë¹ ë¥¸ 시작 ========= DB ìƒì„± 시ì 부터 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드를 1:1로 구축하는 ë°©ë²•ì— ëŒ€í•´ 간단히 설명한다. 다양한 ë³µì œ 구축 ë°©ë²•ì— ëŒ€í•œ ìžì„¸í•œ ë°©ë²•ì€ :ref:`building-replication`\ ì„ ì°¸ê³ í•œë‹¤. 준비 ---- **구성ë„** CUBRID HA를 ì²˜ìŒ ì ‘í•˜ëŠ” 사용ìžê°€ CUBRID HA를 쉽게 ì‚¬ìš©í• ìˆ˜ 있ë„ë¡ ì•„ëž˜ 그림과 ê°™ì´ ê°„ë‹¨í•˜ê²Œ êµ¬ì„±ëœ CUBRID HA를 ì„¤ì •í•˜ëŠ” ê³¼ì •ì„ ì„¤ëª…í•œë‹¤. .. image:: /images/image29.png **사양** 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드로 ì‚¬ìš©í• ìž¥ë¹„ì—는 Linux와 CUBRID 2008 R2.2 ì´ìƒ ë²„ì „ì´ ì„¤ì¹˜ë˜ì–´ 있어야 한다. CUBRID HA는 Windows를 ì§€ì›í•˜ì§€ 않는다. **CUBRID HA 구성 장비 사양** +----------------------+-----------------------+--------+ | | CUBRID ë²„ì „ | OS | +======================+=======================+========+ | 마스터 노드용 장비 | CUBRID 2008 R2.2 ì´ìƒ | Linux | +----------------------+-----------------------+--------+ | ìŠ¬ë ˆì´ë¸Œ 노드용 장비 | CUBRID 2008 R2.2 ì´ìƒ | Linux | +----------------------+-----------------------+--------+ .. note:: ì´ ë¬¸ì„œëŠ” 9.2 ì´ìƒ ë²„ì „ì˜ HA êµ¬ì„±ì— ëŒ€í•´ ì„¤ëª…í•˜ê³ ìžˆìœ¼ë©°, ê·¸ ì´ì „ ë²„ì „ê³¼ëŠ” ì„¤ì • ë°©ë²•ì´ ì¡°ê¸ˆ 다르므로 주ì˜í•œë‹¤. 예를 들어, **cubrid_ha.conf** 는 2008 R4.0 ì´ìƒ ë²„ì „ì—서 ë„ìž…ë˜ì—ˆë‹¤. **ha_make_slavedb.sh**\ 는 2008 R4.1 Patch 2 ì´ìƒ ë²„ì „ì—서 ë„ìž…ë˜ì—ˆë‹¤. .. _quick-server-config: ë°ì´í„°ë² ì´ìФ ìƒì„± ë° ì„œë²„ ì„¤ì • ------------------------------ **ë°ì´í„°ë² ì´ìФ ìƒì„±** CUBRID HAì— í¬í•¨í• ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ëª¨ë“ CUBRID HA 노드ì—서 ë™ì¼í•˜ê²Œ ìƒì„±í•œë‹¤. ë°ì´í„°ë² ì´ìФ ìƒì„± ì˜µì…˜ì€ í•„ìš”ì— ë”°ë¼ ì ì ˆížˆ 변경한다. :: [nodeA]$ cd $CUBRID_DATABASES [nodeA]$ mkdir testdb [nodeA]$ cd testdb [nodeA]$ mkdir log [nodeA]$ cubrid createdb -L ./log testdb en_US Creating database with 512.0M size. The total amount of disk space needed is 1.5G. CUBRID 10.0 [nodeA]$ **cubrid.conf** **$CUBRID/conf/cubrid.conf** ì˜ **ha_mode** 를 ëª¨ë“ HA ë…¸ë“œì— ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. 특히, 로깅 ê´€ë ¨ 파ë¼ë¯¸í„°ì¸ **log_max_archives** 와 **force_remove_log_archives**, HA ê´€ë ¨ 파ë¼ë¯¸í„°ì¸ **ha_mode** ì˜ ì„¤ì •ì— ì£¼ì˜í•œë‹¤. :: # Service parameters [service] service=server,broker,manager # Common section [common] service=server,broker,manager # Server parameters server=testdb data_buffer_size=512M log_buffer_size=4M sort_buffer_size=2M max_clients=100 cubrid_port_id=1523 db_volume_size=512M log_volume_size=512M # HA 구성 시 추가 (Logging parameters) log_max_archives=100 force_remove_log_archives=no # HA 구성 시 추가 (HA 모드) ha_mode=on **cubrid_ha.conf** **$CUBRID/conf/cubrid_ha.conf** ì˜ **ha_port_id**, **ha_node_list**, **ha_db_list** 를 ëª¨ë“ HA ë…¸ë“œì— ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. ë‹¤ìŒ ì˜ˆì—서 마스터 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ *nodeA*, ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ *nodeB*\ë¼ê³ ê°€ì •í•œë‹¤.:: [common] ha_port_id=59901 ha_node_list=cubrid@nodeA:nodeB ha_db_list=testdb ha_copy_sync_mode=sync:sync ha_apply_max_mem_size=500 **databases.txt** **$CUBRID_DATABASES/databases.txt** (**$CUBRID_DATABASES** ê°€ ì„¤ì • 안 ëœ ê²½ìš° **$CUBRID/databases/databases.txt**)ì˜ db-hostì— ë§ˆìŠ¤í„° 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ì„¤ì •(*nodeA*:*nodeB*)한다. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob CUBRID HA 시작 ë° í™•ì¸ ---------------------- **CUBRID HA 시작** CUBRID HA 그룹 ë‚´ì˜ ê° ë…¸ë“œì—서 **cubrid heartbeat start**\ 를 수행한다. **cubrid heartbeat start** 를 가장 ë¨¼ì € 수행한 노드가 마스터 노드가 ë˜ë¯€ë¡œ ìœ ì˜í•´ì•¼ 한다. ì´í•˜ì˜ 예ì—서 마스터 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ *nodeA*, ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ *nodeB*\ë¼ê³ ê°€ì •í•œë‹¤. * 마스터 노드 :: [nodeA]$ cubrid heartbeat start * ìŠ¬ë ˆì´ë¸Œ 노드 :: [nodeB]$ cubrid heartbeat start **CUBRID HA ìƒíƒœ 확ì¸** CUBRID HA 그룹 ë‚´ì˜ ê° ë…¸ë“œì—서 **cubrid heartbeat status**\ 를 수행하여 구성 ìƒíƒœë¥¼ 확ì¸í•œë‹¤. :: [nodeA]$ cubrid heartbeat status @ cubrid heartbeat list HA-Node Info (current nodeA-node-name, state master) Node nodeB-node-name (priority 2, state slave) Node nodeA-node-name (priority 1, state master) HA-Process Info (nodeA 9289, state nodeA) Applylogdb testdb@localhost:/home1/cubrid1/DB/testdb_nodeB.cub (pid 9423, state registered) Copylogdb testdb@nodeB-node-name:/home1/cubrid1/DB/testdb_nodeB.cub (pid 9418, state registered) Server testdb (pid 9306, state registered_and_active) [nodeA]$ CUBRID HA 그룹 ë‚´ì˜ ê° ë…¸ë“œì—서 **cubrid changemode** ìœ í‹¸ë¦¬í‹°ë¥¼ ì´ìš©í•˜ì—¬ ì„œë²„ì˜ ìƒíƒœë¥¼ 확ì¸í•œë‹¤. * 마스터 노드 :: [nodeA]$ cubrid changemode testdb@localhost The server 'testdb@localhost''s current HA running mode is active. * ìŠ¬ë ˆì´ë¸Œ 노드 :: [nodeB]$ cubrid changemode testdb@localhost The server 'testdb@localhost''s current HA running mode is standby. **CUBRID HA ë™ìž‘ 여부 확ì¸** 마스터 ë…¸ë“œì˜ ì•¡í‹°ë¸Œ 서버ì—서 쓰기를 수행한 후 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ìŠ¤íƒ ë°”ì´ ì„œë²„ì— ì •ìƒì 으로 ë°˜ì˜ë˜ì—ˆëŠ”ì§€ 확ì¸í•œë‹¤. HA 환경ì—서 CSQL ì¸í„°í”„리터로 ê° ë…¸ë“œì— ì ‘ì†í•˜ë ¤ë©´, ë°ì´í„°ë² ì´ìФ ì´ë¦„ ë’¤ì— ì ‘ì† ëŒ€ìƒ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ë°˜ë“œì‹œ ì§€ì •í•´ì•¼ 한다("@<호스트 ì´ë¦„>"). 호스트 ì´ë¦„ì„ localhost로 ì§€ì •í•˜ë©´, 로컬 ë…¸ë“œì— ì ‘ì†í•˜ê²Œ ëœë‹¤. .. warning:: ë³µì œê°€ ì •ìƒì 으로 수행ë˜ê¸° 위해서는 í…Œì´ë¸”ì„ ìƒì„±í• 때 기본키(primary key)ê°€ 반드시 존재해야 한다는 ì ì„ ì£¼ì˜í•œë‹¤ * 마스터 노드 :: [nodeA]$ csql -u dba testdb@localhost -c "create table abc(a int, b int, c int, primary key(a));" [nodeA]$ csql -u dba testdb@localhost -c "insert into abc values (1,1,1);" [nodeA]$ * ìŠ¬ë ˆì´ë¸Œ 노드 :: [nodeB]$ csql -u dba testdb@localhost -l -c "select * from abc;" === <Result of SELECT Command in Line 1> === <00001> a: 1 b: 1 c: 1 [nodeB]$ .. _quick-broker-config: 브로커 ì„¤ì •, 시작 ë° í™•ì¸ ------------------------- **브로커 ì„¤ì •** ë°ì´í„°ë² ì´ìФ failover 시 ì •ìƒì ì¸ ì„œë¹„ìŠ¤ë¥¼ 위해서 **databases.txt** ì˜ **db-host** í•ëª©ì— ë°ì´í„°ë² ì´ìŠ¤ì˜ ê°€ìš© 노드를 ì„¤ì •í•´ì•¼ 한다. ê·¸ë¦¬ê³ **cubrid_broker.conf** ì˜ **ACCESS_MODE** 를 ì„¤ì •í•˜ëŠ”ë°, ì´ë¥¼ ìƒëžµí•˜ë©´ ê¸°ë³¸ê°’ì¸ Read Write 모드로 ì„¤ì •ëœë‹¤. 브로커를 별ë„ì˜ ìž¥ë¹„ë¡œ 분리하는 경우 브로커 ìž¥ë¹„ì— **cubrid_broker.conf** 와 **databases.txt** 를 반드시 ì„¤ì •í•´ì•¼ 한다. * databases.txt :: #db-name vol-path db-host log-path lob-base-path testdb /home1/cubrid1/CUBRID/testdb nodeA:nodeB /home1/cubrid1/CUBRID/testdb/log file:/home1/cubrid1/CUBRID/testdb/lob * cubrid_broker.conf :: [%testdb_RWbroker] SERVICE =ON BROKER_PORT =33000 MIN_NUM_APPL_SERVER =5 MAX_NUM_APPL_SERVER =40 APPL_SERVER_SHM_ID =33000 LOG_DIR =log/broker/sql_log ERROR_LOG_DIR =log/broker/error_log SQL_LOG =ON TIME_TO_KILL =120 SESSION_TIMEOUT =300 KEEP_CONNECTION =AUTO CCI_DEFAULT_AUTOCOMMIT =ON # broker mode parameter ACCESS_MODE =RW **브로커 시작 ë° ìƒíƒœ 확ì¸** 브로커는 JDBC나 CCI, PHP ë“±ì˜ ì‘ìš©ì—서 ì ‘ê·¼í•˜ê¸° 위해 사용하는 것ì´ë‹¤. ë”°ë¼ì„œ 간단한 서버 ì´ì¤‘í™” ë™ìž‘ì„ ì‹œí—˜í•˜ê³ ì‹¶ë‹¤ë©´ 브로커를 ì‹œìž‘í• í•„ìš” ì—†ì´ ì„œë²„ í”„ë¡œì„¸ìŠ¤ì— ì§ì ‘ ì ‘ì†í•˜ëŠ” CSQL ì¸í„°í”„리터만 실행해서 확ì¸í• 수 있다. 브로커는 **cubrid broker start** 를 실행하여 ì‹œìž‘í•˜ê³ **cubrid broker stop** ì„ ì‹¤í–‰í•˜ì—¬ ì •ì§€í•œë‹¤. 다ìŒì€ 브로커를 마스터 노드ì—서 실행한 예ì´ë‹¤. :: [nodeA]$ cubrid broker start @ cubrid broker start ++ cubrid broker start: success [nodeA]$ cubrid broker status @ cubrid broker status % testdb_RWbroker --------------------------------------------------------- ID PID QPS LQS PSIZE STATUS --------------------------------------------------------- 1 9532 0 0 48120 IDLE **ì‘ìš© 프로그램 ì„¤ì •** ì‘ìš© í”„ë¡œê·¸ëž¨ì´ ì—°ê²°í• ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„(*nodeA_broker*, *nodeB_broker*)ê³¼ í¬íŠ¸ë¥¼ ì—°ê²° URLì— ëª…ì‹œí•œë‹¤. ë¸Œë¡œì»¤ì™€ì˜ ì—°ê²° ìž¥ì• ê°€ ë°œìƒí•œ 경우 다ìŒìœ¼ë¡œ ì—°ê²°ì„ ì‹œë„í• ë¸Œë¡œì»¤ëŠ” **altHosts** ì†ì„±ì— 명시한다. 아래는 JDBC í”„ë¡œê·¸ëž¨ì˜ ì˜ˆì´ë©°, CCI, PHPì— ëŒ€í•œ 예와 ìžì„¸í•œ ì„¤ëª…ì€ :ref:`ha-cci-conf`, :ref:`ha-php-conf` ì„ ì°¸ê³ í•œë‹¤. .. code-block:: java Connection connection = DriverManager.getConnection("jdbc:CUBRID:nodeA_broker:33000:testdb:::?charSet=utf-8&altHosts=nodeB_broker:33000", "dba", ""); .. _ha-configuration: 환경 ì„¤ì • ========= 다ìŒì€ CUBRID HA ê¸°ëŠ¥ì„ ìˆ˜í–‰í•˜ê¸° 위해 필요한 환경 ì„¤ì •ì— ëŒ€í•œ 설명ì´ë‹¤. 브로커와 DB 사ì´ì˜ ì—°ê²° ì ˆì°¨ì— ëŒ€í•œ ìžì„¸í•œ ì„¤ëª…ì€ :ref:`ha-connect-broker-db`\ ì„ ì°¸ê³ í•œë‹¤. cubrid.conf ----------- **cubrid.conf** 파ì¼ì€ **$CUBRID/conf** ë””ë ‰í„°ë¦¬ì— ìœ„ì¹˜í•˜ë©°, CUBRIDì˜ ì „ë°˜ì ì¸ ì„¤ì • ì •ë³´ë¥¼ ë‹´ê³ ìžˆë‹¤. 여기ì—서는 **cubrid.conf** 중 CUBRID HAê°€ 사용하는 파ë¼ë¯¸í„°ë¥¼ 설명한다. HA 여부 ^^^^^^^ **ha_mode** CUBRID HA ê¸°ëŠ¥ì„ ì„¤ì •í•˜ëŠ” 파ë¼ë¯¸í„°ì´ë‹¤. ê¸°ë³¸ê°’ì€ **off** ì´ë‹¤. CUBRID HA ê¸°ëŠ¥ì€ Windows를 ì§€ì›í•˜ì§€ ì•Šê³ Linuxì—서만 ì‚¬ìš©í• ìˆ˜ 있으므로 ì´ ê°’ì€ Linuxìš© CUBRIDì—서만 ì˜ë¯¸ê°€ 있다. * **off** : CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ì§€ 않는다. * **on** : CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©°, 해당 노드는 failoverì˜ ëŒ€ìƒì´ ëœë‹¤. * **replica** : CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©°, 해당 노드는 failoverì˜ ëŒ€ìƒì´ ë˜ì§€ 않는다. **ha_mode** ê°€ **on** ì´ë©´ **cubrid_ha.conf** 를 ì½ì–´ CUBRID HA를 ì„¤ì •í•œë‹¤. ì´ íŒŒë¼ë¯¸í„°ëŠ” ë™ì 으로 ë³€ê²½í• ìˆ˜ 없으며, 변경하면 해당 노드를 다시 시작해야 한다. 로깅 ^^^^ .. _ha-log_max_archives: **log_max_archives** ë³´ì¡´í• ë³´ê´€ 로그 파ì¼ì˜ 최소 개수를 ì„¤ì •í•˜ëŠ” 파ë¼ë¯¸í„°ì´ë‹¤. ìµœì†Œê°’ì€ 0ì´ë©° ê¸°ë³¸ê°’ì€ **INT_MAX** (2147483647)ì´ë‹¤. CUBRID 설치 시 **cubrid.conf**\ ì—는 0으로 ì„¤ì •ë˜ì–´ 있다. ì´ íŒŒë¼ë¯¸í„°ì˜ ë™ìž‘ì€ **force_remove_log_archives**\ ì˜ ì˜í–¥ì„ 받는다. **force_remove_log_archives**\ ì˜ ì„¤ì •ê°’ì´ **no**\ì´ë©´, í™œì„±í™”ëœ íŠ¸ëžœìžì…˜ì´ ì°¸ì¡°í•˜ê³ ìžˆëŠ” 기존 ë³´ê´€ 로그 íŒŒì¼ ë˜ëŠ” HA 환경ì—서 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë°˜ì˜ë˜ì§€ ì•Šì€ ë§ˆìŠ¤í„° ë…¸ë“œì˜ ë³´ê´€ 로그 파ì¼ì´ ì‚ì œë˜ì§€ 않는다. ì´ì— 대한 ìžì„¸í•œ ë‚´ìš©ì€ ì•„ëž˜ì˜ **force_remove_log_archives**\ 를 ì°¸ê³ í•œë‹¤. **log_max_archives**\ ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`logging-parameters`\ 를 ì°¸ê³ í•œë‹¤. .. _ha-force_remove_log_archives: **force_remove_log_archives** **ha_mode** 를 on으로 ì„¤ì •í•˜ì—¬ HA í™˜ê²½ì„ êµ¬ì¶•í•˜ë ¤ë©´ **force_remove_log_archives** 를 no로 ì„¤ì •í•˜ì—¬ HA ê´€ë ¨ í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ ì‚¬ìš©í• ë³´ê´€ 로그(archive log)를 í•ìƒ ìœ ì§€í•˜ëŠ” ê²ƒì„ ê¶Œìž¥í•œë‹¤. **force_remove_log_archives**\ 를 yes로 ì„¤ì •í•˜ë©´ HA ê´€ë ¨ 프로세스가 ì‚¬ìš©í• ë³´ê´€ 로그 파ì¼ê¹Œì§€ ì‚ì œë 수 ìžˆê³ , ì´ë¡œ ì¸í•´ ë°ì´í„°ë² ì´ìФ ë³µì œ 노드 ê°„ ë°ì´í„° 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있다. ì´ëŸ¬í•œ ìœ„í—˜ì„±ì„ ê°ìˆ˜í•˜ë”ë¼ë„ 디스í¬ì˜ ì—¬ìœ ê³µê°„ì„ ìœ ì§€í•˜ê³ ì‹¶ë‹¤ë©´ **force_remove_log_archives**\ 를 yes로 ì„¤ì •í•œë‹¤. **force_remove_log_archives**\ ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`logging-parameters`\ 를 ì°¸ê³ í•œë‹¤. .. note:: 2008 R4.3 ë²„ì „ë¶€í„°, ë ˆí”Œë¦¬ì¹´ 노드ì—서는 **force_remove_log_archives** ê°’ì˜ ì„¤ì •ê³¼ 무관하게 **log_max_archives** 파ë¼ë¯¸í„°ì— ì„¤ì •ëœ ê°œìˆ˜ì˜ ë³´ê´€ 로그 파ì¼ì„ ì œì™¸í•˜ê³ ëŠ” í•ìƒ ì‚ì œí•œë‹¤. ì ‘ì† ^^^^ **max_clients** ë°ì´í„°ë² ì´ìФ ì„œë²„ì— ë™ì‹œì— ì—°ê²°í• ìˆ˜ 있는 í´ë¼ì´ì–¸íŠ¸ì˜ ìµœëŒ€ 수를 ì§€ì •í•˜ëŠ” 파ë¼ë¯¸í„°ì´ë‹¤. ê¸°ë³¸ê°’ì€ **100**\ ì´ë‹¤. CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë©´ 기본ì 으로 ë³µì œ 로그 복사 프로세스와 ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ 구ë™ë˜ë¯€ë¡œ, 해당 노드를 ì œì™¸í•œ CUBRID HA 그룹 ë‚´ 노드 ìˆ˜ì˜ ë‘ ë°°ë¥¼ ê³ ë ¤í•˜ì—¬ ì„¤ì •í•´ì•¼ 한다. ë˜í•œ failoverê°€ ì¼ì–´ë‚ 때 다른 ë…¸ë“œì— ì ‘ì†í•˜ê³ ìžˆë˜ í´ë¼ì´ì–¸íŠ¸ê°€ 해당 ë…¸ë“œì— ì ‘ì†í• 수 있으므로 ì´ë¥¼ ê³ ë ¤í•´ì•¼ 한다. **max_clients**\ ì— ëŒ€í•œ ìžì„¸í•œ ë‚´ìš©ì€ :ref:`connection-parameters`\ 를 ì°¸ê³ í•œë‹¤. **노드 ê°„ 반드시 ê°’ì´ ë™ì¼í•´ì•¼ 하는 시스템 파ë¼ë¯¸í„°** * **log_buffer_size** : 로그 ë²„í¼ í¬ê¸°. 서버와 로그를 복사하는 **copylogdb** ê°„ í”„ë¡œí† ì½œì— ì˜í–¥ì„ 주는 부분ì´ë¯€ë¡œ 반드시 ë™ì¼í•´ì•¼ 한다. * **log_volume_size** : 로그 볼륨 í¬ê¸°. CUBRID HA는 ì›ë³¸ 트랜ìžì…˜ 로그와 ë³µì œ ë¡œê·¸ì˜ í˜•íƒœì™€ ë‚´ìš©ì´ ë™ì¼í•˜ë¯€ë¡œ 반드시 ë™ì¼í•´ì•¼ 한다. ê·¸ 외 ê° ë…¸ë“œì—서 별ë„로 DB를 ìƒì„±í•˜ëŠ” 경우 **cubrid createdb** 옵션(**\-\-db-volume-size**, **\-\-db-page-size**, **\-\-log-volume-size**, **\-\-log-page-size** 등)ì´ ë™ì¼í•´ì•¼ 한다. * **cubrid_port_id** : ì„œë²„ì™€ì˜ ì—°ê²° ìƒì„±ì„ 위한 TCP í¬íЏ 번호. 서버와 로그를 복사하는 **copylogdb** ì˜ ì—°ê²°ì„ ìœ„í•´ 반드시 ë™ì¼í•´ì•¼ 한다. * **HA ê´€ë ¨ 파ë¼ë¯¸í„°** : **cubrid_ha.conf**\ ì— í¬í•¨ëœ HA ê´€ë ¨ 파ë¼ë¯¸í„°ëŠ” 기본ì 으로 ë™ì¼í•´ì•¼ 하나, 아래 파ë¼ë¯¸í„°ëŠ” 예외ì 으로 다르게 ì„¤ì •í• ìˆ˜ 있다. **ë…¸ë“œì— ë”°ë¼ ë‹¤ë¥´ê²Œ ì„¤ì •í• ìˆ˜ 있는 파ë¼ë¯¸í„°** * ë ˆí”Œë¦¬ì¹´ ë…¸ë“œì˜ **ha_mode** 파ë¼ë¯¸í„° * **ha_copy_sync_mode** 파ë¼ë¯¸í„° * **ha_ping_hosts** 파ë¼ë¯¸í„° * **ha_tcp_ping_hosts** 파ë¼ë¯¸í„° **예시** 다ìŒì€ **cubrid.conf** ì„¤ì •ì˜ ì˜ˆì´ë‹¤. 특히, 로깅 ê´€ë ¨ 파ë¼ë¯¸í„°ì¸ **log_max_archives** 와 **force_remove_log_archives**, HA ê´€ë ¨ 파ë¼ë¯¸í„°ì¸ **ha_mode** ì˜ ì„¤ì •ì— ì£¼ì˜í•œë‹¤. :: # Service Parameters [service] service=server,broker,manager # Server Parameters server=testdb data_buffer_size=512M log_buffer_size=4M sort_buffer_size=2M max_clients=200 cubrid_port_id=1523 db_volume_size=512M log_volume_size=512M # HA 구성 시 추가 (Logging parameters) log_max_archives=100 force_remove_log_archives=no # HA 구성 시 추가 (HA 모드) ha_mode=on log_max_archives=100 .. _cubrid-ha-conf: cubrid_ha.conf -------------- **cubrid_ha.conf** 파ì¼ì€ **$CUBRID/conf** ë””ë ‰í„°ë¦¬ì— ìœ„ì¹˜í•˜ë©°, CUBRIDì˜ HA ê¸°ëŠ¥ì˜ ì „ë°˜ì ì¸ ì„¤ì • ì •ë³´ë¥¼ ë‹´ê³ ìžˆë‹¤. CUBRID HA ê¸°ëŠ¥ì€ Windows를 ì§€ì›í•˜ì§€ ì•Šê³ Linuxì—서만 ì‚¬ìš©í• ìˆ˜ 있으므로 ì´ ê°’ì€ Linuxìš© CUBRIDì—서만 ì˜ë¯¸ê°€ 있다. 브로커와 DB 사ì´ì˜ ì—°ê²° ì ˆì°¨ì— ëŒ€í•œ ìžì„¸í•œ ì„¤ëª…ì€ :ref:`ha-connect-broker-db`\ ì„ ì°¸ê³ í•œë‹¤. 노드 ^^^^ **ha_node_list** CUBRID HA 그룹 ë‚´ì—서 ì‚¬ìš©í• ê·¸ë£¹ ì´ë¦„ê³¼ failoverì˜ ëŒ€ìƒì´ ë˜ëŠ” 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ëª…ì‹œí•œë‹¤. @ 구분ìžë¡œ 나누어 @ ì•žì´ ê·¸ë£¹ ì´ë¦„, @ 뒤가 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì´ë‹¤. 여러 ê°œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ ì‰¼í‘œ(,) ë˜ëŠ” ì½œë¡ (:)으로 구분한다. ê¸°ë³¸ê°’ì€ **localhost@localhost** ì´ë‹¤. .. note:: ì´ íŒŒë¼ë¯¸í„°ì—서 명시한 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ IP로 ëŒ€ì²´í• ìˆ˜ 없으며, 사용ìžëŠ” 반드시 **/etc/hosts** ì— ë“±ë¡ë˜ì–´ 있는 ê²ƒì„ ì‚¬ìš©í•´ì•¼ 한다. 호스트 ì´ë¦„ì´ ì œëŒ€ë¡œ ì„¤ì •ë˜ì§€ ì•Šì€ ê²½ìš° server.err ì—러 로그 파ì¼ì— 다ìŒê³¼ ê°™ì€ ë©”ì‹œì§€ê°€ ì¶œë ¥ëœë‹¤. :: Time: 04/10/12 17:49:45.030 - ERROR *** file ../../src/connection/tcp.c, line 121 ERROR CODE = -353 Tran = 0, CLIENT = (unknown):(unknown)(-1), EID = 1 Cannot make connection to master server on host "Wrong_HOST_NAME".... Connection timed out **ha_mode** 를 **on** 으로 ì„¤ì •í•œ 노드는 **ha_node_list** ì— í•´ë‹¹ 노드가 반드시 í¬í•¨ë˜ì–´ 있어야 한다. CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œëŠ” **ha_node_list** ì˜ ê°’ì´ ë™ì¼í•´ì•¼ 한다. failoverê°€ ì¼ì–´ë‚ 때 ì´ íŒŒë¼ë¯¸í„°ì— ì„¤ì •ëœ ìˆœì„œì— ë”°ë¼ ë§ˆìŠ¤í„° 노드가 ëœë‹¤. ì´ íŒŒë¼ë¯¸í„°ëŠ” ë™ì 으로 ë³€ê²½í• ìˆ˜ 있으며, 변경하면 :ref:`cubrid heartbeat reload <cubrid-heartbeat>`\ 를 실행해야 한다. **ha_replica_list** CUBRID HA 그룹 ë‚´ì—서 ì‚¬ìš©í• ê·¸ë£¹ ì´ë¦„ê³¼ ë ˆí”Œë¦¬ì¹´ 노드 ì´ë¦„, 즉 failoverì˜ ëŒ€ìƒì´ ë˜ì§€ 않는 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ëª…ì‹œí•œë‹¤. ë ˆí”Œë¦¬ì¹´ 노드를 구성하지 않는 경우ì—는 ì§€ì •í• í•„ìš”ê°€ 없다. @ 구분ìžë¡œ 나누어 @ ì•žì´ ê·¸ë£¹ ì´ë¦„, @ 뒤가 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì´ë‹¤. 여러 ê°œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ ì‰¼í‘œ(,) ë˜ëŠ” ì½œë¡ (:)으로 구분한다. ê¸°ë³¸ê°’ì€ **NULL** ì´ë‹¤. 그룹 ì´ë¦„ì€ **ha_node_list** ì—서 명시한 ì´ë¦„ê³¼ 같아야 한다. ì´ íŒŒë¼ë¯¸í„°ì—서 명시하는 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ ë° í•´ë‹¹ ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ì§€ì •í• ë•ŒëŠ” 반드시 **/etc/hosts** ì— ë“±ë¡ë˜ì–´ 있는 ê²ƒì„ ì‚¬ìš©í•´ì•¼ 한다. **ha_mode** 를 **replica** 로 ì„¤ì •í•œ 노드는 **ha_replica_list** ì— í•´ë‹¹ 노드가 반드시 í¬í•¨ë˜ì–´ 있어야 한다. CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œëŠ” **ha_replica_list** ì˜ ê°’ì´ ë™ì¼í•´ì•¼ 한다. ì´ íŒŒë¼ë¯¸í„°ëŠ” ë™ì 으로 ë³€ê²½í• ìˆ˜ 있으며, 변경하면 :ref:`cubrid heartbeat reload <cubrid-heartbeat>`\ 를 실행해야 한다. .. note:: ì´ íŒŒë¼ë¯¸í„°ì—서 명시한 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ IP로 ëŒ€ì²´í• ìˆ˜ 없으며, 사용ìžëŠ” 반드시 **/etc/hosts** ì— ë“±ë¡ë˜ì–´ 있는 ê²ƒì„ ì‚¬ìš©í•´ì•¼ 한다. **ha_db_list** CUBRID HA 모드로 구ë™í• ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ëª…ì‹œí•œë‹¤. ê¸°ë³¸ê°’ì€ **NULL** ì´ë‹¤. 여러 ê°œì˜ ë°ì´í„°ë² ì´ìФ ì´ë¦„ì€ ì‰¼í‘œ(,) ë˜ëŠ” ì½œë¡ (:)으로 구분한다. ì ‘ì† ^^^^ **ha_port_id** CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œë“¤ì´ heartbeat 메시지를 ì£¼ê³ ë°›ìœ¼ë©° 노드 ìž¥ì• ë¥¼ ê°ì§€í• 때 ì‚¬ìš©í• UDP í¬íЏ 번호를 명시한다. ê¸°ë³¸ê°’ì€ **59901** ì´ë‹¤. 서비스 í™˜ê²½ì— ë°©í™”ë²½ì´ ìžˆìœ¼ë©´, ì„¤ì •í•œ í¬íЏ ê°’ì´ ë°©í™”ë²½ì„ í†µê³¼í•˜ë„ë¡ ë°©í™”ë²½ì„ ì„¤ì •í•´ì•¼ 한다. **ha_ping_hosts** ìŠ¬ë ˆì´ë¸Œ 노드ì—서 failoverê°€ 시작ë˜ëŠ” 순간 ì—°ê²°ì„ í™•ì¸í•˜ì—¬ 네트워í¬ì— ì˜í•œ failoverì¸ì§€ 확ì¸í• 때 ì‚¬ìš©í• í˜¸ìŠ¤íŠ¸ë¥¼ 명시한다. ê¸°ë³¸ê°’ì€ **NULL** ì´ë‹¤. 여러 ê°œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ ì‰¼í‘œ(,) ë˜ëŠ” ì½œë¡ (:)으로 구분한다. ì´ íŒŒë¼ë¯¸í„°ì—서 명시한 멤버 ë…¸ë“œë“¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ IP로 ëŒ€ì²´í• ìˆ˜ 있으며, 호스트 ì´ë¦„ì„ ì‚¬ìš©í•˜ëŠ” 경우ì—는 반드시 **/etc/hosts** ì— ë“±ë¡ë˜ì–´ 있어야 한다. CUBRID는 1시간 주기로 **ha_ping_hosts**\ì— ëª…ì‹œëœ í˜¸ìŠ¤íŠ¸ë¥¼ ì 검하여 ëª¨ë“ í˜¸ìŠ¤íŠ¸ê°€ ë¬¸ì œ ìžˆì„ ê²½ìš° ì¼ì‹œì 으로 í•‘ ì²´í¬(ping check)를 ì¤‘ì§€í•˜ê³ 5ë¶„ 단위로 해당 í˜¸ìŠ¤íŠ¸ë“¤ì´ ì •ìƒí™”ë˜ì—ˆëŠ”ì§€ 검사한다. ì´ íŒŒë¼ë¯¸í„°ë¥¼ ì„¤ì •í•˜ë©´ ë¶ˆì•ˆì •í•œ 네트워í¬ë¡œ ì¸í•´ ìƒëŒ€ 마스터 노드가 ë¹„ì •ìƒ ì¢…ë£Œëœ ê²ƒìœ¼ë¡œ 오ì¸í•œ ìŠ¬ë ˆì´ë¸Œ 노드가 마스터 노드로 ì—í• ì´ ë³€ê²½ë˜ë©´ì„œ ë™ì‹œì— ë‘ ê°œì˜ ë§ˆìŠ¤í„° 노드가 존재하게 ë˜ëŠ” split-brain 현ìƒì„ ë°©ì§€í• ìˆ˜ 있다. 그러나 ICMP í”„ë¡œí† ì½œì´ ë¹„í™œì„±í™” ë˜ì–´ 있는 경우 í•‘ ì²´í¬ëŠ” ì •ìƒì 으로 ë™ìž‘하지 않는다. CUBRID는 ì´ ê²½ìš°ë¥¼ 대비하여 **ha_tcp_ping_hosts**\를 ì§€ì›í•œë‹¤. **ha_tcp_ping_hosts** **ha_tcp_ping_hosts**\는 ICMP í”„ë¡œí† ì½œì´ ë¹„í™œì„±í™” ë˜ì–´ **ha_ping_hosts**\를 ì‚¬ìš©í• ìˆ˜ 없는 경우 대안으로 사용ë 수 있다. **ha_tcp_ping_hosts**\는 **ha_ping_hosts**\와 ë˜‘ê°™ì´ ë™ìž‘하지만 í•‘ ì²´í¬ë¥¼ 위해 IP 계층 ëŒ€ì‹ TCP ê³„ì¸µì„ ì‚¬ìš©í•œë‹¤ëŠ” ì°¨ì´ê°€ 있다. ê¸°ë³¸ê°’ì€ **NULL**\ì´ë©°, 여러 ê°œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì€ ì‰¼í‘œ(,)로 호스트 ì´ë¦„ê³¼ í¬íЏ 번호는 ì½œë¡ (:)으로 구분한다. 예를들어, "ha_tcp_ping_hosts=host1:port1,host2:port2"와 ê°™ì€ í˜•ì‹ìœ¼ë¡œ ì„¤ì •í• ìˆ˜ 있다. TCP ê³„ì¸µì„ ì´ìš©í•œ í•‘ ì²´í¬ê°€ ì •ìƒì 으로 ë™ìž‘하기 위해서는 반드시 **ha_tcp_ping_hosts**\ì— ì„¤ì •ëœ í˜¸ìŠ¤íŠ¸ ìƒì—서 해당 í¬íЏ 번호를 갖는 ì†Œì¼“ì´ ë„¤íŠ¸ì›Œí¬ ìš”ì²ì„ ì •ìƒì 으로 ìˆ˜ì‹ í• ìˆ˜ 있어야 하며, ë°©í™”ë²½ì— ì˜í•´ ë„¤íŠ¸ì›Œí¬ ìš”ì²ì´ 차단ë˜ì§€ 않아야 한다. **ha_ping_hosts**\ê°€ ì„¤ì •ëœ ê²½ìš° **ha_tcp_ping_hosts**\는 사용ë˜ì§€ ì•Šê³ ë¬´ì‹œëœë‹¤. ë³µì œ ^^^^ **ha_copy_sync_mode** 트랜ìžì…˜ ë¡œê·¸ì˜ ë³µì‚¬ë³¸ì¸ ë³µì œ 로그를 ì €ìž¥í•˜ëŠ” 모드를 ì„¤ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ **SYNC**\ ì´ë‹¤. **SYNC**, **ASYNC**\ 를 값으로 ì„¤ì •í• ìˆ˜ 있다. **ha_node_list**\ ì— ì§€ì •í•œ ë…¸ë“œì˜ ìˆ˜ë§Œí¼ ì„¤ì •í•´ì•¼ í•˜ê³ ìˆœì„œê°€ 같아야 한다. 쉼표(,) ë˜ëŠ” ì½œë¡ (:)으로 구분한다. ë ˆí”Œë¦¬ì¹´ 노드는 ì´ ê°’ì˜ ì„¤ì •ê³¼ ê´€ê³„ì—†ì´ í•ìƒ ASNYC 모드로 ë™ìž‘한다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`log-multiplexing` 를 ì°¸ê³ í•œë‹¤. **ha_copy_log_base** ë³µì œ 로그를 ì €ìž¥í• ìœ„ì¹˜ë¥¼ ì§€ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ **$CUBRID_DATABASES**/\ *<db_name>*\_\ *<host_name>*\ ì´ë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`log-multiplexing`\ 를 ì°¸ê³ í•œë‹¤. .. _ha_copy_log_max_archives: **ha_copy_log_max_archives** ë³µì œ ë¡œê·¸ì˜ ìµœëŒ€ ë³´ì¡´ 개수를 ì§€ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ 1ì´ë‹¤. 하지만, ë³µì œ 로그가 ì§€ì •í•œ 개수를 초과하ë”ë¼ë„, ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜ë˜ì§€ ì•Šì€ ë³µì œ 로그 파ì¼ì€ ì‚ì œë˜ì§€ 않는다. 불필요한 디스í¬ì˜ 공간 ë‚비를 방지하기 위해 ì´ ê°’ì„ ê¸°ë³¸ê°’ì¸ 1로 ìœ ì§€í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. **ha_apply_max_mem_size** CUBRID HAì˜ ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ì‚¬ìš©í• ìˆ˜ 있는 최대 메모리를 ì„¤ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ **500** (단위: MB)ì´ë©°, ìµœëŒ€ê°’ì€ **INT_MAX** (2147483647)ì´ë‹¤. ì´ ê°’ì„ ì‹œìŠ¤í…œì´ í—ˆìš©í•˜ëŠ” í¬ê¸°ë³´ë‹¤ 너무 í¬ê²Œ ì„¤ì •í•˜ë©´ 메모리 í• ë‹¹ì— ì‹¤íŒ¨í•˜ë©´ì„œ HA ë³µì œ ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ 오ë™ìž‘ì„ ì¼ìœ¼í‚¬ 수 있으므로, 메모리 ìžì›ì´ ì„¤ì •í•œ ê°’ì„ ì¶©ë¶„ížˆ ì‚¬ìš©í• ìˆ˜ 있는지 확ì¸í•œ 후 ì„¤ì •í•˜ë„ë¡ í•œë‹¤. **ha_applylogdb_ignore_error_list** CUBRID HAì˜ ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì—서 ì—러가 ë°œìƒí•´ë„ ì´ë¥¼ ë¬´ì‹œí•˜ê³ ê³„ì† ë³µì œë¥¼ 진행하기 위해 ì´ ê°’ì„ ì„¤ì •í•œë‹¤. 쉼표(,)로 구분하여 ë¬´ì‹œí• ì—러 코드를 나열한다. ì´ ì„¤ì • ê°’ì€ ë†’ì€ ìš°ì„ ìˆœìœ„ë¥¼ 가지므로, **ha_applylogdb_retry_error_list** 파ë¼ë¯¸í„°ë‚˜ "ìž¬ì‹œë„ ì—러 리스트"ì— ì˜í•´ ì„¤ì •ëœ ì—러 코드와 ê°’ì´ ê²¹ì¹˜ë©´ ì´ë“¤ì„ ë¬´ì‹œí•˜ê³ í•´ë‹¹ ì—러를 ìœ ë°œí•œ ìž‘ì—…ì„ ìž¬ì‹œë„하지 않는다. "ìž¬ì‹œë„ ì—러 리스트"는 아래 **ha_applylogdb_retry_error_list** ì˜ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. **ha_applylogdb_retry_error_list** CUBRID HAì˜ ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì—서 ì—러가 ë°œìƒí•˜ë©´ 해당 ì—러를 ìœ ë°œí•œ ìž‘ì—…ì´ ì„±ê³µí• ë•Œê¹Œì§€ 반복ì 으로 재시ë„하기 위해 ì´ ê°’ì„ ì„¤ì •í•œë‹¤. 쉼표(,)로 구분하여 재시ë„í• ì—러 코드를 나열한다. ì´ ê°’ì„ ì„¤ì •í•˜ì§€ ì•Šì•„ë„ ê¸°ë³¸ìœ¼ë¡œ ì„¤ì •ëœ "ìž¬ì‹œë„ ì—러 리스트"는 ë‹¤ìŒ í‘œì™€ 같다. 하지만 ì´ ê°’ë“¤ì´ **ha_applylogdb_ignore_error_list** ì— ì¡´ìž¬í•˜ë©´ ì—러를 ë¬´ì‹œí•˜ê³ ê³„ì† ë³µì œë¥¼ 진행한다. **ìž¬ì‹œë„ ì—러 리스트** +-------------------------------------+-----------+ | ì—러 코드 ì´ë¦„ | ì—러 코드 | +=====================================+===========+ | ER_LK_UNILATERALLY_ABORTED | -72 | +-------------------------------------+-----------+ | ER_LK_OBJECT_TIMEOUT_SIMPLE_MSG | -73 | +-------------------------------------+-----------+ | ER_LK_OBJECT_TIMEOUT_CLASS_MSG | -74 | +-------------------------------------+-----------+ | ER_LK_OBJECT_TIMEOUT_CLASSOF_MSG | -75 | +-------------------------------------+-----------+ | ER_LK_PAGE_TIMEOUT | -76 | +-------------------------------------+-----------+ | ER_PAGE_LATCH_TIMEDOUT | -836 | +-------------------------------------+-----------+ | ER_PAGE_LATCH_ABORTED | -859 | +-------------------------------------+-----------+ | ER_LK_OBJECT_DL_TIMEOUT_SIMPLE_MSG | -966 | +-------------------------------------+-----------+ | ER_LK_OBJECT_DL_TIMEOUT_CLASS_MSG | -967 | +-------------------------------------+-----------+ | ER_LK_OBJECT_DL_TIMEOUT_CLASSOF_MSG | -968 | +-------------------------------------+-----------+ | ER_LK_DEADLOCK_CYCLE_DETECTED | -1021 | +-------------------------------------+-----------+ **ha_replica_delay** 마스터와 ë ˆí”Œë¦¬ì¹´ 사ì´ì˜ ë°ì´í„° ë³µì œ ë°˜ì˜ ì‹œê°„ ê°„ê²©ì„ ì§€ì •í•œë‹¤. ì§€ì •í•œ ì‹œê°„ë§Œí¼ CUBRID는 ì˜ë„ì 으로 ë³µì œ ë°˜ì˜ì„ 지연한다. ms, s, min, h 단위를 ì§€ì •í• ìˆ˜ 있으며 ê°ê° milliseconds, seconds, minutes, hours를 ì˜ë¯¸í•œë‹¤. 단위 ìƒëžµ 시 기본 단위는 밀리초(ms)ì´ë‹¤. ê¸°ë³¸ê°’ì€ 0ì´ë‹¤. **ha_replica_time_bound** 마스터 노드ì—서 파ë¼ë¯¸í„°ë¡œ ì§€ì •í•œ 시간까지 ìˆ˜í–‰ëœ íŠ¸ëžœìžì…˜ë§Œ ë ˆí”Œë¦¬ì¹´ ë…¸ë“œì— ë°˜ì˜í•œë‹¤. í¬ë§·ì€ "YYYY-MM-DD hh:mi:ss"ì´ë©°, ê¸°ë³¸ê°’ì€ ì—†ë‹¤. .. note:: 다ìŒì€ **cubrid_ha.conf** ì„¤ì •ì˜ ì˜ˆì´ë‹¤. :: [common] ha_node_list=cubrid@nodeA:nodeB ha_db_list=testdb ha_copy_sync_mode=sync:sync ha_apply_max_mem_size=500 .. note:: 다ìŒì€ 멤버 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì´ *nodeA* ì´ê³ IP 주소가 192.168.0.1ì¼ ë•Œ /etc/hosts를 ì„¤ì •í•œ 예ì´ë‹¤. :: 127.0.0.1 localhost.localdomain localhost 192.168.0.1 nodeA .. _ha_delay_limit: **ha_delay_limit** **ha_delay_limit**\ì€ CUBRIDê°€ 스스로 ë³µì œ 지연 ìƒíƒœìž„ì„ íŒë‹¨í•˜ëŠ” 기준 시간ì´ê³ **ha_delay_limit_delta**\는 ë³µì œ 지연 시간ì—서 ë³µì œ 지연 í•´ì œ ì‹œê°„ì„ ëº€ ê°’ì´ë‹¤. 한번 ë³µì œ 지연ì´ë¼ê³ íŒë‹¨ëœ 서버는 ë³µì œ 지연 ì‹œê°„ì´ (**ha_delay_limit** - **ha_delay_limit_delta**) ì´í•˜ë¡œ 낮아질 ê²½ìš°ì— ë³µì œ ì§€ì—°ì´ í•´ì†Œë˜ì—ˆë‹¤ê³ íŒë‹¨í•œë‹¤. ìŠ¬ë ˆì´ë¸Œ 노드 ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드가 ë³µì œ 지연 여부를 íŒë‹¨í•˜ëŠ” ëŒ€ìƒ ì„œë²„, 즉 standby ìƒíƒœì˜ DB ì„œë²„ì— í•´ë‹¹í•œë‹¤. 예를 들어 ë³µì œ 지연 ì‹œê°„ì„ 10분으로 ì„¤ì •í•˜ê³ ë³µì œ 지연 í•´ì œëŠ” 8분으로 í•˜ê³ ì‹¶ë‹¤ë©´, **ha_delay_limit**\ì˜ ê°’ì€ 600s(ë˜ëŠ” 10min), **ha_delay_limit_delta**\ì˜ ê°’ì€ 120s(ë˜ëŠ” 2min)ì´ë‹¤. ë³µì œ 지연으로 íŒë‹¨ë˜ë©´ CAS는 현재 ì ‘ì† ì¤‘ì¸ standby DBê°€ 작업 ì²˜ë¦¬ì— ë¬¸ì œê°€ ìžˆë‹¤ê³ íŒë‹¨í•˜ê³ , 다른 standby DB로 ìž¬ì ‘ì†ì„ 시ë„한다. ë³µì œ 지연으로 ì¸í•´ ìš°ì„ ìˆœìœ„ê°€ ë‚®ì€ DBì— ì—°ê²°ëœ CAS는 **cubrid_broker.conf**\ì˜ :ref:`RECONNECT_TIME <reconnect_time>` 파ë¼ë¯¸í„°ë¡œ 명시한 ì‹œê°„ì´ ê²½ê³¼í•˜ë©´ ë³µì œ ì§€ì—°ì´ í•´ì†Œë˜ì—ˆì„ 것으로 기대하여, ìš°ì„ ìˆœìœ„ê°€ ë†’ì€ standby DBì— ìž¬ì ‘ì†ì„ 시ë„한다. **ha_delay_limit_delta** ìœ„ì— ê¸°ìˆ í•œ **ha_delay_limit** ì„ ì°¸ì¡°í•˜ë¼. **ha_copy_log_timeout** ì–´ë–¤ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìФ 서버 프로세스가 ìƒëŒ€ë°© ë…¸ë“œì˜ ë³µì œ 로그 복사 프로세스로부터 ì‘ë‹µì„ ëŒ€ê¸°í•˜ëŠ” 최대 시간ì´ë‹¤. ê¸°ë³¸ê°’ì€ 5(ì´ˆ)ì´ë‹¤. ì´ ê°’ì´ -1ì´ë©´ 무한 대기한다. ì˜¤ì§ **SYNC** 로그 ë³µì œ 모드(**ha_copy_sync_mode**) 파ë¼ë¯¸í„°ì™€ 함께 ìž‘ë™í•œë‹¤. **ha_check_disk_failure_interval** ì´ íŒŒë¼ë¯¸í„° ê°’ì— ì„¤ì •í•œ 시간마다 ë””ìŠ¤í¬ ìž¥ì• ì—¬ë¶€ë¥¼ íŒë‹¨í•œë‹¤. ê¸°ë³¸ê°’ì€ 15ì´ˆì´ë©°, 단위는 ì´ˆì´ë‹¤. * **ha_copy_log_timeout** 파ë¼ë¯¸í„°ì˜ ê°’ì´ -1ì¸ ê²½ìš°, **ha_check_disk_failure_interval**\ì˜ ê°’ì€ ë¬´ì‹œë˜ë©° ë””ìŠ¤í¬ ìž¥ì• ì—¬ë¶€ë¥¼ íŒë‹¨í•˜ì§€ 않는다. * **ha_check_disk_failure_interval**\ì˜ ê°’ì´ **ha_copy_log_timeout**\ì˜ ê°’ë³´ë‹¤ 작게 ì„¤ì •ëœ ê²½ìš°, **ha_copy_log_timeout** + 20ì´ˆì˜ ì‹œê°„ë§ˆë‹¤ ë””ìŠ¤í¬ ìž¥ì• ì—¬ë¶€ë¥¼ íŒë‹¨í•œë‹¤. **ha_unacceptable_proc_restart_timediff** 서버 í”„ë¡œì„¸ìŠ¤ì˜ ë¹„ì •ìƒ ìƒí™©ì´ ì§€ì†ë˜ëŠ” 경우 서버 ìž¬ì‹œìž‘ì´ ë¬´í•œ 반복ë 수 ìžˆê³ , ì´ëŸ° 경우를 ìœ ë°œí•˜ëŠ” 노드는 HA 구성ì—서 ì œì™¸í•˜ëŠ” ê²ƒì´ ë°”ëžŒì§í•˜ë‹¤. ë¹„ì •ìƒ ìƒí™©ì´ ì§€ì†ë˜ë©´ 보통 ì§§ì€ ì‹œê°„ 간격 ì´ë‚´ì— 서버가 재시작ë˜ë¯€ë¡œ, ì´ë¥¼ ê°ì§€í•˜ê¸° 위해 ì´ íŒŒë¼ë¯¸í„°ë¡œ 시간 ê°„ê²©ì„ ëª…ì‹œí•œë‹¤. 명시한 시간 간격 ì´ë‚´ì— 서버가 재시작ë˜ë©´ CUBRID는 ì´ ì„œë²„ë¥¼ ë¹„ì •ìƒìœ¼ë¡œ ê°„ì£¼í•˜ê³ í•´ë‹¹ 노드를 HA 구성ì—서 ì œì™¸(demote)한다. ê¸°ë³¸ê°’ì€ 2minì´ë©°, 단위를 ì§€ì •í•˜ì§€ 않으면 밀리초(msec)로 ì§€ì •ëœë‹¤. SQL 로깅 ^^^^^^^^ **ha_enable_sql_logging** ì´ íŒŒë¼ë¯¸í„°ì˜ ê°’ì´ **yes**\ ì´ë©´ ë³µì œ 로그 ë””ë ‰í„°ë¦¬(**ha_copy_log_base**) ì´í•˜ì˜ sql_log ë””ë ‰í„°ë¦¬ ì´í•˜ì— **applylogdb** 프로세스가 DBì— ë°˜ì˜í•˜ëŠ” SQLì— ëŒ€í•œ 로그 파ì¼ì„ ìƒì„±í•œë‹¤. ê¸°ë³¸ê°’ì€ **no**\ ì´ë‹¤. 로그 íŒŒì¼ ì´ë¦„ì˜ í˜•ì‹ì€ *<db name>_<master hostname>*\ **.sql.log.**\ *<id>*\ ì´ë©°, *<id>*\ 는 0부터 시작한다. **ha_sql_log_max_size_in_mbytes**\ì—서 ì§€ì •í•œ í¬ê¸°ë¥¼ 초과하면 *<id>*\ ì˜ ê°’ì´ í•˜ë‚˜ ì¦ê°€ëœ 새로운 파ì¼ì´ ìƒì„±ëœë‹¤. 예를 들어, "ha_sql_log_max_size_in_mbytes=100"ì´ë©´ demodb_nodeA.sql.log.0 파ì¼ì´ 100MBê°€ ë˜ë©´ì„œ demodb_nodeA.sql.log.1ì´ ìƒˆë¡œ ìƒì„±ëœë‹¤. 기본ì 으로, 2ê°œì˜ ìµœì‹ SQL 로그 파ì¼ë§Œ ìœ ì§€ë˜ë©°, **ha_sql_log_max_count** ì„¤ì •ì„ í†µí•´ ìœ ì§€í• ìµœëŒ€ íŒŒì¼ ê°œìˆ˜ë¥¼ ì¡°ì •í• ìˆ˜ 있다. SQL 로그 형ì‹ì€ 다ìŒê³¼ 같다. * INSERT/DELETE/UPDATE :: -- ë‚ ì§œ | SQL id | 샘플ë§ì„ 위한 select문 ê¸¸ì´ | ì‹¤ì œ ë³€í™˜ëœ SQL문 ê¸¸ì´ -- 샘플ë§ì„ 위한 select ì‹¤ì œ ë³€í™˜ëœ SQL 문 :: -- 2013-01-25 15:16:41 | 40083 | 33 | 114 -- SELECT * FROM [t1] WHERE "c1"=79186; INSERT INTO [t1]("c1", "c2", "c3") VALUES (79186,'b3beb3decd2a6be974',0); * DDL :: -- ë‚ ì§œ | SQL id | 0 | ì‹¤ì œ ë³€í™˜ëœ SQL문 ê¸¸ì´ ddl 구문 (create tableì˜ ê²½ìš° dba 권한으로 ìƒì„±ëœ í…Œì´ë¸”ì— ê¶Œí•œì„ ë¶€ì—¬í•˜ëŠ” grantë¬¸ì´ ë’¤ë”°ë¦„) :: -- 2013-01-25 14:22:59 | 1 | 0 | 50 create class t1 ( id integer, primary key (id) ); -- 2013-01-25 14:22:59 | 2 | 0 | 38 GRANT ALL PRIVILEGES ON [t1] TO public; .. warning:: 마스터 노드ì—서 íŠ¸ë¦¬ê±°ì— ì˜í•´ ìˆ˜í–‰ëœ ìž‘ì—…ì´ SQL 로그 파ì¼ì— 남게 ë˜ë¯€ë¡œ, 별ë„ì˜ DB를 구축하면서 íŠ¹ì • 시ì 부터 해당 SQL 로그를 ë°˜ì˜í•˜ëŠ” 경우 트리거를 반드시 ëˆ ìƒíƒœë¡œ ì 용해야 한다. * 브로커 ì„¤ì •ìœ¼ë¡œ 트리거를 ë„는 ë°©ë²•ì€ :ref:`TRIGGER_ACTION <TRIGGER_ACTION>`\ ì„ ì°¸ê³ í•œë‹¤. * CSQL 실행 시 트리거를 ë„는 ë°©ë²•ì€ :option:`csql --no-trigger-action`\ ì„ ì°¸ê³ í•œë‹¤. .. unique key update 문 중복 ì ìš© 시 ë°œìƒí•˜ëŠ” unique ì—러 ë¬¸ì œì— ëŒ€í•´ì„œëŠ” ì•„ì§ ì„ ë³„ ì „ì´ë¯€ë¡œ warningì— ë°˜ì˜ ë³´ë¥˜. [보류] **ha_sql_log_max_size_in_mbytes** **applylogdb** 프로세스가 DBì— ë°˜ì˜í•˜ëŠ” SQLì´ ë¡œê¹…ë 때 ìƒì„±í•˜ëŠ” 파ì¼ì˜ 최대 í¬ê¸°ì´ë‹¤. ì´ í¬ê¸°ë¥¼ 초과하면 새로운 파ì¼ì´ ìƒì„±ëœë‹¤. **ha_sql_log_max_count** ìœ ì§€í•´ì•¼í• ìµœëŒ€ SQL 로그 íŒŒì¼ ê°œìˆ˜ë¥¼ 나타내며, SQL 로그 파ì¼ì´ ì´ë¥¼ 초과하여 ìƒì„±ë 경우 가장 ì˜¤ëž˜ëœ ë¡œê·¸ 파ì¼ë¶€í„° ì‚ì œëœë‹¤. ì´ íŒŒë¼ë¯¸í„°ì˜ ê¸°ë³¸ê°’ì€ 2ì´ë©°, 2ì—서 5 ë²”ìœ„ì˜ ì •ìˆ˜ê°’ì„ ì„¤ì •í• ìˆ˜ 있다. **ha_sql_log_max_count**\와 **ha_sql_log_max_size_in_mbytes** ì„¤ì •ì„ í†µí•´ ì ì ˆí•œ ì–‘ì˜ SQL 로그를 ìœ ì§€í• ìˆ˜ 있다. **ha_sql_log_path** SQL 로그 파ì¼ì´ ìƒì„±ë ë””ë ‰í„°ë¦¬ 경로를 나타내며, ìƒëŒ€ 경로 ë˜ëŠ” ì ˆëŒ€ 경로로 ì„¤ì •í• ìˆ˜ 있다. ìƒëŒ€ 경로로 ì„¤ì •ë˜ëŠ” 경우 **ha_enable_sql_logging**\ì—서 설명한 ë³µì œ 로그 ë””ë ‰í„°ë¦¬ë¥¼ 기준으로 ìƒëŒ€ 경로를 íŒë‹¨í•œë‹¤. ë°ì´í„°ë² ì´ìФ 서버 프로세스(cub_server)는 반드시 ì§€ì •ëœ ê²½ë¡œì— SQL 로그 파ì¼ì„ ìƒì„±í• 수 있는 ê¶Œí•œì´ ìžˆì–´ì•¼ 한다. ì´ íŒŒë¼ë¯¸í„°ê°€ ì„¤ì •ë˜ì§€ ì•Šì€ ê²½ìš°ì—는 **ha_enable_sql_logging**\ì—서 설명한 ë³µì œ 로그 ë””ë ‰í„°ë¦¬ ê²½ë¡œì— SQL 로그 파ì¼ì„ ìƒì„±í•œë‹¤. .. _ha-cubrid-broker-conf: cubrid_broker.conf ------------------ **cubrid_broker.conf** 파ì¼ì€ **$CUBRID/conf** ë””ë ‰í„°ë¦¬ì— ìœ„ì¹˜í•˜ë©°, ë¸Œë¡œì»¤ì˜ ì „ë°˜ì ì¸ ì„¤ì • ì •ë³´ë¥¼ ë‹´ê³ ìžˆë‹¤. 여기ì—서는 **cubrid_broker.conf** 중 CUBRID HAê°€ 사용하는 파ë¼ë¯¸í„°ë¥¼ 설명한다. 브로커와 DB 사ì´ì˜ ì—°ê²° ì ˆì°¨ì— ëŒ€í•œ ìžì„¸í•œ ì„¤ëª…ì€ :ref:`ha-connect-broker-db`\ ì„ ì°¸ê³ í•œë‹¤. ì ‘ì† ëŒ€ìƒ ^^^^^^^^^ **ACCESS_MODE** ë¸Œë¡œì»¤ì˜ ëª¨ë“œë¥¼ ì„¤ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ **RW** ì´ë‹¤. **RW** (Read Write), **RO** (Read Only), **SO** (Standby Only)를 값으로 ì„¤ì •í• ìˆ˜ 있다. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`broker-mode`\ 를 ì°¸ê³ í•œë‹¤. **REPLICA_ONLY** **REPLICA_ONLY**\ ì˜ ê°’ì´ **ON**\ ì´ë©´ CASê°€ ë ˆí”Œë¦¬ì¹´ì—ë§Œ ì ‘ì†ëœë‹¤. ê¸°ë³¸ê°’ì€ **OFF**\ ì´ë‹¤. **REPLICA_ONLY**\ ì˜ ê°’ì´ **ON**\ ì´ê³ **ACCESS_MODE**\ ì˜ ê°’ì´ **RW**\ ì´ë©´ ë ˆí”Œë¦¬ì¹´ DBì—ë„ ì“°ê¸° ìž‘ì—…ì„ ìˆ˜í–‰í• ìˆ˜ 있다. ì ‘ì† ìˆœì„œ ^^^^^^^^^ **CONNECT_ORDER** CASê°€ ì—°ê²°í• í˜¸ìŠ¤íŠ¸ 순서를 ê²°ì •í• ë•Œ **$CUBRID_DATABASES/databases.txt**\ì˜ **db-host**\ ì— ì„¤ì •ëœ í˜¸ìŠ¤íŠ¸ì—서 순서대로 ì—°ê²°ì„ ì‹œë„í• ì§€ ëžœë¤í•œ 순서대로 ì—°ê²°ì„ ì‹œë„í• ì§€ë¥¼ ì§€ì •í•˜ëŠ” 파ë¼ë¯¸í„°ì´ë‹¤. ê¸°ë³¸ê°’ì€ **SEQ**\ ì´ë©° 순서대로 ì—°ê²°ì„ ì‹œë„한다. **RANDOM**\ ì´ë©´ ëžœë¤í•œ 순서대로 ì—°ê²°ì„ ì‹œë„한다. **PREFERRED_HOSTS** 파ë¼ë¯¸í„° ê°’ì´ ì£¼ì–´ì§€ë©´ ë¨¼ì € **PREFERRED_HOSTS**\ ì— ëª…ì‹œëœ í˜¸ìŠ¤íŠ¸ì˜ ìˆœì„œëŒ€ë¡œ ì—°ê²°ì„ ì‹œë„한 후 ì‹¤íŒ¨í• ê²½ìš°ì—ë§Œ **db-host**\ì˜ ì„¤ì • ê°’ì„ ì‚¬ìš©í•œë‹¤. ê·¸ë¦¬ê³ **CONNECT_ORDER**\는 **PREFERRED_HOSTS**\ì˜ ìˆœì„œì—는 ì˜í–¥ì„ 주지 않는다. 한 곳으로 DB ì ‘ì†ì´ 집중ë˜ëŠ” ìƒí™©ì´ ìš°ë ¤ë˜ëŠ” 경우 ì´ ê°’ì„ **RANDOM**\으로 ì„¤ì •í•œë‹¤. **PREFERRED_HOSTS** 호스트 ì´ë¦„ì„ ë‚˜ì—´í•˜ì—¬ ì—°ê²°í• ìˆœì„œë¥¼ ì§€ì •í•œë‹¤. ê¸°ë³¸ê°’ì€ **NULL**\ ì´ë‹¤. 여러 노드를 ì§€ì •í• ìˆ˜ 있으며 ì½œë¡ (:)으로 구분한다. ë¨¼ì € **PREFERRED_HOSTS** 파ë¼ë¯¸í„°ì— ì„¤ì •ëœ í˜¸ìŠ¤íŠ¸ 순서대로 ì—°ê²°ì„ ì‹œë„한 후 **$CUBRID_DATABASES/databases.txt**\ ì— ì„¤ì •ëœ í˜¸ìŠ¤íŠ¸ 순서대로 ì—°ê²°ì„ ì‹œë„한다. 다ìŒì€ **cubrid_broker.conf** ì„¤ì •ì˜ ì˜ˆì´ë‹¤. localhostì— ìš°ì„ ì ‘ì†í•˜ê¸° 위해 **PREFERRED_HOSTS**\ 를 localhost로 명시했다. :: [%PHRO_broker] SERVICE =ON BROKER_PORT =33000 MIN_NUM_APPL_SERVER =5 MAX_NUM_APPL_SERVER =40 APPL_SERVER_SHM_ID =33000 LOG_DIR =log/broker/sql_log ERROR_LOG_DIR =log/broker/error_log SQL_LOG =ON TIME_TO_KILL =120 SESSION_TIMEOUT =300 KEEP_CONNECTION =AUTO CCI_DEFAULT_AUTOCOMMIT =ON # Broker mode setting parameter ACCESS_MODE =RO PREFERRED_HOSTS =localhost ì ‘ì† ì œí•œ ^^^^^^^^^ .. _MAX_NUM_DELAYED_HOSTS_LOOKUP: **MAX_NUM_DELAYED_HOSTS_LOOKUP** **databases.txt**\ ì˜ **db-host**\ ì— ì—¬ëŸ¬ ëŒ€ì˜ DB 서버를 명시한 HA 환경ì—서 ê±°ì˜ ëª¨ë“ DB 서버ì—서 ë³µì œ ì§€ì—°ì´ ë°œìƒí•˜ëŠ” 경우, **MAX_NUM_DELAYED_HOSTS_LOOKUP** 파ë¼ë¯¸í„°ì—서 명시한 ëŒ€ìˆ˜ì˜ ë³µì œ 지연 서버까지만 ì—°ê²° 여부를 ê²€í† í•œ 후 ì—°ê²°ì„ ê²°ì •í•œë‹¤(ì–´ë–¤ DB ì„œë²„ì˜ ë³µì œ 지연 여부는 standby ìƒíƒœì˜ í˜¸ìŠ¤íŠ¸ë§Œì„ ëŒ€ìƒìœ¼ë¡œ íŒë‹¨í•˜ë©°, :ref:`ha_delay_limit <ha_delay_limit>` 파ë¼ë¯¸í„°ì˜ ì„¤ì •ì— ë”°ë¼ ê²°ì •ë¨). ë˜í•œ **PREFERRED_HOSTS**\ ì—는 **MAX_NUM_DELAYED_HOSTS_LOOKUP**\ ì´ ì ìš©ë˜ì§€ 않는다. 예를 들어 **db-host**\ ê°€ "host1:host2:host3:host4:host5"로 명시ë˜ê³ "MAX_NUM_DELAYED_HOSTS_LOOKUP=2"ì¼ ë•Œ, 만약 í˜¸ìŠ¤íŠ¸ë“¤ì˜ ìƒíƒœëŠ” 다ìŒê³¼ ê°™ì„ ê²½ìš° : * *host1* : active ìƒíƒœ * *host2* : standby ìƒíƒœ, ë³µì œ 지연 * *host3* : ì ‘ì† ë¶ˆê°€ * *host4* : standby ìƒíƒœ, ë³µì œ 지연 * *host5* : standby ìƒíƒœ, ë³µì œ 지연 ì—†ìŒ ì´ë©´ 브로커는 ë¨¼ì € ë³µì œ 지연 ìƒíƒœì¸ 2ê°œì˜ í˜¸ìŠ¤íŠ¸ *host2* , *host4* 까지 ì ‘ì†ì„ 시ë„í•˜ê³ , *ho:1106st4* ì— ì ‘ì†í•˜ëŠ” 것으로 ê²°ì •í•œë‹¤. ì´ë ‡ê²Œ ë™ìž‘하는 ì´ìœ 는 **MAX_NUM_DELAYED_HOSTS_LOOKUP**\ ì—서 명시한 개수까지만 ë³µì œ ì§€ì—°ì´ ìžˆë‹¤ë©´ ì´í›„ì˜ í˜¸ìŠ¤íŠ¸ë“¤ì—ë„ ë³µì œ ì§€ì—°ì´ ìžˆì„ ê²ƒì´ë¼ëŠ” ê°€ì •ì„ í•˜ê¸° 때문ì´ë©°, ë”°ë¼ì„œ ë” ì´ìƒ ë’¤ì˜ í˜¸ìŠ¤íŠ¸ì— ëŒ€í•´ ì ‘ì† ì‹œë„를 하지 ì•Šê³ ë³µì œ ì§€ì—°ì´ ìžˆì§€ë§Œ 가장 ë§ˆì§€ë§‰ì— ì ‘ì†ì„ 시ë„í–ˆë˜ í˜¸ìŠ¤íŠ¸ì— ì ‘ì†í•˜ê¸°ë¡œ ê²°ì •í•˜ëŠ” 것ì´ë‹¤. 단, **PREFERRED_HOSTS**\ ê°€ ê°™ì´ ëª…ì‹œë˜ëŠ” 경우 **PREFERRED_HOSTS**\ ì— ëª…ì‹œëœ ëª¨ë“ í˜¸ìŠ¤íŠ¸ë“¤ì— ëŒ€í•´ ì ‘ì†ì„ ë¨¼ì € 시ë„한 후 다시 db-host ë¦¬ìŠ¤íŠ¸ì˜ ì²˜ìŒë¶€í„° ì ‘ì†ì„ 시ë„한다. 브로커가 DBì— ì ‘ì†í•˜ê¸° 위한 단계는 1ì°¨ ì—°ê²°ê³¼ 2ì°¨ 연결로 나뉜다. * 1ì°¨ ì—°ê²°: 브로커가 DBì— ì ‘ì†í•˜ê¸° 위해 ìµœì´ˆì— ì ‘ì†ì„ 시ë„하는 단계. DB ìƒíƒœ(active/standby)와 ë³µì œ 지연 여부를 확ì¸. ë¨¼ì € **PREFERRED_HOSTS**\ ì˜ í˜¸ìŠ¤íŠ¸ë“¤ì— ì ‘ì†ì„ 시ë„한 후, databases.txtì˜ í˜¸ìŠ¤íŠ¸ë“¤ì— ì ‘ì†ì„ 시ë„한다. ì´ë•ŒëŠ” **ACCESS_MODE**\ ì— ë”°ë¼ DBì˜ ìƒíƒœê°€ activeì¸ì§€, standbyì¸ì§€ë„ 검사하여 ì ‘ì†ì„ ê²°ì •í•œë‹¤. * 2ì°¨ ì—°ê²°: 1ì°¨ ì—°ê²° 실패 후 실패한 위치ì—서부터 ë‘번째로 ì ‘ì†ì„ 시ë„하는 단계. DB ìƒíƒœ(active/standby)와 ë³µì œ 지연 여부를 무시. 단, **SO** 브로커는 í•ìƒ standby DBì—ë§Œ ì ‘ì† í—ˆìš©. ì´ë•ŒëŠ” DBì˜ ìƒíƒœ(active/standby) ë° ë³µì œ 지연 여부와 무관하게 ì ‘ì†ì´ 가능하면 ì ‘ì†ì„ ê²°ì •í•œë‹¤. 하지만 ì§ˆì˜ ìˆ˜í–‰ 단계ì—서 ì—러가 ë°œìƒí• 수 있다. 예를 들어 **ACCESS_MODE** ê°€ **RW**\ì¸ë° standby ìƒíƒœì˜ ì„œë²„ì— ì ‘ì†í•˜ë©´ INSERT ì§ˆì˜ ìˆ˜í–‰ 시 ì—러가 ë°œìƒí•œë‹¤. ì—러 ë°œìƒê³¼ëŠ” 무관하게, standby로 ì—°ê²°ë˜ì–´ 트랜ìžì…˜ì´ ìˆ˜í–‰ëœ ì´í›„ì—는 1ì°¨ ì—°ê²°ì„ ë‹¤ì‹œ 시ë„한다. 단, **SO**\ 브로커는 ì ˆëŒ€ë¡œ active DBì— ì—°ê²°ë 수 없다. **MAX_NUM_DELAYED_HOSTS_LOOKUP**\ ì˜ ê°’ì— ë”°ë¼ ì ‘ì†ì„ 시ë„하는 í˜¸ìŠ¤íŠ¸ì˜ ê°œìˆ˜ê°€ ì œí•œë˜ëŠ” ë°©ë²•ì€ ë‹¤ìŒê³¼ 같다: * MAX_NUM_DELAYED_HOSTS_LOOKUP=-1 ì´ íŒŒë¼ë¯¸í„°ë¥¼ ì§€ì •í•˜ì§€ ì•Šì€ ê²ƒê³¼ 같으며, 기본값ì´ë‹¤. ì´ ê²½ìš° 1ì°¨ ì—°ê²°ì—서는 ë까지 ë³µì œ 지연 여부와 DBì˜ ìƒíƒœë¥¼ 검사하여 ì—°ê²°ì„ ê²°ì •í•œë‹¤. 2ì°¨ ì—°ê²°ì—서는 ë³µì œ ì§€ì—°ì´ ìžˆë”ë¼ë„, ë˜ëŠ” ì›í•˜ëŠ” DB ìƒíƒœ(active/standby)ê°€ 아니ë”ë¼ë„ 가장 ë§ˆì§€ë§‰ì— ì—°ê²° ê°€ëŠ¥í–ˆë˜ í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•œë‹¤. * MAX_NUM_DELAYED_HOSTS_LOOKUP=0 1ì°¨ ì—°ê²°ì—서 **PREFERRED_HOSTS**\ ì—ë§Œ ì—°ê²°ì„ ì‹œë„한 후 2ì°¨ ì—°ê²°ì´ ì§„í–‰ë˜ë©°, 2ì°¨ ì—°ê²°ì—서는 ë³µì œ ì§€ì—°ì´ ìžˆëŠ” DB 서버ì´ê±°ë‚˜ ì›í•˜ëŠ” DB ìƒíƒœ(active/standby)ê°€ 아니ë”ë¼ë„ ì—°ê²°ì„ ì‹œë„한다. 즉, 2ì°¨ ì—°ê²°ì´ë¯€ë¡œ **RW** ë¸Œë¡œì»¤ë„ standby í˜¸ìŠ¤íŠ¸ì— ì—°ê²°ë 수 있으며, **RO** ë¸Œë¡œì»¤ë„ active í˜¸ìŠ¤íŠ¸ì— ì—°ê²°ë 수 있다. 단, **SO** 브로커는 ì ˆëŒ€ë¡œ active DBì— ì—°ê²°ë 수 없다. * MAX_NUM_DELAYED_HOSTS_LOOKUP=n(>0) ì§€ì •ëœ ê°œìˆ˜ì˜ ë³µì œ 지연 호스트까지만 ì—°ê²° 시ë„한다. 1ì°¨ ì—°ê²°ì—서는 ëª…ì‹œëœ ê°œìˆ˜ì˜ ë³µì œ 지연 DB 서버까지 ê²€ì‚¬í•˜ê³ ë‚œ ì´í›„, 2ì°¨ ì—°ê²°ì—서는 ë³µì œ ì§€ì—°ì´ ìžˆëŠ” í˜¸ìŠ¤íŠ¸ì— ì—°ê²°í•œë‹¤. ìž¬ì ‘ì† ^^^^^^ **RECONNECT_TIME** 브로커가 **PREFERRED_HOSTS**\ ê°€ 아닌 DB ì„œë²„ì— ì ‘ì†í•˜ë ¤ê³ 하거나, **RO** 브로커가 active DB ì„œë²„ì— ì ‘ì†í•˜ë ¤ê³ 하거나, 브로커가 ë³µì œ 지연 DB ì„œë²„ì— ì ‘ì†í•˜ë ¤ëŠ” 경우, **RECONNECT_TIME**\ (기본값: 10ë¶„)ì„ ì´ˆê³¼í•˜ë©´ DB ì„œë²„ì— ìž¬ì—°ê²°ì„ ì‹œë„한다. 보다 ìžì„¸í•œ ë‚´ìš©ì€ :ref:`RECONNECT_TIME <reconnect_time>`\ ì„ ì°¸ê³ í•œë‹¤. databases.txt ------------- **databases.txt** 파ì¼ì€ **$CUBRID_DATABASES** (ì„¤ì •ë˜ì–´ 있지 ì•Šì€ ê²½ìš° $CUBRID/databases) ë””ë ‰í„°ë¦¬ì— ìœ„ì¹˜í•˜ë©°, **db_hosts** ê°’ì„ ì„¤ì •í•˜ì—¬ ë¸Œë¡œì»¤ì˜ CASê°€ ì ‘ì†ì„ 시ë„하는 ì„œë²„ì˜ ìˆœì„œë¥¼ ê²°ì •í• ìˆ˜ 있다. 여러 노드를 ì„¤ì •í•˜ë ¤ë©´ ì½œë¡ (:)으로 구분한다. **cubrid_broker.conf**\ ì˜ **CONNECT_ORDER** 파ë¼ë¯¸í„° ê°’ì´ **RANDOM**\ ì´ë©´ 무작위한 순서로 ì ‘ì† ìˆœì„œë¥¼ ê²°ì •í•œë‹¤. 하지만 **PREFERRED_HOSTS** 파ë¼ë¯¸í„° ê°’ì´ ì„¤ì •ëœ ê²½ìš° ëª…ì‹œëœ í˜¸ìŠ¤íŠ¸ë¡œì˜ ì ‘ì†ì„ ìš°ì„ ì‹œë„한다. 다ìŒì€ **databases.txt** ì„¤ì •ì˜ ì˜ˆì´ë‹¤. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob .. _ha-jdbc-conf: JDBC ì„¤ì • --------- JDBCì—서 CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ 브로커(*nodeA_broker*)ì— ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 다ìŒìœ¼ë¡œ ì—°ê²°í• ë¸Œë¡œì»¤(*nodeB_broker*)ì˜ ì—°ê²° ì •ë³´ë¥¼ ì—°ê²° URLì— ì¶”ê°€ë¡œ ì§€ì •í•´ì•¼ 한다. CUBRID HA를 위해 ì§€ì •ë˜ëŠ” ì†ì„±ì€ ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 ì—°ê²°í• í•˜ë‚˜ ì´ìƒì˜ 브로커 노드 ì •ë³´ì¸ **altHosts**\ ì´ë‹¤. ì´ì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :ref:`jdbc-connection-conf`\ 를 ì°¸ê³ í•œë‹¤. 다ìŒì€ JDBC ì„¤ì •ì˜ ì˜ˆì´ë‹¤. .. code-block:: java Connection connection = DriverManager.getConnection("jdbc:CUBRID:nodeA_broker:33000:testdb:::?charSet=utf-8&altHosts=nodeB_broker:33000", "dba", ""); .. _ha-cci-conf: CCI ì„¤ì • -------- CCIì—서 CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ ë¸Œë¡œì»¤ì— ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 ì—°ê²°í• ë¸Œë¡œì»¤ì˜ ì—°ê²° ì •ë³´ë¥¼ ì—°ê²° URLì— ì¶”ê°€ë¡œ ì§€ì •í• ìˆ˜ 있는 :c:func:`cci_connect_with_url` 함수를 사용하여 브로커와 연결해야 한다. CUBRID HA를 위해 ì§€ì •ë˜ëŠ” ì†ì„±ì€ ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 ì—°ê²°í• í•˜ë‚˜ ì´ìƒì˜ 브로커 노드 ì •ë³´ì¸ **altHosts**\ ì´ë‹¤. 다ìŒì€ CCI ì„¤ì •ì˜ ì˜ˆì´ë‹¤. .. code-block:: c con = cci_connect_with_url ("cci:CUBRID:nodeA_broker:33000:testdb:::?altHosts=nodeB_broker:33000", "dba", NULL); if (con < 0) { printf ("cannot connect to database\n"); return 1; } .. _ha-php-conf: PHP ì„¤ì • -------- PHPì—서 CUBRID HA ê¸°ëŠ¥ì„ ì‚¬ìš©í•˜ë ¤ë©´ ë¸Œë¡œì»¤ì— ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 ì—°ê²°í• ë¸Œë¡œì»¤ì˜ ì—°ê²° ì •ë³´ë¥¼ ì—°ê²° URLì— ì¶”ê°€ë¡œ ì§€ì •í• ìˆ˜ 있는 `cubrid_connect_with_url <https://www.php.net/manual/en/function.cubrid-connect-with-url.php>`_ 함수를 사용하여 브로커와 연결해야 한다. CUBRID HA를 위해 ì§€ì •ë˜ëŠ” ì†ì„±ì€ ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 ì—°ê²°í• í•˜ë‚˜ ì´ìƒì˜ 브로커 노드 ì •ë³´ì¸ **altHosts**\ ì´ë‹¤. 다ìŒì€ PHP ì„¤ì •ì˜ ì˜ˆì´ë‹¤. .. code-block:: php <?php $con = cubrid_connect_with_url ("cci:CUBRID:nodeA_broker:33000:testdb:::?altHosts=nodeB_broker:33000", "dba", NULL); if ($con < 0) { printf ("cannot connect to database\n"); return 1; } ?> .. note:: altHosts를 ì„¤ì •í•˜ì—¬ 브로커 ì ˆì²´(failover)ê°€ 가능하ë„ë¡ ì„¤ì •í•œ 환경ì—서, 브로커 ì ˆì²´ê°€ ì›í™œí•˜ê²Œ ë˜ë ¤ë©´ URLì— **disconnectOnQueryTimeout** ê°’ì„ **true** 로 ì„¤ì •í•´ì•¼ 한다. ì´ ê°’ì´ trueë©´ ì§ˆì˜ íƒ€ìž„ì•„ì›ƒ ë°œìƒ ì‹œ ì‘ìš© í”„ë¡œê·¸ëž¨ì€ ì¦‰ì‹œ ê¸°ì¡´ì— ì ‘ì†ë˜ì—ˆë˜ ë¸Œë¡œì»¤ì™€ì˜ ì ‘ì†ì„ í•´ì œí•˜ê³ **altHosts**\ ì— ì§€ì •í•œ 브로커로 ì ‘ì†í•œë‹¤. .. _ha-connect-broker-db: 브로커와 DB ì—°ê²° ================ HA 환경ì—서 브로커는 여러 ê°œì˜ DB 서버 중 하나와 ì ‘ì†ì„ ê²°ì •í•´ì•¼ 한다. ì´ë•Œ 브로커와 DB ì„œë²„ì˜ ì„¤ì •ì— ë”°ë¼ ì–´ë–¤ DB 서버와 어떻게 ì ‘ì†í• 것ì¸ì§€ê°€ 달ë¼ì§„다. ì´ ìž¥ì—서는 HA 환경ì—서 ì„¤ì •ì— ë”°ë¼ ë¸Œë¡œì»¤ê°€ DB 서버를 어떻게 ì„ íƒí•˜ëŠ”ì§€ë¥¼ 중심으로 살펴본다. 환경 ì„¤ì •ì—서 사용ë˜ëŠ” ê° íŒŒë¼ë¯¸í„°ë“¤ì— 대한 ì„¤ëª…ì€ :ref:`ha-configuration`\ ì„ ì°¸ê³ í•œë‹¤. 다ìŒì€ 브로커와 DBê°€ ì—°ê²°ë 때 사용ë˜ëŠ” 주요 파ë¼ë¯¸í„°ë“¤ì´ë‹¤. +------------+----------------------+-------------------------------+-----------------------------------------------------------------------+ | 위치 | ì„¤ì • íŒŒì¼ | 파ë¼ë¯¸í„° ì´ë¦„ | 설명 | +============+======================+===============================+=======================================================================+ | DB 서버 | cubrid.conf | ha_mode | DB ì„œë²„ì˜ HA 모드(on/off/replica). 기본값: off | | +----------------------+-------------------------------+-----------------------------------------------------------------------+ | | cubrid_ha.conf | ha_delay_limit | DB 서버ì—서 ë³µì œ 지연 여부를 íŒë‹¨í•˜ëŠ” ë³µì œ 지연 ê¸°ì¤€ì´ ë˜ëŠ” 시간. | | | +-------------------------------+-----------------------------------------------------------------------+ | | | ha_delay_limit_delta | ë³µì œ 지연 기준 시간ì—서 | | | | | ë³µì œ 지연 해소 ì‹œê°„ì„ ëº€ 시간. | +------------+----------------------+-------------------------------+-----------------------------------------------------------------------+ | 브로커 | cubrid_broker.conf | ACCESS_MODE | 브로커 모드(RW/RO/SO). 기본값: RW | | | +-------------------------------+-----------------------------------------------------------------------+ | | | REPLICA_ONLY | REPLICA 서버로만 ì—°ê²° 가능 여부(ON/OFF). 기본값: OFF | | | +-------------------------------+-----------------------------------------------------------------------+ | | | PREFERRED_HOSTS | databases.txtì˜ db-hostì—서 ì„¤ì •í•œ 호스트보다 ìš°ì„ í•˜ì—¬ | | | | | 여기ì—서 ì§€ì •í•œ í˜¸ìŠ¤íŠ¸ì— ì—°ê²° | | | +-------------------------------+-----------------------------------------------------------------------+ | | | MAX_NUM_DELAYED_HOSTS_LOOKUP | databases.txtì—서 ë³µì œ 지연으로 íŒë‹¨í• í˜¸ìŠ¤íŠ¸ì˜ ê°œìˆ˜. | | | | | 명시한 ê°œìˆ˜ì˜ í˜¸ìŠ¤íŠ¸ê¹Œì§€ ë³µì œ 지연으로 íŒë‹¨ë˜ë©´ | | | | | 가장 ë§ˆì§€ë§‰ì— í™•ì¸í•œ | | | | | 호스트와 ì—°ê²°. | | | | | | | | | | * -1: databases.txtì— ëª…ì‹œí•œ ëª¨ë“ | | | | | í˜¸ìŠ¤íŠ¸ì˜ ë³µì œ 지연 여부를 확ì¸. | | | | | * 0: ë³µì œ 지연 여부를 확ì¸í•˜ì§€ ì•Šê³ | | | | | 바로 2ì°¨ ì—°ê²°ì„ ìˆ˜í–‰. | | | | | * n(>0): nê°œì˜ í˜¸ìŠ¤íŠ¸ê¹Œì§€ ë³µì œ 지연 여부를 확ì¸. | | | +-------------------------------+-----------------------------------------------------------------------+ | | | RECONNECT_TIME | ì 합하지 ì•Šì€ DB ì„œë²„ì— ì—°ê²°ëœ ì´í›„ ìž¬ì—°ê²°ì„ ì‹œë„하는 시간. | | | | | 기본값: 600s. | | | | | ì´ ê°’ì´ 0ì´ë©´ ìž¬ì—°ê²°ì„ ì‹œë„하지 않ìŒ. | | | +-------------------------------+-----------------------------------------------------------------------+ | | | CONNECT_ORDER | databases.txtì— ì„¤ì •ëœ í˜¸ìŠ¤íŠ¸ì—서 순서대로 ì—°ê²°ì„ ì‹œë„í• ì§€ ëžœë¤í•œ | | | | | 순서대로 ì—°ê²°ì„ ì‹œë„í• ì§€ë¥¼ ì§€ì •í•˜ëŠ” 파ë¼ë¯¸í„°(SEQ/RANDOM). 기본값: SEQ | +------------+----------------------+-------------------------------+-----------------------------------------------------------------------+ ì ‘ì† ì ˆì°¨ --------- 브로커가 DB ì„œë²„ì— ì ‘ì†í• 때, 1ì°¨ ì—°ê²°ì„ ë¨¼ì € 시ë„í•˜ê³ ì‹¤íŒ¨í•˜ë©´ 2ì°¨ ì—°ê²°ì„ ì‹œë„한다. * 1ì°¨ ì—°ê²°: DB ìƒíƒœ(active/standby)와 ë³µì œ 지연 여부를 확ì¸. 1. **PREFERRED_HOSTS**\ ì— ëª…ì‹œëœ ìˆœì„œë¡œ ì ‘ì†ì„ 시ë„한다. **ACCESS_MODE**\ 와 ë§žì§€ 않는 ìƒíƒœì˜ DB ë˜ëŠ” ë³µì œ ì§€ì—°ì´ ë°œìƒí•˜ëŠ” DBì—는 ì ‘ì†ì„ 거부한다. 2. **CONNECT_ORDER**\ ì˜ ê°’ì— ë”°ë¼ **databases.txt**\ì— ëª…ì‹œëœ ìˆœì„œ í˜¹ì€ ë¬´ìž‘ìœ„ë¡œ ì ‘ì†ì„ 시ë„한다. **ACCESS_MODE**\ ì— ë”°ë¼ DB ì„œë²„ì˜ ìƒíƒœë¥¼ 확ì¸í•˜ë©°, **MAX_NUM_DELAYED_HOSTS_LOOKUP** 개수까지 ë³µì œ 지연 ì—¬ë¶€ë„ í™•ì¸í•œë‹¤. * 2ì°¨ ì—°ê²°: DB ìƒíƒœ(active/standby)와 ë³µì œ 지연 여부를 무시. 단, **SO** 브로커는 í•ìƒ standby DBì—ë§Œ ì ‘ì† í—ˆìš©. 1. **PREFERRED_HOSTS**\ ì— ëª…ì‹œëœ ìˆœì„œë¡œ ì ‘ì†ì„ 시ë„한다. DB ì„œë²„ì˜ ìƒíƒœê°€ **ACCESS_MODE**\ 와 ë§žì§€ 않거나 DBì—서 ë³µì œ ì§€ì—°ì´ ë°œìƒí•˜ë”ë¼ë„ ì ‘ì†ì„ 허용한다. 단, **SO** 브로커는 ì ˆëŒ€ë¡œ active DBì— ì—°ê²°ë 수 없다. 2. **CONNECT_ORDER**\ ì˜ ê°’ì— ë”°ë¼ **databases.txt**\ì— ëª…ì‹œëœ ìˆœì„œ í˜¹ì€ ë¬´ìž‘ìœ„ë¡œ ì ‘ì†ì„ 시ë„한다. DB ì„œë²„ì˜ ìƒíƒœ ë° ë³µì œ 지연 여부와 무관하게 ì ‘ì†ì´ 가능하면 ëœë‹¤. 파ë¼ë¯¸í„° ì„¤ì •ì— ë”°ë¥¸ ë™ìž‘ì˜ ì˜ˆ ------------------------------ 다ìŒì€ 파ë¼ë¯¸í„° ì„¤ì •ì— ë”°ë¥¸ ë™ìž‘ì˜ ì˜ˆì´ë‹¤. **호스트 DB ìƒíƒœ** * *host1*: active * *host2*: standby, ë³µì œ 지연 * *host3*: standby, replica, ì ‘ì† ë¶ˆê°€ * *host4*: standby, replica, ë³µì œ 지연 * *host5*: standby, replica, ë³µì œ 지연 호스트 DBì˜ ìƒíƒœê°€ 위와 ê°™ì„ ë•Œ, ì„¤ì •ì— ë”°ë¥¸ ë™ìž‘ì˜ ì˜ˆëŠ” 다ìŒê³¼ 같다. **ì„¤ì •ì— ë”°ë¥¸ ë™ìž‘** * 2-1, 2-2, 2-3: 2로부터 (+)는 추가, (#)ì€ ë³€ê²½. * 3-1, 3-2, 3-3: 3으로부터 (+)는 추가, (#)ì€ ë³€ê²½. +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 번호 | ì„¤ì • | ë™ìž‘ | +=======+============================================+======================================================================================================+ | 1 | * **ACCESS_MODE=RW** | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ activeì¸ì§€ 확ì¸í•œë‹¤. | | | * PREFERRED_HOSTS=host2:host3 | | | | * db-host=host1:host2:host3:host4:host5 | * PREFERRED_HOSTSì˜ host2는 ë³µì œ 지연ì´ê³ *host3* 는 ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ db-hostì— ì ‘ì†ì„ 시ë„한다. | | | * MAX_NUM_DELAYED_HOSTS_LOOKUP=-1 | * *host1* ì´ activeì´ë¯€ë¡œ ì ‘ì†ì— 성공한다. | | | * CONNECT_ORDER=SEQ | | | | | | | | | PREFERRED_HOSTSì— ì ‘ì†í•˜ì§€ 않았으므로 | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 2 | * **ACCESS_MODE=RO** | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | * db-host=host1:host2:host3:host4:host5 | | | | * MAX_NUM_DELAYED_HOSTS_LOOKUP=-1 | * DB ìƒíƒœê°€ standbyì¸ í˜¸ìŠ¤íŠ¸ëŠ” ëª¨ë‘ ë³µì œ 지연 ë˜ëŠ” ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ | | | * CONNECT_ORDER=SEQ | 프ë¼ì´ë¨¸ë¦¬ ì—°ê²°ì—는 실패한다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœì™€ ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * 가장 ë§ˆì§€ë§‰ì— ì ‘ì†í–ˆë˜ *host5* ê°€ ì ‘ì†ì— 성공한다. | | | | | | | | ë³µì œ 지연 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 2-1 | * (+)PREFERRED_HOSTS=host1:host3 | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ê³ | | | | *host3* 는 ì ‘ì†ì´ 불가하므로 db-hostì— ì ‘ì†ì„ 시ë„한다. | | | | * DB ìƒíƒœê°€ standbyì¸ í˜¸ìŠ¤íŠ¸ëŠ” ëª¨ë‘ ë³µì œ 지연 | | | | ë˜ëŠ” ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ 1ì°¨ ì—°ê²°ì—는 실패한다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœì™€ ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ì§€ë§Œ ì ‘ì†ì´ 가능하므로 | | | | ë¸Œë¡œì»¤ì™€ì˜ ì ‘ì†ì— 성공한다. | | | | | | | | active 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 2-2 | * (+)PREFERRED_HOSTS=host1:host3 | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | * (#)MAX_NUM_DELAYED_HOSTS_LOOKUP=0 | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ê³ *host3* 는 ì ‘ì†ì´ 불가하다. | | | | * db-hostì—는 ì ‘ì†ì„ 시ë„하지 않는다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœì™€ ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ì§€ë§Œ | | | | ì ‘ì†ì´ 가능하므로 ì ‘ì†ì— 성공한다. | | | | | | | | active 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 2-3 | * (#)MAX_NUM_DELAYED_HOSTS_LOOKUP=2 | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | | * DB ìƒíƒœê°€ standby 호스트ì—서 *host2* , | | | | *host4* 까지 ë³µì œ ì§€ì—°ìž„ì„ í™•ì¸í•œ 후, 1ì°¨ ì—°ê²°ì—는 실패한다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœì™€ ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * 가장 ë§ˆì§€ë§‰ì— ì ‘ì†í–ˆë˜ *host4* ê°€ ì ‘ì†ì— 성공한다. | | | | | | | | ë³µì œ 지연 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 3 | * **ACCESS_MODE=SO** | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | * db-host=host1:host2:host3:host4:host5 | * DB ìƒíƒœê°€ standbyì¸ í˜¸ìŠ¤íŠ¸ëŠ” ëª¨ë‘ ë³µì œ 지연 ë˜ëŠ” ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ | | | | 1ì°¨ ì—°ê²°ì—는 실패한다. | | | * MAX_NUM_DELAYED_HOSTS_LOOKUP=-1 | | | | * CONNECT_ORDER=SEQ | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•˜ì§€ë§Œ | | | | ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * 가장 ë§ˆì§€ë§‰ì— ì ‘ì†í–ˆë˜ *host5* ê°€ ì ‘ì†ì— 성공한다. | | | | | | | | ë³µì œ 지연 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 3-1 | * (+)PREFERRED_HOSTS=host1:host3 | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ê³ *host3* 는 ì ‘ì†ì´ 불가하므로 | | | | db-hostì— ì ‘ì†ì„ 시ë„한다. | | | | * DB ìƒíƒœê°€ standbyì¸ í˜¸ìŠ¤íŠ¸ëŠ” ëª¨ë‘ ë³µì œ 지연 ë˜ëŠ” ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ | | | | 1ì°¨ ì—°ê²°ì—는 실패한다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•˜ì§€ë§Œ | | | | ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * PREFERRED_HOSTSì˜ host1ì€ activeì´ê³ *host3* 는 ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ | | | | db-hostì— ì ‘ì†ì„ 시ë„한다. | | | | * DB ìƒíƒœê°€ standbyì¸ ì²«ë²ˆì§¸ 호스트는 *host2* ì´ë¯€ë¡œ *host2* ì— ì—°ê²°í•œë‹¤. | | | | | | | | ë³µì œ 지연 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 3-2 | * PREFERRED_HOSTS=host1:host3 | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | * (#)MAX_NUM_DELAYED_HOSTS_LOOKUP=0 | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ê³ *host3* 는 ì ‘ì†ì´ 불가하다. | | | | * db-hostì—는 ì ‘ì†ì„ 시ë„하지 않는다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•˜ì§€ë§Œ | | | | ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * PREFERRED_HOSTSì˜ *host1* ì€ activeì´ê³ *host3* 는 ì ‘ì† ë¶ˆê°€ì´ë¯€ë¡œ | | | | db-hostì— ì ‘ì†ì„ 시ë„한다. | | | | * DB ìƒíƒœê°€ standbyì¸ ì²«ë²ˆì§¸ 호스트는 *host2* ì´ë¯€ë¡œ *host2* ì— ì—°ê²°í•œë‹¤. | | | | | | | | ë³µì œ 지연 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ | 3-3 | * (#)MAX_NUM_DELAYED_HOSTS_LOOKUP=2 | 1ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•œë‹¤. | | | | | | | | * DB ìƒíƒœê°€ standby 호스트ì—서 *host2* , *host4* 까지 ë³µì œ ì§€ì—°ìž„ì„ í™•ì¸í•œ 후, | | | | 1ì°¨ ì—°ê²°ì—는 실패한다. | | | | | | | | 2ì°¨ ì—°ê²° ì‹œë„ ì‹œ DB ìƒíƒœê°€ standbyì¸ì§€ 확ì¸í•˜ì§€ë§Œ | | | | ë³µì œ 지연 여부는 확ì¸í•˜ì§€ 않는다. | | | | | | | | * 1ì°¨ ì—°ê²°ì—서 가장 ë§ˆì§€ë§‰ì— ë³µì œ 지연 ìƒíƒœë¥¼ 확ì¸í•œ *host4* ì— ì—°ê²°í•œë‹¤. | | | | | | | | ë³µì œ 지연 서버와 ì ‘ì†í–ˆìœ¼ë¯€ë¡œ | | | | RECONNECT_TIME ì‹œê°„ì´ ì§€ë‚˜ë©´ ìž¬ì ‘ì†ì„ 시ë„한다. | +-------+--------------------------------------------+------------------------------------------------------------------------------------------------------+ êµ¬ë™ ë° ëª¨ë‹ˆí„°ë§ ================ .. _cubrid-heartbeat: cubrid heartbeat ìœ í‹¸ë¦¬í‹° ------------------------- **cubrid heartbeat** ëª…ë ¹ì€ ì¤„ì—¬ì„œ **cubrid hb**\ë¡œë„ ì‹¤í–‰í• ìˆ˜ 있다. start ^^^^^ 해당 ë…¸ë“œì˜ CUBRID HA ê¸°ëŠ¥ì„ í™œì„±í™”í•˜ê³ êµ¬ì„± 프로세스(ë°ì´í„°ë² ì´ìФ 서버 프로세스, ë³µì œ 로그 복사 프로세스, ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤)를 ëª¨ë‘ êµ¬ë™í•œë‹¤. **cubrid heartbeat start**\ 를 실행하는 ìˆœì„œì— ë”°ë¼ ë§ˆìŠ¤í„° 노드와 ìŠ¬ë ˆì´ë¸Œ 노드가 ê²°ì •ë˜ë¯€ë¡œ, 순서를 주ì˜í•´ì•¼ 한다. ì‚¬ìš©ë²•ì€ ë‹¤ìŒê³¼ 같다. :: $ cubrid heartbeat start HA 모드로 ì„¤ì •ëœ ë°ì´í„°ë² ì´ìФ 서버 프로세스는 **cubrid server start** ëª…ë ¹ìœ¼ë¡œ ì‹œìž‘í• ìˆ˜ 없다. 노드 ë‚´ì—서 íŠ¹ì • ë°ì´í„°ë² ì´ìŠ¤ì˜ HA 구성 프로세스들(ë°ì´í„°ë² ì´ìФ 서버 프로세스, ë³µì œ 로그 복사 프로세스, ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤)ë§Œ 구ë™í•˜ë ¤ë©´ ëª…ë ¹ì˜ ë§ˆì§€ë§‰ì— ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ì§€ì •í•œë‹¤. 예를 들어, ë°ì´í„°ë² ì´ìФ *testdb*\ ë§Œ 구ë™í•˜ë ¤ë©´ ë‹¤ìŒ ëª…ë ¹ì„ ì‚¬ìš©í•œë‹¤. :: $ cubrid heartbeat start testdb stop ^^^^ 해당 ë…¸ë“œì˜ CUBRID HA ê¸°ëŠ¥ì„ ë¹„í™œì„±í™”í•˜ê³ êµ¬ì„± 프로세스(ë°ì´í„°ë² ì´ìФ 서버 프로세스, ë³µì œ 로그 복사 프로세스, ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤)를 ëª¨ë‘ ì¢…ë£Œí•œë‹¤. ì´ ëª…ë ¹ì„ ì‹¤í–‰í•œ ë…¸ë“œì˜ HA ê¸°ëŠ¥ì€ ì¢…ë£Œë˜ê³ HA êµ¬ì„±ì— ìžˆëŠ” ë‹¤ìŒ ìˆœìœ„ì˜ ìŠ¬ë ˆì´ë¸Œ 노드로 failoverê°€ ì¼ì–´ë‚œë‹¤. ì‚¬ìš©ë²•ì€ ë‹¤ìŒê³¼ 같다. :: $ cubrid heartbeat stop HA 모드로 ì„¤ì •ëœ ë°ì´í„°ë² ì´ìФ 서버 프로세스는 **cubrid server stop** ëª…ë ¹ìœ¼ë¡œ ì •ì§€í• ìˆ˜ 없다. 노드 ë‚´ì—서 íŠ¹ì • ë°ì´í„°ë² ì´ìŠ¤ì˜ HA 구성 프로세스들(ë°ì´í„°ë² ì´ìФ 서버 프로세스, ë³µì œ 로그 복사 프로세스, ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤)ë§Œ ì •ì§€í•˜ë ¤ë©´ ëª…ë ¹ì˜ ë§ˆì§€ë§‰ì— ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ì§€ì •í•œë‹¤. 예를 들어, ë°ì´í„°ë² ì´ìФ *testdb* 를 ì •ì§€í•˜ë ¤ë©´ ë‹¤ìŒ ëª…ë ¹ì„ ì‚¬ìš©í•œë‹¤. :: $ cubrid heartbeat stop testdb CUBRID HA ê¸°ëŠ¥ì„ ì¦‰ê° ë¹„í™œì„±í™”í•˜ë ¤ë©´ "cubrid heartbeat stop" ëª…ë ¹ì— -i ì˜µì…˜ì„ ì¶”ê°€í•œë‹¤. ì´ ì˜µì…˜ì€ DB 서버 프로세스가 ë¹„ì •ìƒì ì¸ ë™ìž‘ì„ ìˆ˜í–‰í•˜ê³ ìžˆì–´ ë¹ ë¥¸ ì ˆì²´ê°€ 필요한 경우 사용한다. :: $ cubrid heartbeat stop -i or $cubrid heartbeat stop --immediately copylogdb ^^^^^^^^^ CUBRID HA 구성ì—서 íŠ¹ì • peer_nodeì˜ db_nameì— ëŒ€í•œ 트랜ìžì…˜ 로그를 복사하는 **copylogdb** 프로세스를 시작 ë˜ëŠ” ì •ì§€í•œë‹¤. ìš´ì˜ ë„중 ë³µì œ ìž¬êµ¬ì¶•ì„ ìœ„í•´ 로그 복사를 ì¼ì‹œ ì •ì§€í–ˆë‹¤ê°€ 재구ë™í•˜ê³ ì‹¶ì€ ê²½ìš° ì‚¬ìš©í• ìˆ˜ 있다. **cubrid heartbeat copylogdb start** ëª…ë ¹ë§Œ 성공한 경우ì—ë„ ë…¸ë“œ ê°„ ìž¥ì• ê°ì§€ ë° ë³µêµ¬ ê¸°ëŠ¥ì´ ìˆ˜í–‰ë˜ë©°, failoverì˜ ëŒ€ìƒì´ ë˜ì–´ ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì¸ ê²½ìš° 마스터 노드로 ì—í• ì´ ë³€ê²½ë 수 있다. ì‚¬ìš©ë²•ì€ ë‹¤ìŒê³¼ 같다. :: $ cubrid heartbeat copylogdb <start|stop> [ -h <host-name> ] db_name peer_node * <host-name> : copylogdb ëª…ë ¹ì´ ìˆ˜í–‰ë ì›ê²© 호스트명 ëª…ë ¹ì„ ìˆ˜í–‰í•˜ëŠ” 노드가 *nodeB* ì´ê³ , *peer_node* ê°€ *nodeA* ë¼ë©´, 다ìŒê³¼ ê°™ì´ ëª…ë ¹ì„ ìˆ˜í–‰í• ìˆ˜ 있다. :: [nodeB]$ cubrid heartbeat copylogdb stop testdb nodeA [nodeB]$ cubrid heartbeat copylogdb start testdb nodeA **copylogdb** í”„ë¡œì„¸ìŠ¤ì˜ ì‹œìž‘/ì •ì§€ 시 **cubrid_ha.conf** ì˜ ì„¤ì • ì •ë³´ë¥¼ 사용하므로 한 번 ì •í•œ ì„¤ì •ì€ ê°€ê¸‰ì 바꾸지 ì•Šì„ ê²ƒì„ ê¶Œìž¥í•˜ë©°, 바꾸어야만 하는 경우 노드 ì „ì²´ë¥¼ 재구ë™í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. applylogdb ^^^^^^^^^^ CUBRID HA 구성ì—서 íŠ¹ì • peer_nodeì˜ db_nameì— ëŒ€í•œ 트랜ìžì…˜ 로그를 ë°˜ì˜í•˜ëŠ” **applylogdb** 프로세스를 시작 ë˜ëŠ” ì •ì§€í•œë‹¤. ìš´ì˜ ë„중 ë³µì œ ìž¬êµ¬ì¶•ì„ ìœ„í•´ 로그 ë°˜ì˜ì„ ì¼ì‹œ ì •ì§€í–ˆë‹¤ê°€ 재구ë™í•˜ê³ ì‹¶ì€ ê²½ìš° ì‚¬ìš©í• ìˆ˜ 있다. **cubrid heartbeat applylogdb start** ëª…ë ¹ë§Œ 성공한 경우ì—ë„ ë…¸ë“œ ê°„ ìž¥ì• ê°ì§€ ë° ë³µêµ¬ ê¸°ëŠ¥ì´ ìˆ˜í–‰ë˜ë©°, failoverì˜ ëŒ€ìƒì´ ë˜ì–´ ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì¸ ê²½ìš° 마스터 노드로 ì—í• ì´ ë³€ê²½ë 수 있다. ì‚¬ìš©ë²•ì€ ë‹¤ìŒê³¼ 같다. :: $ cubrid heartbeat applylogdb <start|stop> [ -h <host-name> ] db_name peer_node * <host-name>: appplylogdb ëª…ë ¹ì´ ìˆ˜í–‰ë ì›ê²© 호스트명 ëª…ë ¹ì„ ìˆ˜í–‰í•˜ëŠ” 노드가 *nodeB*\ ì´ê³ , peer_nodeê°€ *nodeA*\ ë¼ë©´, 다ìŒê³¼ ê°™ì´ ëª…ë ¹ì„ ìˆ˜í–‰í• ìˆ˜ 있다. :: [nodeB]$ cubrid heartbeat applylogdb stop testdb nodeA [nodeB]$ cubrid heartbeat applylogdb start testdb nodeA **applylogdb** í”„ë¡œì„¸ìŠ¤ì˜ ì‹œìž‘/ì •ì§€ 시 **cubrid_ha.conf** ì˜ ì„¤ì • ì •ë³´ë¥¼ 사용하므로 한 번 ì •í•œ ì„¤ì •ì€ ê°€ê¸‰ì 바꾸지 ì•Šì„ ê²ƒì„ ê¶Œìž¥í•˜ë©°, 바꾸어야만 하는 경우 노드 ì „ì²´ë¥¼ 재구ë™í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. reload ^^^^^^ **cubrid_ha.conf**\ ì—서 CUBRID HA 구성 ì •ë³´ë¥¼ 다시 ì½ëŠ”ë‹¤. 노드를 추가하거나 ì‚ì œí•˜ëŠ” 경우 사용하며, **reload** ëª…ë ¹ ì´í›„ì— ì¶”ê°€/ì‚ì œëœ ë…¸ë“œì˜ HA ë³µì œ 프로세스를 ì¼ê´„ì 으로 구ë™/ì •ì§€í•˜ë ¤ë©´ "**cubrid heartbeat replication start/stop**" ëª…ë ¹ì„ ì‚¬ìš©í• ìˆ˜ 있다. ì‚¬ìš©ë²•ì€ ë‹¤ìŒê³¼ 같다. :: $ cubrid heartbeat reload ë³€ê²½í• ìˆ˜ 있는 구성 ì •ë³´ëŠ” **ha_node_list**\ 와 **ha_replica_list**\ ì´ë‹¤. **reload** ëª…ë ¹ì´ ì‹¤í–‰ëœ í›„ **status** ëª…ë ¹ìœ¼ë¡œ ë…¸ë“œì˜ ìž¬êµ¬ì„±ì´ ìž˜ ë°˜ì˜ë˜ì—ˆëŠ”ì§€ 확ì¸í•œë‹¤. ìž¬êµ¬ì„±ì— ì‹¤íŒ¨í•œ 경우 ì›ì¸ì„ 찾아 해소하ë„ë¡ í•œë‹¤. replication(ë˜ëŠ” repl) start ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ íŠ¹ì • 노드와 ê´€ë ¨ëœ HA 프로세스(copylogdb/applylogdb)를 ì¼ê´„ 구ë™í•˜ê¸° 위한 ëª…ë ¹ìœ¼ë¡œ, ì¼ë°˜ì 으로 **cubrid heartbeat reload** ì´í›„ ì¶”ê°€ëœ ë…¸ë“œì˜ HA ë³µì œ í”„ë¡œì„¸ìŠ¤ë“¤ì„ ì¼ê´„ì 으로 시작하기 위해 실행한다. **replication** ëª…ë ¹ì€ ì¤„ì—¬ì„œ **repl**\ë¡œë„ ì‚¬ìš©í• ìˆ˜ 있다. :: cubrid heartbeat repl start <node_name> * *node_name*: cubrid_ha.confì˜ **ha_node_list**\ì— ëª…ì‹œëœ ë…¸ë“œ ì´ë¦„ 중 하나 replication(ë˜ëŠ” repl) stop ^^^^^^^^^^^^^^^^^^^^^^^^^^^ íŠ¹ì • 노드와 ê´€ë ¨ëœ HA 프로세스(copylogdb/applylogdb)를 ì¼ê´„ ì •ì§€í•˜ê¸° 위한 ëª…ë ¹ìœ¼ë¡œ,ì¼ë°˜ì 으로 **cubrid heartbeat reload** ì´í›„ ì‚ì œëœ ë…¸ë“œì˜ HA ë³µì œ í”„ë¡œì„¸ìŠ¤ë“¤ì„ ì¼ê´„ì 으로 ì •ì§€í•˜ê¸° 위해 실행한다. **replication** ëª…ë ¹ì€ ì¤„ì—¬ì„œ **repl**\ë¡œë„ ì‚¬ìš©í• ìˆ˜ 있다. :: cubrid heartbeat repl stop <node_name> * *node_name*: cubrid_ha.confì˜ **ha_node_list**\ì— ëª…ì‹œëœ ë…¸ë“œ ì´ë¦„ 중 하나 status ^^^^^^ :: $ cubrid heartbeat status [-v] [ -h <host-name> ] * <host-name>: status ëª…ë ¹ì´ ìˆ˜í–‰ë ì›ê²© 호스트명 CUBRID HA 그룹 ì •ë³´ì™€ CUBRID HA 구성 ìš”ì†Œì˜ ì •ë³´ë¥¼ 확ì¸í• 수 있다. ì‚¬ìš©ë²•ì€ ë‹¤ìŒê³¼ 같다. :: $ cubrid heartbeat status @ cubrid heartbeat status HA-Node Info (current nodeB, state slave) Node nodeB (priority 2, state slave) Node nodeA (priority 1, state master) HA-Process Info (master 2143, state slave) Applylogdb testdb@localhost:/home/cubrid/DB/testdb_nodeA (pid 2510, state registered) Copylogdb testdb@nodeA:/home/cubrid/DB/testdb_nodeA (pid 2505, state registered) Server testdb (pid 2393, state registered_and_standby) .. note:: CUBRID 9.0 미만 ë²„ì „ì—서 사용ë˜ì—ˆë˜ **act**, **deact**, **deregister** ëª…ë ¹ì€ ë” ì´ìƒ 사용ë˜ì§€ 않는다. .. _cubrid-service-util: cubrid serviceì— HA ë“±ë¡ ------------------------ CUBRID ì„œë¹„ìŠ¤ì— heartbeat를 등ë¡í•˜ë©´ **cubrid service** ìœ í‹¸ë¦¬í‹°ë¥¼ 사용하여 한 ë²ˆì— ê´€ë ¨ëœ í”„ë¡œì„¸ìŠ¤ë“¤ì„ ëª¨ë‘ êµ¬ë™/ì •ì§€í•˜ê±°ë‚˜ ìƒíƒœë¥¼ 알아볼 수 있어 편리하다. CUBRID 서비스 등ë¡ì€ **cubrid.conf** 파ì¼ì˜ [**service**] ì„¹ì…˜ì— ìžˆëŠ” **service** 파ë¼ë¯¸í„°ì— ì„¤ì •í• ìˆ˜ 있다. ì´ íŒŒë¼ë¯¸í„°ì— **heartbeat** 를 í¬í•¨í•˜ë©´ **cubrid service start** / **stop** ëª…ë ¹ì„ ì‚¬ìš©í•˜ì—¬ ì„œë¹„ìŠ¤ì˜ í”„ë¡œì„¸ìŠ¤ ë° HA ê´€ë ¨ 프로세스를 ëª¨ë‘ í•œ ë²ˆì— êµ¬ë™/ì¤‘ì§€í• ìˆ˜ 있다. 다ìŒì€ **cubrid.conf** 파ì¼ì„ ì„¤ì •í•˜ëŠ” 예ì´ë‹¤. :: # cubrid.conf ... [service] ... service=broker,heartbeat ... [common] ... ha_mode=on .. _cubrid-applyinfo: applyinfo --------- CUBRID HAì˜ ë³µì œ 로그 복사 ë° ë°˜ì˜ ìƒíƒœë¥¼ 확ì¸í•œë‹¤. :: cubrid applyinfo [options] <database-name> * *database-name* : 확ì¸í•˜ë ¤ëŠ” ì„œë²„ì˜ ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ëª…ì‹œí•œë‹¤. 노드 ì´ë¦„ì€ ìž…ë ¥í•˜ì§€ 않는다. **cubrid applyinfo**\ì—서 사용하는 [options]는 다ìŒê³¼ 같다. .. program:: applyinfo .. option:: -r, --remote-host-name=HOSTNAME 트랜ìžì…˜ 로그를 복사하는 ëŒ€ìƒ ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ì„¤ì •í•œë‹¤. ì´ ì˜µì…˜ì„ ì„¤ì •í•˜ë©´ ëŒ€ìƒ ë…¸ë“œì˜ ì•¡í‹°ë¸Œ 로그 ì •ë³´(Active Info.)를 ì¶œë ¥í•œë‹¤. .. option:: -a, --applied-info cubrid applyinfo를 수행한 노드(localhost)ì˜ ë³µì œ ë°˜ì˜ ì •ë³´(Applied Info.)를 ì¶œë ¥í•œë‹¤. ì´ ì˜µì…˜ì„ ì‚¬ìš©í•˜ê¸° 위해서는 반드시 **-L** ì˜µì…˜ì´ í•„ìš”í•˜ë‹¤. .. option:: -L, --copied-log-path=PATH ìƒëŒ€ ë…¸ë“œì˜ íŠ¸ëžœìžì…˜ 로그를 복사해 온 위치를 ì„¤ì •í•œë‹¤. ì´ ì˜µì…˜ì´ ì„¤ì •ëœ ê²½ìš° ìƒëŒ€ 노드ì—서 복사해 온 트랜ìžì…˜ ë¡œê·¸ì˜ ì •ë³´(Copied Active Info.)를 ì¶œë ¥í•œë‹¤. .. option:: -p, --pageid=ID **-L** ì˜µì…˜ì„ ì„¤ì •í•œ 경우 ì„¤ì • 가능하며, 복사해 온 ë¡œê·¸ì˜ íŠ¹ì • 페ì´ì§€ ì •ë³´ë¥¼ ì¶œë ¥í•œë‹¤. ê¸°ë³¸ê°’ì€ 0으로, 활성 페ì´ì§€(active page)를 ì˜ë¯¸í•œë‹¤. .. option:: -v ë” ìžì„¸í•œ ë‚´ìš©ì„ ì¶œë ¥í•œë‹¤. .. option:: -i, --interval=SECOND 트랜ìžì…˜ 로그 복사 ë˜ëŠ” ë°˜ì˜ ìƒíƒœ ì •ë³´ë¥¼ ì§€ì •í•œ 초마다 주기ì 으로 ì¶œë ¥í•œë‹¤. ë³µì œê°€ 지연ë˜ëŠ” ìƒíƒœë¥¼ 확ì¸í•˜ë ¤ë©´ ì´ ì˜µì…˜ì„ ë°˜ë“œì‹œ ì§€ì •í•´ì•¼ 한다 **예시** 다ìŒì€ ìŠ¬ë ˆì´ë¸Œ 노드ì—서 **applyinfo** 를 실행하여 마스터 ë…¸ë“œì˜ íŠ¸ëžœìžì…˜ 로그 ì •ë³´(Active Info.), ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë¡œê·¸ 복사 ìƒíƒœ ì •ë³´(Copied Active Info.)와 로그 ë°˜ì˜ ìƒíƒœ ì •ë³´(Applied Info.)를 확ì¸í•˜ëŠ” 예ì´ë‹¤. * Applied Info. : ìŠ¬ë ˆì´ë¸Œ 노드가 ë³µì œ 로그를 ë°˜ì˜í•œ ìƒíƒœ ì •ë³´ë¥¼ 나타낸다. * Copied Active Info. : ìŠ¬ë ˆì´ë¸Œ 노드가 ë³µì œ 로그를 복사한 ìƒíƒœ ì •ë³´ë¥¼ 나타낸다. * Active Info. : 마스터 노드가 트랜ìžì…˜ 로그를 기ë¡í•œ ìƒíƒœ ì •ë³´ë¥¼ 나타낸다. * Delay in Copying Active Log: 트랜ìžì…˜ 로그 복사 지연 ìƒíƒœë¥¼ 나타낸다. * Delay in Applying Copied Log: 트랜ìžì…˜ 로그 ë°˜ì˜ ì§€ì—° ìƒíƒœë¥¼ 나타낸다. :: [nodeB] $ cubrid applyinfo -L /home/cubrid/DB/testdb_nodeA -r nodeA -a -i 3 testdb *** Applied Info. *** Insert count : 289492 Update count : 71192 Delete count : 280312 Schema count : 20 Commit count : 124917 Fail count : 0 *** Copied Active Info. *** DB name : testdb DB creation time : 04:29:00.000 PM 11/04/2012 (1352014140) EOF LSA : 27722 | 10088 Append LSA : 27722 | 10088 HA server state : active *** Active Info. *** DB name : testdb DB creation time : 04:29:00.000 PM 11/04/2012 (1352014140) EOF LSA : 27726 | 2512 Append LSA : 27726 | 2512 HA server state : active *** Delay in Copying Active Log *** Delayed log page count : 4 Estimated Delay : 0 second(s) *** Delay in Applying Copied Log *** Delayed log page count : 1459 Estimated Delay : 22 second(s) ê° ìƒíƒœ ì •ë³´ê°€ 나타내는 í•ëª©ì„ ì‚´íŽ´ë³´ë©´ 다ìŒê³¼ 같다. * Applied Info. * Committed page : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ 마지막으로 ë°˜ì˜ëœ 트랜ìžì…˜ì˜ ì»¤ë°‹ëœ pageid와 offset ì •ë³´. ì´ ê°’ê³¼ "Copied Active Info."ì˜ EOF LSA ê°’ì˜ ì°¨ì´ë§Œí¼ ë³µì œ ë°˜ì˜ì˜ ì§€ì—°ì´ ìžˆë‹¤. * Insert Count : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ë°˜ì˜í•œ Insert ì¿¼ë¦¬ì˜ ê°œìˆ˜ * Update Count : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ë°˜ì˜í•œ Update ì¿¼ë¦¬ì˜ ê°œìˆ˜ * Delete Count : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ë°˜ì˜í•œ Delete ì¿¼ë¦¬ì˜ ê°œìˆ˜ * Schema Count : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ë°˜ì˜í•œ DDL ë¬¸ì˜ ê°œìˆ˜ * Commit Count : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ë°˜ì˜í•œ 트랜ìžì…˜ì˜ 개수 * Fail Count : ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ ë°˜ì˜ì— 실패한 DML ë° DDL ë¬¸ì˜ ê°œìˆ˜ * Copied Active Info. * DB name : ë³µì œ 로그 복사 프로세스가 로그를 복사하는 ëŒ€ìƒ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì´ë¦„ * DB creation time : ë³µì œ 로그 복사 프로세스가 복사하는 ë°ì´í„°ë² ì´ìŠ¤ì˜ ìƒì„± 시간 * EOF LSA : ë³µì œ 로그 복사 프로세스가 ëŒ€ìƒ ë…¸ë“œì—서 복사한 ë¡œê·¸ì˜ ë§ˆì§€ë§‰ pageid와 offset ì •ë³´. ì´ ê°’ê³¼ "Active Info."ì˜ EOF LSA ê°’ì˜ ì°¨ì´ ë° "Copied Active Info."ì˜ Append LSA ê°’ì˜ ì°¨ì´ë§Œí¼ 로그 ë³µì‚¬ì˜ ì§€ì—°ì´ ìžˆë‹¤. * Append LSA : ë³µì œ 로그 복사 프로세스가 디스í¬ì— ì‹¤ì œë¡œ ì“´ ë¡œê·¸ì˜ ë§ˆì§€ë§‰ pageid와 offset ì •ë³´. ì´ëŠ” EOF LSA보다 작거나 ê°™ì„ ìˆ˜ 있다. ì´ ê°’ê³¼ "Copied Active Info"ì˜ EOF LSA ê°’ì˜ ì°¨ì´ë§Œí¼ 로그 ë³µì‚¬ì˜ ì§€ì—°ì´ ìžˆë‹¤. * HA server state : ë³µì œ 로그 복사 프로세스가 로그를 받아오는 ë°ì´í„°ë² ì´ìФ 서버 í”„ë¡œì„¸ìŠ¤ì˜ ìƒíƒœ. ìƒíƒœì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :ref:`ha-server` 를 ì°¸ê³ í•˜ë„ë¡ í•œë‹¤. * Active Info. * DB name : **-r** ì˜µì…˜ì— ì„¤ì •í•œ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìŠ¤ì˜ ì´ë¦„ * DB creation time : **-r** ì˜µì…˜ì— ì„¤ì •í•œ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìФ ìƒì„± 시간 * EOF LSA : **-r** ì˜µì…˜ì— ì„¤ì •í•œ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìФ 트랜ìžì…˜ ë¡œê·¸ì˜ ë§ˆì§€ë§‰ pageid와 offset ì •ë³´. ì´ ê°’ê³¼ "Copied Active Info."ì˜ EOF LSA ê°’ì˜ ì°¨ì´ë§Œí¼ ë³µì œ 로그 ë³µì‚¬ì˜ ì§€ì—°ì´ ìžˆë‹¤. * Append LSA : **-r** ì˜µì…˜ì— ì„¤ì •í•œ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìФ 서버가 디스í¬ì— ì‹¤ì œë¡œ ì“´ 트랜ìžì…˜ ë¡œê·¸ì˜ ë§ˆì§€ë§‰ pageid와 offset ì •ë³´ * HA server state : **-r** ì˜µì…˜ì— ì„¤ì •í•œ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìФ 서버 ìƒíƒœ * Delay in Copying Active Log * Delayed log page count: 복사가 ì§€ì—°ëœ íŠ¸ëžœìžì…˜ 로그 페ì´ì§€ 개수 * Estimated Delay: 트랜ìžì…˜ 로그 복사 ì˜ˆìƒ ì™„ë£Œ 시간 * Delay in Applying Copied Log * Delayed log page count: ë°˜ì˜ì´ ì§€ì—°ëœ íŠ¸ëžœìžì…˜ 로그 페ì´ì§€ 개수 * Estimated Delay: 트랜ìžì…˜ 로그 ë°˜ì˜ ì˜ˆìƒ ì™„ë£Œ 시간 ë ˆí”Œë¦¬ì¹´ 노드ì—서 해당 ëª…ë ¹ì„ ì‹¤í–‰í• ë•Œ cubrid_ha.confì— "ha_replica_delay=30s"ê°€ ì„¤ì •ë˜ì–´ 있으면 다ìŒì˜ ì •ë³´ê°€ 추가로 ì¶œë ¥ëœë‹¤. :: *** Replica-specific Info. *** Deliberate lag : 30 second(s) Last applied log record time : 2013-06-20 11:20:10 ê° ìƒíƒœ ì •ë³´ê°€ 나타내는 í•ëª©ì„ ì‚´íŽ´ë³´ë©´ 다ìŒê³¼ 같다. * Replica-specific Info. * Deliberate lag: ha_replica_delay 파ë¼ë¯¸í„°ì— ì˜í•´ 사용ìžê°€ ì„¤ì •í•œ 지연 시간 * Last applied log record time: ë ˆí”Œë¦¬ì¹´ 노드ì—서 최근 ë°˜ì˜ëœ ë³µì œ 로그가 마스터 노드ì—서 ì‹¤ì œë¡œ ë°˜ì˜ë˜ì—ˆë˜ 시간 ë ˆí”Œë¦¬ì¹´ 노드ì—서 해당 ëª…ë ¹ì„ ì‹¤í–‰í• ë•Œ cubrid_ha.confì— "ha_replica_delay=30s", "ha_replica_time_bound=2013-06-20 11:31:00"ì´ ì„¤ì •ë˜ì–´ 있으면 ha_replica_delay ì„¤ì •ì€ ë¬´ì‹œë˜ë©° 다ìŒì˜ ì •ë³´ê°€ 추가로 ì¶œë ¥ëœë‹¤. :: *** Replica-specific Info. *** Last applied log record time : 2013-06-20 11:25:17 Will apply log records up to : 2013-06-20 11:31:00 ê° ìƒíƒœ ì •ë³´ê°€ 나타내는 í•ëª©ì„ ì‚´íŽ´ë³´ë©´ 다ìŒê³¼ 같다. * Replica-specific Info. * Last applied log record time: ë ˆí”Œë¦¬ì¹´ 노드ì—서 최근 ë°˜ì˜í•œ ë³µì œ 로그가 마스터 노드ì—서 ë°˜ì˜ëœ 시간 * Will apply log records up to: 해당 시간까지 마스터 노드ì—서 ë°˜ì˜ëœ ë³µì œ 로그를 ë ˆí”Œë¦¬ì¹´ ë…¸ë“œì— ë°˜ì˜ ha_replica_time_bound ì‹œê°„ì´ ë˜ì–´ applylogdbê°€ ë³µì œ ë°˜ì˜ì„ ì™„ì „ížˆ 멈춘 경우 **$CUBRID/log/**\ *db-name*\ **@**\ *local-node-name*\ **_applylogdb_**\ *db-name*\ **_**\ *remote-node-name*\ **.err** \ì— ì¶œë ¥ë˜ëŠ” ì—러 메시지는 다ìŒê³¼ 같다. :: Time: 06/20/13 11:51:05.549 - ERROR *** file ../../src/transaction/log_applier.c, line 7913 ERROR CODE = -1040 Tran = 1, EID = 3 HA generic: applylogdb paused since it reached a log record committed on master at 2013-06-20 11:31:00 or later. Adjust or remove ha_replica_time_bound and restart applylogdb to resume. .. _cubrid-changemode: cubrid changemode ----------------- CUBRID HAì˜ ì„œë²„ ìƒíƒœë¥¼ 확ì¸í•˜ê³ 변경한다. :: cubrid changemode [options] <database-name@node-name> * *database-name@node-name*\: í™•ì¸ ë˜ëŠ” ë³€ê²½í•˜ê³ ìž í•˜ëŠ” ì„œë²„ì˜ ì´ë¦„ì„ ëª…ì‹œí•˜ê³ @으로 구분하여 노드 ì´ë¦„ì„ ëª…ì‹œí•œë‹¤. [options]를 ìƒëžµí•˜ë©´ 확ì¸í•˜ê³ ìž í•˜ëŠ” 서버 ìƒíƒœê°€ ì¶œë ¥ëœë‹¤. **cubrid changemode**\ì—서 사용하는 [options]는 다ìŒê³¼ 같다. .. program:: changemode .. option:: -m, --mode=MODE 서버 ìƒíƒœë¥¼ 변경한다. 옵션 값으로 **standby**, **maintenance**, **active** 중 하나를 ìž…ë ¥í• ìˆ˜ 있다. * ì„œë²„ì˜ ìƒíƒœê°€ **standby**\ì´ë©´ **maintenance**\로 ë³€ê²½í• ìˆ˜ 있다. * ì„œë²„ì˜ ìƒíƒœê°€ **maintenance**\ì´ë©´ **standby**\로 ë³€ê²½í• ìˆ˜ 있다. * ì„œë²„ì˜ ìƒíƒœê°€ **to-be-active**\ì´ë©´ **active**\로 ë³€ê²½í• ìˆ˜ 있다. 단, **\-\-force** 옵션과 함께 사용해야 한다. 아래 **\-\-force** ì˜µì…˜ì˜ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. .. option:: -f, --force ì„œë²„ì˜ ìƒíƒœë¥¼ ê°•ì œë¡œ ë³€ê²½í• ì§€ 여부를 ì„¤ì •í•œë‹¤. 현재 서버가 to-be-active ìƒíƒœì¼ 때 active ìƒíƒœë¡œ ê°•ì œ ë³€ê²½í•˜ë ¤ê³ í•˜ëŠ” 경우ì—는 반드시 사용하며, ì´ë¥¼ ì„¤ì •í•˜ì§€ 않으면 active ìƒíƒœë¡œ 변경ë˜ì§€ 않는다. ê°•ì œ 변경 시 ë³µì œ 노드 ê°„ ë°ì´í„° 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있으므로 사용하지 않는 ê²ƒì„ ê¶Œìž¥í•œë‹¤. .. option:: -t, --timeout=SECOND 기본값 5(ì´ˆ). 노드 ìƒíƒœë¥¼ **standby**\ì—서 **maintenance**\로 ë³€ê²½í• ë•Œ ì§„í–‰ 중ì´ë˜ 트랜ìžì…˜ì´ ì •ìƒ ì¢…ë£Œë˜ê¸°ê¹Œì§€ 대기하는 ì‹œê°„ì„ ì„¤ì •í•œë‹¤. ì„¤ì •í•œ ì‹œê°„ì´ ì§€ë‚˜ë„ íŠ¸ëžœìžì…˜ì´ ì§„í–‰ 중ì´ë©´ ê°•ì œ 종료 후 **maintenance** ìƒíƒœë¡œ ë³€ê²½í•˜ê³ , ì„¤ì •í•œ 시간 ì´ë‚´ì— ëª¨ë“ íŠ¸ëžœìžì…˜ì´ ì •ìƒ ì¢…ë£Œë˜ë©´ 즉시 **maintenance** ìƒíƒœë¡œ 변경한다. **ìƒíƒœ 변경 가능 표** 다ìŒì€ 현재 ìƒíƒœì— ë”°ë¼ ë³€ê²½í• ìˆ˜ 있는 ìƒíƒœë¥¼ 표시한 표ì´ë‹¤. +------------------------------------+-----------------------------------------------+ | | **ë³€ê²½í• ìƒíƒœ** | | +---------------+---------------+---------------+ | | active | standby | maintenance | +--------------------+---------------+---------------+---------------+---------------+ | **현재 ìƒíƒœ** | standby | X | O | O | | +---------------+---------------+---------------+---------------+ | | to-be-standby | X | X | X | | +---------------+---------------+---------------+---------------+ | | active | O | X | X | | +---------------+---------------+---------------+---------------+ | | to-be-active | O* | X | X | | +---------------+---------------+---------------+---------------+ | | maintenance | X | O | O | +--------------------+---------------+---------------+---------------+---------------+ \* 서버가 to-be-active ìƒíƒœì¼ 때 active ìƒíƒœë¡œ ê°•ì œ 변경하면 ë³µì œ 노드 ê°„ 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있으므로 ê´€ë ¨ ë‚´ìš©ì„ ì¶©ë¶„ížˆ 숙지한 사용ìžê°€ 아니ë¼ë©´ 사용하지 않는 ê²ƒì„ ê¶Œìž¥í•œë‹¤. **예시** ë‹¤ìŒ ì˜ˆëŠ” localhost ë…¸ë“œì˜ *testdb* 서버 ìƒíƒœë¥¼ maintenance ìƒíƒœë¡œ 변경한다. ì´ë•Œ ì§„í–‰ 중ì´ë˜ ëª¨ë“ íŠ¸ëžœìžì…˜ì´ ì •ìƒ ì¢…ë£Œí•˜ê¸°ê¹Œì§€ 대기하는 ì‹œê°„ì€ -t ì˜µì…˜ì˜ ê¸°ë³¸ê°’ì¸ 5ì´ˆì´ë‹¤. ì´ ì‹œê°„ ì´ë‚´ì— ëª¨ë“ íŠ¸ëžœìžì…˜ì´ 종료ë˜ë©´ 즉시 ìƒíƒœë¥¼ 변경하며, ì´ ì‹œê°„ì´ ì§€ë‚˜ë„ ì§„í–‰ ì¤‘ì¸ íŠ¸ëžœìžì…˜ì´ 존재하면 ì´ë¥¼ 롤백한 후 ìƒíƒœë¥¼ 변경한다. :: $ cubrid changemode -m maintenance testdb@localhost The server 'testdb@localhost''s current HA running mode is maintenance. ë‹¤ìŒ ì˜ˆëŠ” localhost ë…¸ë“œì˜ *testdb* ì„œë²„ì˜ ìƒíƒœë¥¼ 조회한다. :: $ cubrid changemode testdb@localhost The server 'testdb@localhost''s current HA running mode is active. CUBRID ë§¤ë‹ˆì € HA ëª¨ë‹ˆí„°ë§ ------------------------- CUBRID ë§¤ë‹ˆì €ëŠ” CUBRID ë°ì´í„°ë² ì´ìФ 관리 ë° ì§ˆì˜ ê¸°ëŠ¥ì„ GUI 환경ì—서 ì œê³µí•˜ëŠ” CUBRID ë°ì´í„°ë² ì´ìФ ì „ìš© 관리 ë„구ì´ë‹¤. CUBRID ë§¤ë‹ˆì €ëŠ” CUBRID HA ê·¸ë£¹ì— ëŒ€í•œ 관계ë„와 서버 ìƒíƒœë¥¼ 확ì¸í• 수 있는 HA 대시보드를 ì œê³µí•œë‹¤. ìžì„¸í•œ ì„¤ëª…ì€ CUBRID ë§¤ë‹ˆì € ë§¤ë‰´ì–¼ì„ ì°¸ê³ í•œë‹¤. HA 구성 형태 ============ CUBRID HA 구성ì—는 HA 기본 구성, 다중 ìŠ¬ë ˆì´ë¸Œ 노드 구성, 부하 ë¶„ì‚° 구성, 다중 ìŠ¤íƒ ë°”ì´ ì„œë²„ êµ¬ì„±ì˜ ë„¤ 가지 형태가 있다. ë‹¤ìŒ í‘œì—서 Mì€ ë§ˆìŠ¤í„° 노드, S는 ìŠ¬ë ˆì´ë¸Œ 노드, Rì€ ë ˆí”Œë¦¬ì¹´ 노드를 ì˜ë¯¸í•œë‹¤. +-----------------------------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------+ | 구성 | 노드 구성(M:S:R) | 특징 | +===================================+========================+=======================================================================================================================================+ | HA 기본 구성 | 1:1:0 | CUBRID HAì˜ ê°€ìž¥ 기본ì ì¸ êµ¬ì„±ìœ¼ë¡œ, í•˜ë‚˜ì˜ ë§ˆìŠ¤í„° 노드와 í•˜ë‚˜ì˜ ìŠ¬ë ˆì´ë¸Œ 노드로 구성ë˜ì–´ CUBRID HA ê³ ìœ ì˜ ê¸°ëŠ¥ì¸ | | | | ê°€ìš©ì„±ì„ ì œê³µí•œë‹¤. | +-----------------------------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------+ | 다중 ìŠ¬ë ˆì´ë¸Œ 노드 구성 | 1:N:0 | ìŠ¬ë ˆì´ë¸Œ 노드를 여러 ê°œ ë‘ì–´ ê°€ìš©ì„±ì„ ë†’ì¸ êµ¬ì„±ì´ë‹¤. 단, 다중 ìž¥ì• ìƒí™©ì—서 CUBRID HA 그룹 ë‚´ì˜ ë°ì´í„°ê°€ | | | | ë™ì¼í•˜ì§€ ì•Šì€ ìƒí™©ì´ ë°œìƒí• 수 있으므로 주ì˜í•´ì•¼ 한다. | +-----------------------------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------+ | 부하 ë¶„ì‚° 구성 | 1:1:N | HA 기본 êµ¬ì„±ì— ë ˆí”Œë¦¬ì¹´ 노드를 여러 ê°œ 둔다. ì½ê¸° ì„œë¹„ìŠ¤ì˜ ë¶€í•˜ë¥¼ ë¶„ì‚°í• ìˆ˜ 있으며, 다중 ìŠ¬ë ˆì´ë¸Œ 노드 êµ¬ì„±ì— ë¹„í•´ | | 구성 | | HA로 ì¸í•œ ë¶€ë‹´ì´ ì 다. ë ˆí”Œë¦¬ì¹´ 노드는 failoverë˜ì§€ 않으므로 주ì˜í•´ì•¼ 한다. | +-----------------------------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------+ | 다중 ìŠ¤íƒ ë°”ì´ | 1:1:0 | HA 기본 구성과 노드 êµ¬ì„±ì€ ê°™ìœ¼ë‚˜ 여러 ì„œë¹„ìŠ¤ì˜ ìŠ¬ë ˆì´ë¸Œ 노드가 í•˜ë‚˜ì˜ ë¬¼ë¦¬ì ì¸ ì„œë²„ì— ì„¤ì¹˜ë˜ì–´ 서비스ëœë‹¤. | +-----------------------------------+------------------------+---------------------------------------------------------------------------------------------------------------------------------------+ ì•„ëž˜ì˜ ì„¤ëª…ì—서 ê° ë…¸ë“œì˜ testdb ë°ì´í„°ë² ì´ìФì—는 ë°ì´í„°ê°€ ì—†ë‹¤ê³ ê°€ì •í•œë‹¤. ì´ë¯¸ ë°ì´í„°ê°€ 존재하는 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ë³µì œí•˜ì—¬ HA를 구성하기 위해서는 :ref:`building-replication` ë˜ëŠ” :ref:`rebuilding-replication`\ 를 ì°¸ê³ í•œë‹¤. HA 기본 구성 ------------ CUBRID HAì˜ ê°€ìž¥ 기본ì ì¸ êµ¬ì„±ìœ¼ë¡œ, í•˜ë‚˜ì˜ ë§ˆìŠ¤í„° 노드와 í•˜ë‚˜ì˜ ìŠ¬ë ˆì´ë¸Œ 노드로 구성ëœë‹¤. CUBRID HA ê³ ìœ ì˜ ê¸°ëŠ¥ì¸ ìž¥ì• ì‹œ 무중단(nonstop) 서비스 ê¸°ëŠ¥ì— ì´ˆì ì„ ë§žì¶˜ 구성으로, ìž‘ì€ ì„œë¹„ìŠ¤ì—서 ì ì€ ë¦¬ì†ŒìŠ¤ë¥¼ 투입하여 êµ¬ì„±í• ìˆ˜ 있다. HA 기본 êµ¬ì„±ì€ í•˜ë‚˜ì˜ ë§ˆìŠ¤í„° 노드와 í•˜ë‚˜ì˜ ìŠ¬ë ˆì´ë¸Œ 노드로 서비스를 ì œê³µí•˜ë¯€ë¡œ, ì½ê¸° 부하를 ë¶„ì‚°í•˜ë ¤ë©´ 다중 ìŠ¬ë ˆì´ë¸Œ 노드 구성 ë˜ëŠ” 부하 ë¶„ì‚° êµ¬ì„±ì´ ì¢‹ë‹¤. ë˜í•œ, ìŠ¬ë ˆì´ë¸Œ 노드 ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드 ë“±ì˜ íŠ¹ì • ë…¸ë“œì— ì½ê¸° ì „ìš©ìœ¼ë¡œ ì ‘ì†í•˜ë ¤ë©´ Read Only 브로커 ë˜ëŠ” Preferred Host Read Only 브로커를 구성한다. 브로커 êµ¬ì„±ì— ëŒ€í•œ ì„¤ëª…ì€ :ref:`duplexing-brokers` 를 ì°¸ê³ í•œë‹¤. **노드 ì„¤ì • 예시** .. image:: /images/image30.png HA 기본 êµ¬ì„±ì˜ ê° ë…¸ë“œëŠ” 다ìŒê³¼ ê°™ì´ ì„¤ì •í•œë‹¤. * **node A** (마스터 노드) * **cubrid.conf** 파ì¼ì˜ **ha_mode** 를 **on** 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=59901 ha_node_list=cubrid@nodeA:nodeB ha_db_list=testdb * **node B** (ìŠ¬ë ˆì´ë¸Œ 노드) : *node A* 와 ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. 브로커 ë…¸ë“œì˜ **databases.txt** 파ì¼ì—는 **db-host** ì— HA로 êµ¬ì„±ëœ í˜¸ìŠ¤íŠ¸ì˜ ëª©ë¡ì„ ìš°ì„ ìˆœìœ„ì— ë”°ë¼ ìˆœì„œëŒ€ë¡œ ì„¤ì •í•´ì•¼ 한다. 다ìŒì€ **databases.txt** 파ì¼ì˜ 예ì´ë‹¤. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob **cubrid_broker.conf** 파ì¼ì€ 브로커를 어떻게 구성하ëŠëƒì— ë”°ë¼ ë‹¤ì–‘í•˜ê²Œ ì„¤ì •í• ìˆ˜ 있으며 **databases.txt** 파ì¼ê³¼ 함께 별ë„ì˜ ìž¥ë¹„ë¡œ 구성하여 ì„¤ì •í• ìˆ˜ë„ ìžˆë‹¤. ë‹¤ìŒ ì˜ˆëŠ” ê° ë…¸ë“œì— RW 브로커를 ì„¤ì •í•œ 경우ì´ë©° *node A*, *node B* 둘 다 ê°™ì€ ê°’ìœ¼ë¡œ 구성한다. :: [%RW_broker] ... # Broker mode setting parameter ACCESS_MODE =RW **ì‘ìš© 프로그램 ì—°ê²° ì„¤ì •** 환경 ì„¤ì •ì˜ :ref:`ha-jdbc-conf`, :ref:`ha-cci-conf`, :ref:`ha-php-conf` ì„ ì°¸ê³ í•œë‹¤. **ì°¸ê³ ** ì´ì™€ ê°™ì€ êµ¬ì„±ì—서 트랜ìžì…˜ ë¡œê·¸ì˜ ì´ë™ 경로를 중심으로 살펴보면 다ìŒê³¼ 같다. .. image:: /images/image31.png 다중 ìŠ¬ë ˆì´ë¸Œ 노드 구성 ----------------------- 다중 ìŠ¬ë ˆì´ë¸Œ 노드 êµ¬ì„±ì€ í•œ ê°œì˜ ë§ˆìŠ¤í„° 노드와 여러 ê°œì˜ ìŠ¬ë ˆì´ë¸Œ 노드를 ë‘ì–´ CUBRIDì˜ ì„œë¹„ìŠ¤ ê°€ìš©ì„±ì„ ë†’ì¸ êµ¬ì„±ì´ë‹¤. CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œì—서 ë³µì œ 로그 복사 프로세스와 ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ 구ë™ë˜ë¯€ë¡œ ë³µì œ 로그를 복사하는 부하가 ìƒê¸´ë‹¤. ë”°ë¼ì„œ CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œëŠ” ë„¤íŠ¸ì›Œí¬ ë° ë””ìŠ¤í¬ ì‚¬ìš©ë¥ ì´ ë†’ë‹¤. HA로 êµ¬ì„±ëœ ë…¸ë“œ 수가 많으므로 CUBRID HA 그룹 ë‚´ì˜ ì—¬ëŸ¬ ë…¸ë“œì— ìž¥ì• ê°€ ë°œìƒí•´ë„ í•˜ë‚˜ì˜ ë…¸ë“œë§Œ 있으면 ì½ê¸° 쓰기 서비스를 ì œê³µí• ìˆ˜ 있다. 다중 ìŠ¬ë ˆì´ë¸Œ 노드 구성ì—서 failoverê°€ ì¼ì–´ë‚ 때 마스터 노드가 ë 노드는 **ha_node_list** ì— ì •ì˜í•œ ìˆœì„œì— ë”°ë¼ ì§€ì •ëœë‹¤. 만약 **ha_node_list** ê°’ì´ nodeA:nodeB:nodeCì´ê³ 마스터 노드가 *node A* ì´ë©´, 마스터 ë…¸ë“œì— ìž¥ì• ê°€ ë°œìƒí–ˆì„ 때 *node B* ê°€ 마스터 노드가 ëœë‹¤. **노드 ì„¤ì • 예시** .. image:: /images/image32.png 다중 ìŠ¬ë ˆì´ë¸Œ êµ¬ì„±ì˜ ê° ë…¸ë“œëŠ” 다ìŒê³¼ ê°™ì´ ì„¤ì •í•œë‹¤. * **node A** (마스터 노드) * **cubrid.conf** 파ì¼ì˜ **ha_mode** 를 **on** 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=59901 ha_node_list=cubrid@nodeA:nodeB:nodeC ha_db_list=testdb ha_copy_sync_mode=sync:sync:sync * **node B**, **node C** (ìŠ¬ë ˆì´ë¸Œ 노드): *node A* 와 ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. 브로커 ë…¸ë“œì˜ **databases.txt** 파ì¼ì—는 **db-host** ì— HA êµ¬ì„±ëœ í˜¸ìŠ¤íŠ¸ì˜ ëª©ë¡ì„ ìš°ì„ ìˆœìœ„ì— ë”°ë¼ ìˆœì„œëŒ€ë¡œ ì„¤ì •í•´ì•¼ 한다. 다ìŒì€ **databases.txt** 파ì¼ì˜ 예ì´ë‹¤. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB:nodeC /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob **cubrid_broker.conf** 파ì¼ì€ 브로커를 어떻게 구성하ëŠëƒì— ë”°ë¼ ë‹¤ì–‘í•˜ê²Œ ì„¤ì •í• ìˆ˜ 있으며 **databases.txt** 파ì¼ê³¼ 함께 별ë„ì˜ ìž¥ë¹„ë¡œ 구성하여 ì„¤ì •í• ìˆ˜ë„ ìžˆë‹¤. 예시ì—서는 *node A*, *node B*, *node C*\ ì— RW 브로커를 ì„¤ì •í•˜ì˜€ë‹¤. 다ìŒì€ *node A*, *node B*, *node C* ì˜ **cubrid_broker.conf** ì˜ ì˜ˆì´ë‹¤. :: [%RW_broker] ... # Broker mode setting parameter ACCESS_MODE =RW **ì‘ìš© 프로그램 ì—°ê²° ì„¤ì •** *node A*, *node B* ë˜ëŠ” *node C* ì— ìžˆëŠ” 브로커 중 하나와 연결한다. .. code-block:: java Connection connection = DriverManager.getConnection( "jdbc:CUBRID:nodeA:33000:testdb:::?charSet=utf-8&altHosts=nodeB:33000,nodeC:33000", "dba", ""); 기타 ìžì„¸í•œ 사í•ì€ í™˜ê²½ ì„¤ì •ì˜ :ref:`ha-jdbc-conf`, :ref:`ha-cci-conf`, :ref:`ha-php-conf` ì„ ì°¸ê³ í•œë‹¤. .. note:: ì´ êµ¬ì„±ì€ ë‹¤ì¤‘ ìž¥ì• ì‹œ CUBRID HA 그룹 ë‚´ì˜ ë°ì´í„°ê°€ ë™ì¼í•˜ì§€ ì•Šì€ ìƒí™©ì´ ë°œìƒí• 수 있으며, ê·¸ 예는 다ìŒê³¼ 같다. * ë‘ ë²ˆì§¸ ìŠ¬ë ˆì´ë¸Œ 노드가 재시작으로 ì¸í•´ ë³µì œê°€ 지연ë 때 첫 번째 ìŠ¬ë ˆì´ë¸Œë¡œ failoverë˜ëŠ” ìƒí™© * 빈번한 failover로 ì¸í•´ 새로운 마스터 ë…¸ë“œì˜ ë³µì œ ë°˜ì˜ì´ 완료ë˜ì§€ ì•Šì•˜ì„ ë•Œ 다시 failoverê°€ ì¼ì–´ë‚˜ëŠ” ìƒí™© ì´ì™¸ì— ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì˜ ëª¨ë“œê°€ ASYNCì´ë©´ CUBRID HA 그룹 ë‚´ì˜ ë°ì´í„°ê°€ ë™ì¼í•˜ì§€ ì•Šì€ ìƒí™©ì´ ë°œìƒí• 수 있다. ì´ì™€ ê°™ì´ CUBRID HA 그룹 ë‚´ì˜ ë°ì´í„°ê°€ ë™ì¼í•˜ì§€ ì•Šì€ ìƒí™©ì´ ë°œìƒí•˜ë©´, :ref:`building-replication` ë˜ëŠ” :ref:`rebuilding-replication`\ 를 ì°¸ê³ í•˜ì—¬ CUBRID HA 그룹 ë‚´ì˜ ë°ì´í„°ë¥¼ ë™ì¼í•˜ê²Œ 맞춰야 한다. **ì°¸ê³ ** ì´ì™€ ê°™ì€ êµ¬ì„±ì—서 트랜ìžì…˜ ë¡œê·¸ì˜ ì´ë™ 경로를 중심으로 살펴보면 다ìŒê³¼ 같다. .. image:: /images/image33.png 부하 ë¶„ì‚° 구성 -------------- 부하 ë¶„ì‚° êµ¬ì„±ì€ HA 구성(한 ê°œì˜ ë§ˆìŠ¤í„° 노드와 한 ê°œì˜ ìŠ¬ë ˆì´ë¸Œ 노드)ì— ì—¬ëŸ¬ ê°œì˜ ë ˆí”Œë¦¬ì¹´ 노드를 ë‘ì–´ CUBRID ì„œë¹„ìŠ¤ì˜ ê°€ìš©ì„±ì„ ë†’ì´ê³ , ë§Žì€ ì½ê¸° 부하를 분산하여 ì²˜ë¦¬í• ìˆ˜ 있는 구성ì´ë‹¤. ë ˆí”Œë¦¬ì¹´ ë…¸ë“œë“¤ì€ HA 구성 중 마스터 노드로부터 ë³µì œ 로그를 받아 ë°ì´í„°ë¥¼ ë™ì¼í•˜ê²Œ ìœ ì§€í•˜ê³ , 마스터 노드는 ë ˆí”Œë¦¬ì¹´ 노드ì—서 ë³µì œ 로그를 받지 않으므로 다중 ìŠ¬ë ˆì´ë¸Œ êµ¬ì„±ì— ë¹„í•´ ë„¤íŠ¸ì›Œí¬ ë° ë””ìŠ¤í¬ ì‚¬ìš©ë¥ ì´ ë‚®ë‹¤. ë ˆí”Œë¦¬ì¹´ 노드는 HA êµ¬ì„±ì— í¬í•¨ë˜ì§€ 않으므로 HA 구성 ë‚´ì˜ ëª¨ë“ ë…¸ë“œì— ìž¥ì• ê°€ ë°œìƒí•´ë„ failoverë˜ì§€ ì•Šê³ ì½ê¸° 서비스만 ì œê³µí•œë‹¤. **노드 ì„¤ì • 예시** .. image:: /images/image34.png 부하 ë¶„ì‚° êµ¬ì„±ì˜ ê° ë…¸ë“œëŠ” 다ìŒê³¼ ê°™ì´ ì„¤ì •í•œë‹¤. * **node A** (마스터 노드) * **cubrid.conf** 파ì¼ì˜ **ha_mode**\ 를 **on**\ 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=12345 ha_node_list=cubrid@nodeA:nodeB ha_replica_list=cubrid@nodeC:nodeD:nodeE ha_db_list=testdb ha_copy_sync_mode=sync:sync * **node B** (ìŠ¬ë ˆì´ë¸Œ 노드): *node A*\ 와 ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. * **node C**, **node D**, **node E** (ë ˆí”Œë¦¬ì¹´ 노드) * **cubrid.conf** 파ì¼ì˜ **ha_mode**\ 를 **replica**\ 로 ì„¤ì •í•œë‹¤. :: ha_mode=replica * **cubrid_ha.conf** 파ì¼ì€ *node A*\ 와 ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. **cubrid_broker.conf** 파ì¼ì€ 브로커를 어떻게 구성하ëŠëƒì— ë”°ë¼ ë‹¤ì–‘í•˜ê²Œ ì„¤ì •í• ìˆ˜ 있으며 **databases.txt** 파ì¼ê³¼ 함께 별ë„ì˜ ìž¥ë¹„ë¡œ 구성하여 ì„¤ì •í• ìˆ˜ë„ ìžˆë‹¤. 예시ì—서는 브로커와 DB 서버를 ê°™ì€ ìž¥ë¹„ì— êµ¬ì„±í–ˆìœ¼ë©°, *node A*, *node B*\ ì— RW 브로커를 ì„¤ì •í•˜ê³ , *node C*, *node D*, *node E*\ ì— "CONNECT_ORDER=RANDOM"ê³¼ "PREFERRED_HOSTS=localhost"를 í¬í•¨í•˜ëŠ” SO 브로커를 ì„¤ì •í•˜ì˜€ë‹¤. *node C*, *node D*, *node E*\ 는 "PREFERRED_HOSTS=localhost"ì´ê¸° ë•Œë¬¸ì— ë¡œì»¬ DB ì„œë²„ì— ìš°ì„ ì ‘ì†ì„ 시ë„하며, "CONNECT_ORDER=RANDOM"ì´ë¯€ë¡œ localhost ì ‘ì†ì— ì‹¤íŒ¨í• ê²½ìš° **databases.txt**\ì˜ **db-host**\ì— ëª…ì‹œëœ í˜¸ìŠ¤íŠ¸ë“¤ 중 í•˜ë‚˜ì— ëžœë¤í•˜ê²Œ ì ‘ì†ì„ 시ë„한다. 다ìŒì€ *node A*\ 와 *node B*\ ì˜ **cubrid_broker.conf** 예ì´ë‹¤. :: [%RW_broker] ... # Broker mode setting parameter ACCESS_MODE =RW 다ìŒì€ *node C*, *node D*, *node E*\ ì˜ **cubrid_broker.conf** 예ì´ë‹¤. :: [%PHRO_broker] ... # Broker mode setting parameter ACCESS_MODE =SO PREFERRED_HOSTS =localhost 브로커 ë…¸ë“œì˜ **databases.txt** 파ì¼ì—는 ë¸Œë¡œì»¤ì˜ ìš©ë„ì— ë§žê²Œ HA ë˜ëŠ” 부하 ë¶„ì‚° 서버와 ì—°ê²°ë 수 있ë„ë¡ DB 서버 í˜¸ìŠ¤íŠ¸ì˜ ëª©ë¡ì„ 순서대로 ì„¤ì •í•´ì•¼ 한다. 다ìŒì€ *node A*\ 와 *node B*\ ì˜ **databases.txt** 파ì¼ì˜ 예ì´ë‹¤. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB /home/cubrid/DB/testdb/log file:/home/cubrid/CUBRID/testdb/lob 다ìŒì€ *node C*, *node D*, *node E*\ ì˜ **databases.txt** 파ì¼ì˜ 예ì´ë‹¤. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeC:nodeD:nodeE /home/cubrid/DB/testdb/log file:/home/cubrid/CUBRID/testdb/lob **ì‘ìš© 프로그램 ì—°ê²° ì„¤ì •** ì½ê¸° 쓰기로 ì ‘ì†í•˜ê¸° 위한 ì‘ìš© í”„ë¡œê·¸ëž¨ì€ *node A* ë˜ëŠ” *node B*\ ì— ìžˆëŠ” ë¸Œë¡œì»¤ì— ì—°ê²°í•œë‹¤. 다ìŒì€ JDBC ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì˜ˆì´ë‹¤. .. code-block:: java Connection connection = DriverManager.getConnection( "jdbc:CUBRID:nodeA:33000:testdb:::?charSet=utf-8&altHosts=nodeB:33000", "dba", ""); ì½ê¸° ì „ìš©ìœ¼ë¡œ ì ‘ì†í•˜ê¸° 위한 ì‘ìš© í”„ë¡œê·¸ëž¨ì€ *node C*, *node D* ë˜ëŠ” *node E*\ ì— ìžˆëŠ” ë¸Œë¡œì»¤ì— ì—°ê²°í•œë‹¤. 다ìŒì€ JDBC ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì˜ˆì´ë‹¤. "**loadBalance**\ =true"로 ì„¤ì •í•˜ì—¬ ë©”ì¸ í˜¸ìŠ¤íŠ¸ì™€ **altHosts**\ ì— ì§€ì •í•œ í˜¸ìŠ¤íŠ¸ë“¤ì— ëžœë¤í•œ 순서로 연결한다. .. code-block:: java Connection connection = DriverManager.getConnection( "jdbc:CUBRID:nodeC:33000:testdb:::?charSet=utf-8&loadBalance=true&altHosts=nodeD:33000,nodeE:33000", "dba", ""); 기타 ìžì„¸í•œ 사í•ì€ í™˜ê²½ ì„¤ì •ì˜ :ref:`ha-jdbc-conf`, :ref:`ha-cci-conf`, :ref:`ha-php-conf`\ ì„ ì°¸ê³ í•œë‹¤. **ì°¸ê³ ** ì´ì™€ ê°™ì€ êµ¬ì„±ì—서 트랜ìžì…˜ ë¡œê·¸ì˜ ì´ë™ 경로를 중심으로 살펴보면 다ìŒê³¼ 같다. .. image:: /images/image35.png 다중 ìŠ¤íƒ ë°”ì´ ì„œë²„ 구성 ----------------------- 한 ê°œì˜ ë§ˆìŠ¤í„° 노드와 한 ê°œì˜ ìŠ¬ë ˆì´ë¸Œ 노드로 구성ë˜ë‚˜, 여러 ì„œë¹„ìŠ¤ì˜ ìŠ¬ë ˆì´ë¸Œ 노드를 í•˜ë‚˜ì˜ ë¬¼ë¦¬ì ì¸ ì„œë²„ì— êµ¬ì„±í•œë‹¤. 매우 ìž‘ì€ ì„œë¹„ìŠ¤ì—서 ìŠ¬ë ˆì´ë¸Œ 노드로 ì½ê¸° 부하를 받지 ì•Šì•„ë„ ë˜ëŠ” 경우를 위한 것으로, CUBRID ì„œë¹„ìŠ¤ì˜ ê°€ìš©ì„±ë§Œì„ ìœ„í•œ 구성ì´ë‹¤. ë”°ë¼ì„œ failover 후 ìž¥ì• ê°€ ë°œìƒí–ˆë˜ 마스터 노드가 복구ë˜ë©´ 부하를 다시 마스터 노드로 옮겨 오ë„ë¡ í•˜ì—¬ ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œë“¤ì´ ë“¤ì–´ìžˆëŠ” ì„œë²„ì˜ ë¶€í•˜ë¥¼ 최소화해야 한다. .. image:: /images/image36.png **노드 ì„¤ì • 예시** HA 기본 êµ¬ì„±ì˜ ê° ë…¸ë“œëŠ” 다ìŒê³¼ ê°™ì´ ì„¤ì •í•œë‹¤. * **node AM**, **node AS** : ë‘ ë…¸ë“œëŠ” ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. * **cubrid.conf** 파ì¼ì˜ **ha_mode**\ 를 **on**\ 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=10000 ha_node_list=cubridA@Host1:Host5 ha_db_list=testdbA1,testdbA2 ha_copy_sync_mode=sync:sync * **node BM**, **node BS** : ë‘ ë…¸ë“œëŠ” ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. * **cubrid.conf** 파ì¼ì˜ **ha_mode**\ 를 **on**\ 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=10001 ha_node_list=cubridB@Host2:Host5 ha_db_list=testdbB1,testdbB2 ha_copy_sync_mode=sync:sync * **node CM**, **node CS** : ë‘ ë…¸ë“œëŠ” ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. * **cubrid.conf** 파ì¼ì˜ **ha_mode**\ 를 **on**\ 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=10002 ha_node_list=cubridC@Host3:Host5 ha_db_list=testdbC1,testdbC2 ha_copy_sync_mode=sync:sync * **node DM**, **node DS** : ë‘ ë…¸ë“œëŠ” ë™ì¼í•˜ê²Œ ì„¤ì •í•œë‹¤. * **cubrid.conf** 파ì¼ì˜ **ha_mode**\ 를 **on**\ 으로 ì„¤ì •í•œë‹¤. :: ha_mode=on * 다ìŒì€ **cubrid_ha.conf** 파ì¼ì˜ ì„¤ì • 예ì´ë‹¤. :: ha_port_id=10003 ha_node_list=cubridD@Host4:Host5 ha_db_list=testdbD1,testdbD2 ha_copy_sync_mode=sync:sync HA ì œì•½ ì‚¬í• ============ **ì§€ì› í”Œëž«í¼** 현재 CUBRID HA ê¸°ëŠ¥ì€ Linux 계열ì—서만 ì‚¬ìš©í• ìˆ˜ 있다. CUBRID HA ê·¸ë£¹ì˜ ëª¨ë“ ë…¸ë“œë“¤ì€ ë°˜ë“œì‹œ ë™ì¼í•œ 플랫í¼ìœ¼ë¡œ 구성해야 한다. **í…Œì´ë¸” 기본키(primary key)** CUBRID HA는 마스터 ë…¸ë“œì˜ ì„œë²„ì—서 ìƒì„±ë˜ëŠ” 기본키 ê¸°ë°˜ì˜ ë³µì œ 로그를 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë³µì œ 후 ë°˜ì˜í•˜ëŠ” ë°©ì‹(transaction log shipping)으로 노드 ê°„ ë°ì´í„°ë¥¼ ë™ê¸°í™”하므로 기본키가 ì„¤ì •ëœ í…Œì´ë¸”ì— ëŒ€í•´ì„œë§Œ CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œ ê°„ ë°ì´í„° ë™ê¸°í™”ê°€ 가능하다. CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œ ê°„ íŠ¹ì • í…Œì´ë¸”ì˜ ë°ì´í„°ê°€ ë™ê¸°í™”ë˜ì§€ 않는다면 해당 í…Œì´ë¸”ì— ì ì ˆí•œ 기본키가 ì„¤ì •ë˜ì–´ 있는지 확ì¸í•´ì•¼ 한다. ë¶„í• í…Œì´ë¸”ì—서 **PROMOTE** ë¬¸ì— ì˜í•´ ì¼ë¶€ ë¶„í• ì´ ìŠ¹ê²©ëœ í…Œì´ë¸”ì€ ëª¨ë“ ë°ì´í„°ë¥¼ ìŠ¬ë ˆì´ë¸Œì— ë³µì œí•˜ì§€ë§Œ, 기본 키를 가지지 않게 ë˜ë¯€ë¡œ ì´í›„ 마스터ì—서 해당 í…Œì´ë¸”ì˜ ë°ì´í„°ë¥¼ ìˆ˜ì •í•´ë„ ìŠ¬ë ˆì´ë¸Œì— ë°˜ì˜ë˜ì§€ 않ìŒì— 주ì˜í•œë‹¤. .. note:: **USE_SBR** 힌트를 통해 기본키가 ì„¤ì •ë˜ì§€ ì•Šì€ í…Œì´ë¸”ì— ëŒ€í•œ ë°ì´í„° ë³µì œë„ ì§€ì›í•œë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`sql-hint` ì„ ì°¸ê³ í•œë‹¤. **Java ì €ìž¥ í”„ë¡œì‹œì €(java stored procedure)** CUBRID HAì—서 Java ì €ìž¥ í”„ë¡œì‹œì € 환경 êµ¬ì¶•ì€ ë³µì œë˜ì§€ 않으므로, Java ì €ìž¥ í”„ë¡œì‹œì €ë¥¼ ì‚¬ìš©í•˜ë ¤ë©´ ëª¨ë“ ë…¸ë“œì— ê°ê° Java ì €ìž¥ í”„ë¡œì‹œì € í™˜ê²½ì„ ì„¤ì •í•´ì•¼ 한다. :ref:`cubrid-javasp-server-config`\ ì„ ì°¸ê³ í•œë‹¤. **메서드** CUBRID HA는 ë³µì œ 로그를 기반으로 CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œ ê°„ ë°ì´í„°ë¥¼ ë™ê¸°í™”하므로 ë³µì œ 로그를 ìƒì„±í•˜ì§€ 않는 메서드를 사용하면 CUBRID HA 그룹 ë‚´ 노드 ê°„ ë°ì´í„° 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있다. ë”°ë¼ì„œ CUBRID HA 환경ì—서는 메서드 사용(예: CALL login('dba', '') ON CLASS dbuser;)ì„ ê¶Œìž¥í•˜ì§€ 않는다. **stand-alone 모드** CUBRIDì˜ stand-alone 모드ì—서 수행한 ìž‘ì—…ì— ëŒ€í•´ì„œëŠ” ë³µì œ 로그가 ìƒì„±ë˜ì§€ 않는다. ë”°ë¼ì„œ stand-alone 모드로 csql ë“±ì„ í†µí•´ 작업 수행 시 CUBRID HA 그룹 ë‚´ 노드 ê°„ ë°ì´í„° 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있다. **시리얼 ìºì‹œ(serial cache)** 시리얼 ìºì‹œëŠ” 성능 í–¥ìƒì„ 위해 시리얼 ì •ë³´ë¥¼ 조회하거나 ê°±ì‹ í• ë•Œ Heapì— ì ‘ê·¼í•˜ì§€ ì•Šê³ ë³µì œ 로그를 ìƒì„±í•˜ì§€ 않는다. ë”°ë¼ì„œ 시리얼 ìºì‹œë¥¼ 사용하는 경우 CUBRID HA 그룹 ë‚´ 노드 ê°„ ì‹œë¦¬ì–¼ì˜ í˜„ìž¬ ê°’ì´ ì¼ì¹˜í•˜ì§€ 않는다. **cubrid backupdb -r** ì´ëŠ” ì§€ì •í•œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 백업하는 ëª…ë ¹ìœ¼ë¡œ **-r** ì˜µì…˜ì„ ì‚¬ìš©í•˜ë©´ ë°±ì—…ì„ ìˆ˜í–‰í•œ 후 ë³µêµ¬ì— í•„ìš”í•˜ì§€ ì•Šì€ ë¡œê·¸ë¥¼ ì‚ì œí•œë‹¤. 하지만 ì´ ì˜µì…˜ìœ¼ë¡œ ì¸í•´ 로그가 사ë¼ì§€ëŠ” 경우 CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œ ê°„ ë°ì´í„° 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있으므로 **-r** ì˜µì…˜ì„ ì‚¬ìš©í•˜ì§€ 않아야 한다 **온ë¼ì¸ 백업** HA 환경ì—서 온ë¼ì¸ ë°±ì—…ì„ í•˜ë ¤ë©´ ë°ì´í„°ë² ì´ìФ ì´ë¦„ ë’¤ì— @\ *hostname*\ ì„ ì¶”ê°€í•´ì•¼ 한다. *hostname*\ ì€ $CUBRID_DATABASES/databases.txtì— ì§€ì •ëœ ì´ë¦„ì´ë‹¤. 보통 해당 ì„œë²„ì˜ ë¡œì»¬ DB를 온ë¼ì¸ 백업하므로 "@localhost"를 ì§€ì •í•˜ë©´ ëœë‹¤. :: cubrid backupdb -C -D ./ -l 0 -z testdb@localhost ë°ì´í„°ë² ì´ìФ ìš´ì˜ ì¤‘ì— ìˆ˜í–‰í•˜ëŠ” 온ë¼ì¸ ë°±ì—…ì€ ë””ìŠ¤í¬ I/Oì˜ ë¶€í•˜ê°€ 예ìƒë˜ë¯€ë¡œ, 마스터 DB보다는 ìŠ¬ë ˆì´ë¸Œ DBì—서 ë°±ì—…í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. **INCR/DECR 함수** HA êµ¬ì„±ì˜ ìŠ¬ë ˆì´ë¸Œ 노드ì—서 í´ë¦ ì¹´ìš´í„° í•¨ìˆ˜ì¸ ::func:`INCR` / :func:`DECR` 함수를 사용하면 오류를 반환한다. **LOB(BLOB/CLOB) 타입** CUBRID HAì—서 **LOB** 칼럼 메타 ë°ì´í„°(Locator)는 ë³µì œë˜ê³ , **LOB** ë°ì´í„°ëŠ” ë³µì œë˜ì§€ 않는다. ë”°ë¼ì„œ **LOB** 타입 ì €ìž¥ì†Œê°€ ë¡œì»¬ì— ìœ„ì¹˜í• ê²½ìš°, ìŠ¬ë ˆì´ë¸Œ 노드 ë˜ëŠ” failover ì´í›„ 마스터 노드ì—서 해당 ì¹¼ëŸ¼ì— ëŒ€í•œ ìž‘ì—…ì„ í—ˆìš©í•˜ì§€ 않는다. .. note:: 9.1 ì´ì „ ë²„ì „ì˜ CUBRID HA 환경ì—서 트리거를 ì‚¬ìš©í• ê²½ìš° 마스터 노드ì—서 ì´ë¯¸ ìˆ˜í–‰ëœ íŠ¸ë¦¬ê±°ë¥¼ ìŠ¬ë ˆì´ë¸Œ 노드ì—서 중복 수행하므로 CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œ ê°„ ë°ì´í„° 불ì¼ì¹˜ê°€ ë°œìƒí• 수 있다. ë”°ë¼ì„œ 9.1 ì´ì „ ë²„ì „ì˜ CUBRID HA 환경ì—서는 트리거를 사용하지 않ë„ë¡ í•œë‹¤. .. note:: **UPDATE STATISTICS 문** 10.0 부터는 UPDATE STATISTICS ë¬¸ì´ ë³µì œëœë‹¤. 10.0 미만 ë²„ì „ì—서는 UPDATE STATISTICS ë¬¸ì´ ë³µì œë˜ì§€ 않으므로 ìŠ¬ë ˆì´ë¸Œ/ë ˆí”Œë¦¬ì¹´ ë…¸ë“œì— ë³„ë„로 수행해야 한다. 10.0 미만 ë²„ì „ì˜ ìŠ¬ë ˆì´ë¸Œ/ë ˆí”Œë¦¬ì¹´ 노드ì—서 "UPDATE STATISTICS" êµ¬ë¬¸ì„ ì ìš©í•˜ë ¤ë©´ CSQLì—서 **\-\-sysadm** 옵션과 **\-\-write_on_slave** ì˜µì…˜ì„ ì¶”ê°€í•œ 후 ì´ êµ¬ë¬¸ì„ ìˆ˜í–‰í•´ì•¼ 한다. ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ ============= ì½ê¸° 쓰기 서비스 중 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ --------------------------------- ì´ ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ëŠ” ì„œë¹„ìŠ¤ì˜ ì½ê¸° ì“°ê¸°ì— ì˜í–¥ì„ 받지 않으므로, CUBRID ìš´ì˜ìœ¼ë¡œ ì¸í•´ ì„œë¹„ìŠ¤ì— ë¯¸ì¹˜ëŠ” ì˜í–¥ì´ 매우 작다. ì½ê¸° 쓰기 서비스 ì¤‘ì˜ ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ëŠ” failoverê°€ ì¼ì–´ë‚˜ëŠ” 경우와 ê·¸ë ‡ì§€ ì•Šì€ ê²½ìš°ë¡œ 나눌 수 있다. **failoverê°€ í•„ìš” 없는 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤** ë‹¤ìŒ ìž‘ì—…ì€ CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œë¥¼ ì¢…ë£Œí•˜ê³ ë‹¤ì‹œ 구ë™í•˜ì§€ ì•Šê³ ë°”ë¡œ ìˆ˜í–‰í• ìˆ˜ 있다. +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 대표ì ì¸ ìš´ì˜ ìž‘ì—… | 시나리오 | ê³ ë ¤ ì‚¬í• | +=====================================+================================================+===========================================================================================================+ | 온ë¼ì¸ 백업 | ìš´ì˜ ì¤‘ 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드ì—서 ê°ê° | ìš´ì˜ ìž‘ì—…ìœ¼ë¡œ ì¸í•´ 마스터 ë…¸ë“œì˜ íŠ¸ëžœìžì…˜ì´ 지연ë 수 있으므로 주ì˜í•´ì•¼ 한다. | | | ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•œë‹¤. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 스키마 변경(기본키 변경 작업 ì œì™¸), | 마스터 노드ì—서만 ìš´ì˜ ìž‘ì—…í•˜ë©´ ìžë™ìœ¼ë¡œ | ìš´ì˜ ìž‘ì—…ì´ ë§ˆìŠ¤í„° 노드ì—서 ì™„ë£Œëœ í›„ ìŠ¬ë ˆì´ë¸Œ 노드로 ë³µì œ 로그가 복사ë˜ê³ ê·¸ 후부터 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— | | ì¸ë±ìФ 변경, 권한 변경 | ìŠ¬ë ˆì´ë¸Œ 노드로 ë³µì œ ë°˜ì˜í•œë‹¤. | ë°˜ì˜ì´ ë˜ë¯€ë¡œ ìš´ì˜ ìž‘ì—… ì‹œê°„ì´ 2ë°° 소요 ëœë‹¤. 스키마 ë³€ê²½ì€ ë°˜ë“œì‹œ ì¤‘ê°„ì— failover ì—†ì´ ì§„í–‰í•´ì•¼ 한다. | | | | 스키마 ë³€ê²½ì„ ì œì™¸í•œ ì¸ë±ìФ 변경, 권한 ë³€ê²½ì€ ìš´ì˜ ìž‘ì—… 소요 ì‹œê°„ì´ ë¬¸ì œê°€ ë˜ëŠ” 경우, | | | | ê° ë…¸ë“œë¥¼ ì •ì§€í•œ 후 ë…립 모드(예:**csql** ìœ í‹¸ë¦¬í‹°ì˜ **-S** 옵션)를 통해 ìˆ˜í–‰í• ìˆ˜ 있다. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 볼륨 추가 | HA 구성과 별개로 ê° DBì—서 ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•œë‹¤| ìš´ì˜ ìž‘ì—…ìœ¼ë¡œ ì¸í•´ 마스터 ë…¸ë“œì˜ íŠ¸ëžœìžì…˜ì´ 지연ë 수 있으므로 주ì˜í•´ì•¼ 한다. | | | | ìš´ì˜ ìž‘ì—… 소요 ì‹œê°„ì´ ë¬¸ì œê°€ ë˜ëŠ” 경우 ê° ë…¸ë“œë¥¼ ì •ì§€í•œ 후 ë…립 모드(예: | | | | **cubrid addvoldb** ìœ í‹¸ë¦¬í‹°ì˜ **-S** 옵션)를 통해 ìˆ˜í–‰í• ìˆ˜ 있다. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | ìž¥ì• ë…¸ë“œ 서버 êµì²´ | ìž¥ì• ë°œìƒ í›„ 실행 ì¤‘ì¸ CUBRID HA ê·¸ë£¹ì˜ | CUBRID HA 그룹 ë‚´ ì„¤ì •ì˜ ha_node_listì— ìž¥ì• ë…¸ë“œê°€ 등ë¡ë˜ì–´ 있는 경우로, êµì²´ 시 | | | 재시작 ì—†ì´ êµì²´í•œë‹¤. | 노드명 ë“±ì´ ë³€ê²½ë˜ì§€ 않아야 한다. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | ìž¥ì• ë¸Œë¡œì»¤ 서버 êµì²´ | ìž¥ì• ë°œìƒ í›„ 실행 ì¤‘ì¸ ë¸Œë¡œì»¤ì˜ ìž¬ì‹œìž‘ ì—†ì´ | í´ë¼ì´ì–¸íЏì—서 êµì²´ëœ ë¸Œë¡œì»¤ë¡œì˜ ì—°ê²°ì€ URL 문ìžì—´ì— ì„¤ì •ëœ rcTime ê°’ì— ì˜í•œë‹¤. | | | êµì²´í•œë‹¤. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | DB 서버 ì¦ì„¤ | ê¸°ì¡´ì— êµ¬ì„±ëœ CUBRID HA ê·¸ë£¹ì˜ ìž¬ì‹œìž‘ ì—†ì´ | ë³€ê²½ëœ ì„¤ì • ì •ë³´ë¥¼ 로딩하여 추가/ì‚ì œëœ ë…¸ë“œì— í•´ë‹¹í•˜ëŠ” | | | ì„¤ì • 변경(ha_node_list, ha_replica_list) 후 | **copylogdb/applylogdb** 프로세스를 시작 ë˜ëŠ” ì •ì§€í•œë‹¤. | | | **cubrid heartbeat reload** 를 ê° ë…¸ë“œì—서 | | | | 수행한다. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 브로커 서버 ì¦ì„¤ | 기존 ë¸Œë¡œì»¤ë“¤ì˜ ìž¬ì‹œìž‘ ì—†ì´ ì¶”ê°€ëœ ë¸Œë¡œì»¤ë¥¼ | í´ë¼ì´ì–¸íŠ¸ê°€ ì¶”ê°€ëœ ë¸Œë¡œì»¤ë¡œ ì—°ê²°ë˜ê¸° 위해서는 URL 문ìžì—´ì„ ìˆ˜ì •í•´ì•¼ 한다. | | | 구ë™í•œë‹¤. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ **failoverê°€ 필요한 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤** ë‹¤ìŒ ìž‘ì—…ì€ CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œë¥¼ ì¢…ë£Œí•˜ê³ ìš´ì˜ ìž‘ì—…ì„ ì™„ë£Œí•œ 후 구ë™í•´ì•¼ 한다. +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 대표ì ì¸ ìš´ì˜ ìž‘ì—… | 시나리오 | ê³ ë ¤ ì‚¬í• | +=====================================+================================================+===========================================================================================================+ | DB 서버 ì„¤ì • 변경 | **cubrid.conf**\ ì˜ ì„¤ì •ì´ ë³€ê²½ë˜ë©´ | | | | ì„¤ì • ë³€ê²½ëœ ë…¸ë“œë¥¼ 재시작한다. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 브로커 ì„¤ì • 변경, | **cubrid_broker.conf**\ ì˜ ì„¤ì •ì´ | | | 브로커 추가, 브로커 ì‚ì œ | 변경ë˜ë©´ ì„¤ì • ë³€ê²½ëœ ë¸Œë¡œì»¤ë¥¼ | | | | 재시작한다. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | DBMS ë²„ì „ 패치 | HA 그룹 ë‚´ 노드와 ë¸Œë¡œì»¤ë“¤ì„ ê°ê° | ë²„ì „ 패치는 CUBRIDì˜ ë‚´ë¶€ í”„ë¡œí† ì½œ, 볼륨 ë° | | | ë²„ì „ 패치 후 재시작한다. | ë¡œê·¸ì˜ ë³€ê²½ì´ ì—†ëŠ” 것ì´ë‹¤. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ ì½ê¸° 서비스 중 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ ---------------------------- ì´ ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ëŠ” ì½ê¸° 서비스만 가능하ë„ë¡ í•˜ì—¬ ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•œë‹¤. ì„œë¹„ìŠ¤ì˜ ì½ê¸° ì„œë¹„ìŠ¤ë§Œì„ í—ˆìš©í•˜ê±°ë‚˜ ë¸Œë¡œì»¤ì˜ ëª¨ë“œ ì„¤ì •ì„ Read Only로 ë™ì 변경해야 한다. ì½ê¸° 서비스 ì¤‘ì˜ ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ëŠ” failoverê°€ ì¼ì–´ë‚˜ëŠ” 경우와 ê·¸ë ‡ì§€ ì•Šì€ ê²½ìš°ë¡œ 나눌 수 있다. **failoverê°€ í•„ìš” 없는 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤** ë‹¤ìŒ ìž‘ì—…ì€ CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œë¥¼ ì¢…ë£Œí•˜ê³ ë‹¤ì‹œ 구ë™í•˜ì§€ ì•Šê³ ë°”ë¡œ ìˆ˜í–‰í• ìˆ˜ 있다. +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 대표ì ì¸ ìš´ì˜ ìž‘ì—… | 시나리오 | ê³ ë ¤ ì‚¬í• | +=====================================+================================================+===========================================================================================================+ | 스키마 변경(기본키 변경) | 마스터 노드ì—서만 ìš´ì˜ ìž‘ì—…í•˜ë©´ ìžë™ìœ¼ë¡œ | 기본키를 ë³€ê²½í•˜ë ¤ë©´ 기본키를 ì‚ì œí•˜ê³ ë‹¤ì‹œ 추가해야 한다. ë”°ë¼ì„œ 기본키 ê¸°ë°˜ì˜ ë³µì œ 로그를 ë°˜ì˜í•˜ëŠ” HA | | | ìŠ¬ë ˆì´ë¸Œ 노드로 ë³µì œ ë°˜ì˜í•œë‹¤. | ë‚´ë¶€ 구조 ìƒ ë³µì œ ë°˜ì˜ì´ ì¼ì–´ë‚˜ì§€ ì•Šì„ ìˆ˜ 있으므로, | | | | 반드시 ì½ê¸° 서비스 ì¤‘ì— ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•´ì•¼ 한다. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 스키마 변경(기본키 변경 작업 ì œì™¸), | 마스터 노드ì—서만 ìš´ì˜ ìž‘ì—…í•˜ë©´ ìžë™ìœ¼ë¡œ | ìš´ì˜ ìž‘ì—…ì´ ë§ˆìŠ¤í„° 노드ì—서 ì™„ë£Œëœ í›„ ìŠ¬ë ˆì´ë¸Œ 노드로 ë³µì œ 로그가 복사ë˜ê³ ê·¸ 후부터 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— | | ì¸ë±ìФ 변경, 권한 변경 | ìŠ¬ë ˆì´ë¸Œ 노드로 ë³µì œ ë°˜ì˜í•œë‹¤. | ë°˜ì˜ì´ ë˜ë¯€ë¡œ ìš´ì˜ ìž‘ì—… ì‹œê°„ì´ 2ë°° 소요 ëœë‹¤. 스키마 ë³€ê²½ì€ ë°˜ë“œì‹œ ì¤‘ê°„ì— failover ì—†ì´ ì§„í–‰í•´ì•¼ 한다. | | | | 스키마 ë³€ê²½ì„ ì œì™¸í•œ ì¸ë±ìФ 변경, 권한 ë³€ê²½ì€ ìš´ì˜ ìž‘ì—… 소요 ì‹œê°„ì´ ë¬¸ì œê°€ ë˜ëŠ” 경우, ê° ë…¸ë“œë¥¼ ì •ì§€í•œ | | | | 후 ë…립 모드(예: **csql** ìœ í‹¸ë¦¬í‹°ì˜ **-S** 옵션)를 통해 ìˆ˜í–‰í• ìˆ˜ 있다. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ **failoverê°€ 필요한 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤** ë‹¤ìŒ ìž‘ì—…ì€ CUBRID HA 그룹 ë‚´ì˜ ë…¸ë“œë¥¼ ì¢…ë£Œí•˜ê³ ìš´ì˜ ìž‘ì—…ì„ ì™„ë£Œí•œ 후 구ë™í•´ì•¼ 한다. +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 대표ì ì¸ ìš´ì˜ ìž‘ì—… | 시나리오 | ê³ ë ¤ ì‚¬í• | | | | | +=====================================+================================================+===========================================================================================================+ | DBMS ë²„ì „ ì—…ê·¸ë ˆì´ë“œ | CUBRID HA 그룹 ë‚´ 노드와 ë¸Œë¡œì»¤ë“¤ì„ ê°ê° ë²„ì „ | ë²„ì „ ì—…ê·¸ë ˆì´ë“œëŠ” CUBRIDì˜ ë‚´ë¶€ í”„ë¡œí† ì½œ, 볼륨 ë° ë¡œê·¸ì˜ ë³€ê²½ì´ ìžˆëŠ” 것ì´ë‹¤. ì—…ê·¸ë ˆì´ë“œ ì¤‘ì˜ | | | ì—…ê·¸ë ˆì´ë“œ 후 재시작 한다. | 브로커 ë° ì„œë²„ëŠ” í”„ë¡œí† ì½œ, 볼륨 ë° ë¡œê·¸ ë“±ì´ ì„œë¡œ ë§žì§€ 않는 ë‘ ë²„ì „ì´ ì¡´ìž¬í•˜ê²Œ ë˜ë¯€ë¡œ ì—…ê·¸ë ˆì´ë“œ ì „í›„ì˜ | | | | í´ë¼ì´ì–¸íЏ ë° ë¸Œë¡œì»¤ëŠ” ê°ê°ì˜ ë²„ì „ì— ë§žëŠ” | | | | 브로커 ë° ì„œë²„ì— ì—°ê²°ë˜ë„ë¡ ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•´ì•¼ 한다. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | ëŒ€ëŸ‰ì˜ ë°ì´í„° 작업 | ìž‘ì—…í• ë…¸ë“œë¥¼ ì •ì§€í•˜ê³ ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•œ 후 | ë¶„í• í•˜ì—¬ ìž‘ì—…í• ìˆ˜ 없는 ëŒ€ëŸ‰ì˜ ë°ì´í„° ìž‘ì—…ì´ ì´ì— 해당한다. | | (INSERT/UPDATE/DELETE) | 노드를 구ë™í•œë‹¤. | | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ 서비스 ì •ì§€ 후 ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ ---------------------------- ì´ ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ëŠ” CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œë“¤ì„ ì •ì§€ 후 ìš´ì˜ ìž‘ì—…ì„ ìˆ˜í–‰í•´ì•¼ 한다. +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 대표ì ì¸ ìš´ì˜ ìž‘ì—… | 시나리오 | ê³ ë ¤ ì‚¬í• | | | | | +=====================================+================================================+===========================================================================================================+ | DB ì„œë²„ì˜ í˜¸ìŠ¤íŠ¸ëª… | CUBRID HA 그룹 ë‚´ì˜ ëª¨ë“ ë…¸ë“œë¥¼ ì •ì§€í•˜ê³ | 호스트명 변경 시 ê° ë¸Œë¡œì»¤ì˜ **databases.txt**\ë„ ë³€ê²½í•œ 후 | | ë° IP 변경 | ìš´ì˜ ìž‘ì—… 후 구ë™í•œë‹¤. | **cubrid broker reset** 으로 ë¸Œë¡œì»¤ì˜ ì—°ê²°ì„ ë¦¬ì…‹í•œë‹¤. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ ë ˆí”Œë¦¬ì¹´ ë³µì œ 지연 ì„¤ì • 시나리오 -------------------------------- ì´ ìš´ì˜ ì‹œë‚˜ë¦¬ì˜¤ëŠ” 마스터 노드ì—서 실수로 ë°ì´í„°ë¥¼ ì‚ì œí•œ 경우를 ê°ì§€í•˜ì—¬ íŠ¹ì • 시ì ì´ì „으로 ë°ì´í„°ë¥¼ ë˜ëŒë¦¬ê³ ì‹¶ì„ ë•Œ, ë ˆí”Œë¦¬ì¹´ 노드를 통해 긴급히 ì´ì „ ë°ì´í„°ê¹Œì§€ ë³µêµ¬í• ìˆ˜ 있게 하기 위해 ì§€ì •í•œ 시간 ê°„ê²©ì„ ë‘ê³ ë³µì œë¥¼ 진행하며 íŠ¹ì • 시ì ì—서 ë³µì œë¥¼ ì •ì§€í•˜ë„ë¡ ë³µì œ ì •ì§€ ì‹œê°„ì„ ì„¤ì •í•œë‹¤. +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ | 대표ì ì¸ ìš´ì˜ ìž‘ì—… | 시나리오 | ê³ ë ¤ ì‚¬í• | +=====================================+================================================+===========================================================================================================+ | ë ˆí”Œë¦¬ì¹´ 노드ì—서 | ë ˆí”Œë¦¬ì¹´ ë…¸ë“œì— ë³µì œë˜ëŠ” 시간 ê°„ê²©ì„ | cubrid_ha.confì˜ ha_replica_delay와 | | ë³µì œ 지연 ì„¤ì • | ì§€ì •í•˜ê³ , íŠ¹ì • ì‹œê°„ì— ë³µì œê°€ ì •ì§€ë˜ê²Œ 한다. | ha_replica_time_bound를 ì§€ì •í•œë‹¤. | +-------------------------------------+------------------------------------------------+-----------------------------------------------------------------------------------------------------------+ .. _building-replication: ë³µì œ 구축 ========= .. _cubrid-restoreslave: restoreslave ------------ **cubrid restoreslave** 는 백업본으로부터 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 복구하는 **cubrid restoredb** 와 ë™ì¼í•˜ì§€ë§Œ ìŠ¬ë ˆì´ë¸Œ(slave)나 ë ˆí”Œë¦¬ì¹´(replica)를 ìž¬êµ¬ì„±í• ë•Œ 편리한 ê¸°ëŠ¥ì´ í¬í•¨ë˜ì–´ 있다. **cubrid restoreslave** 를 사용하면 사용ìžê°€ **db_ha_apply_info** ì— ì €ìž¥ë˜ëŠ” ë³µì œ 카탈로그 ìƒì„±ì„ 위해 백업 ì¶œë ¥ì—서 ë³µì œ ê´€ë ¨ ì •ë³´ë¥¼ 수ë™ìœ¼ë¡œ 수집하지 ì•Šì•„ë„ ëœë‹¤. ì´ ëª…ë ¹ì€ ë°±ì—… ì´ë¯¸ì§€ì™€ 활성 로그로부터 필요한 ì •ë³´ë¥¼ ëª¨ë‘ ìžë™ìœ¼ë¡œ ì½ì–´ì„œ ê´€ë ¨ ë³µì œ 카탈로그를 **db_ha_apply_info** ì— ì¶”ê°€í•œë‹¤. 사용ìžëŠ” 백업 ì´ë¯¸ì§€ê°€ ìƒì„±ëœ ë…¸ë“œì˜ ìƒíƒœì™€ 현재 마스터 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ëª…, ì´ ë‘ ê°€ì§€ 필수 옵션만 ì œê³µí•˜ë©´ ëœë‹¤. ìžì„¸í•œ ë‚´ìš©ì€ :ref:`restoredb` 를 ì°¸ê³ í•œë‹¤. :: cubrid restoreslave [OPTION] database-name .. program:: restoreslave .. option:: -s, --source-state=STATE 백업 ì´ë¯¸ì§€ê°€ ìƒì„±ëœ ë…¸ë“œì˜ ìƒíƒœë¥¼ ì§€ì •í•´ì•¼ 한다. STATE는 'master', 'slave' ë˜ëŠ” 'replica'ì¼ ìˆ˜ 있다. .. option:: -m, --master-host-name=NAME 현재 마스터 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ëª…ì„ ìž…ë ¥í•œë‹¤. .. option:: --list ì´ ì˜µì…˜ì€ ë°ì´í„°ë² ì´ìŠ¤ì˜ ë°±ì—… íŒŒì¼ ì •ë³´ë¥¼ 표시한다; 복구 ì ˆì°¨ëŠ” 수행하지 않는다. ë” ë§Žì€ ì •ë³´ëŠ” :ref:`restoredb` 를 ì°¸ê³ í•œë‹¤. .. option:: -B, --backup-file-path=PATH ì´ ì˜µì…˜ì„ ì´ìš©í•´ì„œ 백업 파ì¼ë“¤ì´ ìœ„ì¹˜í• ë””ë ‰í„°ë¦¬ë¥¼ ì§€ì •í• ìˆ˜ 있다. ë” ë§Žì€ ì •ë³´ëŠ” :ref:`restoredb` ì˜ -B ì˜µì…˜ì„ ì°¸ê³ í•œë‹¤. .. option:: -o, --output-file=FILE ì¶œë ¥ëœ ë©”ì„¸ì§€ë“¤ì„ ì €ìž¥í• íŒŒì¼ëª…ì„ ì§€ì •í• ìˆ˜ 있다. ë” ë§Žì€ ì •ë³´ëŠ” :ref:`restoredb` ì˜ -o ì˜µì…˜ì„ ì°¸ê³ í•œë‹¤. .. option:: -u, --use-database-location-path ì´ ì˜µì…˜ì€ databases.txtì— ì§€ì •ëœ ë°ì´í„°ë² ì´ìФ 경로로 복구를 ìˆ˜í–‰í• ê²½ìš° ì§€ì •í•œë‹¤. ë” ë§Žì€ ì •ë³´ëŠ” :ref:`restoredb` ì˜ -u ì˜µì…˜ì„ ì°¸ê³ í•œë‹¤. .. option:: -k, --keys-file-path=PATH ì´ ì˜µì…˜ì€ ë³µêµ¬ 시 필요한 키 파ì¼ì˜ 경로를 ì§€ì •í•œë‹¤. ë” ë§Žì€ ì •ë³´ëŠ” :ref:`restoredb` 를 ì°¸ê³ í•œë‹¤. ë³µì œ 구축 시나리오 ì˜ˆì œ ----------------------- ì´ ê¸€ì—서는 HA êµ¬ì„±ì„ ìš´ì˜í•˜ëŠ” ë„중 새로운 노드를 추가하거나 ì‚ì œí•˜ëŠ” 다양한 시나리오를 알아본다. .. note:: * 기본 키가 있는 í…Œì´ë¸”ë§Œ ë³µì œëœë‹¤ëŠ” ì ì— ë°˜ë“œì‹œ 주ì˜í•œë‹¤. * 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드 (ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì˜ ë³¼ë¥¨ ë””ë ‰í„°ë¦¬ë“¤ì€ ëª¨ë‘ ì¼ì¹˜í•´ì•¼ 한다는 ì ì— ì£¼ì˜í•œë‹¤. * í•˜ë‚˜ì˜ ë…¸ë“œëŠ” 다른 ë…¸ë“œë“¤ì— ëŒ€í•œ ë³µì œ 로그 ì§„í–‰ ì •ë³´ë¥¼ ëª¨ë‘ í¬í•¨í•œë‹¤. 예를 들어, 마스터 *nodeA*\와 ìŠ¬ë ˆì´ë¸Œ *nodeB*, *nodeC*\로 êµ¬ì„±ëœ HA êµ¬ì„±ì„ ê°€ì •í•˜ìž. *nodeA*\는 *nodeB*, *nodeC*\ì— ëŒ€í•œ ë³µì œ ì§„í–‰ ì •ë³´ë¥¼ ê°€ì§€ê³ ìžˆìœ¼ë©°, *nodeB*\는 *nodeA*\와 *nodeC*\ì— ëŒ€í•œ ì •ë³´ë¥¼, *nodeC*\는 *nodeA*\와 *nodeB*\ì— ëŒ€í•œ ì •ë³´ë¥¼ ê°€ì§€ê³ ìžˆë‹¤. * ì ˆì²´(failover)ê°€ ë°œìƒí•˜ì§€ 않는다는 ì „ì œ í•˜ì— ìƒˆë¡œìš´ 노드를 추가한다. 만약 ë³µì œ 구축 ë„중 ì ˆì²´ê°€ ë°œìƒí•˜ë©´ 다시 처ìŒë¶€í„° ë³µì œ êµ¬ì¶•ì„ ìˆ˜í–‰í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. * :ref:`build-slave` 한 ëŒ€ì˜ ìž¥ë¹„ë¡œë§Œ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ìš´ì˜í•˜ë‹¤ê°€ 서비스 ì •ì§€ 후 ìŠ¬ë ˆì´ë¸Œ 노드를 새로 추가한다. * :ref:`build-another-slave` 마스터 한 대, ìŠ¬ë ˆì´ë¸Œ 한 대가 êµ¬ì¶•ëœ í™˜ê²½ì—서 ê¸°ì¡´ì˜ ìŠ¬ë ˆì´ë¸Œë¥¼ 사용하여 새로운 ìŠ¬ë ˆì´ë¸Œë¥¼ 추가한다. * :ref:`remove-slave` 마스터와 2ê°œì˜ ìŠ¬ë ˆì´ë¸Œê°€ êµ¬ì¶•ëœ í™˜ê²½ì—서 í•˜ë‚˜ì˜ ìŠ¬ë ˆì´ë¸Œë¥¼ ì œê±°í•œë‹¤. * :ref:`add-replica` 마스터 한 대, ìŠ¬ë ˆì´ë¸Œ 한 대가 êµ¬ì¶•ëœ í™˜ê²½ì—서 ê¸°ì¡´ì˜ ìŠ¬ë ˆì´ë¸Œë¥¼ 사용하여 새로운 ë ˆí”Œë¦¬ì¹´ë¥¼ 추가한다. * :ref:`rebuild-slave` 마스터, ìŠ¬ë ˆì´ë¸Œ, ë ˆí”Œë¦¬ì¹´ê°€ êµ¬ì¶•ëœ í™˜ê²½ì—서 마스터를 ì´ìš©í•´ ìŠ¬ë ˆì´ë¸Œë¥¼ 재구축한다. 사용ìžì— ì˜í•´ db_ha_apply_info 카탈로그 í…Œì´ë¸”ì˜ ì •ë³´ë¥¼ 변경해야 한다. ì´ìƒì— 대해 ì¢€ë” ìžì„¸ížˆ 알아보ìž. HA 환경ì—서 ë¹„ì •ìƒ ë…¸ë“œë§Œ ìž¬êµ¬ì¶•í•˜ê³ ìž í•˜ëŠ” 경우 :ref:`rebuilding-replication`\를 ì°¸ê³ í•œë‹¤. .. note:: * ë³µì œ 구축 시 ì—¼ë‘ì— ë‘¬ì•¼ í• ì‚¬í•ì€ ìƒˆë¡œ 구축하거나, 재구축하거나, íŠ¹ì • 노드를 ì œê±°í•˜ëŠ” ëª¨ë“ ê²½ìš°, 해당 ë…¸ë“œì— ëŒ€í•œ ë³µì œ ì •ë³´ì™€ ë³µì œ 로그를 변경 ë˜ëŠ” ì‚ì œí•´ì•¼ 한다는 ì ì´ë‹¤. ë³µì œ ì •ë³´ëŠ” db_ha_apply_infoì— ì €ìž¥ë˜ë©°, ìƒëŒ€ë°© ë…¸ë“œì˜ ë³µì œ ì§„í–‰ ìƒíƒœ ì •ë³´ë¥¼ ê°€ì§€ê³ ìžˆë‹¤. 단, ë ˆí”Œë¦¬ì¹´ì˜ ê²½ìš° ì—í• ë³€ê²½(role change)ì´ ë°œìƒí•˜ì§€ 않으므로 ìƒëŒ€ë°© 노드가 ë ˆí”Œë¦¬ì¹´ ë…¸ë“œì˜ ë³µì œ ì •ë³´ì™€ ë³µì œ 로그를 ê°€ì§€ê³ ìžˆì„ í•„ìš”ê°€ 없다. 반면, ë ˆí”Œë¦¬ì¹´ëŠ” 마스터와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ì •ë³´ë¥¼ ëª¨ë‘ ê°€ì§€ê³ ìžˆë‹¤. * :ref:`rebuild-slave`\ì˜ ê²½ìš° 사용ìžê°€ ì§ì ‘ db_ha_apply_info ì •ë³´ë¥¼ 변경해야 한다. * :ref:`build-slave`\ì˜ ê²½ìš° ìŠ¬ë ˆì´ë¸Œë¥¼ 새로 구축하므로 ìžë™ ìƒì„±ë˜ëŠ” ì •ë³´ë¥¼ 그대로 사용하면 ëœë‹¤. * :ref:`build-another-slave`\, :ref:`add-replica`\ì˜ ê²½ìš° ê¸°ì¡´ì˜ ìŠ¬ë ˆì´ë¸Œë¡œë¶€í„° 백업한 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ 사용하는ë°, ê¸°ì¡´ì˜ ìŠ¬ë ˆì´ë¸Œì—는 ë§ˆìŠ¤í„°ì˜ db_ha_apply_info ì •ë³´ê°€ í¬í•¨ë˜ì–´ 있으므로 그대로 ì‚¬ìš©í• ìˆ˜ 있다. * :ref:`remove-slave`\ì˜ ê²½ìš° ì œê±°ëœ ìŠ¬ë ˆì´ë¸Œì— 대한 ë³µì œ ì •ë³´ë¥¼ 사용ìžê°€ ì§ì ‘ ì‚ì œí•´ì•¼ 한다. 하지만 ì´ ì •ë³´ê°€ 남아 있다 하ë”ë¼ë„ ë¬¸ì œê°€ ë˜ì§„ 않는다. .. _build-slave: 서비스 ì •ì§€ 후 ìŠ¬ë ˆì´ë¸Œ 추가 ---------------------------- 마스터 노드 한 대로만 ìš´ì˜í•˜ëŠ” ë„중 서비스를 ì •ì§€í•œ 후 ìŠ¬ë ˆì´ë¸Œë¥¼ 추가하여 마스터와 ìŠ¬ë ˆì´ë¸Œë¥¼ 1:1로 구성하는 경우를 알아보ìž. .. image:: /images/build_slave.png * nodeA: 마스터 노드 호스트 명 * nodeB: 새로 ì¶”ê°€í• ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 ì´ ì‹œë‚˜ë¦¬ì˜¤ì—서 ë°ì´í„°ë² ì´ìŠ¤ëŠ” ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì´ë¯¸ ìƒì„±ë˜ì–´ ìžˆë‹¤ê³ ê°€ì •í•œë‹¤. createdb 수행 시 로캘 ì´ë¦„ê³¼ 문ìžì…‹ì€ 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드가 서로 ë™ì¼í•´ì•¼ 한다. :: export CUBRID_DATABASES=/home/cubrid/DB mkdir $CUBRID_DATABASES/testdb mkdir $CUBRID_DATABASES/testdb/log cd $CUBRID_DATABASES/testdb cubrid createdb testdb -L $CUBRID_DATABASES/testdb/log en_US.utf8 백업 파ì¼ì˜ ì €ìž¥ 위치를 별ë„ì˜ ì˜µì…˜ìœ¼ë¡œ ì§€ì •í•˜ì§€ 않으면 $CUBRID_DATABASES/testdb ë””ë ‰í„°ë¦¬ê°€ ê¸°ë³¸ì´ ëœë‹¤. 브로커 노드가 별ë„ì˜ ìž¥ë¹„ì— êµ¬ì„±ë˜ì–´ ìžˆê³ ë¸Œë¡œì»¤ë¥¼ 추가하지 않는 경우, ì‘ìš© 프로그램ì—서 URLì˜ ë³€ê²½ì„ í•„ìš”ë¡œ 하지 않는다. .. note:: 브로커와 ë°ì´í„°ë² ì´ìŠ¤ì˜ ìž¥ë¹„ê°€ 분리ë˜ì–´ 있지 ì•Šì€ ê²½ìš° ë§ˆìŠ¤í„°ì˜ ìž¥ë¹„ê°€ ê³ ìž¥ë‚ ê²ƒì— ëŒ€ë¹„í•´ ìŠ¬ë ˆì´ë¸Œ 장비ì—서 브로커 ì ‘ì†ì´ 가능해야 한다. ì´ë¥¼ 위해, ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì ‘ì† URLì— altHosts를 추가해야 하며, 브로커 ì´ì¤‘화를 위해 databases.txtì˜ ì„¤ì •ì´ ë³€ê²½ë˜ì–´ì•¼ 한다. HA 환경ì—서 브로커 ì„¤ì •ì€ :ref:`ha-cubrid-broker-conf`\를 ì°¸ê³ í•œë‹¤. ì´ ì‹œë‚˜ë¦¬ì˜¤ì—서는 브로커 노드를 별ë„ì˜ ìž¥ë¹„ë¡œ 분리하지 ì•Šì€ ê²ƒìœ¼ë¡œ ê°€ì •í•œë‹¤. ì´ìƒì„ ì—¼ë‘ì— ë‘ê³ ë‹¤ìŒì˜ 순서로 작업한다. 0. 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ HA ì„¤ì • * 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드가 ë™ì¼í•˜ê²Œ **$CUBRID/conf/cubrid.conf** ì„¤ì • :: [service] service=server,broker,manager # 서비스 시작 시 구ë™ë ë°ì´í„°ë² ì´ìФ ì´ë¦„ 추가 server=testdb [common] ... # HA 구성 시 추가 (Logging parameters) force_remove_log_archives=no # HA 구성 시 추가 (HA 모드) ha_mode=on * 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드가 ë™ì¼í•˜ê²Œ **$CUBRID/conf/cubrid_ha.conf** ì„¤ì • :: [common] ha_port_id=59901 # cubrid는 HA ì‹œìŠ¤í…œì˜ ê·¸ë£¹ ì´ë¦„ì´ê³ , nodeA와 nodeB는 호스트 ì´ë¦„ìž„. ha_node_list=cubrid@nodeA:nodeB ha_db_list=testdb ha_copy_sync_mode=sync:sync ha_apply_max_mem_size=500 * 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드가 ë™ì¼í•˜ê²Œ **$CUBRID_DATABASES/databases.txt** ì„¤ì •. :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob * HA 환경ì—서 브로커, ì‘ìš© 프로그램 ì„¤ì • 브로커 ì„¤ì •ê³¼ ì‘ìš© 프로그램ì—서 URLì— altHosts를 추가하는 ê²ƒì— ëŒ€í•œ ì„¤ëª…ì€ :ref:`ha-cubrid-broker-conf`\를 ì°¸ê³ í•œë‹¤. * 마스터 노드와 ë™ì¼í•˜ê²Œ ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë¡œìº˜ ë¼ì´ë¸ŒëŸ¬ë¦¬ ì„¤ì • :: [nodeA]$ scp $CUBRID/conf/cubrid_locales.txt cubrid_usr@nodeB:$CUBRID/conf/. [nodeB]$ make_locale.sh -t64 * ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë°ì´í„°ë² ì´ìФ ë””ë ‰í„°ë¦¬ ìƒì„± :: [nodeB]$ cd $CUBRID_DATABASES [nodeB]$ mkdir testdb * ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë¡œê·¸ ë””ë ‰í„°ë¦¬ ìƒì„±(마스터 노드와 ê°™ì€ ìœ„ì¹˜ì— ìƒì„±) :: [nodeB]$ cd $CUBRID_DATABASES/testdb [nodeB]$ mkdir log 1. 마스터 노드 서비스 중지, 마스터 ë°ì´í„°ë² ì´ìФ 백업 :: [nodeA]$ cubrid service stop 마스터 ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ë°±ì—…í•˜ê³ , ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì— ë°±ì—… 파ì¼ì„ 복사한다. 마스터 노드ì—서 백업 파ì¼ì˜ ì €ìž¥ 위치는 별ë„ì˜ ì§€ì •ì´ ì—†ìœ¼ë©´ *testdb* ì˜ ë¡œê·¸ ë””ë ‰í„°ë¦¬ê°€ ë˜ë©°, ìŠ¬ë ˆì´ë¸Œ 노드ì—ë„ ë§ˆìŠ¤í„° 노드와 ê°™ì€ ìœ„ì¹˜ì— ë°±ì—… 파ì¼ì„ 복사한다. 아래ì—서 *testdb*\ _bk0v000ì€ ë°±ì—… 볼륨 파ì¼, *testdb*\ _bkvinf는 백업 볼륨 ì •ë³´ 파ì¼ì´ë‹¤. :: [nodeA]$ cubrid backupdb -z -S testdb Backup Volume Label: Level: 0, Unit: 0, Database testdb, Backup Time: Thu Apr 19 16:05:18 2012 [nodeA]$ cd $CUBRID_DATABASES/testdb/log [nodeA]$ scp testdb_bk* cubrid_usr@nodeB:$CUBRID_DATABASES/testdb/log cubrid_usr@nodeB's password: testdb_bk0v000 100% 6157KB 6.0MB/s 00:00 testdb_bkvinf 100% 66 0.1KB/s 00:00 2. ìŠ¬ë ˆì´ë¸Œ 노드ì—서 ë°ì´í„°ë² ì´ìФ 복구. ì´ë•Œ, 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë³¼ë¥¨ 경로가 반드시 같아야 한다. :: [nodeB]$ cubrid restoredb -B $CUBRID_DATABASES/testdb/log testdb 3. 마스터 노드 시작, ìŠ¬ë ˆì´ë¸Œ 노드 시작 :: [nodeA]$ cubrid heartbeat start 마스터 노드가 ì •ìƒ êµ¬ë™ë˜ì—ˆìŒì„ 확ì¸í•œ 후, ìŠ¬ë ˆì´ë¸Œ 노드를 시작한다. ì œì¼ ì•„ëž˜ì—서 *nodeA*\ì˜ stateê°€ registered_and_to_be_activeì—서 registered_and_active로 변경ë˜ë©´ 마스터 노드가 ì •ìƒ êµ¬ë™ëœ 것ì´ë‹¤. :: [nodeA]$ cubrid heartbeat status @ cubrid heartbeat status HA-Node Info (current nodeA, state master) Node nodeB (priority 2, state unknown) Node nodeA (priority 1, state master) HA-Process Info (master 123, state master) Applylogdb testdb@localhost:/home/cubrid/DB/testdb_nodeB (pid 234, state registered) Copylogdb testdb@nodeB:/home/cubrid/DB/testdb_nodeB (pid 345, state registered) Server testdb (pid 456, state registered_and_to_be_active) [nodeB]$ cubrid heartbeat start 마스터 노드, ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ HA êµ¬ì„±ì´ ì •ìƒ ë™ìž‘하는지 확ì¸í•œë‹¤. :: [nodeA]$ csql -u dba testdb@localhost -c"create table tbl(i int primary key);insert into tbl values (1),(2),(3)" [nodeB]$ csql -u dba testdb@localhost -c"select * from tbl" i ============= 1 2 3 .. _build-another-slave: 서비스 ìš´ì˜ ì¤‘ ìŠ¬ë ˆì´ë¸Œ 하나 ë” ì¶”ê°€ ------------------------------------ 다ìŒì€ 마스터:ìŠ¬ë ˆì´ë¸Œë¡œ HA 서비스 ìš´ì˜ ì¤‘ì— ê¸°ì¡´ ìŠ¬ë ˆì´ë¸Œë¡œë¶€í„° 새 ìŠ¬ë ˆì´ë¸Œë¥¼ 추가하는 시나리오ì´ë‹¤. "마스터:ìŠ¬ë ˆì´ë¸Œ"는 1:1ì—서 1:2ê°€ ëœë‹¤. .. image:: /images/build_another_slave.png * nodeA: 마스터 노드 호스트 명 * nodeB: ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 * nodeC: 새로 ì¶”ê°€í• ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 HA 서비스 ìš´ì˜ ì¤‘ ìŠ¬ë ˆì´ë¸Œë¥¼ 새로 ì¶”ê°€í•˜ë ¤ë©´ ê¸°ì¡´ì˜ ë§ˆìŠ¤í„° ë˜ëŠ” ìŠ¬ë ˆì´ë¸Œë¥¼ ì´ìš©í• 수 있는ë°, 보통 ë§ˆìŠ¤í„°ì— ë¹„í•´ ìŠ¬ë ˆì´ë¸Œê°€ ìƒëŒ€ì 으로 ë””ìŠ¤í¬ I/O 부하가 ì ë‹¤ê³ ë³´ê³ , 여기ì—서는 기존 ìŠ¬ë ˆì´ë¸Œë¥¼ ì´ìš©í•˜ì—¬ 추가로 ìŠ¬ë ˆì´ë¸Œë¥¼ 구성해보ìž. .. _build-using-slave-why: .. note:: **노드 추가 시 마스터 ëŒ€ì‹ ìŠ¬ë ˆì´ë¸Œë¥¼ ì´ìš©í• 수 있는 ì´ìœ ** 마스터 ëŒ€ì‹ ìŠ¬ë ˆì´ë¸Œë¥¼ ì´ìš©í•˜ëŠ” ê²ƒì´ ê°€ëŠ¥í•œ ì´ìœ 는, ë§ˆìŠ¤í„°ì˜ íŠ¸ëžœìžì…˜ 로그(활성 로그 + ë³´ê´€ 로그)ê°€ ìŠ¬ë ˆì´ë¸Œì— 그대로 ë³µì œë˜ë©° 마스터 ë…¸ë“œì˜ íŠ¸ëžœìžì…˜ 로그와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë³µì œ 로그(ë³µì œëœ íŠ¸ëžœìžì…˜ 로그)ê°€ 형ì‹ì´ë‚˜ ë‚´ìš© ë©´ì—서 ë™ì¼í•˜ê¸° 때문ì´ë‹¤. .. _build-initial-database: .. note:: **초기 ë°ì´í„°ë² ì´ìФ 구축** ë°ì´í„°ë² ì´ìŠ¤ëŠ” ë‹¤ìŒ ëª…ë ¹ìœ¼ë¡œ ì´ë¯¸ ìƒì„±ë˜ì–´ ìš´ì˜ë˜ê³ ìžˆë‹¤ê³ ê°€ì •í•œë‹¤. createdb 수행 시 로캘 ì´ë¦„ê³¼ 문ìžì…‹ì€ 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드가 서로 ë™ì¼í•´ì•¼ 한다. :: export CUBRID_DATABASES=/home/cubrid/DB mkdir $CUBRID_DATABASES/testdb mkdir $CUBRID_DATABASES/testdb/log cd $CUBRID_DATABASES/testdb cubrid createdb testdb -L $CUBRID_DATABASES/testdb/log en_US.utf8 ì´ë•Œ 백업 파ì¼ì€ ì €ìž¥ 위치를 별ë„ì˜ ì˜µì…˜ìœ¼ë¡œ ì§€ì •í•˜ì§€ 않으면 databases.txtì— ëª…ì‹œëœ ë¡œê·¸ ë””ë ‰í„°ë¦¬ì— ì €ìž¥ëœë‹¤. .. image:: /images/build_another_slave_process.png 0. *nodeC*\ì˜ HA ì„¤ì • * *nodeC*\는 *nodeB*\와 ë™ì¼í•˜ê²Œ **$CUBRID/conf/cubrid.conf** ì„¤ì • HA 모드로 êµ¬ë™ ì¤‘ ë³µì œë˜ì§€ ì•Šì€ ë¡œê·¸ê°€ ì‚ì œë˜ì§€ 않ë„ë¡ í•˜ê¸° 위해 반드시 "force_remove_log_archives=no"로 ì„¤ì •í•œë‹¤. :: [service] service=server,broker,manager [common] ... # HA 구성 시 추가 (Logging parameters) force_remove_log_archives=no # HA 구성 시 추가 (HA 모드) ha_mode=on * *nodeC*\는 *nodeB*\와 ë™ì¼í•˜ê²Œ **$CUBRID/conf/cubrid_ha.conf** ì„¤ì • 단, ha_node_listì— *nodeC*\를 ì¶”ê°€í•˜ê³ , ha_copy_sync_modeì— sync를 하나 ë” ì¶”ê°€í•œë‹¤. :: [common] ha_port_id=59901 # cubrid는 HA ì‹œìŠ¤í…œì˜ ê·¸ë£¹ ì´ë¦„ì´ê³ , nodeA, nodeB, nodeC는 호스트 ì´ë¦„ìž„. ha_node_list=cubrid@nodeA:nodeB:nodeC ha_db_list=testdb ha_copy_sync_mode=sync:sync:sync ha_apply_max_mem_size=500 * *nodeA*, *nodeB*\와 ë™ì¼í•˜ê²Œ *nodeC*\ì˜ ë¡œìº˜ ë¼ì´ë¸ŒëŸ¬ë¦¬ ì„¤ì • :: [nodeB]$ scp $CUBRID/conf/cubrid_locales.txt cubrid_usr@nodeC:$CUBRID/conf/. [nodeC]$ make_locale.sh -t64 * *nodeC*\ì˜ **$CUBRID_DATABASES/databases.txt**\ì—서 db-hostì— *nodeA*, *nodeB*, *nodeC* 추가 :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB:nodeC /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob **databases.txt**\ì˜ **db-host** ë¶€ë¶„ì€ ë¸Œë¡œì»¤ì—서 DB ì„œë²„ë¡œì˜ ì ‘ì† ìˆœì„œì™€ ê´€ë ¨ëœ ì„¤ì •ì´ë¯€ë¡œ ì›í•˜ëŠ”ëŒ€ë¡œ ë³€ê²½ì´ ê°€ëŠ¥í•˜ë‹¤. 예를 들어, **db-host**\ì— nodeA:nodeBë§Œ 쓰거나, localhostë§Œ ì¨ë„ ëœë‹¤. 다만, 로컬ì—서 ì ‘ì†í•˜ëŠ” 경우(csql -u dba testdb@localhost)를 ê°ì•ˆí•˜ì—¬ **db-host**\ì— localhost ë˜ëŠ” 로컬 í˜¸ìŠ¤íŠ¸ì˜ ì´ë¦„ì€ ë°˜ë“œì‹œ í¬í•¨í•œë‹¤. 1. 백업 ì´í›„ 복구 ë„중 *nodeB*\ì˜ ë³µì œ 로그 ì‚ì œ 방지를 위한 ì„¤ì • ì ìš© *nodeB*\ì—서 백업한 ì´í›„ *nodeC*\ì— ë³µêµ¬í•˜ëŠ” ë„중ì—ë„ ì„œë¹„ìŠ¤ê°€ 계ì†ëœë‹¤ë©´ *nodeB*\ì˜ ë³µì œ 로그가 추가ë 수 있는ë°, ì„¤ì •ì— ë”°ë¼ ìŠ¬ë ˆì´ë¸Œì˜ ë³µì œ 로그가 *nodeC*\ì— ë³µì œë˜ê¸°ë„ ì „ì— ì‚ì œë 수 있다. ì´ë¥¼ 방지하기 위해 다ìŒê³¼ ê°™ì€ ì„¤ì •ì„ í•œë‹¤. * *nodeB*\ì— DB ìž¬êµ¬ë™ ì—†ì´ **ha_copy_log_max_archives** ê°’ì„ í¬ê²Œ 변경 *nodeB*\ì—서 ë°±ì—…ì„ ë°›ì€ ì‹œì 부터, *nodeC*\ê°€ 구ë™í•œ ì´í›„ ë°ì´í„°ê°€ 마스터와 ë™ì¼í•´ì§ˆ 때까지 ìˆ˜í–‰ëœ íŠ¸ëžœìžì…˜ì´ ë³´ê´€ë˜ì–´ì•¼, 백업 시ì ì´í›„ì˜ íŠ¸ëžœìžì…˜ì„ *nodeC*\ì— ë°˜ì˜í• 수 있다. ë”°ë¼ì„œ, 백업 ì´í›„ ì¶”ê°€ëœ *nodeB*\ì˜ ë³µì œ 로그는 ìœ ì§€ë˜ì–´ì•¼ 한다. 여기서는 *nodeC* 구축 시간 ë™ì•ˆ 수행ë˜ëŠ” 트랜ìžì…˜ì„ 충분히 ë³´ê´€í• ìˆ˜ 있는 ë³µì œ 로그 개수를 5ë¼ê³ ê°€ì •í•œë‹¤. **$CUBRID/conf/cubrid_ha.conf** 편집 :: ha_copy_log_max_archives=5 *nodeB*\ì˜ applylogdb í”„ë¡œì„¸ìŠ¤ì— **ha_copy_log_max_archives** 파ë¼ë¯¸í„° 변경 ë‚´ì— ë°˜ì˜ :: [nodeB]$ cubrid heartbeat applylogdb stop testdb nodeA [nodeB]$ cubrid heartbeat applylogdb start testdb nodeA .. note:: 마스터 ë…¸ë“œì¸ *nodeA*\ë§Œ 사용하여 *nodeC*\를 구축한다면 *nodeB*\ì—서 ë³µì œ 로그를 복사하는 ìž‘ì—…ì€ ë¶ˆí•„ìš”í•˜ë¯€ë¡œ, *nodeB*\ì—서 **ha_copy_log_max_archives**\를 변경하는 작업 ì—시 불필요하다. ëŒ€ì‹ *nodeA*\ì— ë³€ê²½ëœ **log_max_archives**\를 ì 용해야 한다. cubrid.confì˜ **log_max_archives** 파ë¼ë¯¸í„°ëŠ” "SET SYSTEM PARAMETERS" 구문만으로 서비스 중 ë³€ê²½ì´ ê°€ëŠ¥í•˜ë‹¤. :: [nodeA]$ csql -u dba -c "SET SYSTEM PARAMETERS 'log_max_archives=5'" testdb@localhost 2. *nodeB*\ì—서 백업, *nodeC*\ì— ë³µêµ¬ * *nodeB* 백업 :: [nodeB]$ cd $CUBRID_DATABASES/testdb/log [nodeB]$ cubrid backupdb --sleep-msecs=10 -C -o output.txt testdb@localhost .. _sleep-msecs: .. note:: **\-\-sleep-msecs**\는 1MBì˜ ë°±ì—… 파ì¼ì´ 쓰여질 때마다 쉬는 ì‹œê°„ì„ ì„¤ì •í•˜ëŠ” 옵션으로, 단위는 밀리초ì´ë‹¤. ë°±ì—…í• ìž¥ë¹„ì˜ ë””ìŠ¤í¬ I/O 부하가 심한 경우 ì´ ê°’ì„ ì„¤ì •í•˜ëŠ” ê²ƒì„ ê³ ë ¤í•˜ë˜, ì´ ê°’ì´ í´ìˆ˜ë¡ 백업 ì‹œê°„ì´ ê¸¸ì–´ì§€ë¯€ë¡œ 가급ì ì´ë©´ 부하가 ì ì€ ì‹œê°„ëŒ€ì— ë°±ì—…í•˜ê³ ì´ ê°’ì€ ìž‘ê²Œ ì„¤ì •í• ê²ƒì„ ê¶Œìž¥í•œë‹¤. *nodeB*\ì˜ ë¶€í•˜ê°€ ì „í˜€ 없는 ìƒíƒœë¼ë©´ ì´ ì˜µì…˜ì„ ìƒëžµí•´ë„ 무방하다. -o 옵션으로 명시한 파ì¼ì—는 백업 ê²°ê³¼ ì •ë³´ê°€ 기ë¡ëœë‹¤. * 백업 파ì¼ì„ *nodeC*\ì— ë³µì‚¬ :: [nodeB]$ cd $CUBRID_DATABASES/testdb/log [nodeB]$ scp -l 131072 testdb_bk* cubrid_usr@nodeC:$CUBRID_DATABASES/testdb/log .. note:: scp ëª…ë ¹ì˜ -l ì˜µì…˜ì€ ë³µì‚¬ëŸ‰ì„ ì¡°ì ˆí•˜ëŠ” 옵션으로, 노드 ê°„ íŒŒì¼ ë³µì‚¬ 시 I/O 부하를 ê°ì•ˆí•˜ì—¬ ì´ ì˜µì…˜ì„ ì ì ˆížˆ 부여하ë„ë¡ í•œë‹¤. 단위는 Kbitsì´ë©°, 131072는 16MBì´ë‹¤. * *nodeC*\ì—서 복구를 수행 ì´ë•Œ, 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë³¼ë¥¨ 경로가 반드시 같아야 한다. :: [nodeC]$ cubrid restoredb -B $CUBRID_DATABASES/testdb/log testdb 3. *nodeA*\ì˜ í™œì„± 로그(active log)를 *nodeC*\ì— ë³µì‚¬ *nodeA*\ì˜ í™œì„± 로그ì—는 ìµœê·¼ì— ìƒì„±ëœ ë³´ê´€ ë¡œê·¸ì˜ ë²ˆí˜¸ ì •ë³´ê°€ 들어 있다. 활성 로그를 복사한 시ì ì´í›„ì— ìƒì„±ë˜ëŠ” ë³´ê´€ 로그가 *nodeC*\ì˜ HA êµ¬ë™ í›„ copylogdbì— ì˜í•´ ìžë™ìœ¼ë¡œ 복사ë˜ë ¤ë©´ 해당 ì •ë³´ê°€ 필요하므로, 사용ìžëŠ” 활성 로그 복사 ì´ì „ì— ìƒì„±ëœ ë³´ê´€ 로그만 수ë™ìœ¼ë¡œ 복사하면 ëœë‹¤. * *nodeC*\ì—서 HA ì—°ê²°ì„ ê´€ë¦¬í•˜ëŠ” cub_master êµ¬ë™ :: [nodeC]$ cub_master * *nodeA*\ì— ëŒ€í•œ copylogdb 프로세스 êµ¬ë™ :: [nodeC]$ cubrid heartbeat copylogdb start testdb nodeA * *nodeA*\ì˜ í™œì„± 로그가 복사ë˜ì—ˆìŒì„ í™•ì¸ í˜„ 시ì ì˜ í™œì„± 로그를 복사해 온다는 ê²ƒì€ ìµœê·¼ì— ìƒì„±ëœ ë³´ê´€ 로그 번호 ì •ë³´ë¥¼ íšë“한다는 ì˜ë¯¸ì´ë‹¤. ì´í›„ì— ìƒì„±ë˜ëŠ” ë³´ê´€ 로그는 [5. *nodeC*\ì—서 HA 서비스를 구ë™] ê³¼ì • ì´í›„ ìžë™ìœ¼ë¡œ 복사ëœë‹¤. :: [nodeC]$ cd $CUBRID_DATABASES/testdb_nodeA [nodeC]$ ls testdb_lgar_t testdb_lgat testdb_lgat__lock * *nodeC*\ì—서 *nodeA*\ì— ëŒ€í•œ copylogdb 프로세스 ì •ì§€ :: [nodeC]$ cubrid heartbeat copylogdb stop testdb nodeA * *nodeC*\ì˜ cub_master ì •ì§€ :: [nodeC]$ cubrid service stop 4. *nodeC*\ì— ë°ì´í„°ë² ì´ìФ 복구 ì´í›„ 필요한 로그 íŒŒì¼ ë³µì‚¬ * *nodeB*\ì˜ ë³µì œëœ ë³´ê´€ 로그(replicated archive log) ì „ë¶€ë¥¼ *nodeC*\ì— ë³µì‚¬ :: [nodeC]$ cd $CUBRID_DATABASES/testdb_nodeA [nodeC]$ scp -l 131072 cubrid@nodeB:$CUBRID_DATABASES/testdb_nodeA/testdb_lgar0* . ì´ ê³¼ì •ì—서는 ë³µì œì— í•„ìš”í•œ ë³µì œ ë³´ê´€ 로그가 ì „ë¶€ 존재해야 한다는 ì ì— ì£¼ì˜í•œë‹¤. .. note:: scp ëª…ë ¹ì˜ -l ì˜µì…˜ì€ ë³µì‚¬ëŸ‰ì„ ì¡°ì ˆí•˜ëŠ” 옵션으로, 노드 ê°„ íŒŒì¼ ë³µì‚¬ 시 I/O 부하를 ê°ì•ˆí•˜ì—¬ ì´ ì˜µì…˜ì„ ì ì ˆížˆ 부여하ë„ë¡ í•œë‹¤. 단위는 Kbitsì´ë©°, 131072는 16MBì´ë‹¤. .. note:: íŒŒì¼ ì´ë¦„ì´ ìˆ«ìžë¡œ ë나는 파ì¼ë§Œ 복사한다. 여기ì—서는 ë³µì œ 로그 íŒŒì¼ ì´ë¦„ì˜ ë²ˆí˜¸ê°€ ëª¨ë‘ 0으로 시작하기 ë•Œë¬¸ì— testdb_lgar0*\ì„ ë³µì‚¬í–ˆë‹¤. .. _check-replication-log: .. note:: **필요한 ë³µì œ 로그가 ì´ë¯¸ ì‚ì œëœ ê²½ìš° 대처 방안** **ha_copy_log_max_archives**\ì˜ ê°’ì´ ì¶©ë¶„ížˆ í¬ì§€ ì•Šì€ ê²½ìš° 백업 시ê°ê³¼ 활성 로그 ìƒì„± ì‹œê° ì‚¬ì´ì— ìƒì„±ëœ ë³µì œ 로그가 ì‚ì œë 수 있는ë°, ì´ ê²½ìš° 아래 [5. *nodeC*\ì—서 HA 서비스를 구ë™] ê³¼ì •ì—서 오류가 ë°œìƒí• 수 있다. 오류가 ë°œìƒí•œ 경우, 필요한 로그가 ë§ˆìŠ¤í„°ì— ì¡´ìž¬í•œë‹¤ë©´ 추가로 복사해서 *nodeC*\ì˜ HA를 재구ë™í•œë‹¤. 예를 들어, 마스터ì—는 ë³´ê´€ 로그 #1, #2, #3 ì´ ìžˆê³ ìŠ¬ë ˆì´ë¸Œì—는 ë³µì œëœ ë³´ê´€ 로그 #2, #3ë§Œ 존재하며 #1ì´ ì¶”ê°€ë¡œ 필요하다면 마스터ì—서 #1ì„ ë³µì‚¬í•´ë„ ëœë‹¤. 그러나, ë§ˆìŠ¤í„°ì˜ ë³´ê´€ 로그 파ì¼ì´ ë” ë§Žì´ ë‚¨ëŠ” 경우는 ë§ˆìŠ¤í„°ì˜ **log_max_archives** ê°’ì´ ì¶©ë¶„ížˆ í° ê²½ìš°ì—ë§Œ ë°œìƒí• 수 있는 ìƒí™©ì´ë‹¤. 만약 ë§ˆìŠ¤í„°ì˜ ë³´ê´€ 로그ì—ë„ ì›í•˜ëŠ” ë²ˆí˜¸ì˜ ë³´ê´€ 로그가 없다면 **ha_copy_log_max_archives**\ì˜ ê°’ì„ ì¶©ë¶„ížˆ í¬ê²Œ 한 후 백업 ë° ë³µêµ¬ë¥¼ 처ìŒë¶€í„° 다시 진행한다. .. note:: **필요로 하는 ë³µì œ 로그 ì‚ì œ 여부 확ì¸** 필요로 하는 ë³µì œ 로그가 ì´ë¯¸ ì‚ì œë˜ì—ˆëŠ”ì§€ 여부는 testdb_lginf 파ì¼ì„ 사용하여 확ì¸í• 수 있다. 1. ìŠ¬ë ˆì´ë¸Œì—서 백업한 ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ë³µì›í•œ 경우ë¼ë©´, ë³µì›ëœ ë°ì´í„°ë² ì´ìŠ¤ì˜ db_ha_apply_info 카탈로그 í…Œì´ë¸”ì—서 required_lsa_pageid를 통해 마스터 ë°ì´í„°ë² ì´ìŠ¤ì˜ ì–´ëŠ íŽ˜ì´ì§€ë¶€í„° 필요한지 확ì¸í• 수 있다. 2. 마스터ì—서 $CUBRID_DATABASES/testdb/log ë””ë ‰í„°ë¦¬ì— ìžˆëŠ” testdb_lginf 파ì¼ì˜ ë‚´ìš©ì„ ê°€ìž¥ 아래ì—서부터 확ì¸í•´ 나간다. :: Time: 03/16/15 17:44:23.767 - COMMENT: CUBRID/LogInfo for database /home/cubrid/DB/databases/testdb/testdb Time: 03/16/15 17:44:23.767 - ACTIVE: /home/cubrid/DB/databases/testdb/log/testdb_lgat 1280 pages Time: 03/16/15 17:54:40.892 - ARCHIVE: 0 /home/cubrid/DB/databases/testdb/log/testdb_lgar000 0 1277 Time: 03/16/15 17:57:29.451 - COMMENT: Log archive /home/cubrid/DB/databases/testdb/log/testdb_lgar000 is not needed any longer unless a database media crash occurs. Time: 03/16/15 18:03:08.166 - ARCHIVE: 1 /home/cubrid/DB/databases/testdb/log/testdb_lgar001 1278 2555 Time: 03/16/15 18:03:08.167 - COMMENT: Log archive /home/cubrid/DB/databases/testdb/log/testdb_lgar000, which contains log pages before 2556, is not needed any longer by any HA utilities. Time: 03/16/15 18:03:29.378 - COMMENT: Log archive /home/cubrid/DB/databases/testdb/log/testdb_lgar001 is not needed any longer unless a database media crash occurs. testdb_lginf 파ì¼ì˜ ë‚´ìš©ì´ ìœ„ì™€ ê°™ì´ ê¸°ë¡ë˜ì–´ ìžˆì„ ë•Œ, "Time: 03/16/15 17:54:40.892 - ARCHIVE: 0 /home/cubrid/DB/databases/testdb/log/testdb_lgar000 0 1277"ì˜ ë’¤ ë‘ ê°œì˜ ìˆ«ìžëŠ” 해당 파ì¼ì´ ì €ìž¥í•˜ê³ ìžˆëŠ” 페ì´ì§€ì˜ 시작 ID와 ë IDì´ë‹¤. 예를 들어, db_ha_apply_info를 통해 확ì¸í•œ 백업 당시 페ì´ì§€ IDê°€ 2300번ì´ë¼ë©´ "testdb_lgar001 1278 2555"ì„ í†µí•´ 1278번과 2555번 사ì´ì˜ 페ì´ì§€ IDìž„ì„ í™•ì¸í• 수 있으므로, ë³µì› ì‹œ ë§ˆìŠ¤í„°ì˜ ë³´ê´€ 로그 (ë˜ëŠ” ìŠ¬ë ˆì´ë¸Œì˜ ë³µì œëœ ë³´ê´€ 로그)는 1번부터 필요하다는 ê²ƒì„ ì•Œ 수 있다. 5. *nodeC*\ì—서 HA 서비스를 êµ¬ë™ :: [nodeC]$ cubrid heartbeat start 6. *nodeA*, *nodeB*\ì˜ HA ì„¤ì • 변경 * *nodeB*\ì˜ ha_copy_log_max_archive ì„¤ì • ì›ë³µ :: [nodeB]$ vi cubrid_ha.conf ha_copy_log_max_archives=1 * *nodeB*\ì˜ applylogdb í”„ë¡œì„¸ìŠ¤ì— ha_copy_log_max_archives 파ë¼ë¯¸í„° 변경 ë‚´ì— ë°˜ì˜ :: [nodeB]$ cubrid heartbeat applylogdb stop testdb nodeA [nodeB]$ cubrid heartbeat applylogdb start testdb nodeA * *nodeA*, *nodeB*\ì˜ cubrid_ha.confì—서 ha_node_listì— *nodeC*\를 ì¶”ê°€í•˜ê³ , ha_copy_sync_modeì— sync를 하나 ë” ì¶”ê°€ :: $ cd $CUBRID/conf $ vi cubrid_ha.conf ha_node_list=cubrid@nodeA:nodeB:nodeC ha_copy_sync_mode=sync:sync:sync * ë³€ê²½ëœ ha_node_list를 ì ìš© :: [nodeA]$ cubrid heartbeat reload [nodeB]$ cubrid heartbeat reload * *nodeC*\ì— ëŒ€í•œ coplylogdb, applylogdb êµ¬ë™ :: [nodeA]$ cubrid heartbeat repl start nodeC [nodeB]$ cubrid heartbeat repl start nodeC 7. 브로커 추가 ë° ì‘ìš© 프로그램 URLì˜ altHostsì— ì¶”ê°€ëœ ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ 추가 í•„ìš”ì— ë”°ë¼ ë¸Œë¡œì»¤ë¥¼ ì¶”ê°€í•˜ê³ , ì¶”ê°€ëœ ë¸Œë¡œì»¤ì— ì ‘ì†í•˜ê¸° 위해 ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ URL ì†ì„±ì¸ altHostsì— ì¶”ê°€ëœ ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ì¶”ê°€í•œë‹¤. ë¸Œë¡œì»¤ì˜ ì¶”ê°€ë¥¼ ê³ ë ¤í•˜ì§€ ì•Šê³ ìžˆë‹¤ë©´ ì´ ìž‘ì—…ì„ í•˜ì§€ ì•Šì•„ë„ ëœë‹¤. * *nodeA*, *nodeB* ëª¨ë‘ **$CUBRID_DATABASES/databases.txt**\ì—서 db-hostì— *nodeC* 추가 :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB:nodeC /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob **databases.txt**\ì˜ **db-host** ë¶€ë¶„ì€ ë¸Œë¡œì»¤ì—서 DB ì„œë²„ë¡œì˜ ì ‘ì† ìˆœì„œì™€ ê´€ë ¨ëœ ì„¤ì •ì´ë¯€ë¡œ ì›í•˜ëŠ”ëŒ€ë¡œ ë³€ê²½ì´ ê°€ëŠ¥í•˜ë‹¤. 예를 들어, **db-host**\ì— nodeA:nodeBë§Œ 쓰거나, localhostë§Œ ì¨ë„ ëœë‹¤. 다만, 로컬ì—서 ì ‘ì†í•˜ëŠ” 경우(csql -u dba testdb@localhost)를 ê°ì•ˆí•˜ì—¬ **db-host**\ì— localhost ë˜ëŠ” 로컬 호스트 ì´ë¦„ì€ ë°˜ë“œì‹œ í¬í•¨í•œë‹¤. .. _remove-slave: 서비스 ìš´ì˜ ì¤‘ ìŠ¬ë ˆì´ë¸Œ ì œê±° ---------------------------- "마스터:ìŠ¬ë ˆì´ë¸Œ=1:2"로 êµ¬ì„±ëœ í™˜ê²½ì—서 í•˜ë‚˜ì˜ ìŠ¬ë ˆì´ë¸Œë¥¼ ì œê±°í•´ë³´ìž. .. image:: /images/remove_slave.png * nodeA: 마스터 노드 호스트 명 * nodeB: ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 * nodeC: ì œê±°í• ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 .. image:: /images/remove_slave_process.png 1. *nodeC* ì •ì§€ :: $ cubrid heartbeat stop # heartbeat와 ê´€ë ¨ëœ í”„ë¡œì„¸ìŠ¤ë“¤ (applylogdb, copylogdb, cub_server) ì •ì§€ $ cubrid service stop # cub_master, cub_broker, cub_manager ë“±ì˜ êµ¬ë™ ì •ì§€ 2. *nodeA*, *nodeB*\ì˜ ì„¤ì •ì—서 *nodeC* ì œê±° * *nodeA*, *nodeB*\ì˜ cubrid_ha.confì—서 ha_node_listì˜ *nodeC* ì œê±°, ha_copy_sync_modeì˜ sync 하나 ì œê±° :: $ vi cubrid_ha.conf ha_node_list=cubrid@nodeA:nodeB ha_copy_sync_mode=sync:sync * ë³€ê²½ëœ ha_node_list를 ì ìš© ë§ˆìŠ¤í„°ì¸ *nodeA*\ì—는 "reload" ëª…ë ¹ì„ ì‚¬ìš©í•œë‹¤. :: [nodeA]$ cubrid heartbeat reload ìŠ¬ë ˆì´ë¸Œì¸ *nodeB*\ì—는 "stop/start" ëª…ë ¹ì„ ì‚¬ìš©í•œë‹¤. :: [nodeB]$ cubrid heartbeat stop [nodeB]$ cubrid heartbeat start * *nodeC*\ì— ëŒ€í•œ copylogdb, applylogdb 프로세스 ì •ì§€ :: [nodeA]$ cubrid heartbeat repl stop nodeC [nodeB]$ cubrid heartbeat repl stop nodeC * *nodeA*, *nodeB*\ì—서 *nodeC*\ì— ëŒ€í•œ ë³µì œ 로그 ì œê±° :: $ cd $CUBRID_DATABASES $ rm -rf testdb_nodeC * *nodeA*, *nodeB*\ì—서 *nodeC*\ì— ëŒ€í•œ ë³µì œ ì •ë³´ ì œê±° csql 실행 시 **\-\-sysadm** 옵션과 **\-\-write-on-standby** ì˜µì…˜ì„ ì£¼ì–´ì•¼ ìŠ¬ë ˆì´ë¸Œì—서 DELETE ì—°ì‚°ì„ ìˆ˜í–‰í• ìˆ˜ 있다. :: $ csql -u dba --sysadm --write-on-standby testdb@localhost sysadm> DELETE FROM db_ha_apply_info WHERE copied_log_path='/home/cubrid/DB/databases/testdb_nodeC'; copied_log_path는 ë³µì œ 로그 파ì¼ì´ ì €ìž¥ëœ ê²½ë¡œë¥¼ 나타낸다. 3. 브로커 ì„¤ì •ì—서 *nodeC* ì œê±° * *nodeA*, *nodeB*\ì˜ databases.txtì—서 db-hostì— *nodeC*\ê°€ í¬í•¨ë˜ì–´ 있는 경우, *nodeC*\를 ì œê±° :: $ cd $CUBRID_DATABASES $ vi databases.txt #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob * *nodeA*, *nodeB*\ì˜ ë¸Œë¡œì»¤ ìž¬êµ¬ë™ :: $ cubrid broker restart .. note:: *nodeC*\ê°€ ì¢…ë£Œëœ ìƒíƒœì´ë¯€ë¡œ ì‘ìš© í”„ë¡œê·¸ëž¨ì´ *nodeC* ë°ì´í„°ë² ì´ìŠ¤ì— ì ‘ì†ë˜ì§€ëŠ” ì•Šì„ ê²ƒì´ë©°, ë”°ë¼ì„œ 브로커 재구ë™ì„ 서ë‘를 필요는 없다. 브로커 ìž¬êµ¬ë™ ì‹œ 해당 ë¸Œë¡œì»¤ì— ì—°ê²°ëœ ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì—°ê²°ì´ ëŠì–´ì§ˆ 수 있ìŒì„ ê°ì•ˆí•´ì•¼ 한다. ë˜í•œ, ë™ì¼í•œ ì„¤ì •ì˜ ë¸Œë¡œì»¤ê°€ 다중으로 존재하는 경우 í•˜ë‚˜ì˜ ë¸Œë¡œì»¤ê°€ 다른 브로커를 ëŒ€ì‹ í• ìˆ˜ 있으므로 브로커를 하나씩 재구ë™í•˜ë„ë¡ í•œë‹¤. 예를 들어, ìœ„ì˜ ì„¤ì •ì—서는 *nodeA*\와 *nodeB*\ì— ë¸Œë¡œì»¤ê°€ ë™ì¼í•˜ê²Œ ì„¤ì •ë˜ì–´ 있으므로, *nodeB*\를 재구ë™í•œ ì´í›„ *nodeA*\를 재구ë™í•˜ë„ë¡ í•œë‹¤. .. _add-replica: 서비스 ìš´ì˜ ì¤‘ ë ˆí”Œë¦¬ì¹´ 추가 ---------------------------- "마스터:ìŠ¬ë ˆì´ë¸Œ=1:1" 구성ì—서 ìŠ¬ë ˆì´ë¸Œë¥¼ ì´ìš©í•´ ë ˆí”Œë¦¬ì¹´ë¥¼ 추가해 ë³´ìž. 초기 ë°ì´í„°ë² ì´ìФ ì„¤ì •ì€ :ref:`build-another-slave`\ì˜ :ref:`초기 ë°ì´í„°ë² ì´ìФ 구축 <build-initial-database>`\ì—서 ì„¤ì •í•œ 것과 ë™ì¼í•˜ë‹¤. .. image:: /images/add_replica.png * nodeA: 마스터 노드 호스트 명 * nodeB: ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 * nodeC: 새로 ì¶”ê°€í• ë ˆí”Œë¦¬ì¹´ 노드 호스트 명 .. image:: /images/add_replica_process.png 0. *nodeC*\ì˜ HA ì„¤ì • * *nodeC*\는 ha_mode를 ì œì™¸í•˜ê³ ëŠ” *nodeB*\와 ë™ì¼í•˜ê²Œ **$CUBRID/conf/cubrid.conf** ì„¤ì • ha_mode=replica로 ì„¤ì •í•œë‹¤. :: [service] service=server,broker,manager [common] # HA 구성 시 추가 (HA 모드) ha_mode=replica .. note:: ë ˆí”Œë¦¬ì¹´ì˜ íŠ¸ëžœìžì…˜ 로그는 ë³µì œì— ì‚¬ìš©ë˜ì§€ 않으므로, force_remove_log_archivesì˜ ì„¤ì •ì´ ë¬´ì—‡ì´ë“ í•ìƒ yes로 ë™ìž‘한다. * *nodeC*\ì˜ **$CUBRID/conf/cubrid_ha.conf** ì„¤ì • ha_replica_listì— *nodeC*\를 추가한다. :: [common] ha_port_id=59901 # cubrid는 HA ì‹œìŠ¤í…œì˜ ê·¸ë£¹ ì´ë¦„ì´ê³ , nodeA, nodeB, nodeC는 호스트 ì´ë¦„ìž„. ha_node_list=cubrid@nodeA:nodeB ha_replica_list=cubrid@nodeC ha_db_list=testdb ha_copy_sync_mode=sync:sync ha_apply_max_mem_size=500 * *nodeA*, *nodeB*\와 ë™ì¼í•˜ê²Œ *nodeC*\ì˜ ë¡œìº˜ ë¼ì´ë¸ŒëŸ¬ë¦¬ ì„¤ì • :: [nodeB]$ scp $CUBRID/conf/cubrid_locales.txt cubrid_usr@nodeC:$CUBRID/conf/. [nodeC]$ make_locale.sh -t64 * *nodeC*\ì˜ **$CUBRID_DATABASES/databases.txt**\ì—서 db-hostì— *nodeC* ì§€ì • :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeC /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob **databases.txt**\ì˜ **db-host** ë¶€ë¶„ì€ ë¸Œë¡œì»¤ì—서 DB ì„œë²„ë¡œì˜ ì ‘ì† ìˆœì„œì™€ ê´€ë ¨ëœ ì„¤ì •ì´ë¯€ë¡œ ì›í•˜ëŠ”ëŒ€ë¡œ ë³€ê²½ì´ ê°€ëŠ¥í•˜ë‹¤. 예를 들어, **db-host**\ì— nodeA:nodeBë§Œ 쓰거나, localhostë§Œ ì¨ë„ ëœë‹¤. 다만, 로컬ì—서 ì ‘ì†í•˜ëŠ” 경우(csql -u dba testdb@localhost)를 ê°ì•ˆí•˜ì—¬ **db-host**\ì— localhost ë˜ëŠ” 로컬 í˜¸ìŠ¤íŠ¸ì˜ ì´ë¦„ì€ ë°˜ë“œì‹œ í¬í•¨í•œë‹¤. 1. 백업 ì´í›„ 복구 ë„중 *nodeB*\ì˜ ë³µì œ 로그 ì‚ì œ 방지를 위한 ì„¤ì • ì ìš© *nodeB*\ì—서 백업한 ì´í›„ *nodeC*\ì— ë³µêµ¬í•˜ëŠ” ë„중ì—ë„ ì„œë¹„ìŠ¤ê°€ 계ì†ëœë‹¤ë©´, 복구 ì´í›„ì—ë„ *nodeB*\ì˜ ë³µì œ 로그가 추가ë 수 있는ë°, ì„¤ì •ì— ë”°ë¼ *nodeC*\ì— í•„ìš”í•œ ë³µì œ 로그 ì¼ë¶€ê°€ ì‚ì œë 수 있다. ì´ë¥¼ 방지하기 위해 다ìŒê³¼ ê°™ì€ ì„¤ì •ì„ í•œë‹¤. * *nodeB*\ì— DB ìž¬êµ¬ë™ ì—†ì´ **ha_copy_log_max_archives** ê°’ì„ í¬ê²Œ 변경 *nodeB*\ì˜ ë°±ì—… ë°ì´í„°ë¥¼ ë³µì›í•œ *nodeC*\ì˜ ë°ì´í„°ê°€ 마스터(*nodeA*)와 ë™ì¼í•´ì§ˆ ë•Œê¹Œì§€ì˜ íŠ¸ëžœìžì…˜ì´ ë³´ê´€ë˜ì–´ì•¼, 백업 시ì ì´í›„ì˜ íŠ¸ëžœìžì…˜ì„ *nodeC*\ì— ë°˜ì˜í• 수 있다. ë”°ë¼ì„œ, 백업 ì´í›„ ì¶”ê°€ëœ *nodeB*\ì˜ ë³µì œ 로그는 ìœ ì§€ë˜ì–´ì•¼ 한다. 여기서는 *nodeC* 구축 시간 ë™ì•ˆ 수행ë˜ëŠ” 트랜ìžì…˜ì„ 충분히 ë³´ê´€í• ìˆ˜ 있는 ë³µì œ 로그 개수를 5ë¼ê³ ê°€ì •í•œë‹¤. **$CUBRID/conf/cubrid_ha.conf** 편집 :: ha_copy_log_max_archives=5 *nodeB*\ì˜ applylogdb í”„ë¡œì„¸ìŠ¤ì— ha_copy_log_max_archives 파ë¼ë¯¸í„° 변경 ë‚´ì— ë°˜ì˜ :: [nodeB]$ cubrid heartbeat applylogdb stop testdb nodeA [nodeB]$ cubrid heartbeat applylogdb start testdb nodeA .. note:: 마스터 ë…¸ë“œì¸ *nodeA*\ë§Œ 사용하여 *nodeC*\를 구축한다면 *nodeB*\ì—서 ë³µì œ 로그를 복사하는 ìž‘ì—…ì€ ë¶ˆí•„ìš”í•˜ë¯€ë¡œ, *nodeB*\ì—서 **ha_copy_log_max_archives**\를 변경하는 작업 ì—시 불필요하다. ëŒ€ì‹ *nodeA*\ì— ë³€ê²½ëœ **log_max_archives**\를 ì 용하여야 한다. cubrid.confì˜ **log_max_archives** 파ë¼ë¯¸í„°ëŠ” "SET SYSTEM PARAMETERS" 구문만으로 서비스 중 ë³€ê²½ì´ ê°€ëŠ¥í•˜ë‹¤. :: [nodeA]$ csql -u dba -c "SET SYSTEM PARAMETERS 'log_max_archives=5'" testdb@localhost 2. *nodeB*\ì˜ ë°±ì—… ë° *nodeC*\ì˜ ë³µêµ¬ * *nodeB* 백업 :: [nodeB]$ cd $CUBRID_DATABASES/testdb/log [nodeB]$ cubrid backupdb --sleep-msecs=10 -C -o output.txt testdb@localhost .. note:: :ref:`build-another-slave`\ì˜ :ref:`--sleep-msecs <sleep-msecs>`\ì— ëŒ€í•œ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. * 백업 파ì¼ì„ *nodeC*\ì— ë³µì‚¬ :: [nodeB]$ cd $CUBRID_DATABASES/testdb/log [nodeB]$ scp -l 131072 testdb_bk* cubrid_usr@nodeC:$CUBRID_DATABASES/testdb/log .. note:: scp ëª…ë ¹ì˜ -l ì˜µì…˜ì€ ë³µì‚¬ëŸ‰ì„ ì¡°ì ˆí•˜ëŠ” 옵션으로, 노드 ê°„ íŒŒì¼ ë³µì‚¬ 시 I/O 부하를 ê°ì•ˆí•˜ì—¬ ì´ ì˜µì…˜ì„ ì ì ˆížˆ 부여하ë„ë¡ í•œë‹¤. 단위는 Kbitsì´ë©°, 131072는 16MBì´ë‹¤. * *nodeC*\ì—서 복구를 수행 ì´ë•Œ, 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë³¼ë¥¨ 경로가 반드시 같아야 한다. :: [nodeC]$ cubrid restoredb -B $CUBRID_DATABASES/testdb/log testdb 3. *nodeA*\ì˜ í™œì„± 로그(active log)를 *nodeC*\ì— ë³µì‚¬ *nodeA*\ì˜ í™œì„± 로그ì—는 ìµœê·¼ì— ìƒì„±ëœ ë³´ê´€ ë¡œê·¸ì˜ ë²ˆí˜¸ ì •ë³´ê°€ 들어 있다. 활성 로그를 복사한 시ì ì´í›„ì— ìƒì„±ë˜ëŠ” ë³´ê´€ 로그가 *nodeC*\ì˜ HA êµ¬ë™ í›„ copylogdbì— ì˜í•´ ìžë™ìœ¼ë¡œ 복사ë˜ë ¤ë©´ ì´ ì •ë³´ê°€ 필요하므로, 사용ìžëŠ” 활성 로그 복사 ì´ì „ì— ìƒì„±ëœ ë³´ê´€ 로그만 수ë™ìœ¼ë¡œ 복사하면 ëœë‹¤. * *nodeC*\ì—서 HA ì—°ê²°ì„ ê´€ë¦¬í•˜ëŠ” cub_master êµ¬ë™ :: [nodeC]$ cub_master * *nodeA*\ì— ëŒ€í•œ copylogdb 프로세스 êµ¬ë™ :: [nodeC]$ cubrid heartbeat copylogdb start testdb nodeA * *nodeA*\ì˜ í™œì„± 로그가 복사ë˜ì—ˆìŒì„ í™•ì¸ í˜„ 시ì ì˜ í™œì„± 로그를 복사해 온다는 ê²ƒì€ í˜„ 시ì 까지 ìƒì„±ëœ ë³´ê´€ 로그 번호 ì •ë³´ë¥¼ íšë“한다는 ì˜ë¯¸ì´ë‹¤. ì´í›„ì— ìƒì„±ë˜ëŠ” ë³´ê´€ 로그는 [5. *nodeC*\ì—서 HA 서비스를 구ë™] ê³¼ì • ì´í›„ ìžë™ìœ¼ë¡œ 복사ëœë‹¤. :: [nodeC]$ cd $CUBRID_DATABASES/testdb_nodeA [nodeC]$ ls testdb_lgar_t testdb_lgat testdb_lgat__lock * *nodeC*\ì—서 *nodeA*\ì— ëŒ€í•œ copylogdb 프로세스 ì •ì§€ :: [nodeC]$ cubrid heartbeat copylogdb stop testdb nodeA * *nodeC*\ì˜ cub_master ì •ì§€ :: [nodeC]$ cubrid service stop 4. *nodeC*\ì— ë°ì´í„°ë² ì´ìФ 복구 ì´í›„ 필요한 로그 íŒŒì¼ ë³µì‚¬ * *nodeB*\ì˜ ë³µì œëœ ë³´ê´€ 로그(replicated archive log) ì „ë¶€ë¥¼ *nodeC*\ì— ë³µì‚¬ :: [nodeC]$ cd $CUBRID_DATABASES/testdb_nodeA [nodeC]$ scp -l 131072 cubrid@nodeB:$CUBRID_DATABASES/testdb_nodeA/testdb_lgar0* . ì´ ê³¼ì •ì—서는 ë³µì œì— í•„ìš”í•œ ë³µì œ ë³´ê´€ 로그가 ì „ë¶€ 존재해야 한다는 ì ì— ì£¼ì˜í•œë‹¤. .. note:: scp ëª…ë ¹ì˜ -l ì˜µì…˜ì€ ë³µì‚¬ëŸ‰ì„ ì¡°ì ˆí•˜ëŠ” 옵션으로, 노드 ê°„ íŒŒì¼ ë³µì‚¬ 시 I/O 부하를 ê°ì•ˆí•˜ì—¬ ì´ ì˜µì…˜ì„ ì ì ˆížˆ 부여하ë„ë¡ í•œë‹¤. 단위는 Kbitsì´ë©°, 131072는 16MBì´ë‹¤. .. note:: íŒŒì¼ ì´ë¦„ì´ ìˆ«ìžë¡œ ë나는 파ì¼ë§Œ 복사한다. 여기ì—서는 ë³µì œ 로그 íŒŒì¼ ì´ë¦„ì˜ ë²ˆí˜¸ê°€ ëª¨ë‘ 0으로 시작하기 ë•Œë¬¸ì— testdb_lgar0*\ì„ ë³µì‚¬í–ˆë‹¤. .. note:: **ha_copy_log_max_archives**\ì˜ ê°’ì´ ì¶©ë¶„ížˆ í¬ì§€ ì•Šì€ ê²½ìš° 백업 시ê°ê³¼ 활성 로그 ìƒì„± ì‹œê° ì‚¬ì´ì— ìƒì„±ëœ ë³µì œ 로그가 ì‚ì œë 수 있는ë°, ì´ ê²½ìš° 아래 [5. *nodeC*\ì—서 HA 서비스를 구ë™] ê³¼ì •ì—서 오류가 ë°œìƒí• 수 있다. 오류가 ë°œìƒí•˜ë©´ 위ì—서 설명한 :ref:`필요한 ë³µì œ ë¡œê·¸ì˜ ì‚ì œ 여부 í™•ì¸ ë° ëŒ€ì²˜ 방안 <check-replication-log>`\ì„ ì°¸ê³ í•˜ì—¬ 조치하ë„ë¡ í•œë‹¤. 5. *nodeC*\ì—서 HA 서비스를 êµ¬ë™ :: [nodeC]$ cubrid heartbeat start 6. *nodeA*, *nodeB*\ì˜ HA ì„¤ì • 변경 * *nodeB*\ì˜ ha_copy_log_max_archive ì„¤ì • ì›ë³µ :: [nodeB]$ vi cubrid_ha.conf ha_copy_log_max_archives=1 * *nodeB*\ì˜ applylogdb í”„ë¡œì„¸ìŠ¤ì— ha_copy_log_max_archives 파ë¼ë¯¸í„° 변경 ë‚´ì— ë°˜ì˜ :: [nodeB]$ cubrid heartbeat applylogdb stop testdb nodeA [nodeB]$ cubrid heartbeat applylogdb start testdb nodeA * *nodeA*, *nodeB*\ì˜ cubrid_ha.confì—서 ha_replica_listì— *nodeC*\를 추가 :: $ cd $CUBRID/conf $ vi cubrid_ha.conf ha_replica_list=cubrid@nodeC * ë³€ê²½ëœ ha_replica_list를 ì ìš© :: [nodeA]$ cubrid heartbeat reload [nodeB]$ cubrid heartbeat reload *nodeC*\는 ë ˆí”Œë¦¬ì¹´ 노드ì´ë¯€ë¡œ, *nodeA*, *nodeB*\ì—서 *nodeC*\ì— ëŒ€í•œ applylogdb, copylogdbì˜ êµ¬ë™ì€ 불필요하다. 7. 브로커 추가 ë° ì‘ìš© 프로그램 URLì˜ altHostsì— ì¶”ê°€ëœ ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ 추가 í•„ìš”ì— ë”°ë¼ ë¸Œë¡œì»¤ë¥¼ ì¶”ê°€í•˜ê³ , ì¶”ê°€ëœ ë¸Œë¡œì»¤ì— ì ‘ì†í•˜ê¸° 위해 ì‘ìš© í”„ë¡œê·¸ëž¨ì˜ ì—°ê²° ì†ì„±ì— ì¶”ê°€ëœ ë¸Œë¡œì»¤ì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì„ ì¶”ê°€í•œë‹¤. ë¸Œë¡œì»¤ì˜ ì¶”ê°€ë¥¼ ê³ ë ¤í•˜ì§€ ì•Šê³ ìžˆë‹¤ë©´ ì´ ìž‘ì—…ì„ í•˜ì§€ ì•Šì•„ë„ ëœë‹¤. * *nodeA*, *nodeB* ëª¨ë‘ **$CUBRID_DATABASES/databases.txt**\ì—서 db-hostì— *nodeC* 추가 :: #db-name vol-path db-host log-path lob-base-path testdb /home/cubrid/DB/testdb nodeA:nodeB:nodeC /home/cubrid/DB/testdb/log file:/home/cubrid/DB/testdb/lob **databases.txt**\ì˜ **db-host** ë¶€ë¶„ì€ ë¸Œë¡œì»¤ì—서 DB ì„œë²„ë¡œì˜ ì ‘ì† ìˆœì„œì™€ ê´€ë ¨ëœ ì„¤ì •ì´ë¯€ë¡œ ì›í•˜ëŠ”ëŒ€ë¡œ ë³€ê²½ì´ ê°€ëŠ¥í•˜ë‹¤. 예를 들어, **db-host**\ì— nodeA:nodeBë§Œ 쓰거나, localhostë§Œ ì¨ë„ ëœë‹¤. 다만, 로컬ì—서 ì ‘ì†í•˜ëŠ” 경우(csql -u dba testdb@localhost)를 ê°ì•ˆí•˜ì—¬ **db-host**\ì— localhost ë˜ëŠ” 로컬 호스트 ì´ë¦„ì€ ë°˜ë“œì‹œ í¬í•¨í•œë‹¤. .. _rebuild-slave: 서비스 ìš´ì˜ ì¤‘ ìŠ¬ë ˆì´ë¸Œ 재구축 ------------------------------ "마스터:ìŠ¬ë ˆì´ë¸Œ:ë ˆí”Œë¦¬ì¹´ = 1:1:1"로 êµ¬ì¶•ëœ í™˜ê²½ì—서 ìŠ¬ë ˆì´ë¸Œì˜ ë°ì´í„°ì— ì´ìƒì´ ë°œìƒí–ˆë‹¤ê³ ê°€ì •í•˜ê³ , 마스터로부터 ë°ì´í„°ë¥¼ ì™„ì „ížˆ 새로 구축해 ë³´ìž. 초기 ë°ì´í„°ë² ì´ìФ ì„¤ì •ì€ :ref:`build-another-slave`\ì˜ :ref:`초기 ë°ì´í„°ë² ì´ìФ 구축 <build-initial-database>`\ì—서 ì„¤ì •í•œ 것과 ë™ì¼í•˜ë‹¤. .. image:: /images/rebuild_slave.png * nodeA: 마스터 노드 호스트 명 * nodeB: ìž¬êµ¬ì¶•í• ìŠ¬ë ˆì´ë¸Œ 노드 호스트 명 * nodeC: ë ˆí”Œë¦¬ì¹´ 노드 호스트 명 .. image:: /images/rebuild_slave_process.png 1. *nodeB* ì •ì§€, *nodeB* ë°ì´í„° ì‚ì œ *nodeB*\를 ì •ì§€í•œ 후, *nodeB*\ì˜ ë°ì´í„°ë² ì´ìФ 볼륨, *nodeA*\와 *nodeC*\ì— ìžˆëŠ” *nodeB*\ì˜ ë³µì œ 로그를 ì‚ì œí•œë‹¤. * *nodeB* ì •ì§€ :: [nodeB]$ cubrid heartbeat stop [nodeB]$ cubrid service stop * *nodeB*\ì˜ ë°ì´í„°ë² ì´ìФ 볼륨, ë³µì œ 로그 ì‚ì œ :: [nodeB]$ cd $CUBRID_DATABASES [nodeB]$ rm testdb/* [nodeB]$ rm testdb/log/* [nodeB]$ rm -rf testdb_nodeA * *nodeA*\, *nodeC*\ì—서 *nodeB*\ì˜ ë¡œê·¸ ë³µì œ ì •ì§€ :: [nodeA]$ cubrid heartbeat repl stop testdb nodeB [nodeC]$ cubrid heartbeat repl stop testdb nodeB * *nodeA*\, *nodeC*\ì—서 *nodeB*\ì— ëŒ€í•œ ë³µì œ 로그 ì‚ì œ :: [nodeA]$ rm -rf $CUBRID_DATABASES/testdb_nodeB [nodeC]$ rm -rf $CUBRID_DATABASES/testdb_nodeB 2. HA 카탈로그 í…Œì´ë¸” ì‚ì œ, *nodeA*\ì˜ ë°±ì—… ë° *nodeB*\ì˜ ë³µêµ¬, HA 카탈로그 í…Œì´ë¸”ì— ì •ë³´ 추가 * HA 카탈로그 í…Œì´ë¸”ì¸ db_ha_apply_infoì˜ ë ˆì½”ë“œ ì‚ì œ *nodeB*\ì˜ db_ha_apply_info ì •ë³´ë¥¼ ëª¨ë‘ ì‚ì œí•˜ì—¬ 초기화한다. :: [nodeB]$ csql --sysadm -u dba -S testdb csql> DELETE FROM db_ha_apply_info; *nodeA*, *nodeC*\ì—서 *nodeB*\ì— ëŒ€í•œ db_ha_apply_info ì •ë³´ë¥¼ ì‚ì œí•œë‹¤. :: [nodeA]$ csql --sysadm -u dba testdb@localhost csql> DELETE FROM db_ha_apply_info WHERE copied_log_path='/home/cubrid/DB/databases/testdb_nodeB'; [nodeC]$ csql --sysadm --write-on-standby -u dba testdb@localhost csql> DELETE FROM db_ha_apply_info WHERE copied_log_path='/home/cubrid/DB/databases/testdb_nodeB'; * *nodeA* 백업 :: [nodeA]$ cd $CUBRID_DATABASES/testdb/log [nodeA]$ cubrid backupdb --sleep-msecs=10 -C -o output.txt testdb@localhost .. note:: :ref:`build-another-slave`\ì˜ :ref:`--sleep-msecs <sleep-msecs>`\ì— ëŒ€í•œ ì„¤ëª…ì„ ì°¸ê³ í•œë‹¤. * 백업 파ì¼ì„ *nodeB*\ì— ë³µì‚¬ :: [nodeA]$ [nodeA]$ scp -l 131072 testdb_bk* cubrid_usr@nodeB:$CUBRID_DATABASES/testdb/log .. note:: scp ëª…ë ¹ì˜ -l ì˜µì…˜ì€ ë³µì‚¬ëŸ‰ì„ ì¡°ì ˆí•˜ëŠ” 옵션으로, 노드 ê°„ íŒŒì¼ ë³µì‚¬ 시 I/O 부하를 ê°ì•ˆí•˜ì—¬ ì´ ì˜µì…˜ì„ ì ì ˆížˆ 부여하ë„ë¡ í•œë‹¤. 단위는 Kbitsì´ë©°, 131072는 16MBì´ë‹¤. * *nodeB*\ì—서 복구를 수행 ì´ë•Œ, 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë³¼ë¥¨ ì ˆëŒ€ 경로가 반드시 같아야 한다. :: [nodeB]$ cubrid restoredb -B $CUBRID_DATABASES/testdb/log testdb * *nodeB*\ì˜ db_ha_apply_infoì— *nodeA*\ì— ëŒ€í•œ ë³µì œ ì •ë³´ë¥¼ 추가 *nodeA*\ì— ìžˆëŠ” 백업 결과를 ì €ìž¥í•œ output.txt 파ì¼ì—서 **db_ha_apply_info**\를 ì—…ë°ì´íŠ¸í• ì •ë³´ë¥¼ 얻는다. output.txt는 "cubrid backupdb" ëª…ë ¹ì„ ìˆ˜í–‰í•œ ë””ë ‰í„°ë¦¬ì— ì €ìž¥ëœë‹¤. :: [nodeA]$ vi $CUBRID_DATABASES/testdb/log/output.txt [ Database(testdb) Full Backup start ] - num-threads: 2 - compression method: NONE - sleep 10 millisecond per 1M read. - backup start time: Fri Mar 20 18:18:53 2015 - number of permanent volumes: 2 - HA apply info: testdb 1426495463 12922 16192 - backup progress status ... 아래 스í¬ë¦½íŠ¸ë¥¼ ë§Œë“ í›„ ì´ë¥¼ 수행한다. ìœ„ì˜ ì¶œë ¥ ì •ë³´ 중 "HA apply info"ì—서 첫 번째 숫ìžì¸ 1426495463ì€ $db_creationì—, ë‘ ë²ˆì§¸ 숫ìžì¸ 12922는 $pageidì—, 세 번째 숫ìžì¸ 16192는 $offsetì— ë„£ê³ , db_nameì—는 ë°ì´í„°ë² ì´ìФ ì´ë¦„ì¸ testdb, master_hostì—는 마스터 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ ì´ë¦„ì¸ *nodeA*\를 넣는다. :: [nodeB]$ vi update.sh #!/bin/sh db_creation=1426495463 page_id=12922 offset=16192 db_name=testdb master_host=nodeA repl_log_home_abs=$CUBRID_DATABASES repl_log_path=$repl_log_home_abs/${db_name}_${master_host} local_db_creation=`awk 'BEGIN { print strftime("%m/%d/%Y %H:%M:%S", '$db_creation') }'` csql_cmd="\ INSERT INTO \ db_ha_apply_info \ VALUES \ ( \ '$db_name', \ datetime '$local_db_creation', \ '$repl_log_path', \ $page_id, $offset, \ $page_id, $offset, \ $page_id, $offset, \ $page_id, $offset, \ $page_id, $offset, \ $page_id, $offset, \ NULL, \ NULL, \ NULL, \ 0, \ 0, \ 0, \ 0, \ 0, \ 0, \ 0, \ NULL \ )" # Insert nodeA's HA info. csql --sysadm -u dba -c "$csql_cmd" -S testdb :: [nodeB]$ sh update.sh ìž…ë ¥ì´ ì œëŒ€ë¡œ ë˜ì—ˆëŠ”ì§€ 확ì¸í•œë‹¤. :: [nodeB]$ csql -u dba -S testdb csql> ;line on csql> SELECT * FROM db_ha_apply_info; 3. *nodeA*\ì˜ í™œì„± 로그(active log)를 *nodeB*\ì— ë³µì‚¬ *nodeA*\ì˜ í™œì„± 로그ì—는 ìµœê·¼ì— ìƒì„±ëœ ë³´ê´€ ë¡œê·¸ì˜ ë²ˆí˜¸ ì •ë³´ê°€ 들어 있다. 활성 로그를 복사한 시ì ì´í›„ì— ìƒì„±ë˜ëŠ” ë³´ê´€ 로그가 *nodeB*\ì˜ HA êµ¬ë™ í›„ copylogdbì— ì˜í•´ ìžë™ìœ¼ë¡œ 복사ë˜ë ¤ë©´ 해당 ì •ë³´ê°€ 필요하므로, 사용ìžëŠ” 활성 로그 복사 ì´ì „ì— ìƒì„±ëœ ë³´ê´€ 로그만 수ë™ìœ¼ë¡œ 복사하면 ëœë‹¤. * *nodeB*\ì—서 HA ì—°ê²°ì„ ê´€ë¦¬í•˜ëŠ” cub_master êµ¬ë™ :: [nodeB]$ cub_master * *nodeB*\ì—서 *nodeA*\ì— ëŒ€í•œ copylogdb 프로세스 êµ¬ë™ :: [nodeB]$ cubrid heartbeat copylogdb start testdb nodeA * *nodeB*\ì—서 *nodeA*\ì˜ í™œì„± 로그가 복사ë˜ì—ˆìŒì„ í™•ì¸ í˜„ 시ì ì˜ í™œì„± 로그를 복사해 온다는 ê²ƒì€ í˜„ 시ì 까지 ìƒì„±ëœ ë³´ê´€ 로그 번호 ì •ë³´ë¥¼ íšë“한다는 ì˜ë¯¸ì´ë‹¤. ì´í›„ì— ìƒì„±ë˜ëŠ” ë³´ê´€ 로그는 [5. *nodeB*\ì—서 HA 서비스를 구ë™] ê³¼ì • ì´í›„ ìžë™ìœ¼ë¡œ 복사ëœë‹¤. :: [nodeB]$ cd $CUBRID_DATABASES/testdb_nodeA [nodeB]$ ls testdb_lgar_t testdb_lgat testdb_lgat__lock * *nodeB*\ì—서 *nodeA*\ì— ëŒ€í•œ copylogdb 프로세스 ì •ì§€ :: [nodeB]$ cubrid heartbeat copylogdb stop testdb nodeA * *nodeB*\ì˜ cub_master ì •ì§€ :: [nodeB]$ cubrid service stop 4. *nodeB*\ì— ë°ì´í„°ë² ì´ìФ 복구 ì´í›„ 필요한 로그 íŒŒì¼ ë³µì‚¬ * *nodeA*\ì˜ ë³´ê´€ 로그 ì „ë¶€ë¥¼ *nodeB*\ì— ë³µì‚¬ :: [nodeB]$ cd $CUBRID_DATABASES/testdb_nodeA [nodeB]$ scp -l 131072 cubrid@nodeA:$CUBRID_DATABASES/testdb/log/testdb_lgar0* . ì´ ê³¼ì •ì—서는 ë³µì œì— í•„ìš”í•œ ë³´ê´€ 로그가 ì „ë¶€ 존재해야 한다는 ì ì— ì£¼ì˜í•œë‹¤. .. note:: scp ëª…ë ¹ì˜ -l ì˜µì…˜ì€ ë³µì‚¬ëŸ‰ì„ ì¡°ì ˆí•˜ëŠ” 옵션으로, 노드 ê°„ íŒŒì¼ ë³µì‚¬ 시 I/O 부하를 ê°ì•ˆí•˜ì—¬ ì´ ì˜µì…˜ì„ ì ì ˆížˆ 부여하ë„ë¡ í•œë‹¤. 단위는 Kbitsì´ë©°, 131072는 16MBì´ë‹¤. .. note:: íŒŒì¼ ì´ë¦„ì´ ìˆ«ìžë¡œ ë나는 파ì¼ë§Œ 복사한다. ìœ„ì˜ ì˜ˆì—서는 ë³´ê´€ 로그가 ëª¨ë‘ 0으로 시작하기 ë•Œë¬¸ì— testdb_lgar0*\ì„ ë³µì‚¬í–ˆë‹¤. .. note:: **필요한 로그가 ì´ë¯¸ ì‚ì œëœ ê²½ìš°** **log_max_archives**\ì˜ ê°’ì´ ì¶©ë¶„ížˆ í¬ì§€ ì•Šì€ ê²½ìš° 백업 시ê°ê³¼ 활성 로그 ìƒì„± ì‹œê° ì‚¬ì´ì— ìƒì„±ëœ ë³´ê´€ 로그가 ì‚ì œë 수 있는ë°, ì´ ê²½ìš° 아래 [5. *nodeB*\ì—서 HA 서비스를 êµ¬ë™ ...] ê³¼ì •ì—서 오류가 ë°œìƒí• 수 있다. ì´ ê²½ìš° **log_max_archives**\ì˜ ê°’ì„ ì¶©ë¶„ížˆ í¬ê²Œ 한 후 백업 ë° ë³µêµ¬ë¥¼ 처ìŒë¶€í„° 다시 진행한다. 5. *nodeB*\ì—서 HA 서비스를 구ë™í•˜ê³ , *nodeA*, *nodeC*\ì—서 로그 ë³µì œ ë° ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ ìž¬êµ¬ë™ :: [nodeB]$ cubrid heartbeat start :: [nodeA]$ cubrid heartbeat applylogdb start testdb nodeB [nodeA]$ cubrid heartbeat copylogdb start testdb nodeB [nodeC]$ cubrid heartbeat applylogdb start testdb nodeB [nodeC]$ cubrid heartbeat copylogdb start testdb nodeB ë³µì œ 불ì¼ì¹˜ ê°ì§€ ================ ë³µì œ 불ì¼ì¹˜ ê°ì§€ 방법 --------------------- 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì˜ ë°ì´í„°ê°€ ì¼ì¹˜í•˜ì§€ 않는 ë³µì œ 노드 ê°„ ë°ì´í„° 불ì¼ì¹˜ 현ìƒì€ 다ìŒê³¼ ê°™ì€ ê³¼ì •ì„ í†µí•´ ì–´ëŠ ì •ë„ ê°ì§€í• 수 있다. ë˜í•œ :ref:`cubrid-checksumdb` ìœ í‹¸ë¦¬í‹°ë¥¼ 사용해 ë³µì œ 불ì¼ì¹˜ë¥¼ ê°ì§€í• ìˆ˜ë„ ìžˆë‹¤. 그러나 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì˜ ë°ì´í„°ë¥¼ 서로 ì§ì ‘ 비êµí•´ë³´ëŠ” 방법보다 ë” ì •í™•í•œ í™•ì¸ ë°©ë²•ì€ ì—†ë‹¤. ë³µì œ 불ì¼ì¹˜ ìƒíƒœë¼ëŠ” íŒë‹¨ì´ ë 경우, 마스터 ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìŠ¤ë¥¼ ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì— ìƒˆë¡œ 구축해야 한다.( :ref:`rebuilding-replication` ì°¸ê³ ). * **cubrid statdump** ëª…ë ¹ì„ ìˆ˜í–‰í•˜ì—¬ **Time_ha_replication_delay** ì‹œê°„ì„ í™•ì¸í•œë‹¤. ì´ ê°’ì´ í´ ìˆ˜ë¡ ë³µì œ 지연 ì •ë„ê°€ í´ ìˆ˜ 있다는 ê²ƒì„ ì˜ë¯¸í•˜ë©°, ì§€ì—°ëœ ì‹œê°„ë§Œí¼ ë³µì œ 불ì¼ì¹˜ê°€ ì¡´ìž¬í• ê°€ëŠ¥ì„±ì´ ì»¤ì§„ë‹¤. * ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì—서 **cubrid applyinfo** 를 실행하여 "Fail count" ê°’ì„ í™•ì¸í•œë‹¤. "Fail count"ê°€ 0ì´ë©´, ë³µì œì— ì‹¤íŒ¨í•œ 트랜ìžì…˜ì´ ì—†ë‹¤ê³ ë³¼ 수 있다(:ref:`cubrid-applyinfo` ì°¸ê³ ). :: [nodeB]$ cubrid applyinfo -L /home/cubrid/DB/testdb_nodeA -r nodeA -a testdb *** Applied Info. *** Committed page : 1913 | 2904 Insert count : 645 Update count : 0 Delete count : 0 Schema count : 60 Commit count : 15 Fail count : 0 ... * ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì—서 ë³µì œ ë¡œê·¸ì˜ ë³µì‚¬ 지연 여부를 확ì¸í•˜ê¸° 위해, **cubrid applyinfo** 를 실행하여 "Copied Active Info."ì˜ "Append LSA" ê°’ê³¼ "Active Info."ì˜ "Append LSA" ê°’ì„ ë¹„êµí•œë‹¤. ì´ ê°’ì´ í° ì°¨ì´ë¥¼ ë³´ì¸ë‹¤ë©´, ë³µì œ 로그가 ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì— ë³µì‚¬ë˜ëŠ”ë° ì§€ì—°ì´ ìžˆë‹¤ëŠ” ì˜ë¯¸ì´ë‹¤(:ref:`cubrid-applyinfo` ì°¸ê³ ). :: [nodeB]$ cubrid applyinfo -L /home/cubrid/DB/testdb_nodeA -r nodeA -a testdb ... *** Copied Active Info. *** DB name : testdb DB creation time : 11:28:00.000 AM 12/17/2010 (1292552880) EOF LSA : 1913 | 2976 Append LSA : 1913 | 2976 HA server state : active *** Active Info. *** DB name : testdb DB creation time : 11:28:00.000 AM 12/17/2010 (1292552880) EOF LSA : 1913 | 2976 Append LSA : 1913 | 2976 HA server state : active * ë³µì œ 로그 복사 ì§€ì—°ì´ ì˜ì‹¬ë˜ëŠ” 경우 ë„¤íŠ¸ì›Œí¬ íšŒì„ ì†ë„ê°€ ëŠë ¤ì¡ŒëŠ”ì§€, ë””ìŠ¤í¬ ì—¬ìœ ê³µê°„ì´ ì¶©ë¶„í•œì§€, ë””ìŠ¤í¬ I/Oì—는 ì´ìƒì´ 없는지 ë“±ì„ í™•ì¸í•œë‹¤. * ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì—서 ë³µì œ ë¡œê·¸ì˜ ë°˜ì˜ ì§€ì—° 여부를 확ì¸í•˜ê¸° 위해, **cubrid applyinfo** 를 실행하여 "Applied Info." ì˜ "Committed page" ê°’ê³¼ "Copied Active Info."ì˜ "EOF LSA" ê°’ì„ ë¹„êµí•œë‹¤. ì´ ê°’ì´ í° ì°¨ì´ë¥¼ ë³´ì¸ë‹¤ë©´, ë³µì œ 로그가 ìŠ¬ë ˆì´ë¸Œ(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´) ë°ì´í„°ë² ì´ìŠ¤ì— ë°˜ì˜ë˜ëŠ”ë° ì§€ì—°ì´ ìžˆë‹¤ëŠ” ì˜ë¯¸ì´ë‹¤(:ref:`cubrid-applyinfo` ì°¸ê³ ). :: [nodeB]$ cubrid applyinfo -L /home/cubrid/DB/testdb_nodeA -r nodeA -a testdb *** Applied Info. *** Committed page : 1913 | 2904 Insert count : 645 Update count : 0 Delete count : 0 Schema count : 60 Commit count : 15 Fail count : 0 *** Copied Active Info. *** DB name : testdb DB creation time : 11:28:00.000 AM 12/17/2010 (1292552880) EOF LSA : 1913 | 2976 Append LSA : 1913 | 2976 HA server state : active ... * ë³µì œ 로그 ë°˜ì˜ ì§€ì—°ì´ ì‹¬í•œ 경우 수행 ì‹œê°„ì´ ê¸´ 트랜ìžì…˜ì„ ì˜ì‹¬í•´ ë³¼ 수 있는ë°, 해당 트랜ìžì…˜ì˜ ìˆ˜í–‰ì´ ì •ìƒì´ë¼ë©´ ë³µì œ 지연 ì—시 ì •ìƒì 으로 ë°œìƒí• 수 있다. ì •ìƒ ì—¬ë¶€ë¥¼ íŒë‹¨í•˜ê¸° 위해 **cubrid applyinfo** 를 ì§€ì†ì 으로 수행하면서 applylogdbê°€ ë³µì œ 로그를 ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì— ê³„ì† ë°˜ì˜í•˜ê³ 있는지 확ì¸í•´ì•¼ 한다. * copylogdb, applylogdb 프로세스가 ìƒì„±í•œ 오류 ë¡œê·¸ì˜ ë©”ì‹œì§€ë¥¼ 확ì¸í•œë‹¤(오류 메시지 ì°¸ê³ ). * 마스터 ë°ì´í„°ë² ì´ìФ í…Œì´ë¸”ì˜ ë ˆì½”ë“œ 개수, ìŠ¬ë ˆì´ë¸Œ(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´) ë°ì´í„°ë² ì´ìФ í…Œì´ë¸”ì˜ ë ˆì½”ë“œ 개수를 비êµí•œë‹¤. .. _cubrid-checksumdb: checksumdb ---------- **checksumdb** 를 통해 간단하게 ë³µì œ ë¬´ê²°ì„±ì„ í™•ì¸í• 수 있다. 기본ì 으로 ì´ ìœ í‹¸ë¦¬í‹°ëŠ” 마스터 ë…¸ë“œì˜ ê° í…Œì´ë¸”ì„ ì²í¬(chunk)로 ë¶„í• í•œ 후 CRC32 ê°’ì„ ê³„ì‚°í•œë‹¤. 계산 ê°’ì´ ì•„ë‹Œ 계산 ë°©ë²•ì´ CUBRID HA를 통해 ë³µì œëœë‹¤. ê²°ê³¼ì 으로 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ 노드(ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드)ì—서 ê³„ì‚°ëœ CRC32 ê°’ì„ ë¹„êµí•¨ìœ¼ë¡œì¨ **checksumdb** 는 ë³µì œ 무결성 여부를 확ì¸í• 수 있다. **checksumdb** 는 성능 ì €í•˜ë¥¼ 최소화하ë„ë¡ ì„¤ê³„ë˜ì—ˆìœ¼ë‚˜ ë§ˆìŠ¤í„°ì˜ ì„±ëŠ¥ì— ì˜í–¥ì„ 줄 수 있어 사용시 ìœ ì˜í•´ì•¼ 한다. :: cubrid checksumdb [options] <database-name>@<hostname> .. program:: checksumdb * *<hostname>* : ì²´í¬ì„¬(checksum) ê³„ì‚°ì„ ì‹œìž‘í• ë•Œ 마스터 ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ëª…ì„ ì§€ì •í•´ì•¼ 한다. ê³„ì‚°ì´ ì™„ë£Œëœ í›„ 결과를 ê°€ì ¸ì˜¬ 때 확ì¸í• ë…¸ë“œì˜ í˜¸ìŠ¤íŠ¸ëª…ì„ ì§€ì •í•œë‹¤. .. option:: -c, --chunk-size=NUMBER CRC32 ê³„ì‚°ì— ì‚¬ìš©í• í–‰ 수를 ì§€ì •í•œë‹¤. (기본값: 500í–‰, 최소값: 100í–‰) .. option:: -s, --sleep=NUMBER ì²í¬ë¥¼ 계산하는 ë„중 checksumdbê°€ 쉬는 ì‹œê°„ì„ ì„¤ì •í•œë‹¤.(기본값: 100ms) .. option:: -i, --include-class-file=FILE -i ì˜µì…˜ì„ ì§€ì •í•´ ë³µì œ 불ì¼ì¹˜ë¥¼ 확ì¸í• í…Œì´ë¸”ì„ ì§€ì •í•œë‹¤. í…Œì´ë¸”ì„ ì§€ì •í•˜ì§€ 않으면 ì „ì²´ í…Œì´ë¸”ì„ í™•ì¸í•œë‹¤. íŒŒì¼ ë‚´ìš©ì˜ í…Œì´ë¸”명 구분ìžë¡œ ì‚¬ìš©í• ìˆ˜ 있는 기호는 빈 문ìžì—´, íƒ, ê°œí–‰ë¬¸ìž ë° ì‰¼í‘œì´ë‹¤. .. option:: -e, --exclude-class-file=FILE -e ì˜µì…˜ì„ ì§€ì •í•˜ì—¬ ë³µì œ 불ì¼ì¹˜ 확ì¸ì—서 ì œì™¸í• í…Œì´ë¸”ì„ ì§€ì •í•œë‹¤. -i와 -e 중 하나만 ì‚¬ìš©í• ìˆ˜ 있다. .. option:: -t, --timeout=NUMBER ì´ ì˜µì…˜ìœ¼ë¡œ 계산 시간 ì œí•œì„ ì§€ì •í•œë‹¤. (기본값: 1000ms) ì´ ì‹œê°„ ì œí•œì— ë„달하면 ê³„ì‚°ì´ ì·¨ì†Œë˜ê³ ìž ì‹œ í›„ì— ë‹¤ì‹œ 시작ëœë‹¤. .. option:: -n, --table-name=STRING ì²´í¬ì„¬ 결과를 ì €ìž¥í• í…Œì´ë¸”ëª…ì„ ì§€ì •í•œë‹¤. í…Œì´ë¸”명 ìž…ë ¥ 시 "ì†Œìœ ìžëª….í…Œì´ë¸”명" 형ì‹ì„ 사용해야 하며, 현재는 ì†Œìœ ìžëª…으로 dbaë§Œ ì§€ì •í• ìˆ˜ 있다. (기본값: dba.db_ha_checksum) .. option:: -r, --report-only ì´ ì˜µì…˜ì„ í†µí•´ checksum ê³„ì‚°ì´ ì™„ë£Œëœ í›„ì— ê²°ê³¼ë¥¼ ì–»ì„ ìˆ˜ 있다. .. option:: --resume checksum ê³„ì‚°ì´ ì¤‘ì§€ë˜ì—ˆì„ 경우, ì´ ì˜µì…˜ì„ ì´ìš©í•´ì„œ 다시 ì‹¤í–‰í• ìˆ˜ 있다. .. option:: --schema-only ì´ ì˜µì…˜ì„ ì´ìš©í•´ì„œ CRC32 ê³„ì‚°ì„ í•˜ì§€ ì•Šê³ ê° í…Œì´ë¸”ì˜ ìŠ¤í‚¤ë§ˆë§Œì„ ë¹„êµí• 수 있다. .. option:: --cont-on-error ì´ ì˜µì…˜ì´ ì—†ìœ¼ë©´ ì—러 ë°œìƒì‹œ checksumdbê°€ 중지ëœë‹¤. 다ìŒì€ checksumdb를 실행하는 ì˜ˆì œì´ë‹¤. :: cubrid checksumdb -c 100 -s 10 testdb@master ë³µì œ 불ì¼ì¹˜ê°€ 발견ë˜ì§€ ì•Šì•˜ì„ ê²½ìš° :: $ cubrid checksumdb -r testdb@slave ================================================================ target DB: testdb@slave (state: standby) report time: 2016-01-14 16:33:30 checksum table name: db_ha_checksum, db_ha_checksum_schema ================================================================ ------------------------ different table schema ------------------------ NONE ---------------------------------------------------------------- table name diff chunk id chunk lower bound ---------------------------------------------------------------- NONE -------------------------------------------------------------------------------------- table name total # of chunks # of diff chunks total/avg/min/max time -------------------------------------------------------------------------------------- t1 7 0 88 / 12 / 5 / 14 (ms) t2 7 0 96 / 13 / 11 / 15 (ms) í…Œì´ë¸” *t1* ì—서 ë³µì œ 불ì¼ì¹˜ê°€ ê°ì§€ë˜ì—ˆì„ 경우 :: $ cubrid checksumdb -r testdb@slave ================================================================ target DB: testdb@slave (state: standby) report time: 2016-01-14 16:35:57 checksum table name: db_ha_checksum, db_ha_checksum_schema ================================================================ ------------------------ different table schema ------------------------ NONE ---------------------------------------------------------------- table name diff chunk id chunk lower bound ---------------------------------------------------------------- t1 0 (id>=1) t1 1 (id>=100) t1 4 (id>=397) -------------------------------------------------------------------------------------- table name total # of chunks # of diff chunks total/avg/min/max time -------------------------------------------------------------------------------------- t1 7 3 86 / 12 / 5 / 14 (ms) t2 7 0 93 / 13 / 11 / 15 (ms) í…Œì´ë¸” *t1* ì—서 스키마 불ì¼ì¹˜ê°€ ê°ì§€ë˜ì—ˆì„ 경우 :: $ cubrid checksumdb -r testdb@slave ================================================================ target DB: testdb@slave (state: standby) report time: 2016-01-14 16:40:56 checksum table name: db_ha_checksum, db_ha_checksum_schema ================================================================ ------------------------ different table schema ------------------------ <table name> t1 <current schema - collected at 04:40:53.947 PM 01/14/2016> CREATE TABLE [t1] ([id] INTEGER NOT NULL, [col1] CHARACTER VARYING(20), [col2] INTEGER, [col3] DATETIME, [col4] INTEGER, CONSTRAINT [pk_t1_id] PRIMARY KEY ([id])) COLLATE iso88591_bin <schema from master> CREATE TABLE [t1] ([id] INTEGER NOT NULL, [col1] CHARACTER VARYING(20), [col2] INTEGER, [col3] DATETIME, CONSTRAINT [pk_t1_id] PRIMARY KEY ([id])) COLLATE iso88591_bin * Due to schema inconsistency, the checksum difference of the above table(s) may not be reported. ---------------------------------------------------------------- table name diff chunk id chunk lower bound ---------------------------------------------------------------- NONE -------------------------------------------------------------------------------------- table name total # of chunks # of diff chunks total/avg/min/max time -------------------------------------------------------------------------------------- t1 7 0 95 / 13 / 11 / 16 (ms) t2 7 0 94 / 13 / 11 / 15 (ms) .. _ha-error: HA 오류 메시지 -------------- 다ìŒì€ ë³µì œ 불ì¼ì¹˜ ë°œìƒì˜ ì›ì¸ì´ ë 수 있는 ì˜¤ë¥˜ì— ëŒ€í•œ 오류 ë©”ì‹œì§€ë“¤ì„ ì •ë¦¬í•œ 것ì´ë‹¤. CAS 프로세스(cub_cas) ^^^^^^^^^^^^^^^^^^^^^ CAS í”„ë¡œì„¸ìŠ¤ì˜ ì˜¤ë¥˜ 메시지는 **$CUBRID/log/broker/error_log**/\ *<broker_name>_<app_server_num>*\ **.err**\ ì— ê¸°ë¡ëœë‹¤. 아래는 HA 환경ì—서 ì ‘ì† ì‹œ ë°œìƒí•˜ëŠ” 오류 메시지를 별ë„로 ì •ë¦¬í•œ 것ì´ë‹¤. **브로커와 DB 서버 ê°„ handshake 오류 메시지** +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -1139 | Handshake error (peer host ?): incompatible | error | 브로커 ACCESS_MODE와 ì„œë²„ì˜ ìƒíƒœ | | | | read/write mode. (client: ?, server: ?) | | (active/standby) 불ì¼ì¹˜ | | | | | | (:ref:`broker-mode` ì°¸ê³ ) | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1140 | Handshake error (peer host ?): | error | **ha_delay_limit**\ì„ ì„¤ì •í•œ 서버ì—서 ë³µì œ 지연 ë°œìƒ | | | | HA replication delayed. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1141 | Handshake error (peer host ?): replica-only | error | ë ˆí”Œë¦¬ì¹´ë§Œ ì ‘ì† ê°€ëŠ¥í•œ 브로커(CAS)ê°€ | | | | client to non-replica server. | | ë ˆí”Œë¦¬ì¹´ê°€ 아닌 | | | | | | ì„œë²„ì— ì ‘ì† ì‹œë„(:ref:`broker-mode` ì°¸ê³ ) | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1142 | Handshake error (peer host ?): remote access to | error | HA maintenance ëª¨ë“œì¸ ì„œë²„ì— ì›ê²© ì ‘ì† ì‹œë„ | | | | server not allowed. | | (:ref:`ha-server` ì°¸ê³ ) | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1143 | Handshake error (peer host ?): unidentified | error | 서버 ë²„ì „ 알 수 ì—†ìŒ | | | | server version. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ **ì—°ê²° 오류 메시지** +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -353 | Cannot make connection to master server on host ?. | error | cub_master 프로세스 down | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1144 | Timed out attempting to connect to ?. | error | 장비 down | | | | (timeout: ? sec(s)) | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ ë³µì œ 로그 복사 프로세스(copylogdb) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì˜ ì˜¤ë¥˜ 메시지는 **$CUBRID/log/**\ *<db-name>*\ **@**\ *<remote-node-name>*\ **_copylogdb.err**\ ì— ê¸°ë¡ëœë‹¤. ë³µì œ 로그 복사 프로세스ì—서 ë‚¨ì„ ìˆ˜ 있는 오류 ë©”ì‹œì§€ì˜ severity는 fatal, error, notificationì´ë©° 기본 severity는 errorì´ë‹¤. ë”°ë¼ì„œ notification 오류 메시지를 ë‚¨ê¸°ë ¤ë©´ **cubrid.conf** ì˜ **error_log_level** ê°’ì„ ë³€ê²½í•´ì•¼ 한다. ì´ì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :ref:`error-parameters`\ 를 ì°¸ê³ í•œë‹¤. **초기화 오류 메시지** ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì˜ ì´ˆê¸°í™” 단계ì—서 ë‚¨ì„ ìˆ˜ 있는 오류 메시지는 아래와 같다. +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -10 | Unable to mount disk volume ?. | error | ë³µì œ 로그 íŒŒì¼ ì—´ê¸° 실패 | ë³µì œ 로그 존재 ìœ ë¬´ë¥¼ 확ì¸í•œë‹¤. ë³µì œ ë¡œê·¸ì˜ ìœ„ì¹˜ëŠ” | | | | | | `기본 환경 ì„¤ì • <#admin_admin_ha_conf_ha_htm>`_\ ì„ | | | | | | ì°¸ê³ í•œë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -78 | Internal error: an I/O error occurred | fatal | ë³µì œ 로그 ì½ê¸° 실패 | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | while reading logical log page | | | | | | ? (physical page ?) of ? | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -81 | Internal error: logical log page ? may be | fatal | ë³µì œ 로그 복사 프로세스가 ì—°ê²°ëœ ë°ì´í„°ë² ì´ìФ | ë³µì œ 로그 복사 프로세스가 ì—°ê²°ëœ ë°ì´í„°ë² ì´ìФ | | | corrupted. | | 서버 프로세스로부터 복사한 | 서버 í”„ë¡œì„¸ìŠ¤ì˜ ì˜¤ë¥˜ 로그를 확ì¸í•œë‹¤. | | | | | 복사한 ë³µì œ 로그 페ì´ì§€ì˜ 오류 | 오류 로그를 확ì¸í•œë‹¤. ì´ ì˜¤ë¥˜ 로그는 $CUBRID/log/serverì— ìœ„ì¹˜í•œë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1039 | log writer: log writer started. mode: ? | error | ë³µì œ 로그 복사 프로세스가 초기화 성공하여 ì •ìƒ ì‹œìž‘ | ì´ ì˜¤ë¥˜ 메시지는 ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì˜ ì‹œìž‘ ì •ë³´ë¥¼ 나타내기 위해 | | | | | | 기ë¡ë˜ëŠ” 것ì´ë¯€ë¡œ 조치 사í•ì€ ì—†ë‹¤. | | | | | | ë³µì œ 로그 복사 프로세스가 ì‹œìž‘ëœ | | | | | | ì´í›„ ì´ ì˜¤ë¥˜ 메시지가 나오기 ì „ê¹Œì§€ì˜ ì˜¤ë¥˜ 메시지는 ì •ìƒ ìƒí™©ì—서 | | | | | | ë°œìƒí• 수 있는 것ì´ë¯€ë¡œ 무시한다. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ **ë³µì œ 로그 ìš”ì² ë° ìˆ˜ì‹ ì˜¤ë¥˜ 메시지** ë³µì œ 로그 복사 프로세스는 ì—°ê²°ëœ ë°ì´í„°ë² ì´ìФ 서버 í”„ë¡œì„¸ìŠ¤ì— ë³µì œ 로그를 ìš”ì²í•˜ê³ ì ì ˆí•œ ë³µì œ 로그를 ìˆ˜ì‹ í•œë‹¤. ì´ë•Œ ë°œìƒí•˜ëŠ” 오류 메시지는 아래와 같다. +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -89 | Log ? does not belong to the given database. | error | ê¸°ì¡´ì— ë³µì œë˜ì—ˆë˜ 로그와 현재 ë³µì œí•˜ë ¤ëŠ” | ë³µì œ 로그 복사 프로세스가 연결한 ë°ì´í„°ë² ì´ìФ 서버/호스트 ì •ë³´ë¥¼ | | | | | 로그가 다름 | 확ì¸í•œë‹¤. | | | | | 로그가 다름 | ì—°ê²°í•˜ë ¤ëŠ” ë°ì´í„°ë² ì´ìФ 서버/호스트 ì •ë³´ë¥¼ 변경해야 하는 | | | | | | 경우 기존 ë³µì œ 로그를 ì‚ì œí•˜ì—¬ ì´ˆê¸°í™”í•˜ê³ ìž¬ì‹œìž‘í•œë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -186 | Error receiving data from server. | error | ë³µì œ 로그 복사 프로세스가 ì—°ê²°ëœ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | ë°ì´í„°ë² ì´ìФ 서버로부터 | | | | | | ìž˜ëª»ëœ ì •ë³´ë¥¼ ìˆ˜ì‹ | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -199 | Server no longer responding. | error | ë³µì œ 로그 복사 프로세스가 ì—°ê²°ëœ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | ë°ì´í„°ë² ì´ìФ 서버로부터 ì—°ê²° 종료 | | | | | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ **ë³µì œ 로그 쓰기 오류 메시지** ë³µì œ 로그 복사 프로세스는 ì—°ê²°ëœ ë°ì´í„°ë² ì´ìФ 서버 프로세스로부터 ìˆ˜ì‹ í•œ ë³µì œ 로그를 **cubrid_ha.conf** ì—서 ì§€ì •í•œ 위치(**ha_copy_log_base**)ì— ë³µì‚¬í•œë‹¤. ì´ë•Œ ë°œìƒí•˜ëŠ” 오류 메시지는 아래와 같다. +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -10 | Unable to mount disk volume ?. | error | ë³µì œ 로그 íŒŒì¼ ì—´ê¸° 실패 | ë³µì œ 로그 ìœ ë¬´ë¥¼ 확ì¸í•œë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -79 | Internal error: an I/O error occurred writing | fatal | ë³µì œ 로그 쓰기 실패 | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | logical log page ?(physical page ?) | | | | | | of ?. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -80 | An error occurred due to insufficient space in | fatal | íŒŒì¼ ì‹œìŠ¤í…œ 공간 부족으로 | ë””ìŠ¤í¬ íŒŒí‹°ì…˜ ë‚´ ì—¬ìœ | | | ating system device while writing logical | | ë³µì œ 로그 쓰기 실패 | ê³µê°„ì´ ìžˆëŠ”ì§€ 확ì¸í•œë‹¤. | | | log page ?(physical page ?) of ?. | | | | | | Up to ? bytes in size are allowed. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ **ë³µì œ 로그 ì•„ì¹´ì´ë¸Œ 오류 메시지** ë³µì œ 로그 복사 프로세스는 ì—°ê²°ëœ ë°ì´í„°ë² ì´ìФ 서버 프로세스로부터 ë°›ì€ ë³µì œ 로그를 ì¼ì •한 주기마다 ì•„ì¹´ì´ë¸Œ(archive)하여 보관하게 ëœë‹¤. ì´ë•Œ ë°œìƒí•˜ëŠ” 오류 메시지는 아래와 같다. +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -78 | Internal error: an I/O error occurred while | fatal | ì•„ì¹´ì´ë¸Œ 중 ë³µì œ 로그 ì½ê¸° 실패 | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | reading logical log page ? | | | | | | (physical page ?) of ?. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -79 | Internal error: an I/O error occurred while writing | fatal | ì•„ì¹´ì´ë¸Œ 로그 쓰기 실패 | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | logical log page ? | | | | | | (physical page ?) of ?. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -81 | Internal error: logical log page ? may be corrupted.| fatal | ì•„ì¹´ì´ë¸Œ 중 ë³µì œ 로그 오류 발견 | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 | | | | | | 확ì¸í•œë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -98 | Unable to create archive log ? to archive | fatal | ì•„ì¹´ì´ë¸Œ 로그 íŒŒì¼ ìƒì„± 실패 | ë””ìŠ¤í¬ íŒŒí‹°ì…˜ ë‚´ ì—¬ìœ ê³µê°„ì´ ìžˆëŠ”ì§€ 확ì¸í•œë‹¤. | | | pages from ? to ?. | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -974 | Archive log ? is created to archive pages | notification | ì•„ì¹´ì´ë¸Œ 로그 íŒŒì¼ ì •ë³´ | ì´ ì˜¤ë¥˜ 메시지는 ìƒì„±ëœ ì•„ì¹´ì´ë¸Œ 로그 ì •ë³´ë¥¼ 위해 | | | from ? to ?. | | | 기ë¡ë˜ëŠ” 것ì´ë¯€ë¡œ 조치 사í•ì€ ì—†ë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ **종료 ë° ìž¬ì‹œìž‘ 오류 메시지** ë³µì œ 로그 복사 프로세스가 종료 ë° ìž¬ì‹œìž‘ ì‹œì— ë°œìƒí•˜ëŠ” 오류 메시지는 다ìŒê³¼ 같다. +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -1037 | log writer: log writer shut itself down by signal. | error | ì§€ì •ëœ ì‹œê·¸ë„ì— ì˜í•´ copylogdb 프로세스 종료 | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤(applylogdb) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì˜ ì˜¤ë¥˜ 메시지는 **$CUBRID/log/**\ *db-name*\ **@**\ *local-node-name*\ **_applylogdb_**\ *db-name*\ **_**\ *remote-node-name*\ **.err** ì— ê¸°ë¡ëœë‹¤. ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì—서 ë‚¨ì„ ìˆ˜ 있는 오류 ë©”ì‹œì§€ì˜ severity는 fatal, error, notificationì´ë©° 기본 severity는 errorì´ë‹¤. ë”°ë¼ì„œ notification 오류 메시지를 ë‚¨ê¸°ë ¤ë©´ **cubrid.conf** ì˜ **error_log_level** ê°’ì„ ë³€ê²½í•´ì•¼ 한다. ì´ì— 대한 ìžì„¸í•œ ì„¤ëª…ì€ :ref:`error-parameters` 를 ì°¸ê³ í•œë‹¤. **초기화 오류 메시지** ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì˜ ì´ˆê¸°í™” 단계ì—서 ë‚¨ì„ ìˆ˜ 있는 오류 메시지는 아래와 같다. +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+=====================================================+==============+======================================================+======================================================================+ | -10 | Unable to mount disk volume ?. | error | ë™ì¼í•œ ë³µì œ 로그를 ë°˜ì˜í•˜ë ¤ëŠ” | ë™ì¼í•œ ë³µì œ 로그를 ë°˜ì˜í•˜ë ¤ëŠ” applylogdb 프로세스가 | | | | | applylogdbê°€ ì´ë¯¸ 실행 중 | 있는지 확ì¸í•œë‹¤. | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ | -1038 | log applier: log applier started. required LSA: | error | applylogdb 초기화 성공 후 ì •ìƒ ì‹œìž‘ | ì´ ì˜¤ë¥˜ 메시지는 ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ì˜ ì‹œìž‘ ì •ë³´ë¥¼ | | | ?|?. last committed LSA: ?|?. | | 나타내기 위해 기ë¡ë˜ëŠ” 것ì´ë¯€ë¡œ 조치 사í•ì€ ì—†ë‹¤. | | | | last committed repl LSA: ?|? | | | | +-------+-----------------------------------------------------+--------------+------------------------------------------------------+----------------------------------------------------------------------+ **로그 ë¶„ì„ ì˜¤ë¥˜ 메시지** ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ëŠ” ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ ë³µì‚¬ëœ ë³µì œ 로그를 ì½ì–´ ë¶„ì„í•˜ê³ ì´ë¥¼ ë°˜ì˜í•œë‹¤. ë³µì œ 로그를 ë¶„ì„í• ë•Œ ë°œìƒí•˜ëŠ” 오류 메시지는 아래와 같다. +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+======================================================+==============+=====================================================+======================================================================+ | -13 | An I/O error occurred while reading page ? | error | ë³µì œ ë°˜ì˜í• 로그 페ì´ì§€ ì½ê¸° 실패 | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | of volume ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -17 | Internal error: fetching deallocated pageid ? of | fatal | ë³µì œ ë¡œê·¸ì— í¬í•¨ë˜ì§€ ì•Šì€ ë¡œê·¸ 페ì´ì§€ë¥¼ | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | volume ?. | | ì½ê¸° ì‹œë„ | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -81 | Internal error: logical log page ? may be | fatal | 기존 ë³µì œ ë°˜ì˜ ì¤‘ì´ë˜ 로그와 현재 로그가 | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | corrupted. | | 불ì¼ì¹˜ ë˜ëŠ” | | | | | | ë³µì œ 로그 ë ˆì½”ë“œ 오류 | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -82 | Unable to mount log disk volume/file ?. | error | ë³µì œ 로그 파ì¼ì´ 존재하지 ì•ŠìŒ | ë³µì œ 로그 존재 ìœ ë¬´ë¥¼ 확ì¸í•œë‹¤. | | | | | | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -97 | Internal error: unable to find log page ? in | error | 로그 페ì´ì§€ê°€ ë³µì œ ë¡œê·¸ì— ì¡´ìž¬í•˜ì§€ ì•ŠìŒ | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | log archives. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -897 | Decompression failed. | error | 로그 ë ˆì½”ë“œ ì••ì¶• í•´ì œ 실패 | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1028 | log applier: unexpected EOF record in archive log. | error | ì•„ì¹´ì´ë¸Œ ë¡œê·¸ì— ìž˜ëª»ëœ ë¡œê·¸ ë ˆì½”ë“œê°€ í¬í•¨ | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | LSA: ?|?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1029 | log applier: invalid replication log page/offset. | error | ìž˜ëª»ëœ ë¡œê·¸ ë ˆì½”ë“œê°€ í¬í•¨ | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | page HDR: ?|?, final: ?|?, append LSA: ?|?, EOF | | | | | | LSA: ?|?, ha file status: ?, is end-of-log: ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1030 | log applier: invalid replication record. LSA: ?|?, | error | 로그 ë ˆì½”ë“œ í—¤ë” ì˜¤ë¥˜ | cubrid applyinfo ìœ í‹¸ë¦¬í‹°ë¥¼ 통해 ë³µì œ 로그를 확ì¸í•œë‹¤. | | | forw LSA: ?|?, backw LSA: ?|?, Trid: ?, prev tran | | | | | | LSA: ?|?, type: ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ **ë³µì œ 로그 ë°˜ì˜ ì˜¤ë¥˜ 메시지** ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ëŠ” ë³µì œ 로그 복사 í”„ë¡œì„¸ìŠ¤ì— ì˜í•´ ë³µì‚¬ëœ ë³µì œ 로그를 ì½ì–´ ë¶„ì„í•˜ê³ ì´ë¥¼ ë°˜ì˜í•œë‹¤. ë¶„ì„한 ë³µì œ 로그를 ë°˜ì˜í• 때 ë°œìƒí•˜ëŠ” 오류 메시지는 아래와 같다. +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+======================================================+==============+=====================================================+======================================================================+ | -72 | The transaction (index ?, ?@?|?) has been | error | ë°ë“œë½ ë“±ì— ì˜í•´ ë³µì œ ë°˜ì˜ ì‹¤íŒ¨ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | cancelled by system. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -111 | Your transaction has been cancelled due to | error | ë³µì œë¥¼ ë°˜ì˜í•˜ë ¤ëŠ” ë°ì´í„°ë² ì´ìФ 서버 프로세스 종료 | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | server failure or a mode change. | | ë˜ëŠ” 모드 ë³€ê²½ì— ì˜í•´ ë³µì œ ë°˜ì˜ ì‹¤íŒ¨ | | | | | | | | | | | | | | | | | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -191 | Cannot connect to server ? on ?. | error | ë³µì œë¥¼ ë°˜ì˜í•˜ë ¤ëŠ” ë°ì´í„°ë² ì´ìФ 서버 í”„ë¡œì„¸ìŠ¤ì™€ì˜ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | ì—°ê²° 종료 | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -195 | Server communication error: ?. | error | ë³µì œë¥¼ ë°˜ì˜í•˜ë ¤ëŠ” ë°ì´í„°ë² ì´ìФ 서버 í”„ë¡œì„¸ìŠ¤ì™€ì˜ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | ì—°ê²° 종료 | | | | | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -224 | The database has not been resumed. | error | ë³µì œë¥¼ ë°˜ì˜í•˜ë ¤ëŠ” ë°ì´í„°ë² ì´ìФ 서버 í”„ë¡œì„¸ìŠ¤ì™€ì˜ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | ì—°ê²° 종료 | | | | | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1027 | log applier: Failed to change the reflection | error | ë³µì œ ë°˜ì˜ ìƒíƒœ 변경 실패 | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | status from ? to ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1031 | log applier: Failed to reflect the Schema | error | SCHEMA ë³µì œ ë°˜ì˜ ì‹¤íŒ¨ | ë³µì œ 불ì¼ì¹˜ 여부를 확ì¸í•˜ê³ 불ì¼ì¹˜ 시 | | | replication log. class: ?, schema: ?, internal | | | HA ë³µì œ ìž¬êµ¬ì„±ì„ ì‹¤í–‰í•œë‹¤. | | | error: ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1032 | log applier: Failed to reflect the Insert | error | INSERT ë³µì œ ë°˜ì˜ ì‹¤íŒ¨ | ë³µì œ 불ì¼ì¹˜ 여부를 확ì¸í•˜ê³ 불ì¼ì¹˜ 시 | | | replication log. class: ?, key: ?, internal | | | HA ë³µì œ ìž¬êµ¬ì„±ì„ ì‹¤í–‰í•œë‹¤. | | | error: ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1033 | log applier: Failed to reflect the Update | error | UPDATE ë³µì œ ë°˜ì˜ ì‹¤íŒ¨ | ë³µì œ 불ì¼ì¹˜ 여부를 확ì¸í•˜ê³ 불ì¼ì¹˜ 시 | | | replication log. class: ?, key: ?, internal | | | HA ë³µì œ ìž¬êµ¬ì„±ì„ ì‹¤í–‰í•œë‹¤. | | | error: ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1034 | log applier: Failed to reflect the Delete | error | DELETE ë³µì œ ë°˜ì˜ ì‹¤íŒ¨ | ë³µì œ 불ì¼ì¹˜ 여부를 확ì¸í•˜ê³ 불ì¼ì¹˜ 시 | | | replication log. class: ?, key: ?, internal | | | HA ë³µì œ ìž¬êµ¬ì„±ì„ ì‹¤í–‰í•œë‹¤. | | | error: ?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1040 | HA generic: ?. | notification | ì•„ì¹´ì´ë¸Œ ë¡œê·¸ì˜ ë§ˆì§€ë§‰ ë ˆì½”ë“œë¥¼ ë°˜ì˜í•˜ê±°ë‚˜ ë³µì œ | ì´ ì—러 메시지는 ì¼ë°˜ì ì¸ ì •ë³´ë¥¼ 위해 | | | | | ë°˜ì˜ ìƒíƒœ 변경 | 기ë¡ë˜ëŠ” 로그로 조치 사í•ì€ ì—†ë‹¤. | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ **종료 ë° ìž¬ì‹œìž‘ 오류 메시지** ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ê°€ 종료 ë° ìž¬ì‹œìž‘ ì‹œì— ë°œìƒí•˜ëŠ” 오류 메시지는 다ìŒê³¼ 같다. +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | 오류 | 오류 메시지 | severity | 설명 | 조치 ì‚¬í• | | 코드 | | | | | +=======+======================================================+==============+=====================================================+======================================================================+ | -1035 | log applier: The memory size (? MB) of the log | error | 최대 메모리 í¬ê¸° ì œí•œì— ì˜í•´ ë³µì œ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | applier is larger than the maximum memory size | | 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ 재시작 | | | | (? MB), or is doubled the starting memory size | | | | | | (? MB) or more. required LSA: ?|?. last | | | | | | committed LSA: ?|?. | | | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ | -1036 | log applier: log applier is terminated by signal. | error | ì§€ì •ëœ ì‹œê·¸ë„ì— ì˜í•´ | ë‚´ë¶€ì 으로 복구ëœë‹¤. | | | | | ë³µì œ 로그 ë°˜ì˜ í”„ë¡œì„¸ìŠ¤ 종료 | | +-------+------------------------------------------------------+--------------+-----------------------------------------------------+----------------------------------------------------------------------+ .. _rebuilding-replication: ë³µì œ 재구축 스í¬ë¦½íЏ ==================== CUBRID HA 환경ì—ì„œì˜ ë³µì œ ìž¬êµ¬ì¶•ì€ ë‹¤ì¤‘ ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë‹¤ì¤‘ ìž¥ì• ìƒí™©ì´ë‚˜ ì¼ë°˜ì ì¸ ì˜¤ë¥˜ ìƒí™©ìœ¼ë¡œ ì¸í•´ CUBRID HA 그룹 ë‚´ì˜ ë°ì´í„°ê°€ ë™ì¼í•˜ì§€ ì•Šì€ ê²½ìš°ì— í•„ìš”í•˜ë‹¤. **cubrid applyinfo** ìœ í‹¸ë¦¬í‹°ëŠ” ë³µì œ ì§„í–‰ ìƒíƒœë¥¼ 확ì¸í• 수는 있지만 ì´ë¥¼ 통해 ë³µì œ 불ì¼ì¹˜ 여부를 ì§ì ‘ íŒë‹¨í• 수는 없으므로, ë³µì œ 불ì¼ì¹˜ 여부를 ì •í™•í•˜ê²Œ íŒë‹¨í•˜ë ¤ë©´ 마스터 노드와 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ë°ì´í„°ë¥¼ ì§ì ‘ 확ì¸í•´ì•¼ 한다. 마스터-ìŠ¬ë ˆì´ë¸Œë¡œ êµ¬ì„±ëœ í™˜ê²½ì—서 ìŠ¬ë ˆì´ë¸Œ ë…¸ë“œì˜ ì´ìƒìœ¼ë¡œ ì¸í•´ ìŠ¬ë ˆì´ë¸Œ 노드만 재구축하는 경우, ê·¸ ì ˆì°¨ëŠ” 다ìŒê³¼ 같다. 1. 마스터 ë°ì´í„°ë² ì´ìФ 백업 2. ìŠ¬ë ˆì´ë¸Œì—서 ë°ì´í„°ë² ì´ìФ 복구 3. 백업 시ì ì„ ìŠ¬ë ˆì´ë¸Œì˜ HA 메타 í…Œì´ë¸”(db_ha_apply_info)ì— ì €ìž¥ 4. ìŠ¬ë ˆì´ë¸Œì—서 HA 서비스 êµ¬ë™ (cubrid hb start) ë³µì œ ìž¬êµ¬ì¶•ì„ ìœ„í•´ì„œëŠ” 마스터 노드, ìŠ¬ë ˆì´ë¸Œ 노드, ë ˆí”Œë¦¬ì¹´ 노드ì—서 아래 í™˜ê²½ì´ ë™ì¼í•´ì•¼ 한다. * CUBRID ë²„ì „ * 환경 변수(**$CUBRID**, **$CUBRID_DATABASES**, **$LD_LIBRARY_PATH**, **$PATH**) * ë°ì´í„°ë² ì´ìФ 볼륨, 로그 ë° ë³µì œ 로그 경로 * 리눅스 ì„œë²„ì˜ ì‚¬ìš©ìž ì•„ì´ë”” ë° ë¹„ë°€ë²ˆí˜¸ * **ha_mode**, **ha_copy_sync_mode**, **ha_ping_hosts** 를 ì œì™¸í•œ ëª¨ë“ HA ê´€ë ¨ 파ë¼ë¯¸í„° 다ìŒì˜ ê²½ìš°ì— í•œí•˜ì—¬ **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ë¥¼ 실행하여 ë³µì œ ìž¬êµ¬ì¶•ì´ ê°€ëŠ¥í•˜ë‹¤. * `from-master-to-slave` * `from-slave-to-replica` * `from-replica-to-replica` * `from-replica-to-slave` ê·¸ ì´ì™¸ì˜ 경우ì—는 수ë™ìœ¼ë¡œ 구축해야 하며, 수ë™ìœ¼ë¡œ 구축하는 시나리오는 :ref:`building-replication`\를 ì°¸ê³ í•œë‹¤. ìž¬êµ¬ì¶•ì´ ì•„ë‹Œ ì‹ ê·œ êµ¬ì¶•ì¸ ê²½ìš° cubrid.conf, cubrid_ha.conf, databases.txtì˜ íŒŒì¼ë“¤ì„ 마스터 노드와 ë™ì¼í•˜ê²Œ ì„¤ì •í•˜ë©´ ëœë‹¤. ë‹¤ìŒ ì„¤ëª…ì—서는 ë³µì œ ìž¬êµ¬ì¶•ì— ì‚¬ìš©ë˜ëŠ” **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ë¥¼ ì‚¬ìš©í• ìˆ˜ 있는 ì‚¬ë¡€ë“¤ì— ëŒ€í•´ 알아볼 것ì´ë‹¤. ì°¸ê³ ë¡œ, 다중 ìŠ¬ë ˆì´ë¸Œ 노드를 êµ¬ì¶•í•˜ê³ ìž í•˜ëŠ” 경우 **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ë¥¼ ì‚¬ìš©í• ìˆ˜ 없다. ha_make_slavedb.sh 스í¬ë¦½íЏ --------------------------- **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ë¥¼ ì´ìš©í•˜ì—¬ ë³µì œ ìž¬êµ¬ì¶•ì„ ìˆ˜í–‰í• ìˆ˜ 있다. ì´ ìŠ¤í¬ë¦½íŠ¸ëŠ” **$CUBRID/share/scripts/ha** ì— ìœ„ì¹˜í•˜ë©°, ë³µì œ ìž¬êµ¬ì¶•ì— ë“¤ì–´ê°€ê¸° ì „ì— ë‹¤ìŒì˜ í•ëª©ì„ ì‚¬ìš©ìž í™˜ê²½ì— ë§žê²Œ ì„¤ì •í•´ì•¼ 한다. ì´ ìŠ¤í¬ë¦½íŠ¸ëŠ” 2008 R2.2 Patch 9 ë²„ì „ë¶€í„° ì§€ì›í•˜ì§€ë§Œ 2008 R4.1 Patch 2 미만 ë²„ì „ê³¼ëŠ” ì¼ë¶€ ì„¤ì • ë°©ë²•ì´ ë‹¤ë¥´ë©°, ì´ ë¬¸ì„œì—서는 2008 R4.1 Patch 2 ì´ìƒ ë²„ì „ì—ì„œì˜ ì„¤ì • ë°©ë²•ì— ëŒ€í•´ 설명한다. * **target_host** : ë³µì œ ìž¬êµ¬ì¶•ì„ ìœ„í•œ ì›ë³¸ 노드(주로 마스터 노드)ì˜ í˜¸ìŠ¤íŠ¸ëª…ìœ¼ë¡œ, **/etc/hosts**\ ì— ë“±ë¡ë˜ì–´ 있어야 한다. ìŠ¬ë ˆì´ë¸Œ 노드는 마스터 노드 ë˜ëŠ” ë ˆí”Œë¦¬ì¹´ 노드를 ì›ë³¸ìœ¼ë¡œ 하여 ë³µì œ ìž¬êµ¬ì¶•ì´ ê°€ëŠ¥í•˜ë©°, ë ˆí”Œë¦¬ì¹´ 노드는 ìŠ¬ë ˆì´ë¸Œ 노드 ë˜ëŠ” ë˜ ë‹¤ë¥¸ ë ˆí”Œë¦¬ì¹´ 노드를 ì›ë³¸ìœ¼ë¡œ 하여 ë³µì œ ìž¬êµ¬ì¶•ì´ ê°€ëŠ¥í•˜ë‹¤. * **repl_log_home** : 마스터 ë…¸ë“œì˜ ë³µì œ ë¡œê·¸ì˜ í™ˆ ë””ë ‰í„°ë¦¬ë¥¼ ì„¤ì •í•œë‹¤. ì¼ë°˜ì 으로 **$CUBRID_DATABASES** 와 ë™ì¼í•˜ë‹¤. 반드시 ì ˆëŒ€ 경로를 ìž…ë ¥í•´ì•¼ 하며, ì‹¬ë³¼ë¦ ë§í¬ë¥¼ 사용하면 안 ëœë‹¤. 경로 ë’¤ì— ìŠ¬ëž˜ì‹œ(/)를 ë¶™ì´ë©´ 안 ëœë‹¤. 다ìŒì€ í•„ìš”ì— ë”°ë¼ ì„ íƒì 으로 ì„¤ì •í•˜ëŠ” í•목ì´ë‹¤. * **db_name** : ë³µì œ ìž¬êµ¬ì¶•í• ë°ì´í„°ë² ì´ìФ ì´ë¦„ì„ ì„¤ì •í•œë‹¤. ì„¤ì •í•˜ì§€ 않으면 **$CUBRID/conf/cubrid_ha.conf** ë‚´ **ha_db_list** ì˜ ê°€ìž¥ 처ìŒì— 위치한 ì´ë¦„ì„ ì‚¬ìš©í•œë‹¤. * **backup_dest_path** : ë³µì œ ì›ë³¸ 노드ì—서 **backupdb** 수행 시 백업 ë³¼ë¥¨ì„ ìƒì„±í• 경로를 ì„¤ì •í•œë‹¤. * **backup_option** : ë³µì œ ì›ë³¸ 노드ì—서 **backupdb** 수행 시 필요한 ì˜µì…˜ì„ ì„¤ì •í•œë‹¤. * **restore_option** : ë³µì œ ëŒ€ìƒ ë…¸ë“œì—서 **restoredb** 수행 시 필요한 ì˜µì…˜ì„ ì„¤ì •í•œë‹¤. * **scp_option** : ë³µì œ ì›ë³¸ ë…¸ë“œì˜ ë°±ì—… ë³¼ë¥¨ì„ ë³µì œ ëŒ€ìƒ ë…¸ë“œë¡œ 복사해 오기 위한 **scp** ì˜µì…˜ì„ ì„¤ì •í• ìˆ˜ 있는 í•목으로 ê¸°ë³¸ê°’ì€ ë³µì œ ì›ë³¸ ë…¸ë“œì˜ ë„¤íŠ¸ì›Œí¬ ë¶€í•˜ë¥¼ 주지 않기 위해 **-l 131072** ì˜µì…˜ì„ ì‚¬ìš©í•œë‹¤(ì „ì†¡ ì†ë„를 16M로 ì œí•œ). * **ssh_port** : 스í¬ë¦½íЏì—서 사용ë˜ëŠ” ssh와 scp를 위한 **port** 번호를 ì„¤ì •í• ìˆ˜ 있는 í•목으로 ê¸°ë³¸ê°’ì€ **22** 로 ì„¤ì •ëœë‹¤. ì´ ì˜µì…˜ì€ ìŠ¤í¬ë¦½íЏì—서 ì´ìš©ë˜ëŠ” **expect** ì—ë„ ë™ì¼í•˜ê²Œ ì ìš©ëœë‹¤. 스í¬ë¦½íŠ¸ì˜ ì„¤ì •ì´ ë나면 **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ë¥¼ ë³µì œ ëŒ€ìƒ ë…¸ë“œì—서 수행한다. 스í¬ë¦½íЏ 수행 시 여러 ë‹¨ê³„ì— ì˜í•´ ë³µì œ ìž¬êµ¬ì¶•ì´ ì´ë£¨ì–´ì§€ë©° ê° ë‹¨ê³„ì˜ ì§„í–‰ì„ ìœ„í•´ì„œ 사용ìžê°€ ì ì ˆí•œ ê°’ì„ ìž…ë ¥í•´ì•¼ 한다. 다ìŒì€ ìž…ë ¥í• ìˆ˜ 있는 ê°’ì— ëŒ€í•œ 설명ì´ë‹¤. * **yes** : ê³„ì† ì§„í–‰í•œë‹¤. * **no** : 현재 단계를 í¬í•¨í•˜ì—¬ ì´í›„ ê³¼ì •ì„ ì§„í–‰í•˜ì§€ 않는다. * **skip** : 현재 단계를 수행하지 ì•Šê³ ë‹¤ìŒ ë‹¨ê³„ë¥¼ 진행한다. ì´ ìž…ë ¥ ê°’ì€ ì´ì „ 스í¬ë¦½íЏ ìˆ˜í–‰ì— ì‹¤íŒ¨í•˜ì—¬ 재시ë„í• ë•Œ 다시 ìˆ˜í–‰í• í•„ìš”ê°€ 없는 단계를 무시하기 위해 사용한다. .. warning:: * ha_make_slavedb.sh 스í¬ë¦½íŠ¸ëŠ” expect와 ssh를 ì´ìš©í•˜ì—¬ ì›ê²© ë…¸ë“œì— ì ‘ì† ëª…ë ¹ì„ ìˆ˜í–‰í•˜ë¯€ë¡œ expect ëª…ë ¹ì´ ì„¤ì¹˜(root ê³„ì •ì—서 yum install expect)ë˜ì–´ 있어야 í•˜ê³ , ì›ê²© ssh ì ‘ì†ì´ 가능해야 한다. .. note:: * **ë³µì œ 재구축ì—는 백업 ë³¼ë¥¨ì´ í•„ìš”** ë³µì œ ìž¬êµ¬ì¶•ì„ ìˆ˜í–‰í•˜ë ¤ë©´ ì›ë³¸ ë…¸ë“œì— ìžˆëŠ” ë°ì´í„°ë² ì´ìФ ë³¼ë¥¨ì˜ ë¬¼ë¦¬ì ì´ë¯¸ì§€ë¥¼ ë³µì œ ëŒ€ìƒ ë…¸ë“œì˜ ë°ì´í„°ë² ì´ìŠ¤ì— ë³µì‚¬í•´ì•¼ 한다. ê·¸ëŸ°ë° **cubrid unloaddb** 는 논리ì ì¸ ì´ë¯¸ì§€ë¥¼ 백업하므로 **cubrid unloaddb** 와 **cubrid loaddb**\ 를 ì´ìš©í•´ì„œëŠ” ë³µì œ ìž¬êµ¬ì¶•ì„ í• ìˆ˜ 없다. **cubrid backupdb** 는 물리ì ì´ë¯¸ì§€ë¥¼ 백업하므로 ì´ë¥¼ ì´ìš©í•œ ë³µì œ ìž¬êµ¬ì¶•ì´ ê°€ëŠ¥í•˜ë©°, **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ëŠ” **cubrid backupdb** 를 ì´ìš©í•˜ì—¬ ë³µì œ ìž¬êµ¬ì¶•ì„ ìˆ˜í–‰í•œë‹¤. * **ë³µì œ 재구축 ë„중 ì›ë³¸ ë…¸ë“œì˜ ì˜¨ë¼ì¸ 백업 ë° ìž¬êµ¬ì¶•ë˜ëŠ” ë…¸ë“œë¡œì˜ ë³µêµ¬** **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ëŠ” 수행 ë„중 ì›ë³¸ ë…¸ë“œì— ëŒ€í•´ 온ë¼ì¸ ë°±ì—…ì„ ìˆ˜í–‰í•˜ê³ , 재구축ë˜ëŠ” ë…¸ë“œì— ë³µêµ¬ë¥¼ 수행한다. ë°±ì—…ì„ ì‹œìž‘í•œ ì´í›„ 추가로 ì§„í–‰ëœ íŠ¸ëžœìžì…˜ë“¤ì„ 복구ë˜ëŠ” ë…¸ë“œì— ë°˜ì˜í•˜ê¸° 위해 **ha_make_slavedb.sh** 스í¬ë¦½íŠ¸ëŠ” "마스터" ë…¸ë“œì˜ ë³´ê´€ 로그를 복사해서 사용한다(ìŠ¬ë ˆì´ë¸Œì—서 ë ˆí”Œë¦¬ì¹´ë¥¼ êµ¬ì¶•í• ë•Œ, ë ˆí”Œë¦¬ì¹´ì—서 ë ˆí”Œë¦¬ì¹´ë¥¼ êµ¬ì¶•í• ë•Œ, ê·¸ë¦¬ê³ ë ˆí”Œë¦¬ì¹´ì—서 ìŠ¬ë ˆì´ë¸Œë¥¼ êµ¬ì¶•í• ë•Œ ëª¨ë‘ "마스터"ì˜ ë³´ê´€ 로그를 사용). ë”°ë¼ì„œ 온ë¼ì¸ ë°±ì—…ì´ ì§„í–‰ë˜ëŠ” ë™ì•ˆ ì›ë³¸ ë…¸ë“œì— ì¶”ê°€ë˜ëŠ” ë³´ê´€ 로그가 ì‚ì œë˜ì§€ 않ë„ë¡ ë§ˆìŠ¤í„° 노드ì—서 **cubrid.conf**\ì˜ **force_remove_log_max_archives**\, **log_max_archives**\ 를 ì ì ˆížˆ ì„¤ì •í•´ì•¼ 한다. ìžì„¸í•œ ë‚´ìš©ì€ ì•„ëž˜ì˜ êµ¬ì¶• ì˜ˆë“¤ì„ ì°¸ê³ í•œë‹¤. * **ë³µì œ 재구축 스í¬ë¦½íЏ 수행 중 오류 ë°œìƒ** ë³µì œ 재구축 스í¬ë¦½íŠ¸ëŠ” 수행 ë„중 오류가 ë°œìƒí•´ë„ ì´ì „ ìƒí™©ìœ¼ë¡œ ìžë™ 롤백ë˜ì§€ 않는다. ì´ëŠ” ë³µì œ 재구축 스í¬ë¦½íŠ¸ë¥¼ 수행하기 ì „ì—ë„ ë³µì œ ëŒ€ìƒ ë…¸ë“œê°€ ì´ë¯¸ ì •ìƒì 으로 서비스하기 íž˜ë“ ìƒí™©ì´ê¸° 때문ì´ë‹¤. ë³µì œ 재구축 스í¬ë¦½íŠ¸ë¥¼ 수행하기 ì „ ìƒí™©ìœ¼ë¡œ ëŒì•„ê°€ë ¤ë©´, ë³µì œ 재구축 스í¬ë¦½íŠ¸ë¥¼ 수행하기 ì „ì— ë³µì œ ì›ë³¸ 노드와 ë³µì œ ëŒ€ìƒ ë…¸ë“œì˜ ë‚´ë¶€ ì¹´íƒˆë¡œê·¸ì¸ **db_ha_apply_info** ì •ë³´ì™€ ê¸°ì¡´ì˜ ë³µì œ 로그를 백업해야 한다.