Thứ Sáu, 11 tháng 11, 2022

Hướng dẫn triển khai mô hình HAproxy, Pacemaker cho MariaDB Galera

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

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master