
- TOP
- ã¿ã°äžèЧ
- Perl
Perl
ã€ãã³ã
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã
ãã¬ãžã³
æè¡ããã°
ããã«ã¡ã¯ãkosuiããšå²©äœå¹žç¿ (@kosui_me) ã§ããã«ã±ãã·ã§èªèšŒæš©éåºç€ããŒã ã®ããã¯ãªãŒããåããŠããŸãã ç§ãã¡ã®ããŒã ã§ã¯ãèªèšŒåºç€ã»IDåºç€ã»ç«¯æ«åºç€ã»ã©ã€ã»ã³ã¹åºç€ãªã©ãæ§ã
ãªãã©ãããã©ãŒã ã·ã¹ãã ãTypeScriptã§æ§ç¯ããŠããŸãã ãµãŒããµã€ãTypeScriptãããžãã¹ãšããŠå®è·µããå Žåãåçåä»ãã®PythonãPerlãã¯ã©ã¹ããŒã¹ã®åç®çåä»ãã®JavaãC#ããã¿ãŒã³ãããäžå¿ã®Elixirãªã©ãåã«å¯Ÿããã¢ãããŒããç°ãªãèšèªã®çµéšè
ããæ§ã
ãªããã¯ã°ã©ãŠã³ããæã£ãããŒã ã¡ã³ããŒãšããŠéçºã»éçšããããšãšãªããŸããããããããããã®ããã¯ã°ã©âŠ
ã¯ããã« çŸåšã¡ã«ã«ãªã§ã¯ CoreDB ãšåŒã°ãã巚倧㪠MySQL ã TiDB ã«ç§»è¡ããŠããŸã[^1]. ãã®èšäºå
ã§ã玹ä»ãããŠããŸãã, ç§ãã¡ã¯ç§»è¡ããããã« MySQL ãš TiDB ã DM ãšããããŒã«ã§å·®ååæãè¡ã£ãŠããŸã. æ¬èšäºã§ã¯ãã® DM ãå©çšãã€ã€ DDL(Data Definition Language) ãã©ã®æ§ã«å®è¡ããŠãããã«ã€ããŠç޹ä»ããŸã. ã¡ã«ã«ãªã§ã® MySQL ãžã® DDL å®è¡ ãŸã, ã¡ã«ã«ãªã«ããã MySQL ãžã® DDL å®è¡ã¯äžèšã®éãå ŽååãããŠå®è¡ããŠããŸã: ããããã®æ¡ä»¶ã«ã€ããŠç°¡åã«è§£èª¬ããŸãã, åºæ¬çã« source – replica ã® replication é
å»¶ãæå°éã«æããããã«å ŽååãããŠããŸã. ã¡ã¿ããŒã¿ã®ã¿ã®å€æŽ ãŸãæåã®æ¡ä»¶ã¯ãã¡ã¿ããŒã¿ã®ã¿ã®å€æŽãã©ãããã§ã. ãã㯠Online DDL[^2] ã®ããŒãžã§ [In Place] & ![Rebuilds Table] & [Permit Concurrent DML] & [Only Modifies Metadata] ãªãã®ã該åœããŸã. äŸãã° Table åã®å€æŽã Column ã® default å€ã®å€æŽ, ENUM ã®è¿œå [^3] ãªã©ã§ã. ããã¯ããŒãã«ã®åæ§ç¯ãªã©ãäžèŠã§äžç¬ã§å®äºãããããã®ãŸãŸ source åŽã§å®è¡ããŸã. metadata ã®ã¿ã®å€æŽã§ã泚æããããš metadata ã®ã¿ã®å€æŽãšã¯ããæ³šæãã¹ãããš, ãã㯠DDL ãšã¯ãšãªã®ããã¯ç«¶åã§ã. å
¬åŒããã¥ã¡ã³ã[^4]ã«ãããšãã MySQL ã§ã¯ table ãžã®ã¢ã¯ã»ã¹/倿޿ã«äžè²«æ§ãä¿èšŒããããã« metadata lock ãååŸããŸãã, ãã® metadata lock ã DDL ãšã¢ããªã±ãŒã·ã§ã³ãçºè¡ããã¯ãšãªã§ç«¶åãæå³ããªã圱é¿ãåãŒãå¯èœæ§ããããŸã: -- session 1 mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM foo; Empty set (0.00 sec) -- // ãã®ãŸãŸ transaction ãä¿æãããŸãŸã«ãã -- session 2 mysql> ALTER TABLE foo ALTER COLUMN id SET DEFAULT 0, ALGORITHM=INSTANT; -- // metadata ã®ã¿ã®å€æŽã«ããããããå®è¡ããããã¯ããã -- session 3 mysql> SELECT * FROM foo; -- // DDL ã®åŸç¶ã®ã¯ãšãªãåŸ
ãããã ãã®ããã« session 2 ç§»è¡ã®åäžããŒãã«ãžã®ã¢ã¯ã»ã¹ããããã¯ãããŠããŸãã, ããã§ processlist ãš metadata lock ã®é¢ä¿ãèŠãŠã¿ãŸã: mysql> SELECT -> t.PROCESSLIST_ID AS process_id, -> t.PROCESSLIST_USER AS user, -> t.PROCESSLIST_DB AS db, -> t.PROCESSLIST_TIME AS time, -> t.PROCESSLIST_STATE AS state, -> t.PROCESSLIST_INFO AS query, -> ml.LOCK_TYPE, -> ml.LOCK_DURATION, -> ml.LOCK_STATUS -> FROM performance_schema.metadata_locks ml -> JOIN performance_schema.threads t -> ON ml.OWNER_THREAD_ID = t.THREAD_ID -> WHERE ml.OBJECT_TYPE = 'TABLE' -> AND ml.OBJECT_SCHEMA = 'test' -> AND ml.OBJECT_NAME = 'foo' -> AND t.PROCESSLIST_ID IS NOT NULL -> ORDER BY ml.LOCK_STATUS, process_id; +------------+------+------+------+---------------------------------+------------------------------------------------------------------+-------------------+---------------+-------------+ | process_id | user | db | time | state | query | LOCK_TYPE | LOCK_DURATION | LOCK_STATUS | +------------+------+------+------+---------------------------------+------------------------------------------------------------------+-------------------+---------------+-------------+ | 8 | root | test | 516 | NULL | NULL | SHARED_READ | TRANSACTION | GRANTED | | 9 | root | test | 514 | Waiting for table metadata lock | alter table foo alter column id set default 0, ALGORITHM=INSTANT | SHARED_UPGRADABLE | TRANSACTION | GRANTED | | 9 | root | test | 514 | Waiting for table metadata lock | alter table foo alter column id set default 0, ALGORITHM=INSTANT | EXCLUSIVE | TRANSACTION | PENDING | | 16 | root | test | 512 | Waiting for table metadata lock | SELECT * FROM foo | SHARED_READ | TRANSACTION | PENDING | +------------+------+------+------+---------------------------------+------------------------------------------------------------------+-------------------+---------------+-------------+ ãã®æ§ã« DDL(id=9)ã Exclusive lock ãåãããšããŠèŠªã® transaction(id=8)ãåŸ
ã£ãŠããŠ, DDL ã®åŸç¶(id=16)ãæŽã«åŸ
ããããŠããäºãããããŸã. ãããé¿ããããã«, ããšã metadata lock ã®ãã®ã§ãã£ãŠãäžèšã®ããã« lock_wait_timeout ãååçãå€ã«æå®ããããšã§ãã®äŸã®åŸç¶ã®ã¯ãšãªã«ãªãã¹ã圱é¿ãäžããªãæ§ã«å®è¡ããããšãéèŠã§ã. äŸãã°ããã§ã¯ 5s ã«èšå®ããå Žåã®ããããã®æåã確èªããŸã: -- session 1 mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> SELECT * FROM foo; Empty set (0.02 sec) -- session 2 mysql> SET SESSION lock_wait_timeout=5; mysql> SELECT NOW(); ALTER TABLE foo ALTER COLUMN id SET DEFAULT 0, ALGORITHM=INSTANT; SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2026-03-05 01:59:32 | +---------------------+ 1 row in set (0.01 sec) ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction +---------------------+ | NOW() | +---------------------+ | 2026-03-05 01:59:37 | +---------------------+ 1 row in set (0.00 sec) -- session 3 mysql> SELECT NOW(); SELECT * FROM foo; SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2026-03-05 01:59:34 | +---------------------+ 1 row in set (0.01 sec) Empty set (3.03 sec) +---------------------+ | NOW() | +---------------------+ | 2026-03-05 01:59:37 | +---------------------+ 1 row in set (0.00 sec) 1ç§æªæºã§å®äºããã ç¶ããŠã®æ¡ä»¶ã¯ã1ç§æªæºã§å®äºãããã©ãããã§ã. ããã«ã€ããŠã¯å
·äœçãªã±ãŒã¹ã玹ä»ããããšã¯é£ããã®ã§ãã, äŸãã° CREATE TABLE æ, 空ãããã¯ååå°ãªãã¬ã³ãŒãæ°ã«å¯Ÿããã¡ã¿ããŒã¿ã®å€æŽã§å®çµããªã DDL[^5] ãªã©ãããã«åœãããŸã. ããã§ãªãã1ç§æªæºããšããæ¡ä»¶ãä»äžããŠãããã«ã€ããŠã§ãã, MySQL ã® DDL ã¯ããšã online ãšããŠã replication ãæ§æããŠãããšãã«ã¯äžèšã®å¶éããããŸã[^6]: Long running online DDL operations can cause replication lag. An online DDL operation must finish running on the source before it is run on the replica. Also, DML that was processed concurrently on the source is only processed on the replica after the DDL operation on the replica is completed. online DDL ãšããŠã replica ã§å®è¡ãããåã« source ã§å®äºããŠããå¿
èŠããã, ãŸã source ã§äžŠè¡ã§å®è¡ãããŠãã DML 㯠replica ã§ã® DDL ãå®äºããåŸã«å®è¡ãããŸã. ã€ãŸã, source ã§äžŠè¡å®è¡ãããŠãã DML 㯠replica ã§ã¯ DDL ãå®äºãããŸã§ãããã¯ããããšããããšã§ã. ãã㯠source åŽã§(online) DDL ã«ãã source åŽã® table definition ã®å€æŽãšäžŠè¡å®è¡ãããŠãã DML ã®å¯Ÿå¿ã replica åŽã§ãåæ§ã«ããŠåçŸãããå¿
èŠããããŸã. ãã®ãã replica åŽã§ã table defintion ã®å€æŽãš DML ã®æŽåæ§ãæ
ä¿ããããã«ãã®ãããªä»çµã¿ãšãªã£ãŠããŸã. åé ã®èšäºã®ããã«ã¡ã«ã«ãªã®ããŒã¿ãµã€ãºã¯éåžžã«å·šå€§ã§äžã«ã¯ DDL å®äºã«1æ¥ä»¥äžããããã®ããã, ãã®ãããªããŒãã«ãžã® DDL ã«ãã replication é
å»¶ãé²ãããã«, åºæ¬çã«å³åº§ã«çµãããªã DDL ã¯ãã®ãŸãŸå®è¡ããªãããã«ããŠããŸã. å®éã« DDL ã 1s æªæºã§å®äºãããã©ããã¯çµéšåã«åºã¥ãããšãå€ãã§ãã, äŸãã°ãµãŒãã¹ã§çšŒåããŠããªããã¹ãã§ SET sql_log_bin=0 ãå®è¡ããŠãã€ããªãã°ã«åºåããªãããã«ããŠå®æž¬ãããªã©ã§èšæž¬å¯èœã§ã. ãŸã, DDL èªäœã 1s æªæºã§å®äºãããšããŠãå
ã® metadata lock ã«ãã圱é¿ã¯èæ
®ããå¿
èŠããããã, ãã®å Žåãåæ§ã« lock_wait_timeout ã調æŽããå¿
èŠããããŸã. gh-ost ã§å¯Ÿå¿å¯èœã æéã®ããã DDL ãå®è¡ããå Žå, ã¡ã«ã«ãªã§ã¯ gh-ost ãæ¡çšããŠããŸã . gh-ost ãå©çšã§ãããã©ããã«ã€ããŠã¯ãªãœãŒã¹çãªå¶é(ããŒãã«ã³ããŒã䌎ãããäœå°ãªãã£ã¹ã¯ãµã€ãºãå¿
èŠ, éåžžã®æŽæ°ãš gh-ost ã«ãã backfill/å·®ååæã«ãã replication é
延圱é¿)ãæ©èœçãªå¶é(UNIQUE KEY ã®äžéšã« ENUM ãå«ãŸããå Žåã®æ§èœå£å[^7])ããªãéã gh-ost ãå©çšããŠãã, DDL å®è¡ãªãã¬ãŒã·ã§ã³ã§æãæ°ã®å€ãã±ãŒã¹ã§ã. ããããããæºãããªãå Žåã«ã¯ Rolling Upgrade, ã€ãŸãå
š replica ã«å¯Ÿã㊠DDL ãå®è¡ãæåŸã« source ãåãæ¿ãããšãã£ãããšãè¡ããŸã. ãªã ENUM ãå«ãå Žåã«æ§èœå£åããã®ã MySQL ã® å
¬åŒããã¥ã¡ã³ã ã«ãããš ENUM ã¯æååé ã§ã¯ãªãå
éš index é ã§ãœãŒããããŸãã, ãã㯠Go èšèª[^8]ã®æååã«ãããã³ããªã³ã°ãšç°ãªããŸã. ãã® ENUM ã®åãæ±ãã®äžäžèŽã«ãã iteration æã®ããŒã¿æ¬ æãé¿ããããã«, gh-ost ã§ã¯ UNIQUE KEY ã« ENUM ãå«ãŸããå Žåã«ã¯ CONCAT(...) ã«ããæç€ºçãªæååãšããŠåãæ±ãããŸã[^9]. ãã®æ, ORDER BY CONCAT(...) ASC ãå®è¡ãããããšã«ãªãçµæãšã㊠iteration ã®ãã³ã« Creating Sort Index ãçºçãæ§èœ, è² è·ãšãã«å£åããå¯èœæ§ããããŸã. DM ãçšãã DDL å®è¡ ãããã TiDB ã®è©±ã«ç§»ããŸã. åè¿°ã®éãã¡ã«ã«ãªã§ã¯ç§»è¡ã«äŒŽã忢æéããªãã¹ãçãããããã« DM ãçšã㊠MySQL ãš TiDB ã§å·®ååæããã€ã€åãæ¿ããé²ããŠããŸã: ãã®æ, åè¿°ã®æ¡ä»¶ 3 ã®å Žåã«ã©ã®ãããªæåã«ãªãããèããŠã¿ãŸã. ãã¡ãã®ããã¥ã¡ã³ã ã®éã, DM ã«ã¯ online-ddl ãšãããã©ã°ããã pt-osc ã gh-ost ãšãã£ã online migration tool ã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããŠããŸã. ãããã㯠gh-ost ãäŸã«ããŠèª¬æããŠãããŸã. ãŸã, gh-ost ã§ test database ã® foo table ã« DDL ãé©å¿ãããæµãã«ã€ããŠèª¬æããŸã: ã¡ã¿ããŒã¿ããŒãã«(ghc) ãäœæ Create /* gh-ost */ table test._foo_ghc realtable ãããšã«åãæ¿ãåŸã®ããŒãã«(gho)ãäœæ Create /* gh-ost */ table test._foo_gho like test.foo gho ã« DDL ã®é©å¿ ALTER /* gh-ost */ table test._foo_gho ... realtable ãã gho ãžã® backfill backfill å®äºåŸ realtable ãã gho ãžã®å·®ååæ å·®ååæå®äºåŸ RENAME æã䜿ã£ãŠ cutover RENABLE TABLE foo TO _foo_del, _foo_gho TO foo ãã®ãããŒã§ online-ddl ãæå¹åãããŠããå Žåã« DM ã¯ã©ã®ãããªæåã«ãªãã§ãããã. ã¡ã¿ããŒã¿ããŒãã«(ghc) ãäœæ DM 㯠ghc ããŒãã«ãäœæããªã realtable ãããšã«åãæ¿ãåŸã®ããŒãã«(gho)ãäœæ DM 㯠gho ããŒãã«ãäœæããªã, ãã®ä»£ããã«ã¡ã¿ããŒã¿ããŒãã« dm_meta.{task_name}_onlineddl ãåæåãã DELETE FROM dm_meta.{task_name}_onlineddl WHERE id = {server_id} and ghost_schema = {ghost_schema} and ghost_table = {ghost_table}; gho ã« DDL ã®é©å¿ DM ãå®è¡ããã DDL ãã¡ã¿ããŒã¿ããŒãã« dm_meta.{task_name}_onlineddl ã«ä¿åãã ãã® DDL ã¯åŸã«å©çšããã realtable ãã gho ãžã® backfill DM 㯠realtable ãžã®æŽæ°ã®ã¿ TiDB ã«åæãã gho ãžã®æŽæ°ã¯ãã¹ãŠç Žæ£ããã backfill å®äºåŸ realtable ãã gho ãžã®å·®ååæ 4 ãšåæ§ã« realtable ãžã®æŽæ°ã®ã¿åæ å·®ååæå®äºåŸ RENAME æã䜿ã£ãŠ cutover DM 㯠cutover ã® RENAME æãåå²ã, gho table ãã realtable ãžã® RENAME å®è¡ã®éã«äžèšã宿œãã 3 ã§ä¿åãã DDL ãååŸ DDL ã® gho ã realtable ã«çœ®æ 眮æããã DDL ãå®è¡ ALTER table test.foo ...; ãã®ããã«ã㊠DM 㯠OnlineDDL ããŒã«ãå©çšããéã« realtable ãã gho ãžã®åæã«äŒŽãåŠçãåæžããŠããŸã( online-ddl=false ãæå®ããå Žåã¯éåžžéã gho/ghc ãªã©ãäœæããã). ãŸãšãããšäžèšã®ããã«ãªããŸã: MySQL TiDB ã¡ã¿ããŒã¿ããŒãã«(ghc) ãäœæ ghc ããŒãã«ã¯äœæããªã realtable ãããšã«åãæ¿ãåŸã®ããŒãã«(gho)ãäœæ gho ããŒãã«ã¯äœæãã DM ã®ã¡ã¿ããŒã¿ããŒãã«ãåæå gho ã« DDL ã®é©å¿ å®è¡äºå®ã® DDL ãã¡ã¿ããŒã¿ããŒãã«ã«ä¿å realtable ãã gho ãžã® backfill realtable ãžã®æŽæ°ã®ã¿ TiDB ã«åæ backfill å®äºåŸ realtable ãã gho ãžã®å·®ååæ realtable ãžã®æŽæ°ã®ã¿ TiDB ã«åæ å·®ååæå®äºåŸ RENAME æã䜿ã£ãŠ cutover RENAME æãåå²ãä¿åããŠãã DDL ãå®éã« realtable ã«å¯ŸããŠå®è¡ gh-ost å©çšæã® DM ã®æåã®æ¯èŒ DDL å®è¡æã®ãã©ãã« ã¡ã«ã«ãªã§ã¯ online-ddl=true & gh-ost ã«ãã DDL å®è¡ã§éçšããŠãã, ç¹ã«å€§ããªåé¡ããªãéçšã§ããŠããŸãã. ãããããæã® DDL å®è¡ã§åé¡ãçºçããŸã. ãã®åé¡ãšã¯ DM ã® replication lag ãéåžž 1~2s æªæºã ã£ããã®ãçªåŠ 1h 以äžé
å»¶ãããšããäºè±¡ã§ãã. DM ã® status 㯠RUNNING ã«ãé¢ããããã®æ§ã« Replication QPS(DM syncer ã®å®äºãã Job æ°)ã 16:00 é ãã 0 ã«ãªã£ãŠãã, DML ãäœãå®è¡ãããªããªã£ãŠããŸãã: TiDB ã®ãµããŒãããŒã ãšãšãã«èª¿æ»ãããšãã, ãã® QPS ã忢ããã¿ã€ãã³ã°ã§äžèšã® DDL ãå®è¡ãããŠããããšãããããŸãã. ALTER TABLE `mercari`.`foo` MODIFY COLUMN `bar_id` int(10) UNSIGNED NOT NULL; ãã® DDL ã¯å
ã® MySQL ã«ããã DDL å®è¡ãã¿ãŒã³ã«ãã㊠gh-ost ãå©çšãããã®ã§ãã£ããã, å
ã§ç޹ä»ãã cutover( RENAME TABLE ) å®è¡æã« ALTER ãå®è¡ãããŠãããã® DDL ã«ãã DM ã®é
å»¶ãçºçããŠããããšãããããŸãã. åå ã¯ããããŸããã, ãªã DM ãé
å»¶ããã®ã§ãããã. ããã¯å
ã«ç޹ä»ãã Online DDL ã® replica ã§å®è¡ãããå¶éãšåãçç±ã§, TiDB ãçŽæ¥ MySQL ã® binlog ãèªããªããã DM ãå
ã® source/replica ã§ã® table defnition ãš DML ã®æŽåæ§æ
ä¿ãä¿èšŒããããã®ä»çµã¿ãšãªã£ãŠããŸã. ã§ã¯ v8.5.3 ãäŸã«å®éã«ã³ãŒãã®äžãã¿ãŠã¿ãŸããã[^10]: // dm/syncer/syncer.go#L713 func (s *Syncer) Process(ctx context.Context, pr chan pb.ProcessResult) { // ... err := s.Run(newCtx) if err != nil { // returned error rather than sent to runFatalChan // cancel goroutines created in s.Run cancel() } // ... } // dm/syncer/syncer.go#L1741 func (s *Syncer) Run(ctx context.Context) (err error) { // ... s.runWg.Add(1) go s.syncDML() s.runWg.Add(1) go func() { defer s.runWg.Done() // also need to use a different ctx. checkpointFlushWorker worker will be closed in the first defer s.checkpointFlushWorker.Run(s.tctx) }() s.runWg.Add(1) go s.syncDDL(adminQueueName, s.ddlDBConn, s.ddlJobCh) // ... } // dm/syncer/syncer.go#L1419 func (s *Syncer) syncDDL(queueBucket string, db *dbconn.DBConn, ddlJobChan chan *job) { defer s.runWg.Done() var err error for { ddlJob, ok := <-ddlJobChan if !ok { return } // ... if !ignore { // ... affected, err = db.ExecuteSQLWithIgnore(s.syncCtx, s.metricsProxies, errorutil.IsIgnorableMySQLDDLError, ddlJob.ddls) // ... } } } // dm/syncer/ddl.go#L221 func (ddl *DDLWorker) HandleQueryEvent(ev *replication.QueryEvent, ec eventContext, originSQL string) (err error) { // ... if err = ddl.flushJobs(); err != nil { return err } return ddl.strategy.handleDDL(qec) } // dm/syncer/syncer.go#L3210 func (s *Syncer) flushJobs() error { flushJobSeq := s.getFlushSeq() s.tctx.L().Info("flush all jobs", zap.Stringer("global checkpoint", s.checkpoint), zap.Int64("flush job seq", flushJobSeq)) job := newFlushJob(s.cfg.WorkerCount, flushJobSeq) _, err := s.handleJobFunc(job) return err } // dm/syncer/syncer.go#L1115 func (s *Syncer) handleJob(job *job) (added2Queue bool, err error) { // ... s.addJob(job) // ... } // dm/syncer/syncer.go#L1016 func (s *Syncer) addJob(job *job) { // ... tp := job.tp switch tp { case flush: s.jobWg.Add(1) s.dmlJobCh <- job case ddl: s.updateJobMetrics(false, adminQueueName, job) s.jobWg.Add(1) startTime := time.Now() s.ddlJobCh <- job s.metricsProxies.AddJobDurationHistogram.WithLabelValues("ddl", s.cfg.Name, adminQueueName, s.cfg.SourceID).Observe(time.Since(startTime).Seconds()) // ... } } // dm/syncer/syncer.go#L1617 func (s *Syncer) syncDML() { defer s.runWg.Done() dmlJobCh := s.dmlJobCh if s.cfg.Compact { dmlJobCh = compactorWrap(dmlJobCh, s) } causalityCh := causalityWrap(dmlJobCh, s) flushCh := dmlWorkerWrap(causalityCh, s) for range flushCh { s.jobWg.Done() } } // dm/syncer/syncer.go#L1419 func (s *Syncer) syncDDL(queueBucket string, db *dbconn.DBConn, ddlJobChan chan *job) { defer s.runWg.Done() var err error for { ddlJob, ok := <-ddlJobChan if !ok { return } // ... if !ignore { // ... affected, err = db.ExecuteSQLWithIgnore(s.syncCtx, s.metricsProxies, errorutil.IsIgnorableMySQLDDLError, ddlJob.ddls) // ... } } } ãã®éšåã§ binlog ãã DDL ã€ãã³ããæ¥ããšãã«, ãŸã DML ã® flush ãè¡ããŸã. ãã㯠DML queue ã«å
¥ã£ãŠãã DML ãäžåºŠãã¹ãŠäžæµ(TiDB)ã«ãŠå®è¡ãããã, s.jobWg.Wait() ãããã®å®äºãåŸ
æ©ããŸã. ãã®åŸ DDL job ã DDL queue ã«æå
¥ã, åã³ s.jobWg.Wait() ã§äžæµ(TiDB)ã§ DDL å®è¡ãå®äºãããŸã§åŸ
æ©ããŸã. ãã® DDL ã«ãã wait ã§åŸ
æ©ããŠããé binlog ã€ãã³ãåŠçã«ãŒãã¯ãããã¯ããããã, DDL ãå®äºãããŸã§ DM ã¯åŸç¶ã®ã€ãã³ããåŠçããªããšããããšã«ãªããŸã. online-ddl=true èšå®æã« gh-ost ãå©çšãã DDL ã®å®è¡ã¯äžèšã®ããã«ãªããŸã: ãã®æ§ã« gh-ost ã® cut-over(RENAME) å®è¡æã« downstream åŽã§å®éã® DDL ãçºè¡ãããããå®äºãããŸã§ DML ã¯ãããã¯ããããã, DDL ãå®äºãããŸã§ replication ãé
å»¶ããããšã«ãªããŸã. DM ãå©çšãã€ã€å®å
šã« DDL ãå®è¡ããã«ã¯ ãã®æ§ã« online-ddl 㯠gh-ost ãªã© online schema change tool ã®å©çšæã«åæã«å¿
èŠãªç¡é§ãåæžãããããã®ãã®ãªãã, æå®ãããšããŠãäžæµ(TiDB)ã§ã® DDL ã®å®è¡å®äºãåŸ
ã€å¿
èŠããããŸã. ããã¯åé ã®ç¡åæ¢ã§æ®µéçã«ç§»è¡ããŠããéã«ããã€ãåé¡ãããå ŽåããããŸã. MySQL ãã TiDB ãžç§»è¡ããéã«ã¯ãµãŒãã¹ãžã®åœ±é¿ãå°ãªããã®(åæåºç€ã®ããã® CDC ãªã©)ããèªã¿èŸŒã¿ãç§»è¡ãããŠãããŸãã, ãããã®äžã«ã¯å€§ããªé
å»¶ã蚱容ã§ããªããã®ããããã, æ°æéå®è¡ã«ããã DDL ã¯åœ±é¿ãäžããå¯èœæ§ããããŸã. äžæ¹ã§ã¡ã«ã«ãªã®ããŒã¿ããŒã¹ã¯ãããã巚倧ã§ãã TiDB Dumpling ã TiDB Lightning ã«ãã export/import ã§ãæ°æ¥ä»¥äžããã, DDL å®è¡ã®ããã« DM ã忢, ã€ãŸã TiDB Cluster ãåäœæãããšãããªãã¬ãŒã·ã§ã³ãçŸå®çã§ã¯ãããŸãã. ãã®ãã, ã¡ã«ã«ãªã§ã¯äžèšã®ããã« DDL ã®å®è¡æ¹æ³ãã±ãŒã¹åãããŠããŸã: å
ã®ç޹ä»ã®ããã« online-ddl ãæå¹åãããš MySQL äžã§ cutover( RENAME TABLE ) ãããã¿ã€ãã³ã°ã§ TiDB åŽã§ DDL ãå®è¡ãããŸã. ä»®ã«ãã® DDL ãäŸãã° MODIFY COLUMN ã®ããã«äœåºŠã§ãå®è¡å¯èœãªå Žåã¯, å
ã« TiDB åŽã®ã¿ DDL ãå®è¡ããŠãã㊠gh-ost ãããããšã§2åç®ã®(å®è³ªæå³ããªã) DDL ã§ã¯å³åº§ã«çµäºãããã, å®éã® DDL ãé·æéã§ã DM ã®é
å»¶ãæå°ã«æããããšãå¯èœã§ã. åã®ããã° ã«ãããããªã¬ã³ãŒãæ°ãå€ãããã« INDEX ã§å€æ°å©çšãããŠãããã㪠column ã«å¯Ÿãã MODIFY COLUMN ãªã©ã«ã¯æçšãšèšããŸã. ãã以å€ã®å Žå(äŸãã° INDEX 远å ãªã©)ã¯å®è¡æéãããžãã¹èŠä»¶ã«ãã£ãŠããããŸãã, é
å»¶ã蚱容ã㊠gh-ost ãå®è¡ãã, Binlog Event Filter ã«ãã該åœã® DDL ã ãé€å€ãããªã©å¯Ÿå¿ãèããããŸã. ãŸãšã ä»å㯠DM ã§ MySQL ãš TiDB ãåæããŠãããšãã« DDL ããªãã¹ãå®å
šã«å®è¡ããæ¹æ³ã玹ä»ããŸãã. DM ãå©çšããéã«åèã«ããŠããã ãããšå¹žãã§ã. çŸåšã¡ã«ã«ãªã§ã¯ DBRE ã® EM ãåéããŠããŸã, 詳ãã㯠ãã¡ã ãã芧ãã ãã. [^1]: ref: https://pingcap.co.jp/case-study/mercari-tidb-cloud/ ã [^2]: ref: https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-operations.html ã [^3]: æ«å°Ÿè¿œå ãã€èŠçŽ ã®åæ°ã byte ãè·šããªãå Žåã®ã¿è©²åœ [^4]: ref: https://dev.mysql.com/doc/refman/8.4/en/metadata-locking.html ã [^5]: äŸãã° INDEX ã column ã®æäœ(远å /åé€/ã¿ã€ã倿Ž) [^6]: ref: https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-limitations.html ã [^7]: ref: https://github.com/github/gh-ost/blob/master/doc/requirements-and-limitations.md ã [^8]: ref: gh-ost 㯠Go èšèª, pt-osc 㯠Perl ã§å®è£
ãããŠãã [^9]: ref: https://github.com/github/gh-ost/issues/273 ã [^10]: ref: https://github.com/pingcap/tiflow/blob/v8.5.3/ ã
LifeKeeperã®ãå°ã£ããããã§ããïŒãã«å€ããïŒãµããŒãäºäŸããåŠã¶ãã©ãã«ã·ã¥ãŒãã£ã³ã°ïŒåçºé²æ¢ç ããã«ã¡ã¯ãSCSKã®åç°ã§ãã ãã€ã TechHarmony ãã芧ããã ãããããšãããããŸãã ã·ã¹ãã ã®ãªãã¬ãŒã¹ãããŒããŠã§ã¢æŽæ°ã®ã¿ã€ãã³ã°ã§èšªããããããã«ãŠã§ã¢ã®ããŒãžã§ã³ã¢ãããã ããµããŒãåãïŒEOSïŒå¯Ÿå¿ãããé
åçãªæ°æ©èœã®è¿œå ããªã©ãOSã®ãããé©çšãšã¯ãŸãéã£ããæåŸ
ãšç·åŒµãå
¥ãæ··ããäžå€§ã€ãã³ãã§ã¯ãªãã§ããããã ããããHAã¯ã©ã¹ã¿ãŒãœãããŠã§ã¢ã§ããLifeKeeperã«ãããŠããã®ãããŒãžã§ã³ã¢ãããã¯åãªããã¡ã€ã«ã®çœ®ãæãã§ã¯ãããŸããã ãã€ã³ã¹ããŒã©ãŒãå®è¡ããŠãããŒãžã§ã³çªå·ãäžããã°å®äºïŒã âŠâŠããæã蟌ãã§äœæ¥ãé²ããçµæãåèµ·ååŸã«èšå®ãã¡ã€ã«ãåæå€ã«æ»ã£ãŠããããé·å¹ŽåããŠããã¹ã¯ãªãããçªç¶ãšã©ãŒãåãå§ããããšãã£ããäºæãã¬ãã©ãã«ã«çŽé¢ããããšããããŸãã æ¬é£èŒäŒç»ãLifeKeeper ã®ãå°ã£ããããã§ããïŒãã«å€ããïŒãµããŒãäºäŸããåŠã¶ãã©ãã«ã·ã¥ãŒãã£ã³ã°ïŒåçºé²æ¢çãã§ã¯ããµããŒãã»ã³ã¿ãŒã«èç©ããããçã®ãã©ãã«äºäŸããå
ã«ãå®å®éçšã®ããã®å®è·µçãªç¥æµãå
±æããŠãããŸãã ã¯ããã«ïŒæåãžã®ããŒãããããæã é£èŒç¬¬2åãšãªãä»åã¯ãLifeKeeperæ¬äœãDataKeeperã®ããŒãžã§ã³ã¢ããã«çŠç¹ãåœãŠãŸãã ããŒãžã§ã³ã¢ããäœæ¥ã«ãããŠãæãæãã®ã¯ ãèŠããªãå€åã ã§ãã ã€ã³ã¹ããŒã©ãŒã¯äŸ¿å©ã§ããããããè£åŽã§ã©ã®èšå®ãåŒãç¶ããã©ã®èšå®ããªã»ããããã®ãããŸãæ°ããããŒãžã§ã³ãå€ãèšå®ãã©ãè§£éããã®ãã¯ããªãªãŒã¹ããŒãã®çްéšãèªã¿èŸŒãŸãªãéãèŠããŠããŸããã ä»åã¯ãå®éã«ãµããŒããžå¯ãããããããŒãžã§ã³ã¢ãã倱æäºäŸãã以äžã®3ã€ã®ãèœãšã穎ïŒTrapïŒãã«åé¡ããŸããã èšå®ãšç°å¢ã®ããµã€ã¬ã³ãå€åã éå»ã®ããŸããããããçããã è¿éã¯ãæ¥ãã°åãã ãããã®äºäŸããããªã倱æããã®ãããåŠã³ã確å®ã«æåãããããã®ãã§ãã¯ãã€ã³ãïŒããŒããããïŒã解説ããŸãã ãã®ä»ã®é£èŒäŒç»ã¯ä»¥äžã®ãªã³ã¯ããã©ããïŒ ããªãœãŒã¹èµ·åã»ãã§ã€ã«ãªãŒããŒå€±æã®æ·±å±€ #1ãEC2ãªãœãŒã¹ãèµ·åããªãïŒã¯ã©ãŠã飿ºã®ç²ç¹ãšãããã°è¡ â TechHarmony ããªãœãŒã¹èµ·åã»ãã§ã€ã«ãªãŒããŒå€±æã®æ·±å±€ #2ããã¡ã€ã«ã·ã¹ãã ã®æãã¬èœãšã穎ïŒãšã©ãŒã³ãŒãããåå ãèªã¿è§£ã â TechHarmony ããªãœãŒã¹èµ·åã»ãã§ã€ã«ãªãŒããŒå€±æã®æ·±å±€ #3ãèšå®ãã¹ã»éä¿¡é害ã»ããŒãžã§ã³éãã®æ·±å±€ãšåçºé²æ¢ç â TechHarmony ãOSã»LKããŒãžã§ã³ã¢ããã§æ³£ããªãããã« #1ãOSããŒãžã§ã³ã¯å€ããŠããªãã®ã«ïŒïŒã«ãŒãã«æŽæ°ã®ãèœãšã穎ããšäºææ§ã®çå® â TechHarmony ãå®é²ãLifeKeeperããŒãžã§ã³ã¢ããã®ãå°ã£ãïŒãäºäŸãã¡ã€ã« ããããã¯ãå®éã®ãµããŒãåãåãããããŒã¹ã«ããã±ãŒã¹ã¹ã¿ãã£ã§ãã ãèªåã®ç°å¢ã§ãèµ·ãããããããããªãã ãšããèŠç¹ã§ã芧ãã ããã Trap 1ïŒèšå®ãšç°å¢ã®ããµã€ã¬ã³ãå€åã ããŒãžã§ã³ã¢ããã«ãã£ãŠãä»ãŸã§äœ¿ã£ãŠããèšå®ãç°å¢ã ãéãã«ã å€ãã£ãŠããŸã ã±ãŒã¹ã§ãã â ã±ãŒã¹AïŒã¢ããããŒããããèšå®ãæ¶ããïŒïŒïŒLinuxçïŒ ãv9.5.2ããv9.9.1ãžã¢ããããŒãããŸããããšã©ãŒãªãå®äºããã®ã§ãããåèµ·ååŸã«ãªãããããã·èšå®ãªã©ãå¹ããªããªã£ãŠããŸãâŠã çºçç¶æ³: ã¢ããããŒãäœæ¥èªäœã¯æåãããã®ã®ãLifeKeeperã®åäœèšå®ãã¡ã€ã«ïŒ /etc/default/LifeKeeper ïŒã«èšè¿°ããŠããã«ã¹ã¿ã èšå®ãæ¶å€±ããŠããŸããã åå : LifeKeeperã®ä»æ§ã«ãããæŽæ°ã€ã³ã¹ããŒã«æã« äžéšã®èšå®ãã¡ã€ã«ãããã©ã«ãå€ã«æ»ãïŒäžæžããããïŒ æåãšãªã£ãŠããŸããã æèš: ãèšå®ã¯ãã¹ãŠèªåçã«åŒãç¶ãããã¯ãããšããæã蟌ã¿ã¯å±éºã§ããç¹ã«ã¡ãžã£ãŒããŒãžã§ã³ããŸããæŽæ°ã§ã¯ãããã¯ã¢ãããšåŸ©å
æé ãå¿
é ã§ãã â ã±ãŒã¹BïŒã¹ã¯ãªãããåããªãïŒPerlã®çœ ïŒWindowsçïŒ ãv8.9ããv8.10.2ãžäžããããšããŠããŸãããã©ã¡ãŒã¿å€æŽã¯äžèŠãšèããŸããããæ¬åœã«ãã®ãŸãŸäžããŠå€§äžå€«ã§ããããïŒã ãªã¹ã¯: 調æ»ã®çµæãLifeKeeperã«å梱ãããŠããPerlã®ããŒãžã§ã³ããv8.10.1以éã§ã5.8ç³»ãããã5.32ç³»ããžãšäžæ°ã«ã¢ããã°ã¬ãŒããããŠããããšã倿ããŸããã æèš: GenericãªãœãŒã¹ãªã©ã§Perlã¹ã¯ãªããã䜿çšããŠããå Žåãèšèªä»æ§ã®å€æŽã«ããã¹ã¯ãªãããåäœããªããªãå¯èœæ§ããããŸããã¢ããªã±ãŒã·ã§ã³ã ãã§ãªããããã«ãŠã§ã¢ãäŸåãã ãèšèªç°å¢ãã®å€å ãéèŠãªãã§ãã¯ãã€ã³ãã§ãã Trap 2ïŒéå»ã®ããŸããããããçããã å€ãããŒãžã§ã³ã§ã¯èš±å®¹ãããŠããïŒãããã¯ç¡èŠãããŠããïŒèšå®ã®äžåããæ°ããããŒãžã§ã³ã®ã峿 Œãªãã§ãã¯ãã«ãã£ãŠãšã©ãŒãšããŠé¡åšåããã±ãŒã¹ã§ãã â ã±ãŒã¹CïŒäº¡éIPãã¢ã©ãŒããåŒãèµ·ãã ãOSãšLifeKeeperãæŽæ°ããåŸããã°ã« failed quickCheck due to ALRM signal ãšãããšã©ãŒãå€çºããããã«ãªããŸããã以åã¯åºãŠããªãã£ãã®ã§ããâŠã åå : IPãªãœãŒã¹ã®ç£èŠãªã¹ãïŒ pinglist ïŒã«ãæ¢ã«æ€å»æžã¿ã§çéã§ããªãå€ãIPã¢ãã¬ã¹ãæ®ã£ãŠããŸããã ãªãä»ïŒ: ããŒãžã§ã³ã¢ããã«äŒŽã ãã§ãã¯åŠçããªãã©ã€ã®æåãå€åïŒå³æ ŒåïŒ ããå€ãIPãžã®å¿çåŸ
ã¡ãç©ã¿éãªã£ãçµæãã¿ã€ã ã¢ãŠãïŒALRM signalïŒãçºçããŠããŸããã æèš: ãä»ã¯äœ¿ã£ãŠããªããã©æ®ã£ãŠããèšå®ãã¯ãããŒãžã§ã³ã¢ããæã®æå€§ã®æµã§ããæŽæ°äœæ¥ã¯ãŽãæé€ã®çµ¶å¥œã®æ©äŒãšæããŸãããã â ã±ãŒã¹DïŒãã£ã¹ã¯ã«ååããªãïŒïŒïŒUUIDåé¡ïŒ ãããŒãžã§ã³ã¢ããåŸãDataKeeperãªãœãŒã¹ã§ãäžæã®èå¥åããªãããšããèŠåãåºãããããŒãã£ã·ã§ã³æ
å ±ãæ£ããååŸã§ããªããªããŸããã åå : LifeKeeper/DataKeeperã®æ°ããããŒãžã§ã³ã§ã¯ããã£ã¹ã¯ãäžæã«ç¹å®ããããã« ãUUIDãã®äœ¿çšãå¿
é åïŒãŸãã¯å³æ ŒåïŒ ãããŸãããå€ãç°å¢ã§ãMBR圢åŒãã®ããŒãã£ã·ã§ã³ã䜿ã£ãŠãããããUUIDãæãããæ°ããããŒãžã§ã³ã®èŠä»¶ãæºãããªããªã£ãŠããŸããã æèš: ãœãããŠã§ã¢ã®é²åã«åãããŠãã€ã³ãã©åŽïŒããŒãã£ã·ã§ã³ããŒãã«çïŒãGPT圢åŒãžã®ã¢ãã³åãå¿
èŠã«ãªãããšããããŸãã Trap 3ïŒè¿éã¯ãæ¥ãã°åãã æé ãçç¥ããããç¡çãªã¢ããããŒããã¹ãéãããšããŠå€±æããã±ãŒã¹ã§ãã â ã±ãŒã¹EïŒé£ã°ããããããŒãžã§ã³ã¢ãã ãv9.6.xããv9.8.1ãžäžæ°ã«ã¢ããããŒãããããšããã倱æããŸããã2äžä»£åããã®æŽæ°ã¯ãµããŒããããŠããã¯ãã§ããâŠã åå : åºæ¬çã«ã¯çŽæ¥ã¢ããããŒããå¯èœã§ããã ãã®ç¹å®ã®ããŒãžã§ã³ïŒv9.8.1ïŒã«ãããŠã¯ å
éšããã±ãŒãžã®å€§å¹
ãªæ§æå€æŽ ããã£ããããäŸå€çã«v9.7ãv9.8.0ãçµç±ãããã¹ãããã¢ããã°ã¬ãŒãããå¿
èŠã§ããã æèš: ããã€ãã®ã«ãŒã«ïŒN-2ãŸã§OKãªã©ïŒãä»åãé©çšãããããšã¯éããŸããããªãªãŒã¹ããŒãã«ã¯å¿
ã ãã¢ããã°ã¬ãŒãã®æ³šæç¹ãããäŸå€çãªãã¹ã ãèšèŒãããŠããŸãã®ã§ãæ
£ããŠããäœæ¥ã§ãå¿
ãç®ãéããŸãããã â ã±ãŒã¹FïŒGUIã®è¡šç€ºããããã ãDataKeeperæŽæ°åŸãGUIäžã§ãžã§ãæ
å ±ã衚瀺ãããªããªããŸããã 解決ç: 調æ»ã®çµæãå
éšæ
å ±ã®äžæŽåãèµ·ããŠããŸããããã®ã±ãŒã¹ã§ã¯ãç¡çã«ä¿®æ£ããããããåã€ã³ã¹ããŒã«ããŠãžã§ããåäœæãããæ¹ããçµæãšããŠæ©ãã確å®ã«è§£æ¶ããŸããã æèš: ããŒãžã§ã³ã倧ããé¢ããŠããå Žåãæåãããããå Žå ã¯ãäžæžãã¢ããããŒãã«åºå·ãããèšå®ããã¯ã¢ããããšã£ãäžã§ã®ãäœãçŽãïŒåäœæïŒããæçã«ãŒãã«ãªãããšããããŸãã ãåçºãããªãïŒãæåãžã®ãã§ãã¯ãªã¹ã äžèšã®å€±æäºäŸããå°ãåºãããããŒãžã§ã³ã¢ããäœæ¥åã«ç¢ºèªãã¹ãã転ã°ã¬å
ã®æããã§ãã¯ãªã¹ãã§ããèšç»æ®µéã§ãã²ã掻çšãã ããã â LifeKeeper/DataKeeper ããŒãžã§ã³ã¢ããäºå確èªã·ãŒã [ã ] ããã¹ã®ç¢ºèªã çŸåšã®ããŒãžã§ã³ããã¿ãŒã²ããããŒãžã§ã³ãžãçŽæ¥ãã¢ããããŒãå¯èœã§ããïŒïŒäžç¶ããŒãžã§ã³ãå¿
èŠãããŸãããïŒïŒ [ ã] ãèšå®ãã¡ã€ã«ã®ããã¯ã¢ããã æŽæ°æã«åæåããããã¡ã€ã«ïŒ /etc/default/LifeKeeper çïŒãç¹å®ããŠããŸããïŒ ãããã®æåããã¯ã¢ãããååŸããæŽæ°åŸã«åŸ©å
ããæé ãçµã¿èŸŒã¿ãŸãããïŒ [ ã] ãèšèªã»ç°å¢ã®å·®ç°ã PerlãPythonãªã©ãLifeKeeperãå©çšããã©ã³ã¿ã€ã ã®ããŒãžã§ã³ã«å€æŽã¯ãããŸãããïŒïŒèªäœã¹ã¯ãªãããžã®åœ±é¿ç¢ºèªïŒ ãã£ã¹ã¯ã®ããŒãã£ã·ã§ã³åœ¢åŒã¯æ°ããããŒãžã§ã³ã®èŠä»¶ïŒUUIDå¿
é /GPTæšå¥šãªã©ïŒãæºãããŠããŸããïŒ [ ã] ãäžèŠèšå®ã®åé€ïŒãŽãæé€ïŒã IPãªãœãŒã¹ã® pinglist ã«ãçŸåšçéã§ããªãã亡éIPããæ®ã£ãŠããŸãããïŒ [ã ] ãOSãšã®æŽåæ§ã OSèªäœã®ã«ãŒãã«ã¢ããããŒããè¡ãå ŽåãLifeKeeperã®åã€ã³ã¹ããŒã«ãã¢ãžã¥ãŒã«åã³ã³ãã€ã«ã®æé ã確èªããŸãããïŒ [ã ] ããªã«ããªãã©ã³ã æŽæ°ã€ã³ã¹ããŒã«ãäžæŽåãèµ·ãããå Žåã«åããäžåºŠã¢ã³ã€ã³ã¹ããŒã«ããŠãæ°èŠã€ã³ã¹ããŒã«ïŒèšå®åŸ©å
ïŒãŸãã¯åäœæïŒãã«åãæ¿ããå€æåºæºãæã£ãŠããŸããïŒ ãã¹ããã©ã¯ãã£ã¹ïŒæåãžã®è¿é ãã©ãã«ãé²ãããã«ãææ¥ããã§ããããã¹ããã©ã¯ãã£ã¹ãã3ã€ææ¡ããŸãã ããªãªãŒã¹ããŒããã¯å®ã®å°å³ ãªãªãŒã¹ããŒããããã°ä¿®æ£ã®ãªã¹ããã ãšæã£ãŠããŸãããïŒ æ¬åœã«èŠãã¹ãã¯ãå¶éäºé
(Known Issues)ã ãš ã倿Žç¹ (Migration/Changes)ãã§ããããã«ã¯ãèšå®ãã¡ã€ã«ãåæåãããããUUIDãå¿
é ã«ãªãããšãã£ãéèŠæ
å ±ãå¿
ãæžãããŠããŸãã ã¹ããŒãžã³ã°ç°å¢ã§ã®ãªããŒãµã«ã¯å¿
é æºäžã®ç¢ºèªã ãã§ã¯ããpinglistã®ã¿ã€ã ã¢ãŠããããPerlã®äºææ§ããšãã£ãç°å¢äŸåã®ãã©ãã«ã¯èŠæããŸãããæ¬çªç°å¢ã®ã¯ããŒã³ïŒãŸãã¯åçæ§æïŒãçšæããå®éã«ããŒãžã§ã³ã¢ããæé ãæµããªããŒãµã«ãè¡ã£ãŠãã ããã 倧å¹
ãªæŽæ°ã¯ãåäœæããèŠéã« æ°å¹Žåã®ããŒãžã§ã³ããäžæ°ã«ææ°çã«ãããããªå Žåãç¶ãæ¥ãã®ã¢ããããŒããç¹°ãè¿ãããããèšå®æ
å ±ãæ§ããŠãã¯ãªãŒã³ã€ã³ã¹ããŒã«åŸã«åèšå®ãããæ¹ããæœåšçãªãŽããæ®ãããçµæçã«å®å®çšŒåã«ã€ãªããããšãå€ã
ãããŸãããäžæžããã«ãã ãããªãæè»æ§ãéèŠã§ãã ãŸãšã ããŒãžã§ã³ã¢ããæã®ãã©ãã«ã¯ãå€ãã®å Žåãæºåäžè¶³ãããæã蟌ã¿ãã®ééã«å
¥ã蟌ããã®ã§ãã ããããä»åã玹ä»ããäºäŸã®ããã«ãäºåã« ãäœãå€ããã®ãããäœãæ¶ããã®ãããä»ã®èšå®ã«ãŽãã¯ãªããã ã確èªããŠããã°ããã®ã»ãšãã©ã¯é²ããŸãã ãLifeKeeperã®ãå°ã£ããããã§ããïŒãã«å€ããã ä»åã®ããŒãããããåèã«ããã²å®å¿ã»å®å
šãªããŒãžã§ã³ã¢ããèšç»ãç«ãŠãŠãã ããã æ¬¡åäºå 次åããã¯æ°ç« ã«çªå
¥ïŒ ããŒãã¯ãã¯ã©ãŠãç°å¢ç¹æã®èœãšã穎ïŒAWS/Azure飿ºã§ããããã€ã³ããã§ãã ã¯ã©ãŠããªãã§ã¯ã®ããªã³ãã¬ãã¹ãšåãæèŠã§èšå®ãããåããªãïŒïŒããšãããã©ãã«ã ãã®ç¬¬äžåŒŸãšããŠã AWSç°å¢ã§ã®LifeKeeperå®å®çšŒåè¡ ã«ãã©ãŒã«ã¹ããŸãã ãRoute53ã®DNSãåãæ¿ãããªãïŒãã䟿å©ãªã¯ãã®ãAuto RecoveryããLifeKeeperãšå§å©ããïŒïŒããšãã£ãAWSç¹æã®äºäŸãšãEC2ã»S3飿ºã®æ³šæç¹ã培åºè§£èª¬ããŸãããæ¥œãã¿ã«ïŒ 詳ããå
容ããç¥ãã«ãªãããããã¯ã以äžã®ãããŒããSCSK LifeKeeperå
¬åŒãµã€ããŸã§
åç»
該åœããã³ã³ãã³ããèŠã€ãããŸããã§ãã









