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

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

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

    ๅœจไผๆฅญ่ณ‡ๆ–™ๅบซๆžถๆง‹ไธญ,ๆœ€ๅธธ่ฆ‹็š„้œ€ๆฑ‚ๅฐฑๆ˜ฏ「ไธไธญๆ–ทๆœๅ‹™」่ˆ‡「้ฟๅ…่ณ‡ๆ–™ไธไธ€่‡ด」。 ๅ‚ณ็ตฑ Master/Slave ่ค‡ๅฏซๆœ‰ๆ˜Ž้กฏ้™ๅˆถ:ไธป็ฏ€้ปžๆ•…้šœๅณๅ…จ็ซ™ๅœๆ“บ,ไธ” Slave ๅฏซๅ…ฅๅ—้™。 ๆœฌๆŒ‡ๅ—ๅฐ‡ๆ•™ไฝ ๆ‰“้€  ็œŸๆญฃ็š„ Active-Active(้›™ไธปๅŒๆญฅ)้ซ˜ๅฏ็”จ่ณ‡ๆ–™ๅบซ้›†็พค —— MariaDB Galera Cluster(ไธ‰็ฏ€้ปž็‰ˆๆœฌ)。

    Galera Cluster ๆไพ›ๅŽŸ็”ŸๅŒๆญฅ่ค‡ๅฏซ(True Multi-Master Replication),ๆฏๅ€‹็ฏ€้ปžๅŒๆ™‚ๅ…ทๅ‚™「่ฎ€」、「ๅฏซ」่ƒฝๅŠ›, ๆญ้… quorum、่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›、ๅขž้‡ๅŒๆญฅ(IST)่ˆ‡่ฒ ่ผ‰ๅนณ่กก,่ƒฝ่ฎ“ไฝ ็š„่ณ‡ๆ–™ๅบซ้”ๅˆฐไผๆฅญ็ดš้ซ˜ๅฏ็”จๆ€ง。


    ๐Ÿ“Œ ไธ€、ๆžถๆง‹ๆฆ‚ๅฟต:็‚บไป€้บผ้ธ Galera Cluster?

    Galera ๆ˜ฏ็›ฎๅ‰ๆœ€ๆˆ็†Ÿ็š„「็œŸๆญฃๅŒๆญฅ(Synchronous)」ๅคšไธป่ณ‡ๆ–™ๅบซ。

    • ๅคšไธปๅŒๆญฅ(Active-Active) ๆ‰€ๆœ‰็ฏ€้ปžๅฏๅŒๆ™‚่ฎ€ๅฏซ
    • ้›ถๅปถ้ฒ่ค‡ๅฏซ(ไธ€่‡ดๆ€งไฟ่ญ‰)้ฟๅ… Slave ่ฝๅพŒ
    • ่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›、็ฏ€้ปž่‡ชๅ‹•ๅŠ ๅ…ฅ
    • Quorum ๆฉŸๅˆถ ้˜ฒๆญข split-brain
    • ๅขž้‡ๅŒๆญฅ IST ๅŠ ๅฟซ็ฏ€้ปž้‡ๆ–ฐๅŠ ๅ…ฅ้€Ÿๅบฆ

    ๆœฌๆŒ‡ๅ—ๆŽก็”จๆฅญ็•Œๆœ€ไฝณๅฏฆๅ‹™:

    node1: 192.168.1.10
    node2: 192.168.1.11
    node3: 192.168.1.12
    

    ๐Ÿ“ก ไบŒ、ไธ‰็ฏ€้ปž Galera Cluster ๆ‹“ๆ’ฒๅœ–

    
                       ┌────────────────────────┐
                       │      HAProxy + VIP      │
                       │    (่ฎ€ๅฏซ่ฒ ่ผ‰ๅนณ่กกๅฑค)      │
                       └──────────┬─────────────┘
                                  │
                   ┌──────────────┴──────────────┐
                   │                               │
          ┌────────┴────────┐             ┌────────┴────────┐
          │   MariaDB Node 1 │             │   MariaDB Node 2 │
          │   192.168.1.10   │             │   192.168.1.11   │
          └────────┬─────────┘             └────────┬────────┘
                   │                                   │
                   └──────────────┬──────────────┬────┘
                                  │              │
                           ┌──────┴──────┐
                           │ MariaDB Node 3 │
                           │ 192.168.1.12  │
                           └──────────────┘
    

    ๐Ÿ›  ไธ‰、ๅฎ‰่ฃ MariaDB + Galera(ๆฏๅ€‹็ฏ€้ปž้ƒฝ้œ€ๅŸท่กŒ)

    sudo dnf install mariadb mariadb-server galera -y
    sudo systemctl enable mariadb
    

    ⚙️ ๅ››、Galera ไธป่ฆ่จญๅฎš(ๆฏๅ€‹็ฏ€้ปž็š†้ ˆ้…็ฝฎ)

    ็ทจ่ผฏ /etc/my.cnf.d/galera.cnf

    [galera]
    wsrep_on=ON
    wsrep_provider=/usr/lib64/galera/libgalera_smm.so
    wsrep_cluster_name="galera_cluster"
    
    wsrep_cluster_address="gcomm://192.168.1.10,192.168.1.11,192.168.1.12"
    
    wsrep_node_address="192.168.1.X"
    wsrep_node_name="nodeX"
    
    binlog_format=ROW
    default_storage_engine=InnoDB
    innodb_autoinc_lock_mode=2
    
    ⚠️ ๆฏๅฐ้œ€ๆ›ฟๆ›: - `wsrep_node_address` - `wsrep_node_name`

    ๐Ÿš€ ไบ”、ๅ•Ÿๅ‹• Galera Cluster(ๆญฃ็ขบ้ †ๅบ)

    1️⃣ ๅ•Ÿๅ‹•็ฌฌไธ€ๅฐ(Bootstrap Cluster)

    galera_new_cluster
    

    2️⃣ ๅ•Ÿๅ‹•็ฌฌไบŒ、็ฌฌไธ‰ๅฐ

    sudo systemctl start mariadb
    
    ๆˆๅŠŸๅพŒ่ผธๅ…ฅ:
    mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
    
    ้ ๆœŸ็ตๆžœ:
    3
    

    ๐Ÿ” ๅ…ญ、Galera ๅŒๆญฅๅŽŸ็†(SST / IST)

    • SST(State Snapshot Transfer):็ฌฌไธ€ๆฌกๅŠ ๅ…ฅ้œ€ๅ…จ้‡ๅŒๆญฅ
    • IST(Incremental State Transfer):็ฏ€้ปž็Ÿญๆšซ้›ข็ทšๅพŒ่‡ชๅ‹•ๅขž้‡ๅŒๆญฅ(ๆ›ดๅฟซ)

    ๐Ÿงฉ ไธƒ、Quorum & Split-Brain ้ฟๅ…

    ไธ‰็ฏ€้ปžๆžถๆง‹ๅ…งๅปบ Quorum,้ฟๅ… split-brain:

    
    3 ็ฏ€้ปž → ๆœ€ไฝณ็‹€ๆ…‹  
    2 ็ฏ€้ปž → ไปๅฏ้‹ไฝœ(>50%)  
    1 ็ฏ€้ปž → ้›†็พค่‡ชๅ‹•ๅœๆญข(ไฟ่ญทไธ€่‡ดๆ€ง)
    

    ⚖️ ๅ…ซ、ๆญ้… HAProxy ่ฒ ่ผ‰ๅนณ่กก(ๆŽจ่–ฆ)

    ๅฎ‰่ฃ HAProxy:

    sudo dnf install haproxy -y
    

    ่จญๅฎš:

    /etc/haproxy/haproxy.cfg
    
    frontend mysql-in
        bind *:3306
        mode tcp
        default_backend galera
    
    backend galera
        mode tcp
        balance roundrobin
        option mysql-check user haproxy
        server node1 192.168.1.10:3306 check
        server node2 192.168.1.11:3306 check
        server node3 192.168.1.12:3306 check
    

    ๐Ÿท ไน、่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ›(Keepalived + VIP)

    ่ฎ“ HAProxy ๅ…ทๅ‚™้›™ๆดป HA。

    ่จญๅฎš Keepalived:

    vrrp_instance VI_1 {
        state MASTER
        interface ens33
        virtual_router_id 50
        priority 120
        virtual_ipaddress {
            192.168.1.200
        }
    }
    

    VIP ๆœƒ่‡ชๅ‹•ๆผ‚็งปๅˆฐๅฅๅบท็š„ HAProxy ็ฏ€้ปž,ๅค–้ƒจๆฐธ้ ไฝฟ็”จ: mysql -h 192.168.1.200 -u user -p


    ๐Ÿ“ฆ ๅ、็ฏ€้ปžๆๆฏ€ / ไฟฎๅพฉๆต็จ‹

    ๐ŸŸก Node ๅคฑ่ฏ → ่‡ชๅ‹•ๅˆ‡ๆ›่‡ณๅ…ถไป–ๅ…ฉๅฐ

    ๐ŸŸข Node ๆขๅพฉ → ่‡ชๅ‹•ๅŠ ๅ…ฅ(IST)

    ๐Ÿ”ด ่‹ฅ Node ่ณ‡ๆ–™ๅšด้‡ไธไธ€่‡ด → SST ้‡ๅปบ


    ๐Ÿ“˜ ็ต่ชž

    ไธ‰็ฏ€้ปž MariaDB Galera Cluster ่ฎ“ไฝ ็ฒๅพ—็œŸๆญฃ็š„ Active-Active ๅคšไธปๆžถๆง‹:

    • ๆ‰€ๆœ‰็ฏ€้ปž็š†ๅฏๅŒๆ™‚่ฎ€ๅฏซ
    • ่ณ‡ๆ–™ไธ€่‡ดๆ€ง 100% ไฟ่ญ‰
    • HAProxy + VIP ๆไพ›ไธไธญๆ–ทๅญ˜ๅ–
    • ่‡ชๅ‹•ๆ•…้šœๅˆ‡ๆ› + ่‡ชๅ‹•ไฟฎๅพฉ

    ้€™ๆ˜ฏไผๆฅญ่ณ‡ๆ–™ๅบซๆœ€ไฝณ่งฃๆฑบๆ–นๆกˆไน‹ไธ€,้ฉ็”จๆ–ผ API、ๅพŒ็ซฏ็ณป็ตฑ、้ซ˜ๆต้‡ๆœๅ‹™็ญ‰。


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

    — WWFandy・็ณป็ตฑ่ˆ‡่ณ‡ๆ–™ๅบซ็ญ†่จ˜

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

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

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

    ๅญ—็ดš