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 port3391
mariadb-galera-2
-- public port3392
mariadb-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
mysql
console 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àSynced
wsrep_cluster_status
: nên làPrimary
wsrep_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/