Làm quen với MariaDB Galera Cluster

MariaDB Galera Cluster là hệ thống cluser cho phép nhiều primary node CSDL MariaDB đồng thời, tức bạn có thể thực hiện lệnh write trên node bất kỳ và dữ liệu được đồng bộ cho các node khác trong cluster. Nó chỉ chính thức hỗ trợ hoạt động trên môi trường Linux và InnoDB storage engine.

Tính năng
Một số từ ngữ kỹ thuật tiếng Anh vui lòng xem bài gốc tại đây
- Đồng bộ dữ liệu hầu như real-time
- Mô hình active-active nhiều primary
- Đọc và ghi trên bất kỳ cluster node nào
- Tự động quản lý quyền/vai trò các node trong cluster, node lỗi tự drop khỏi cluster
- Tự động quá trình join node mới
- Đồng bộ song song cấp độ dòng
- Client kết nối trực tiếp như một MariaDB thông thường
Một số hạn chế
- Chỉ hỗ trợ 1 phần cho loại CSDL MyISAM. Để full tính năng cần dùng InnoDB tables.
- Các table cần có primary key.
- Tính năng lock / unlock table không hỗ trợ
- Global transactions chưa hỗ trợ
- Query cache không sử dụng trong Galera Cluster
- Query logs chỉ có thể lưu vào file thay vì vào table
Cài đặt mô hình lab với docker-compose
Dưới đây là file docker-compose.yml để bạn có thể 1 phát ăn ngay, dựng hệ thống trong phút mốt trên 1 máy chủ và trải nghiệm tính năng của MariaDB Galera Cluster.
version: '2.1'
services:
# master/bootstrap node
mariadb-galera-1:
image: docker.io/bitnami/mariadb-galera:10.7
ports:
- '3391:3306'
#- '4444:4444'
#- '4567:4567'
#- '4568:4568'
volumes:
- 'mariadb_galera_data_1:/bitnami/mariadb'
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_GALERA_CLUSTER_NAME=mariadb-cluster
- MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes
- MARIADB_GALERA_FORCE_SAFETOBOOTSTRAP=yes
# MARIADB_GALERA_CLUSTER_ADDRESS point to bootstrap node
- MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://mariadb-galera-1:4567,mariadb-galera-2:4567,mariadb-galera-3:4567,0.0.0.0:4567
- MARIADB_EXTRA_FLAGS=--max-connect-errors=1000 --max_connections=155
- MARIADB_GALERA_MARIABACKUP_USER=mariadb_backup_user
- MARIADB_GALERA_MARIABACKUP_PASSWORD=backup_pwd
- MARIADB_ROOT_PASSWORD=root_password
- MARIADB_REPLICATION_USER=rep_user
- MARIADB_REPLICATION_PASSWORD=rep_pwd
healthcheck:
test: ['CMD', '/opt/bitnami/scripts/mariadb-galera/healthcheck.sh']
interval: 15s
timeout: 5s
retries: 6
# slave node
mariadb-galera-2:
image: docker.io/bitnami/mariadb-galera:10.7
ports:
- '3392:3306'
#- '4444:4444'
#- '4567:4567'
#- '4568:4568'
volumes:
- 'mariadb_galera_data_2:/bitnami/mariadb'
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_GALERA_CLUSTER_NAME=mariadb-cluster
#- MARIADB_GALERA_CLUSTER_BOOTSTRAP=yes
#- MARIADB_GALERA_FORCE_SAFETOBOOTSTRAP=yes
# MARIADB_GALERA_CLUSTER_ADDRESS point to bootstrap node
- MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://mariadb-galera-1:4567,mariadb-galera-2:4567,mariadb-galera-3:4567,0.0.0.0:4567
- MARIADB_EXTRA_FLAGS=--max-connect-errors=1000 --max_connections=155
- MARIADB_GALERA_MARIABACKUP_USER=mariadb_backup_user
- MARIADB_GALERA_MARIABACKUP_PASSWORD=backup_pwd
- MARIADB_ROOT_PASSWORD=root_password
- MARIADB_REPLICATION_USER=rep_user
- MARIADB_REPLICATION_PASSWORD=rep_pwd
healthcheck:
test: ['CMD', '/opt/bitnami/scripts/mariadb-galera/healthcheck.sh']
interval: 15s
timeout: 5s
retries: 6
mariadb-galera-3:
image: docker.io/bitnami/mariadb-galera:10.7
ports:
- '3393:3306'
#- '4444:4444'
#- '4567:4567'
#- '4568:4568'
volumes:
- 'mariadb_galera_data_3:/bitnami/mariadb'
environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development.
- ALLOW_EMPTY_PASSWORD=yes
- MARIADB_GALERA_CLUSTER_NAME=mariadb-cluster
# MARIADB_GALERA_CLUSTER_ADDRESS point to bootstrap node
- MARIADB_GALERA_CLUSTER_ADDRESS=gcomm://mariadb-galera-1:4567,mariadb-galera-2:4567,mariadb-galera-3:4567,0.0.0.0:4567
- MARIADB_EXTRA_FLAGS=--max-connect-errors=1000 --max_connections=155
- MARIADB_GALERA_MARIABACKUP_USER=mariadb_backup_user
- MARIADB_GALERA_MARIABACKUP_PASSWORD=backup_pwd
- MARIADB_ROOT_PASSWORD=root_password
- MARIADB_REPLICATION_USER=rep_user
- MARIADB_REPLICATION_PASSWORD=rep_pwd
healthcheck:
test: ['CMD', '/opt/bitnami/scripts/mariadb-galera/healthcheck.sh']
interval: 15s
timeout: 5s
retries: 6
volumes:
mariadb_galera_data_1:
driver: local
mariadb_galera_data_2:
driver: local
mariadb_galera_data_3:
driver: local
Lưu lại và chạy lệnh docker-compose up -d để build và start các container. Chúng ta sẽ có 3 container có tên lần lượt là:
mariadb-galera-1-- public port3391mariadb-galera-2-- public port3392mariadb-galera-3-- public port3393

Các tham số chính
Quản lý MariaDB Galera Cluster, bạn cần chú ý 1 số tham số sau để có thể xử lý khi có vấn đề (ví dụ: khi node giữ vai trò cluster bootstrap bị down)
- Login vào
mysqlconsole trên node bất kỳ, chạy querySHOW STATUS LIKE 'wsrep_%';để lấy các giá trị wsrep_last_committed: giá trị này nên như nhau giữa các nodewsrep_local_state_comment: nên làSyncedwsrep_cluster_status: nên làPrimarywsrep_cluster_size: nên bằng số node của cluster (ví dụ3)wsrep_connected: nên làON
Tài liệu tham khảo
- https://hub.docker.com/r/bitnami/mariadb-galera/
- https://severalnines.com/blog/updated-how-bootstrap-mysql-or-mariadb-galera-cluster
- https://severalnines.com/database-blog/galera-cluster-recovery-101-deep-dive-network-partitioning
- https://www.catalyst2.com/blog/everything-you-need-to-know-about-galera-cluster/