็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ—„️ MySQL / MariaDB Active-Active ้ซ˜ๅฏ็”จๆžถๆง‹:้›™ไธปๅŒๆญฅ + ่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›ๅฎŒๆ•ดๆŒ‡ๅ—

    ๐Ÿ—„️ MySQL / MariaDB Active-Active ้ซ˜ๅฏ็”จๆžถๆง‹:้›™ไธปๅŒๆญฅ + ่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›ๅฎŒๆ•ดๆŒ‡ๅ—

    ็•ถ็ถฒ็ซ™ๆˆ–็ณป็ตฑๆˆ้•ทๅˆฐไธ€ๅฎš่ฆๆจก,「ไธ€ๅฐ่ณ‡ๆ–™ๅบซ + ไธ€ๅฐๅ‚™ๆด」็š„ Active-Passive ๆžถๆง‹,ๅพˆๅฟซๅฐฑๆœƒ้‡ๅˆฐๆฅต้™: ่ฎ€ๅฏซ้ƒฝๆ“ ๅœจๅŒไธ€ๅฐไธปๆฉŸ、ๅ‚™ๆดๅนณๆ™‚้–’็ฝฎ、ๆ•…้šœๅˆ‡ๆ›้‚„ๅฏ่ƒฝ้œ€่ฆไบบๅทฅไป‹ๅ…ฅ。 ้€™ๆ™‚ๅ€™,「Active-Active ้›™ไธป+่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›」ๆœƒๆ˜ฏ่‡ช็„ถ็š„ไธ‹ไธ€ๆญฅ。 ๆœฌๆ–‡ไปฅ MySQL / MariaDB ็‚บไธป,ๅพžๆฆ‚ๅฟต、ๆžถๆง‹้ธๅž‹、้ƒจ็ฝฒๅฏฆไฝœๅˆฐๆ•…้šœๆƒ…ๅขƒ่ˆ‡ๆŽ’้Œฏๆ•ด็†ไธ€ๅฅ—ๅฎŒๆ•ดๅฏฆๅ‹™ๆŒ‡ๅ—。

    ๐Ÿ“Œ ไธ€、Active-Active ๆ˜ฏไป€้บผ?่ˆ‡ Active-Passive ๆœ‰ไฝ•ไธๅŒ?

    ๅ…ˆ็”จๆœ€็ฐกๅ–ฎ็š„ๆ–นๅผ,ๆŠŠๅ…ฉ็จฎๅธธ่ฆ‹ๆžถๆง‹ๆ‹†้–‹ไพ†็œ‹:

    • Active-Passive(ไธปๅ‚™)
      ไธ€ๅฐไธปๅบซ่™•็†ๆ‰€ๆœ‰่ฎ€ๅฏซ,ๅฆไธ€ๅฐๅ‚™ๅบซ้€้Ž่ค‡ๅฏซ(ๅŒๆญฅๆˆ–้žๅŒๆญฅ)่ทŸไธŠไธปๅบซ。ๅนณๆ™‚ๅ‚™ๅบซไธๅฐๅค–ๆœๅ‹™,ๅชๆœ‰ไธปๅบซๆŽ›ๆމๆ™‚ๆ‰ๅˆ‡ๆ›。
    • Active-Active(้›™ไธป / ๅคšไธป)
      ๅคšๅ€‹็ฏ€้ปž ๅŒๆ™‚ๅฐๅค–ๆไพ›ๆœๅ‹™,ๆต้‡ๅฏไปฅ่ขซๅˆ†ๆ•ฃๅˆฐไธๅŒ DB,็†่ซ–ไธŠๅฏไปฅๅŒๆ™‚ๆๅ‡ๅžๅ่ˆ‡ๅฏ็”จๆ€ง。

    ๅ…ฉ่€…ๆœ€้—œ้ต็š„ๅทฎ็•ฐๅœจๆ–ผ:

    • ่ณ‡ๆ–™ไธ€่‡ดๆ€ง้›ฃๅบฆ:Active-Active ๅฟ…้ ˆ่™•็†「ๅคšๅ€‹็ฏ€้ปžๅŒๆ™‚ๅฏซๅ…ฅๅŒไธ€็ญ†่ณ‡ๆ–™」็š„่ก็ชๅ•้กŒ。
    • ๆต้‡ๅˆ†ๆ•ฃๆ–นๅผ:Active-Passive ๅŸบๆœฌไธŠๆ‰€ๆœ‰ๅฏซๅ…ฅ้ƒฝๆ‰“ๅˆฐๅŒไธ€ๅฐ;Active-Active ๅ‰‡้œ€่ฆๆญ้… Load Balancer / ไธญไป‹ๅฑค ็ฎกๆต้‡。
    • ๆ•…้šœ่กŒ็‚บ:Active-Passive ๅชๆœ‰ไธ€ๅ€‹「ไธป」้œ€่ฆๅˆ‡ๆ›;Active-Active ๅ‰‡่ฆ่™•็†「ๆŸๅ€‹็ฏ€้ปžๆญปๆމๅพŒ,ๅฆ‚ไฝ•ๅฟซ้€ŸๆŠŠๆต้‡ๅฐŽๅ‘ๅ…ถไป–ๅฅๅบท็ฏ€้ปž」。

    ๅ› ๆญค,Active-Active ไธๆ˜ฏๅคš้–‹ๅนพๅฐ DB、ไบ’็›ธๅšไธปๅพž ๅฐฑ่ƒฝๅฎŒๆˆ。 ไฝ ้œ€่ฆ็š„ๆ˜ฏ:ๆ”ฏๆดๅคšไธปๆžถๆง‹็š„่ค‡ๅฏซๆŠ€่ก“+่จญ่จˆ่‰ฏๅฅฝ็š„ๆต้‡ๅ…ฅๅฃ+ๆ•…้šœๅตๆธฌๆฉŸๅˆถ

    ๐Ÿ“š ไบŒ、ๅธธ่ฆ‹ MySQL / MariaDB Active-Active ๆžถๆง‹้ธ้ …็ธฝ่ฆฝ

    ๅฏฆๅ‹™ไธŠ,ๆƒณๅœจ MySQL / MariaDB ไธ–็•Œ้”ๆˆ Active-Active,ๅธธ่ฆ‹้ธ้ …ๅคง่‡ดๅฆ‚ไธ‹:

    1. ๅ‚ณ็ตฑ้›™ไธป่ค‡ๅฏซ(Master-Master Replication)— ❌ ไธๅปบ่ญฐไฝœ็‚บไธปๅŠ›

    ้€™ๆ˜ฏๅพˆๅคšไบบๆœ€ๅ…ˆๆƒณๅˆฐ็š„ๅšๆณ•:

    • A ไธป <=> B ไธป:ไบ’็›ธๅšไธปๅพž่ค‡ๅฏซ,ๅ…ฉ้‚Š้ƒฝๅฏไปฅๅฏซ。
    • ๅœจๆ‡‰็”จ็จ‹ๅผ็ซฏๆˆ– Proxy ็ซฏ,ๅŒๆ™‚ๆŠŠๆต้‡้€ๅˆฐๅ…ฉ้‚Š。

    ๅ•้กŒๆ˜ฏ:

    • ่ก็ช่™•็†ๅพˆ้บป็…ฉ:ๅŒๆ™‚ๅฏซๅŒไธ€็ญ†่ณ‡ๆ–™,ๆœ€ๅพŒ่ชฐ็‚บๆบ–?
    • Binlog ๅปถ้ฒ / ่ฟดๅœˆ่ค‡ๅฏซ:่จญๅฎšไธๆ…Žๆœƒๅ‡บ็พๅฅ‡ๆ€ช็š„ๅพช็’ฐ่ˆ‡ๅปถ้ฒ。
    • ่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›็ผบไนๅ…ฑ่ญ˜ๆฉŸๅˆถ:ๅฎนๆ˜“ๅ‡บ็พ Split Brain,ๅ…ฉ้‚Š้ƒฝไปฅ็‚บ่‡ชๅทฑๆ˜ฏไธป。

    ๅ› ๆญค,้›™ไธป่ค‡ๅฏซ้€šๅธธๅชๅœจ「ๆต้‡ไธๅคง、ๆ“ไฝœ่€…ๆฅต็†Ÿๆ‚‰้ขจ้šช」็š„ๅ ดๆ™ฏไฝฟ็”จ,ไธฆไธ้ฉๅˆไฝœ็‚บๆณ›็”จ็š„ Active-Active ๆžถๆง‹。

    2. MariaDB Galera / Percona XtraDB Cluster — ✅ ๆœ€ๅธธ่ฆ‹็š„ Active-Active ๆ–นๆกˆไน‹ไธ€

    Galera Cluster ๆ˜ฏไธ€็จฎ ๅŒๆญฅๅคšไธป่ค‡ๅฏซ ็š„ๆŠ€่ก“,MariaDB / Percona ็ญ‰้ƒฝๆไพ›ๆ•ดๅˆๅฅ—ไปถ。 ๅœจ Galera ไธญ,ๆ‰€ๆœ‰็ฏ€้ปžๅ…ฑไบซๅŒไธ€ๅ€‹「ๅฏซๅ…ฅ่ฆ–ๅœ–」,้€้Žไธ€่‡ดๆ€งๆผ”็ฎ—ๆณ•,็ขบไฟๆ‰€ๆœ‰็ฏ€้ปž็œ‹่ฆ‹็š„ๅฏซๅ…ฅ้ †ๅบ็›ธๅŒ。

    ็‰นๆ€ง:

    • ๆฏๅ€‹็ฏ€้ปž้ƒฝๅฏไปฅ่ฎ€ๅฏซ(ๅคšไธป)。
    • ้€้Ž wsrep_* ๅƒๆ•ธๆŽงๅˆถ่ค‡ๅฏซ่กŒ็‚บ่ˆ‡ Flow Control。
    • ๆ”ฏๆด ๅŒๆญฅๆˆ–่€…「ๆบ–ๅŒๆญฅ」 ็š„ๅฏซๅ…ฅ็ขบ่ชๆฉŸๅˆถ。

    ๅ„ช้ปž:

    • ๅŽŸ็”Ÿๆ”ฏๆดๅคšไธปๅฏซๅ…ฅ,่จญ่จˆๅฐฑๆ˜ฏ็‚บ Active-Active ่€Œ็”Ÿ。
    • ๅ…งๅปบ Quorum / ไปฒ่ฃ,่ผƒๅฎนๆ˜“้ฟๅ…่…ฆ่ฃ‚。
    • ๆœ‰ๅฎŒๆ•ด็š„็คพ็พคๅฏฆๅ‹™่ˆ‡ๆ–‡ไปถ,ๆญ้… HAProxy / ProxySQL ๆˆ็†Ÿๅบฆ้ซ˜。

    3. MySQL Group Replication / InnoDB Cluster — ✅ ๅฎ˜ๆ–นๅคšไธปๆ–นๆกˆ

    MySQL ๅฎ˜ๆ–นๅ‰‡ๆไพ› Group Replication ๅŠๅ…ถไธŠๅฑคๅฐ่ฃ InnoDB Cluster, ไธ€ๆจฃๆไพ› ๅคšไธปๅฏซๅ…ฅ + ๅ…ฑ่ญ˜ๅ”่ญฐ + ่‡ชๅ‹•ๆ•…้šœ่™•็† ็š„่ƒฝๅŠ›。

    ็‰นๆ€ง:

    • ๆ”ฏๆด Single-Primary ไปฅๅŠ Multi-Primary ๆจกๅผ。
    • ๆญ้… MySQL Router ๅฏๆไพ›ๆ™บๆ…ง่ทฏ็”ฑ(่ฎ€ๅฏซๅˆ†้›ข、ๆ•…้šœ็ฏ€้ปžๅ‰”้™ค)。
    • ่ˆ‡ MySQL Shell ๆ•ดๅˆ,ๅปบ็ซ‹่ˆ‡็ถญ้‹็›ธๅฐ็›ด่ฆบ。

    ๅฆ‚ๆžœไฝ ๅๅฅฝ「ๅ…จ้ƒจ็”จๅฎ˜ๆ–นๅ…ƒไปถ」,InnoDB Cluster + Router ๆœƒๆ˜ฏๅพˆๅฅฝ็š„้ธๆ“‡。

    4. Proxy ๅฑค(ProxySQL / HAProxy)+ VIP(Keepalived)— Active-Active ็š„「ๅ…ฅๅฃๅคง่…ฆ」

    ็„ก่ซ–ๆ˜ฏ Galera ๆˆ– InnoDB Cluster,่ฆ่ฎ“ๅค–้ƒจๆ‡‰็”จ็จ‹ๅผ「็ฐกๅ–ฎ้€ฃไธ€ๅ€‹ไฝๅ€ๅฐฑๅฅฝ」,ๅนพไนŽ้ƒฝๆœƒๆญ้…:

    • Proxy ๅฑค:ProxySQL ๆˆ– HAProxy,่ฒ ่ฒฌ:
      • ๅฅๅบทๆชขๆŸฅ(Health Check)。
      • ๆŠŠๆต้‡ๅˆ†้…ๅˆฐๅฅๅบท็ฏ€้ปž。
      • ่ฎ€ๅฏซๅˆ†้›ข(็œ‹ๆžถๆง‹้œ€ๆฑ‚)。
    • ่™›ๆ“ฌ IP(VIP)ๆˆ– DNS: ้€้Ž Keepalived / LVS / DNS(็Ÿญ TTL)่ฎ“ๆ‡‰็”จ็ซฏๅช่จ˜ไฝๅ–ฎไธ€้€ฃ็ทšไฝๅ€。้€™ไนŸๆ˜ฏๆ•…้šœๅˆ‡ๆ›็š„ๅ…ฅๅฃ。

    ๐Ÿง  ไธ‰、่จญ่จˆ Active-Active ๆžถๆง‹ๅ‰,ๅฟ…้ ˆๅ…ˆๆƒณๆธ…ๆฅš็š„ๅนพไปถไบ‹

    1. ไธ€่‡ดๆ€งๆจกๅž‹: ไฝ ็š„็ณป็ตฑๆ˜ฏๅๅ‘「ๅผทไธ€่‡ด」้‚„ๆ˜ฏ「ๅฏๆŽฅๅ—็Ÿญๆšซไธไธ€่‡ด」?
    2. ๅฏซๅ…ฅ่ก็ช: ๆœ‰ๆฒ’ๆœ‰ๅคง้‡่ทจ็ฏ€้ปžๅŒๆ™‚ๆ›ดๆ–ฐๅŒไธ€็ญ†่ณ‡ๆ–™็š„ๆƒ…ๆณ?
    3. ๆ•…้šœๅˆ‡ๆ›็ญ–็•ฅ: ่ชฐไพ†ๆฑบๅฎš「ๅ“ชๅฐไธ‹็ทš」?ๆ˜ฏ ProxySQL / HAProxy / Router / Orchestrator ้‚„ๆ˜ฏไบบๆ‰‹?
    4. ็ถญ้‹่ƒฝๅŠ›: ๅœ˜้šŠๆ˜ฏๅฆ็†Ÿๆ‚‰้€™ไบ›ๅ…ƒไปถ็š„ๆŽ’้Œฏ?(Flow Control、GTID、ไปฒ่ฃ、Split Brain…)

    ไปฅไธ‹ๆˆ‘ๅ€‘็”จๅ…ฉๅ€‹ๅธธ่ฆ‹ๅฏฆไฝœ็ฏ„ไพ‹,ๅธถไฝ ๅพž้›ถ็ต„ๅ‡บไธ€ๅฅ—ๅฏไปฅไธŠ็ทš็š„ๆžถๆง‹。

    ๐Ÿ—️ ๅ››、็ฏ„ไพ‹ๆžถๆง‹ไธ€:MariaDB Galera + HAProxy + Keepalived(ๅธธ่ฆ‹ไผๆฅญ็ต„ๅˆ)

    1. ๆžถๆง‹ๆ‹“ๆจธ็คบๆ„

                     ┌─────────────────────────────┐
                     │         ๆ‡‰็”จ็จ‹ๅผๅฑค(Web / API) │
                     └─────────────▲──────────────┘
                                   │ ้€ฃ็ทš(ๅ–ฎไธ€ VIP)
                            VIP: 10.0.0.100:3306
                                   │
                    ┌──────────────┴──────────────┐
                    │                             │
         HAProxy + Keepalived A         HAProxy + Keepalived B
            10.0.0.11                        10.0.0.12
                    │                             │
          ┌─────────┴────────┐          ┌────────┴─────────┐
          │                  │          │                  │
       DB1 (Galera)      DB2 (Galera)  DB3 (Galera)   (ๅฏ้ธ Arbitrator)

    ่จญ่จˆ้‡้ปž:

    • 3 ๅ€‹ Galera ็ฏ€้ปž็ถญๆŒ Quorum,้ฟๅ…้›™็ฏ€้ปž่…ฆ่ฃ‚。
    • 2 ๅฐ HAProxy + Keepalived ็ต„ๆˆๅ‰็ซฏ้›™ๆฉŸ,ๅฐๅค–ๅชๆšด้œฒ VIP。
    • ๆ‡‰็”จ็จ‹ๅผ่จ˜ไฝ็š„ๅชๆœ‰ 10.0.0.100:3306,่ƒŒๅพŒๅˆ‡ๆ›ๅฎŒๅ…จ้€ๆ˜Ž。

    2. Galera ๅŸบๆœฌๅฎ‰่ฃ่ˆ‡่จญๅฎš(็คบๆ„)

    ไปฅไธ‹ไปฅ MariaDB + Galera ็‚บไพ‹,ๆฏๅฐ DB ็ฏ€้ปž็š„ /etc/my.cnf.d/galera.cnf ๅฏ่ƒฝๅŒ…ๅซ:

    [galera]
    wsrep_on                 = ON
    wsrep_provider           = /usr/lib64/galera/libgalera_smm.so
    
    # ้›†็พคๅ็จฑ
    wsrep_cluster_name       = 'prod-galera-cluster'
    
    # ้›†็พคๆˆๅ“กๆธ…ๅ–ฎ(ๆ‰€ๆœ‰็ฏ€้ปžไธ€่‡ด)
    wsrep_cluster_address    = 'gcomm://10.0.0.21,10.0.0.22,10.0.0.23'
    
    # ๆœฌ็ฏ€้ปžไฝๅ€(ๆฏๅฐไธๅŒ)
    wsrep_node_address       = '10.0.0.21'
    wsrep_node_name          = 'db1'
    
    # ่ค‡ๅฏซ่จญๅฎš
    binlog_format            = ROW
    default_storage_engine   = InnoDB
    innodb_autoinc_lock_mode = 2
    
    # ๆต้‡ๆŽงๅˆถ(ไพๅฏฆ้š›ๆƒ…ๆณ่ชฟๆ•ด)
    wsrep_slave_threads      = 8
    wsrep_certification_rules= STRICT

    ๅˆๅง‹ๅŒ–ๆญฅ้ฉŸ(ๆฆ‚ๅฟต็คบๆ„):

    1. ๅœจ็ฌฌไธ€ๅฐ DB(db1)ไฝฟ็”จ galera_new_cluster / bootstrap ๆ–นๅผๅ•Ÿๅ‹•้›†็พค。
    2. ๅœจ db2、db3 ็›ดๆŽฅๅ•Ÿๅ‹• MariaDB,ๆœƒ้€้Ž wsrep_cluster_address ๆ‰พๅˆฐ้›†็พคไธฆ่‡ชๅ‹•ๅŒๆญฅ。
    3. ็ขบ่ช SHOW STATUS LIKE 'wsrep_cluster_size'; ้กฏ็คบ็ฏ€้ปžๆ•ธ้‡ๆญฃ็ขบ。

    3. HAProxy ่ˆ‡ๅฅๅบทๆชขๆŸฅ่จญๅฎš

    ๅœจ HAProxy ็ฏ€้ปžไธญ,ๅฏ่จญๅฎšไธ€็ต„ๅพŒ็ซฏๆŒ‡ๅ‘ Galera ็ฏ€้ปž,ไธฆ้€้Ž mysql-check ๆชขๆŸฅๅฅๅบท็‹€ๆ…‹:

    frontend mysql_front
        bind *:3306
        mode tcp
        default_backend galera_back
    
    backend galera_back
        mode tcp
        balance roundrobin
        option mysql-check user haproxy_check
        server db1 10.0.0.21:3306 check
        server db2 10.0.0.22:3306 check
        server db3 10.0.0.23:3306 check backup

    ๅฏฆๅ‹™ไธŠๅฏไปฅไพ้œ€ๆฑ‚ๆŠŠๆŸไบ›็ฏ€้ปžๆจ™็‚บ backup,ๆˆ–้€ฒไธ€ๆญฅๅˆฉ็”จ ProxySQL ๅš「ๅฏซๅ…ฅ้›†ไธญ / ่ฎ€ๅ–ๅˆ†ๆ•ฃ」, ไพ‹ๅฆ‚:ไธ€ๅฐ็ฏ€้ปžไธป่ฒ ่ฒฌๅฏซๅ…ฅ,ๅ…ถ้ค˜ๆ”พ่ฎ€ๅ–็‚บไธป。

    4. Keepalived ่™›ๆ“ฌ IP ่จญๅฎš

    ไปฅ A ็ฏ€้ปž็‚บไธป、B ็ฏ€้ปž็‚บๅ‚™็š„ Keepalived ่จญๅฎš็คบๆ„:

    vrrp_instance VI_1 {
        state MASTER
        interface eth0
        virtual_router_id 51
        priority 150
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass ha-vip-pass
        }
        virtual_ipaddress {
            10.0.0.100/24 dev eth0
        }
    }

    ๅœจ B ็ฏ€้ปžๅ‰‡ๅฐ‡ state ่จญ็‚บ BACKUPpriority ่จญไฝŽไธ€ไบ›,ไพ‹ๅฆ‚ 100。็•ถ A ็ฏ€้ปžๅคฑๆ•ˆๆ™‚,VIP ๆœƒ้ฃ„ๅˆฐ B ็ฏ€้ปž。

    5. ๆ•…้šœๆƒ…ๅขƒ็ฐกๅ–ฎ้ฉ—่ญ‰

    • ้—œ้–‰ๅ…ถไธญไธ€ๅ€‹ DB ็ฏ€้ปž:็ขบ่ช HAProxy ๆชขๆธฌๅˆฐๅพŒ,ๅพžๅพŒ็ซฏๆฑ ไธญ็งป้™ค่ฉฒ็ฏ€้ปž。
    • ้—œ้–‰ A ็ฏ€้ปžๆ•ดๆฉŸ:็ขบ่ช VIP ้ฃ„็งปๅˆฐ B ็ฏ€้ปž,ๆ‡‰็”จ็จ‹ๅผ้€ฃ็ทšไธไธญๆ–ท(ๆˆ–็Ÿญๆšซไธญๆ–ทๅพŒๆขๅพฉ)。
    • ๅˆปๆ„่ฃฝ้€ ็ถฒ่ทฏ้š”้›ข:็ขบ่ช Galera ็š„ Quorum ่กŒ็‚บ,้ฟๅ…้›™้‚Š้ƒฝๅฐๅค–ๆไพ›ๆœๅ‹™。

    ๐Ÿ—️ ไบ”、็ฏ„ไพ‹ๆžถๆง‹ไบŒ:MySQL InnoDB Cluster + MySQL Router + Keepalived

    ่‹ฅๅๅฅฝ MySQL ๅฎ˜ๆ–นๆŠ€่ก“ๅ †็–Š,ๅฏไปฅๆ”น็”จ:

    • InnoDB Cluster:ๅบ•ๅฑคไฝฟ็”จ Group Replication ๅฎŒๆˆๅคšไธป่ค‡ๅฏซ。
    • MySQL Router:ๆไพ›ๆ™บๆ…ง่ทฏ็”ฑ็ซฏ้ปž(่ฎ€ / ๅฏซไธๅŒๅŸ 、ๆ•…้šœ็ฏ€้ปžๅ‰”้™ค)。

    1. ๅปบ็ซ‹ InnoDB Cluster(็คบๆ„ๆต็จ‹)

    ้€้Ž MySQL Shell ๅปบ็ซ‹้›†็พค็š„ๆฆ‚ๅฟต็คบๆ„:

    # ๅœจ mysqlsh ไธญ
    dba.createCluster("prodCluster", {multiPrimary: true})
    
    # ๅŠ ๅ…ฅ็ฏ€้ปž
    cluster = dba.getCluster()
    cluster.addInstance("root@10.0.0.31:3306")
    cluster.addInstance("root@10.0.0.32:3306")
    cluster.addInstance("root@10.0.0.33:3306")
    
    # ๆŸฅ็œ‹็‹€ๆ…‹
    cluster.status()

    ่จญๅฎš multiPrimary: true ๅพŒ,้›†็พคไธญ็š„็ฏ€้ปž้ƒฝๅฏไปฅๅฏซๅ…ฅ,InnoDB Cluster ๆœƒ่™•็†ๅฏซๅ…ฅๆŽ’ๅบ่ˆ‡ๅ…ฑ่ญ˜。

    2. ้ƒจ็ฝฒ MySQL Router

    ๅœจ Router ็ฏ€้ปžไธŠ,ไฝฟ็”จ MySQL Shell ็‚บ Router ๅธถๅ‡บ่จญๅฎš:

    # ็”ขๅ‡บ Router ่จญๅฎš
    dba.configureRouterInstance("router@10.0.0.41:6446", {
        clusterName: "prodCluster"
    })

    Router ๅ•Ÿๅ‹•ๅพŒๆœƒๆšด้œฒ้กžไผผ:

    • 6446:่ฎ€ๅฏซ็ซฏ้ปž。
    • 6447:ๅ”ฏ่ฎ€็ซฏ้ปž。

    ๅ†ๆญ้… Keepalived ๅฐ‡ Router ็ฏ€้ปžๅšๆˆ้›™ๆฉŸ,ๅฐๅค–ไธ€ๆจฃๅชๆไพ›ไธ€ๅ€‹ VIP。

    ⏱ ๅ…ญ、่‡ชๅ‹•ๆ•…้šœๅตๆธฌ่ˆ‡ Failover ๆต็จ‹่จญ่จˆ

    Active-Active ๆžถๆง‹็š„้‡้ปž,ไธๅชๆ˜ฏ「ๅคšๅฐ้ƒฝๅœจ่ท‘」,่€Œๆ˜ฏๆŸๅฐๆŽ›ไบ†ไน‹ๅพŒ่ƒฝไธ่ƒฝ่‡ชๅ‹•ๅˆ‡ๆ›ไธ”ไธๅฏซๅฃž่ณ‡ๆ–™

    ไธ€่ˆฌๆœƒๆ‹†ๆˆไธ‰ๅ€‹ๅฑคๆฌก:

    1. ่ณ‡ๆ–™ๅบซๅฑค: Galera / Group Replication ้€้ŽๆŠ•็ฅจๆฉŸๅˆถๆฑบๅฎš่ชฐ้‚„ๅœจ้›†็พคๅ…ง。
    2. Proxy / Router ๅฑค: HAProxy / ProxySQL / MySQL Router ้€้ŽๅฅๅบทๆชขๆŸฅ,ๆŠŠ「ๆฒ’้€š」ๆˆ–「ไธๅœจ้›†็พคๅ…ง」็š„็ฏ€้ปž่ธขๆމ。
    3. VIP / DNS ๅฑค: Keepalived ๆˆ–็Ÿญ TTL DNS ๆŽงๅˆถ「ๅ…ฅๅฃๅœจๅ“ชไธ€ๅฐ Proxy」。

    ่จญ่จˆๅŽŸๅ‰‡:

    • ไปปไธ€ๅฑค้ƒฝไธ่ฆๅ–ฎ้ปž(Single Point of Failure)。
    • 「่ชฐๆœ‰ๆฌŠๆฑบๅฎšๆŠŠ็ฏ€้ปž่ธขๅ‡บๆœๅ‹™」ไธ€ๅฎš่ฆๆธ…ๆฅš(้ฟๅ…ๅคš้ ญๆฑบ็ญ–)。
    • ๆ•…้šœๅตๆธฌ่ฆๆœ‰ grace period,้ฟๅ…็Ÿญๆšซ็ถฒ่ทฏๆŠ–ๅ‹•ๅธถไพ†้Žๅบฆๅˆ‡ๆ›。

    ๐Ÿฉน ไธƒ、ๅธธ่ฆ‹้™ท้˜ฑ่ˆ‡ๆŽ’้Œฏๆธ…ๅ–ฎ

    • ่…ฆ่ฃ‚(Split Brain): ็ถฒ่ทฏๅˆ†ๅ‰ฒๅพŒ,ๅ…ฉ้‚Š้ƒฝไปฅ็‚บ่‡ชๅทฑๆ˜ฏไธป,็ตๆžœๅŒๆ™‚ๆŽฅๅ—ๅฏซๅ…ฅ。
    • Flow Control ้€ ๆˆๅปถ้ฒ: Galera / Group Replication ไธญ,่ฝๅพŒๅคชๅคš็š„็ฏ€้ปžๅฏ่ƒฝๆ‹–ๆ…ขๆ•ด้ซ”ๆไบค้€Ÿๅบฆ。
    • ไธ็•ถ่ฎ€ๅฏซๅˆ†้…: ๆŠŠ「ๅผทไธ€่‡ด่ฆๆฑ‚」็š„ๅฏซๅ…ฅๅˆ†ๆ•ฃๅˆฐๅคšๅ€‹็ฏ€้ปž,้€ ๆˆๅคง้‡้Ž–็ซถ็ˆญ。
    • ๅฅๅบทๆชขๆŸฅ้Žๆ–ผๅ–ฎ็ด”: ๅชๆชขๆŸฅ 3306 ๆดป่‘—ๅฐฑ็•ถๆญฃๅธธ,ๆฒ’ๆœ‰ๆชขๆŸฅ「ๆ˜ฏๅฆไปๅœจ้›†็พคๅ…ง」。
    • ๅ‚™ไปฝ่ˆ‡ๅฟซ็…งไธไธ€่‡ด: ๆฒ’ๆœ‰ๆ„่ญ˜ๅˆฐๅคšไธปๆžถๆง‹ไธ‹ๅ‚™ไปฝ้ปž็š„้ธๆ“‡่ˆ‡ไธ€่‡ดๆ€งๅ•้กŒ。

    ๅปบ่ญฐๆŽ’้Œฏๆ–นๅ‘:

    1. ๅ…ˆ็œ‹ DB ๅฑค้›†็พค็‹€ๆ…‹(wsrep_cluster_statuscluster.status())。
    2. ๅ†็œ‹ Proxy ๅฑคๅพŒ็ซฏๆฑ ็‹€ๆ…‹(show servers state / HAProxy stats)。
    3. ๆœ€ๅพŒ็œ‹ VIP / DNS ็š„ๆŒ‡ๅ‘่ˆ‡ ARP ่งฃๆžๆ˜ฏๅฆๆญฃ็ขบ。

    ๐Ÿ’พ ๅ…ซ、ๅ‚™ไปฝ、็ถญ่ญท่ˆ‡ Schema ่ฎŠๆ›ด็ญ–็•ฅ

    Active-Active ๆžถๆง‹ไธ‹,ๅ‚™ไปฝ่ˆ‡็ถญ่ญท่ฆ็‰นๅˆฅๅฐๅฟƒ:

    • ๅ‚™ไปฝ: ๅปบ่ญฐ็ตฑไธ€็”ฑ「ๆŒ‡ๅฎš็ฏ€้ปž」ๅŸท่กŒ,ไธฆ็ขบ่ช่ฉฒ็ฏ€้ปžๅœจๅ‚™ไปฝๆœŸ้–“ไธ่ขซ Proxy ็•ถๆˆไธป่ฆๅฏซๅ…ฅ็ฏ€้ปž。
    • Schema ่ฎŠๆ›ด: ๅ„˜้‡ๆธ›ๅฐ‘ๅคง่ฆๆจก ALTER,ๆ”น็”จ Online DDL ๆˆ–ๅˆ†ๆ‰น่ฎŠๆ›ด。
    • ็ถญ่ญท็ช—ๅฃ: ๅปบ่ญฐ้…ๅˆ่ฒ ่ผ‰ไฝŽ่ฐท,ไธ”ไบ‹ๅ…ˆๆจกๆ“ฌ「็ฏ€้ปžไธ‹็ทš / ้‡ๆ–ฐๅŠ ๅ…ฅ」ๆต็จ‹。

    ๅฆ‚ๆžœไฝ ๅทฒ็ถ“ๆœ‰ PostgreSQL 50 ่ฌ็ญ†่ณ‡ๆ–™ๅฏฆ้ฉ— ้‚ฃ้กžๅŸบๆบ–็’ฐๅขƒ,ๅฏไปฅๆฏ”็…งๆ–นๅผ็‚บ Active-Active ๆžถๆง‹ๅปบ็ซ‹ๅฃ“ๆธฌ่…ณๆœฌ,ๆธฌ่ฉฆ:

    • ๅ–ฎ็ฏ€้ปžๆ•…้šœๆ™‚็š„ๅžๅ็ฉฉๅฎšๅบฆ。
    • ็ฏ€้ปž้‡ๆ–ฐๅŠ ๅ…ฅๆ™‚ๅธถไพ†็š„ๅŒๆญฅ่ฒ ่ผ‰。
    • ๅœจๅคง้‡ DML / DDL ๆ“ไฝœไธ‹,Flow Control ็š„ๅฝฑ้Ÿฟ็จ‹ๅบฆ。

    ๐ŸŽฏ ไน、ไป€้บผๆƒ…ๅขƒ้ฉๅˆ Active-Active?ไป€้บผๆƒ…ๅขƒไธ้ฉๅˆ?

    ้ฉๅˆๆŽก็”จ Active-Active ็š„ๆƒ…ๅขƒ:

    • ่ฎ€ๅฏซๆต้‡้ƒฝๅ้ซ˜,้œ€่ฆๅŒๆ™‚ๆๅ‡ ๅžๅ่ˆ‡ๅฏ็”จๆ€ง
    • ๆœๅ‹™ ไธ่ƒฝๆŽฅๅ—้•ทๆ™‚้–“็š„ไธปๅ‚™ๅˆ‡ๆ›็ช—ๅฃ,ไพ‹ๅฆ‚้‡‘่žไบคๆ˜“、ๅณๆ™‚่จ‚ๅ–ฎ็ณป็ตฑ。
    • ๅœ˜้šŠๆœ‰ไธ€ๅฎš็š„ DBA / SRE ่ƒฝ้‡,้ก˜ๆ„ๆŠ•่ณ‡ๅœจ็›ฃๆŽง่ˆ‡ๆŽ’้Œฏๆต็จ‹ไธŠ。

    ๆšซๆ™‚ไธๅปบ่ญฐๆŽก็”จ Active-Active ็š„ๆƒ…ๅขƒ:

    • ่ณ‡ๆ–™ๆจกๅž‹้ซ˜ๅบฆ้›†ไธญๆ–ผๅ–ฎไธ€ๅนพๅผต่กจ,ๆฏๆฌกไบคๆ˜“้ƒฝๆœƒไฟฎๆ”นๅŒไธ€ๆ‰น row,้Ž–็ซถ็ˆญๆฅตๅšด้‡。
    • ๅœ˜้šŠ็ผบไน DBA ็ถ“้ฉ—,ไปฅๅพ€้€ฃๅ–ฎไธป่ค‡ๅฏซ้ƒฝๅธธๅ‡บๅŒ…。
    • ็ณป็ตฑ่ฆๆจกๅฐšๅฐ,ไธ€ๅฐไธปๆฉŸ + ไธ€ๅฐๅ‚™ๆดๅฐฑ่ถณไปฅๆ”ฏๆ’ๆต้‡。

    ้€™ๆ™‚ๅ€™,ๅ่€Œๅปบ่ญฐๅ…ˆๆŠŠๅŸบ็คŽๆ‰“ๅฅฝ,ไพ‹ๅฆ‚:

    • ่จญ่จˆๅˆ็†็š„ Active-Passive + ่‡ชๅ‹• Failover。
    • ๅ…ˆๅš ่ฎ€ๅฏซๅˆ†้›ข,ๆŠŠ่ฎ€ๆต้‡ๅˆ‡ๅˆฐๅ‰ฏๆœฌไธŠ。
    • ๅ†้€ๆญฅๆผ”้€ฒๅˆฐๅคšไธปๆžถๆง‹。

    ๐Ÿงญ ๅ、ๅฏฆไฝœ่กŒๅ‹•ๆธ…ๅ–ฎ(ๅฏ็•ถๅฐˆๆกˆ Checklist)

    ✅ ๆ˜Ž็ขบๅฎš็พฉ็ณป็ตฑไธ€่‡ดๆ€ง้œ€ๆฑ‚(ๅผทไธ€่‡ด / ๆœ€็ต‚ไธ€่‡ด)
    ✅ ้ธๅฎšๅคšไธป่ค‡ๅฏซๆ–นๆกˆ(Galera / InnoDB Cluster / ๅ…ถไป–)
    ✅ ่ฆๅŠƒ็ฏ€้ปžๆ•ธ้‡:่‡ณๅฐ‘ 3 DB ็ฏ€้ปžๆˆ– 2 DB + 1 Arbitrator
    ✅ ้ƒจ็ฝฒ Proxy ๅฑค(HAProxy / ProxySQL / MySQL Router)
    ✅ ้ƒจ็ฝฒ VIP / DNS ๅˆ‡ๆ›ๆฉŸๅˆถ(Keepalived / ็Ÿญ TTL DNS)
    ✅ ๅปบ็ซ‹ๆ•…้šœๆƒ…ๅขƒๆธฌ่ฉฆ่…ณๆœฌ(็ฏ€้ปž็•ถๆฉŸ、็ถฒ่ทฏไธญๆ–ท、้‡ๅ•Ÿ)
    ✅ ๅปบ็ซ‹ๅ‚™ไปฝ่ˆ‡้‚„ๅŽŸ้ฉ—่ญ‰ๆต็จ‹(ๅฎšๆœŸๆผ”็ทด)
    ✅ ้‡ๅฐ Flow Control / Quorum / Split Brain ๅปบ็ซ‹ SOP
    ✅ ๅฐ‡ๆ‰€ๆœ‰ๆญฅ้ฉŸๆ–‡ไปถๅŒ–,็ดๅ…ฅ็ถญ้‹ Runbook

    ๐Ÿ’ฌ ไบ’ๅ‹•็•™่จ€ๅผ•ๅฐŽ(Active-Active ๅฏฆๆˆฐๅˆ†ไบซๅ€)

    ๅฆ‚ๆžœไฝ ๅœจๅฏฆไฝœ MySQL / MariaDB Active-Active ้ซ˜ๅฏ็”จๆžถๆง‹ ็š„้Ž็จ‹ไธญ:

    • ้‡ๅˆฐ Flow Control、ๅปถ้ฒๆˆ–้Ž–็ซถ็ˆญๅ•้กŒ
    • ๅฐ Galera / InnoDB Cluster / ProxySQL ่จญ่จˆๆœ‰็–‘ๅ•
    • ๆˆ–ๆƒณๅˆ†ไบซไฝ ๅฏฆ้š›่ธฉๅˆฐ็š„ๅ‘、ๆžถๆง‹ๆ‹“ๆจธ

    ๆญก่ฟŽ็›ดๆŽฅๅœจไธ‹ๆ–น็•™่จ€ ๐Ÿ‘‡ ็ฐกๅ–ฎๆ่ฟฐไฝ ็š„ ็ฏ€้ปžๆ•ธ้‡、็‰ˆๆœฌ、ๆžถๆง‹ๅœ–,ๆˆ‘ๆœƒๆŠŠๅธธ่ฆ‹ๅ•้กŒๆ•ด็†ๆˆๅพŒ็บŒ่ฃœๅ……็ฏ‡ๆˆ– FAQ ๆ›ดๆ–ฐๅœจๆœฌๆ–‡。


    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    ๐Ÿ“˜ ็ต่ชž:ๅพž「ๅ…ฉๅฐ DB」ๅˆฐ「ไธ€ๆ•ดๅ€‹ๆœๅ‹™็ณป็ตฑ」็š„ๆ€็ถญ

    ๅพˆๅคšไบบๅœจ่ซ‡ Active-Active ๆžถๆง‹ๆ™‚,็›ด่ฆบๆƒณๅˆฐ็š„ๆ˜ฏ「ๆŠŠๅ…ฉๅฐ่ณ‡ๆ–™ๅบซๅšๆˆไธปไธป่ค‡ๅฏซ」; ไฝ†็•ถไฝ ๅฏฆ้š›้ƒจ็ฝฒ้Ž Galera、InnoDB Cluster、ProxySQL、HAProxy、Keepalived ็ญ‰็ต„ๅˆไน‹ๅพŒ, ๆœƒ็™ผ็พๅฎƒ็œŸๆญฃๆ”น่ฎŠ็š„ๆ˜ฏ:ไฝ ้–‹ๅง‹็”จ「ๆ•ดๅ€‹ๆœๅ‹™็ณป็ตฑ」่€Œไธๆ˜ฏ「ๅ–ฎไธ€่ณ‡ๆ–™ๅบซ」็š„่ง’ๅบฆๅœจ่จญ่จˆๆžถๆง‹

    ๅฆ‚ๆžœไฝ ็›ฎๅ‰ๆญฃๅœจ่ฆๅŠƒ่ณ‡ๆ–™ๅบซ้ซ˜ๅฏ็”จๅ‡็ดš、ๆˆ–่€…ๆญฃ่ฆๅพž Active-Passive ้Žๆธกๅˆฐ Active-Active, ๅพˆๆŽจ่–ฆๆŠŠๆœฌๆ–‡็•ถๆˆ ๅฐˆๆกˆ Checklist ่ˆ‡ๅญธ็ฟ’ๅœฐๅœ–, ๆญ้…ไธŠ้ขๅปถไผธ้–ฑ่ฎ€ไธญ็š„ Proxmox、Linux ๅฎ‰ๅ…จ่ˆ‡ PostgreSQL ๅฏฆ้ฉ—็ณปๅˆ—,ไธ€ๆญฅไธ€ๆญฅๆŠŠๆ•ด้ซ”ๅŸบ็คŽๆ‰“็ฉฉ。

    — WWFandy・MySQL / MariaDB HA ็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš