Khi chúng ta đã có một cụm MariaDB Galera Cluster 3 nodes, bài toán tiếp theo cần làm là thực hiện quản lý healthcheck cụm MariaDB Cluster, cân bằng tải cho cụm MariaDB Cluster để các ứng dụng có thể trỏ tới sử dụng đọc ghi dữ liệu.
1. Thành phần giải pháp:
HAproxy: Là phầm mềm mã nguồn mở miễn phí, cung cấp các giải pháp như cân bằng tải TCP/HTTP và máy chủ proxy. HAproxy sẽ cải thiện hiệu năng và tính tin cậy, sẵn sàng của hệ thống bằng cách dẫn tải đến các node khác.
Pacemaker: Là một phần mềm công cụ đóng vai trò quản lý cụm tài nguyên. Pacemaker sử dụng corosync để liên lạc bên trong cluster, xác định node lỗi và chuyển tài nguyên sang những node đang hoạt động.
2. Mô hình:
Mô hình triển khai:
Mô hình hoạt động giữa các thành phần:
IP planning:
3. Hướng dẫn triển khai
3.1 Thiết lập ban đầu
Thiết lập ban đầu và khởi tạo cụm MariaDB Galera Cluster theo tài liệu tại đây.
Khai báo file /etc/hosts trên tất cả các node
cat << EOF >> /etc/hosts
192.168.10.94 mariadb-1
192.168.10.95 mariadb-2
192.168.10.96 mariadb-3
EOF
3.2 Cài đặt Healthcheck cho MariaDB Galera Cluster
Có nhiều cách để thực hiện việc healthcheck cho cụm MariaDB Galera, ở đây tôi sẽ sử dụng một dịch vụ là xinetd. Dịch vụ này có chức năng điều khiển các kết nối mạng đến hệ thống. Từ đó sẽ thực hiện định nghĩa ra một service trên hệ thống có tên là mysqlchk được listen qua port tcp 9200, service này sẽ có nhiệm vụ giao tiếp với HAproxy để thực hiện healthcheck cụm MariaDB cluster.
Thực hiện trên tất cả các node
Bước 1: Thực hiện cài đặt xinetd
yum -y install xinetd
Bước 2: Tạo script check cho dịch vụ mysqlchk
. Script này sẽ thực hiện check trạng thái các node trong cụm MariaDB Galera. Tạo file /usr/local/bin/clustercheck
có nội dung:
#!/bin/bash
#
# Script to make a proxy (ie HAProxy) capable of monitoring Percona XtraDB Cluster nodes properly
#
# Author: Olaf van Zandwijk <olaf.vanzandwijk@nedap.com>
# Author: Raghavendra Prabhu <raghavendra.prabhu@percona.com>
#
# Documentation and download: https://github.com/olafz/percona-clustercheck
#
# Based on the original script from Unai Rodriguez
#
if [[ $1 == '-h' || $1 == '--help' ]];then
echo "Usage: $0 <user> <pass> <available_when_donor=0|1> <log_file> <available_when_readonly=0|1> <defaults_extra_file>"
exit
fi
# if the disabled file is present, return 503. This allows
# admins to manually remove a node from a cluster easily.
if [ -e "/var/tmp/clustercheck.disabled" ]; then
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 51\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is manually disabled.\r\n"
sleep 0.1
exit 1
fi
MYSQL_USERNAME="${1-clustercheckuser}"
MYSQL_PASSWORD="${2-clustercheckpassword!}"
AVAILABLE_WHEN_DONOR=${3:-0}
ERR_FILE="${4:-/dev/null}"
AVAILABLE_WHEN_READONLY=${5:-1}
DEFAULTS_EXTRA_FILE=${6:-/etc/my.cnf}
#Timeout exists for instances where mysqld may be hung
TIMEOUT=10
EXTRA_ARGS=""
if [[ -n "$MYSQL_USERNAME" ]]; then
EXTRA_ARGS="$EXTRA_ARGS --user=${MYSQL_USERNAME}"
fi
if [[ -n "$MYSQL_PASSWORD" ]]; then
EXTRA_ARGS="$EXTRA_ARGS --password=${MYSQL_PASSWORD}"
fi
if [[ -r $DEFAULTS_EXTRA_FILE ]];then
MYSQL_CMDLINE="mysql --defaults-extra-file=$DEFAULTS_EXTRA_FILE -nNE --connect-timeout=$TIMEOUT \
${EXTRA_ARGS}"
else
MYSQL_CMDLINE="mysql -nNE --connect-timeout=$TIMEOUT ${EXTRA_ARGS}"
fi
#
# Perform the query to check the wsrep_local_state
#
WSREP_STATUS=$($MYSQL_CMDLINE -e "SHOW STATUS LIKE 'wsrep_local_state';" \
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
if [[ "${WSREP_STATUS}" == "4" ]] || [[ "${WSREP_STATUS}" == "2" && ${AVAILABLE_WHEN_DONOR} == 1 ]]
then
# Check only when set to 0 to avoid latency in response.
if [[ $AVAILABLE_WHEN_READONLY -eq 0 ]];then
READ_ONLY=$($MYSQL_CMDLINE -e "SHOW GLOBAL VARIABLES LIKE 'read_only';" \
2>${ERR_FILE} | tail -1 2>>${ERR_FILE})
if [[ "${READ_ONLY}" == "ON" ]];then
# Percona XtraDB Cluster node local state is 'Synced', but it is in
# read-only mode. The variable AVAILABLE_WHEN_READONLY is set to 0.
# => return HTTP 503
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 43\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is read-only.\r\n"
sleep 0.1
exit 1
fi
fi
# Percona XtraDB Cluster node local state is 'Synced' => return HTTP 200
# Shell return-code is 0
echo -en "HTTP/1.1 200 OK\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 40\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is synced.\r\n"
sleep 0.1
exit 0
else
# Percona XtraDB Cluster node local state is not 'Synced' => return HTTP 503
# Shell return-code is 1
echo -en "HTTP/1.1 503 Service Unavailable\r\n"
echo -en "Content-Type: text/plain\r\n"
echo -en "Connection: close\r\n"
echo -en "Content-Length: 44\r\n"
echo -en "\r\n"
echo -en "Percona XtraDB Cluster Node is not synced.\r\n"
sleep 0.1
exit 1
fi
Bước 3: Phân quyền cho script vừa tạo
chmod 0777 /usr/local/bin/clustercheck
Bước 4: Cấu hình dịch vụ xinetd
cat << EOF > /etc/xinetd.d/mysqlchk
service mysqlchk
{
disable = no
flags = REUSE
socket_type = stream
port = 9200
wait = no
user = nobody
server = /usr/local/bin/clustercheck
log_on_failure += USERID
only_from = 0.0.0.0/0
bind =
per_source = UNLIMITED
}
EOF
Bước 5: Khai báo dịch vụ mysqlchk trên hệ thống
cat << EOF >> /etc/services
mysqlchk 9200/tcp # MySQL check
EOF
Bước 6: Khởi động lại dịch vụ xinetd
systemctl restart xinetd
Bước 7: Gán quyền cho user trong Database để có thể thực hiện check thông qua service
mysql -uroot -p -e "GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword\!';"
mysql -uroot -p -e "FLUSH PRIVILEGES;"
Kiểm tra đã thực hiện healthcheck thành công hay chưa trên node bất kỳ:
/usr/local/bin/clustercheck
3.3 Cài đặt HAproxy
Thực hiện trên tất cả các node
Bước 1: Cài đặt các gói cho service HAproxy
yum -y install haproxy
Bước 2: Cấu hình service HAproxy
cat << EOF > /etc/haproxy/haproxy.cfg
global
daemon
group haproxy
log /dev/log local0
log /dev/log local1 notice
maxconn 16000
pidfile /var/run/haproxy.pid
stats socket /var/lib/haproxy/stats
tune.bufsize 32768
tune.maxrewrite 1024
user haproxy
defaults
log global
maxconn 8000
mode http
option redispatch
option http-server-close
option splice-auto
retries 3
timeout http-request 20s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout check 10s
listen stats
bind 192.168.10.178:8080
mode http
stats enable
stats uri /stats
stats realm HAProxy\ Statistics
stats refresh 10s
stats show-node
stats show-legends
listen mysqld-3306
bind 192.168.10.178:3306
balance source
mode tcp
option httpchk
option tcplog
option clitcpka
option srvtcpka
timeout client 28801s
timeout server 28801s
server mariadb-1 192.168.10.94:3306 check port 9200 inter 5s fastinter 2s rise 3 fall 3
server mariadb-2 192.168.10.95:3306 check port 9200 inter 5s fastinter 2s rise 3 fall 3 backup
server mariadb-3 192.168.10.96:3306 check port 9200 inter 5s fastinter 2s rise 3 fall 3 backup
EOF
Bước 3: Bổ sung cấu hình cho phép kernel có thể binding tới IP VIP
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
Bước 4: Refresh lại cấu hình sysctl
sysctl -p
Bước 5: Dừng service HAproxy
systemctl stop haproxy
3.4 Cài đặt Pacemaker Cluster
Thực hiện trên tất cả các node
Bước 1: Cài đặt Pacemaker và các gói phụ trợ
dnf -y install --enablerepo=ha pcs pacemaker corosync pcs fence-agents-all resource-agents
Bước 2: Update lại các gói cài đặt
dnf -y update
Bước 3: Thiết lập mật khẩu cho user hacluster để thực hiện quản lý cluster
echo <Nhập_mật_khẩu_hacluster_của_bạn> | passwd --stdin hacluster
Bước 4: Khởi động service pcs
systemctl start pcsd
systemctl enable pcsd
systemctl enable corosync
systemctl enable pacemaker
Thực hiện trên node mariadb-1
Bước 1: Chứng thực cluster
pcs host auth mariadb-1 mariadb-2 mariadb-3 -u hacluster -p <Nhập_mật_khẩu_hacluster_của_bạn>
Kết quả:
Bước 2: Khởi tạo cấu hình cluster ban đầu
pcs cluster setup --force ha_cluster mariadb-1 mariadb-2 mariadb-3
Kết quả:
Bước 3: Khởi động cluster
pcs cluster start --all
Kết quả:
Bước 4: Enable Cluster để có thể start cùng OS
pcs cluster enable --all
Kết quả:
Bước 5: Disable cơ chế stonith (tự động down một node trong cụm cluster nếu hoạt động không đúng)
pcs property set stonith-enabled=false
Bước 6: Cho phép Cluster tiếp tục hoạt động ngay cả khi mất Quorum
pcs property set no-quorum-policy=ignore
Bước 7: Khởi tạo tài nguyên IP VIP
pcs resource create vip_public ocf:heartbeat:IPaddr2 ip=192.168.10.178 cidr_netmask=24 meta migration-threshold=3 failure-timeout=60 resource-stickiness=1 op monitor interval=5 timeout=20 op start interval=0 timeout=30 op stop interval=0 timeout=30
Bước 8: Khởi tạo tài nguyên quản lý service HAproxy
pcs resource create p_haproxy systemd:haproxy meta migration-threshold=3 failure-timeout=120 target-role=Started op monitor interval=30 timeout=60 op start interval=0 timeout=60 op stop interval=0 timeout=60
Bước 9: Bắt buộc 2 tài nguyên vip_public và p_haproxy phải đồng thời start trên một node
pcs constraint colocation add vip_public with p_haproxy score=INFINITY
Bước 10: Tài nguyên p_haproxy sẽ start sau vip_public
pcs constraint order start vip_public then start p_haproxy
Bước 11: Enable tài nguyên vip_public start cùng OS
pcs resource enable vip_public
Bước 12: Enable tài nguyên p_haproxy start cùng OS
pcs resource enable p_haproxy
Bước 13: Cleanup
pcs resource cleanup
Kiểm tra trạng thái Cluster
pcs status
Thực hiện trên tất cả các node
Khởi động lại HAproxy
systemctl restart haproxy
4. Kiểm tra hệ thống sau khi cài đặt
Truy cập qua địa chỉ : <IP_VIP_của bạn>:8080/stats
Giờ ứng dụng của bạn sẽ chỉ cần gọi tới địa chỉ 192.168.10.178:3306 là có thể truy xuất đọc ghi dữ liệu.
Giả định dừng service MariaDB trên một node
Đứng tại 2 node bất kỳ truy xuất MariaDB qua địa chỉ IP VIP
mysql -uroot -h192.168.10.178 -p
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile: 0902912888
⚡️ Skype: tranbinh48ca
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội
=============================
Hướng dẫn triển khai mô hình HAproxy, Pacemaker cho MariaDB Galera, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,khóa học pl/sql, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty