Galera Cluster mysql บน ubuntu 22
ก่อนอืนเลย ต้องบอกถึงข้อจำกัด จากที่ผมทดสอบมา ว่าการทำงานของ Galera Cluster mysql เป็นแบบนี้
หากไม่ถูกอย่างไรสามารถเสริมได้ เพราะข้อมูลนี้มาจากทดสอบจริงๆ
1.Cluster จะไม่ทำงาน หาก node ที่เชื่อมกันน้อยกว่า ครึ่ง เท่ากับว่า หากเรามี 2 site วาง site ละ 3 node หรือเท่าไรก็แล้วแต่ แล้วเกิดเหตุการ network ระหว่าง site ขาด node แต่ละ site จะไม่สามารถทำงานได้เลย ดังนั้นจะไม่เหมาะกัน network ที่หลุดบ่ายๆ และ แต่ละ site มีการ update ข้อมูลของตัวเอง เพราะถ้า network หลุด มันจะ update ของ site ตัวเองไม่ได้ นอกจากเราจะเน้น ไปที่ site หลัก เช่น hq ไม่ได้เน้น site รอง
2.แต่ละ node จะเป็น multi-master จะ update ที่ไหนก็ได้
3.set ง่าย มาก
4.หากมี แค่ 2 node ข้อมูลจะ update ได้ทั้ง 2 site (อันนี้ไม่แน่ใจแต่เจอตอนแรกต้องทดสอบอีกที)
5.หาก node หลุดไป 1 ชั่วโมงพอ node กลับมาข้อมูลก็เท่ากันปกติ
6.จากข้อแรก ฉันก็เลยจะไปทาง Replication Cluster แต่ก็ทำได้สูงสุดแค่ 2 site แต่งานฉันมี 5 site แต่หากใครมีแค่ 2 site ก็สามารถทำได้ แต่ก็อีกนั้นละ หากมีแค่ 2 site ก็ทำ Replication master – master ไปดีกว่าไหม (แต่ฉันไม่แน่ใจเรื่องความสเถียน ระหว่าง Cluster กับ Replication หาก network หลุดเป็นเวลานานและข้อมูลเยอะ )
——————————————————————————————————–
นี้คือการทำบน ubuntu 22 หากที่อยู่ไฟล์อาจไม่เหมือนกัน
———————————————————————————————————-
ติดตั้ง (ทุก node)
apt install mariadb-server mariadb-client galera-4
จากนั้นก็ตั้งค่า mariadb (ทุก node)
mysql_secure_installation
ทดสอบเข้าสู่ระบบ (ทุก node)
mysql -u root -p
จากนั้นแก้ไฟล์ เพื่อให้เข้าได้ทุก ip (ของจริงไม่ควร) (ทุก node)
/etc/mysql/mariadb.conf.d/50-server.cnf
[mysqld]
bind-address = 0.0.0.0
จากนั้นก็ทดสอบ connect ดู ทุก site และสร้าง database ที่จะทดสอบ (ทุก node)
สร้าง User สำหรับ State Snapshot Transfer (SST) บนทุก Node
sudo mysql -u root -p
CREATE USER ‘sstuser’@’localhost’ IDENTIFIED BY ‘your_password’;
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO ‘sstuser’@’localhost’;
FLUSH PRIVILEGES;
กำหนดค่าพื้นฐานของ Galera Cluster บนทุก Node
sudo nano /etc/mysql/mariadb.conf.d/60-galera.cnf
# เปิดใช้ Galera
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
# ชื่อ Cluster
wsrep_cluster_name=”my_galera_cluster”
# ที่อยู่ของ nodes ทั้งหมดใน Cluster (รวมทุก site)
wsrep_cluster_address=”gcomm://192.168.1.216,192.168.1.217,192.168.1.218,192.168.1.219,192.168.1.220,192.168.1.221″
# กำหนด IP address ของ node นี้
wsrep_node_address=”192.168.1.216″ # ปรับตาม IP ของ node นั้น ๆ
# ตั้งชื่อของ node
wsrep_node_name=”mysql1″ # ปรับตามชื่อ node เช่น mysql2, mysql3 ฯลฯ
# การทำ State Snapshot Transfer (SST)
wsrep_sst_method=rsync
# ค่าที่จำเป็นสำหรับ Galera
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
บน node แรก (เช่น mysql1
) ให้รันคำสั่งนี้เพื่อเริ่ม Cluster เป็นครั้งแรก:
sudo galera_new_cluster
บน nodes อื่น (mysql2
ถึง mysql6
) ให้เริ่ม MariaDB ตามปกติ:
sudo systemctl start mysql
ใช้คำสั่งนี้เพื่อตรวจสอบจำนวน nodes ใน Cluster:
SHOW STATUS LIKE ‘wsrep_cluster_size’;
จากนั้นลองทดสอบดู
หาก node ipไม่ถูกตั้งค่าผิด หรือต้องการแก้ใดๆ แล้ว สั่ง galera_new_cluster กลับมาไม่ได้ ทำให้ error ให้ไปแก้ค่าตามที่นี้ node แรก หรือ ที่จะให้เป็นหลัก
vi /var/lib/mysql/grastate.dat
หาแถว safe_to_bootstrap: 0
แล้วเปลี่ยนค่าเป็น safe_to_bootstrap: 1
# GALERA saved state
version: 2.1
uuid: 05b05462-9740-11ef-8646-6f7401d660e9
seqno: -1
safe_to_bootstrap: 1
จากนั้นก็ ที่ node หลัก
sudo galera_new_cluster
และ
systemctl start mysql
ทุก node