๐️ 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、ๅพ็ซฏ็ณป็ตฑ、้ซๆต้ๆๅ็ญ。
๐ ๅปถไผธ้ฑ่ฎ
- Linux ้ฒ็ซ็ๆดๅ:firewalld / iptables / nftables
- OpenVPN + PKI ไผๆฅญๅฎขๆถ็ซฏ่ทฏ็ฑๅฎๆดๆๅ
- Linux NFS ไผๆฅญ้จ็ฝฒๅฎๆดๆๅ
- Linux LVM PV / VG / LV Resize ๅฎๆดๆๅญธ
— WWFandy・็ณป็ตฑ่่ณๆๅบซ็ญ่จ
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ