Linux P2_High Availability Service on Linux (Apache + MySQL)

Discussion in 'LINUX SERVICE' started by vohongnhuy, Jun 10, 2019.

  1. vohongnhuy

    vohongnhuy New Member

    Joined:
    Mar 11, 2019
    Messages:
    11
    Likes Received:
    0
    Trophy Points:
    1
    Gender:
    Male
    Location:
    HCM
    High Availability Service on Linux CentOS 7 (Apache + MySQL)
    Tóm tắt nội dung
    Phần 1: http://svuit.vn/threads/p1_high-availability-service-on-linux-apache-mysql-10144/
    I. Đặt vấn đề
    II. Giải pháp
    III. Tổng quan các giải pháp
    1. Pacemaker
    2. Corosync
    3. MySQL Replication
    IV. Thử nghiệm giải pháp
    1. Mô hình hệ thống lab thử nghiệm các giải pháp HA Web trên VMWare
    2. Cài đặt và cấu hình Pacemaker + Corosync

    Phần 2: http://svuit.vn/threads/p2_high-availability-service-on-linux-apache-mysql-10145/
    3. HA dạng Active/Passive Apache
    4. HA dạng Active/Passive cho MySQL
    5. Trường hợp 1 node fail


    3. HA dạng Active/Passive Apache

    (chỉ thực thiện trên cấu hình trên một node duy nhất).
    Chú ý:
    • Resource chính là các ứng dụng được cấu hình cluster.
    • Tùy vào tài ngyên mà bạn muốn Pacemaker quản lý thì sẽ được add thêm vào trong Cluster.
    • Khi add resource vào cluster thì việc start, stop, restart resource này sẽ do Pacemaker quản lý.
    • Corosync có nhiệm vụ làm messenger để báo cho các node biết tính hình các resource đang như thế nào.
    Thực hiện thêm resource Apache, đặt tên là ha_apache
    #pcs resource create ha_apache ocf:heartbeat:apache configfile=/etc/httpd/conf/httpd.conf statusurl="http://127.0.0.1/server-status" op monitor interval=20s

    Kiểm tra trạng thái của các resource hiện tại.
    #pcs status resources

    Kết quả như bên dưới

    ser(16)

    Cấu hình điều kiện ràng buộc cho các resource (dùng cho trường hợp các resource nằm khác node). Cấu hình để thiết lập resource Virtual_IP và ha_apache hoạt động trên cùng 1 máy trong cụm cluster.
    #pcs constraint colocation add ha_apache with Virtual_IP INFINITY

    Thiết lập chế độ khởi động của các resource (khởi động Virtua_IP rồi mới đến ha_apache)
    #pcs constraint order Virtual_IP then ha_apache

    Kiểm tra lại các thiết lập trên
    #pcs constraint

    Kết quả như sau

    ser(17)

    Kiểm tra lại trạng thái của các resource, ta sẽ thấy chúng được started trên cùng 1 node.
    #pcs status

    ser(18)

    Trong kết quả trên, ta có thể quan sát các resource đang được quản lý bởi pacemaker, các resource đang nằm trên node nào.
    Trường hợp Failover Apache
    Ta shutdown node1 (node active) và dùng lệnh #pcs status trên node2. Các resource tự động được chuyển sang hoạt động trên node2 (node passive được chuyển thành active).

    ser(19)

    Kết quả có thể truy cập web từ virtual IP đã cấu hình

    ser(20)

    4. HA dạng Active/Passive cho MySQL.
    Cấu hình MySQL Replication để đồng bộ dữ liệu trong MySQL
    Lưu ý: trong MySQL Replication
    • Node1 là master
    • Node2 là slaver
    • Bài lab sử dụng user root làm user replication, điều này là không khuyến khích, nên tạo một user và gán các quyền cần thiết cho replication.
    • Không nên áp dụng giải pháp này đối với dữ liệu ghi. Vì khi master fail, client sẽ chuyển hướng sang slave

    • Bài lab sử dụng một database tên opencps được lấy từ internet (file /home/vhny/opencps.sql) để test tính năng replication, thực hiện add database này vào master như sau:
    MariaDB> create database opencps;
    MariaDB> use opencps;
    MariaDB> source /home/vhny/opencps.sql;


    ser(21)

    Kết quả

    ser(22)

    Cấu hình Master trên node1
    Sửa trong file /etc/my.cnf những option sau:
    [mysqld]
    log-bin=mysql-bin
    server-id=1


    ser(23)

    Restart mysql trên MySQL master
    #systemctl restart mariadb

    Cho phép MySQL slave được quyền replication tất cả database bằng user root và yêu cầu đến từ node2
    MariaDB> grant replication slave on *.* to ‘root’@’node2’ identified by ‘1’;
    MariaDB> flush privileges;


    ser(24)

    Kiểm tra master đã hoạt động đúng
    MariaDB> show master status;

    ser(25)

    Tại đây ta lưu ý file log-bin.000003 và position 10880071, thông tin này để cấu hình chính xác trên slave.
    Cấu hình slave trên node2
    Sửa trong file /etc/my.cnf option sau:
    [mysqld]
    server-id=2


    ser(26)

    Restart mysql trên MySQL master
    #systemctl restart mariadb

    Trường hợp Master đã có dữ liệu, nhưng slaver chưa có, để cấu hình replication, ta cần đảm bảo mọi dữ liệu trong MySQL trên 2 node là giống nhau.
    Migrate dữ liệu từ master node1 qua slaver node2:
    Ngưng mọi hoạt động làm thay đổi data, thực hiện trên node1
    MariaDB> flush tables with read lock;

    ser(27)

    Dump database
    #mysqldump -u root -p --opt opencps > /home/vhny/copydb/opencps.sql

    ser(28)

    Copy file được dump lên node2 (tiếp tục thực hiện trên node2)
    #scp root@node1:/home/vhny/copydb/opencps.sql /home/db

    ser(29)

    Import database vừa copy vào mysql
    #mysql -u root -p -e ‘create database opencps;’
    #mysql -u root -p newdatabase < /home/db/opencps.sql


    Kết quả

    ser(30)

    Như vậy data trên 2 node đã giống nhau hoàn toàn, giờ ta sẽ thực hiện replication
    Trên node2: ta có file log-bin.000003 và position 10880071
    #mysql -u root -p
    MariaDB> change master to master_host='node1', master_user='root',
    master_password='1', master_log_file='log-bin.000003', master_log_pos=10880071;


    ser(31)

    Start slave
    MariaDB>start slave;

    ser(32)

    Kiểm tra cấu hình đúng
    MariaDB> show slave status\G;

    ser(33)

    Giờ qua trình đồng bộ đã hoàn tất, ta có thể unlock database trên node1, khi đó mọi thay đổi trên node1 master sẽ được đồng bộ lên node2 slave.
    #mysql -u root -p -e 'unlock tables; '

    ser(34)

    Thử xoá dữ liệu trên node1
    Trước khi xoá

    ser(35)

    Sau khi xoá một row trong table image
    #mysql -u root -p -DB opencps -e 'delete from image where imageId=21207;'

    Kết quả node2 cũng được xoá.

    ser(36)

    Thêm resource MySQL để Pacemaker quản lý, tạo HA Active/Passive MySQL (node passive vẫn chạy để đồng bộ dữ liệu từ node active) (chỉ thực hiện cấu hình trên một node duy nhất).
    Ta tắt dịch vụ MySQL đang chạy và đảm bảo không dùng systemctl quản lý dịch vụ mysql
    #systemctl stop mariadb
    #systemctl disable mariadb


    Lệnh thêm resource trong pcs
    #pcs resource create mysql ocf:heartbeat:mysql binary="/usr/bin/mysqld_safe" config="/etc/my.cnf" datadir="/var/lib/mysql" pid="/var/lib/mysql/mysql.pid" socket="/var/lib/mysql/mysql.sock" replication_passwd='1' op monitor timeout="30s" interval="20s" op monitor role="Master" timeout="30s" interval="10s" op monitor role="Slave" timeout="30s" interval="30s" master

    ser(37)

    Có nhiều parameter trong câu lệnh thêm resource MySQL, đa số trong đó đều có giá trị mặc định. Tuỳ thuộc vào cấu hình MySQL của hệ thống hiện tại mà ta sẽ thay đổi một số parameter. Chẳng hạn như password hoặc timeout phản hồi.

    Kiểm tra cấu hình đúng
    #pcs status

    ser(38)

    Ở đây ta thấy rằng pcs chưa nhận đúng node master và slave, ta thay đổi như sau
    #pcs resource mysql-master move node1 –master

    ser(39)

    Cấu hình điều kiện ràng buộc cho các resource (dùng cho trường hợp các resource nằm khác node). Cấu hình để thiết lập các resource hoạt động trên cùng 1 máy trong cụm cluster.
    #pcs constraint colocation add mysql-master with Virtual_IP INFINITY

    Thiết lập chế độ khởi động của các resource (khởi động Virtua_IP rồi mới đến ha_apache và mysql)
    #pcs constraint order Virtual_IP then mysql-master

    Kiểm tra lại các thiết lập trên
    #pcs constraint

    Kết quả như sau

    ser(40)

    Giờ ta khởi động lại toàn bộ cluster
    #pcs cluster stop –all
    #pcs cluster start –all
    #pcs status


    Kết quả

    ser(41)

    Truy cập database từ virtual IP

    ser(42)

    5. Trường hợp 1 node fail
    Giả định ta shutdown node1 sau khi đã cấu hình hoàn tất. Web tại IP 172.16.1.10 còn hoạt động?

    Tạo một site đơn giản tại /var/www/html/index.php trên cả 2 node kết nối đến database ở virtual IP với php như sau:
    <?php
    $servername = "172.16.1.10";
    $username = "root";
    $password = "1";
    // Create connection
    $conn = new mysqli($servername, $username, $password);
    // Check connection
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }
    echo "Connected successfully.<br>";
    echo gethostname();
    ?>


    ser(43)

    Config CentOS cho phép kết nối database từ web
    #setsebool -P httpd_can_network_connect=1

    Trường hợp 2 node hoạt động bình thường, ta truy cập web từ virtual IP

    ser(44)

    Giờ ta shutdown node1, web đã chuyển sang node2 và vẫn hoạt động bình thường

    ser(45)

    ser(46)

    Kiểm tra trạng thái các dịch vụ từ node2, ta thấy node1 OFFLINE

    ser(47)

    Lưu ý:
    • Nếu node fail hoạt động lại, muốn chuyển các dịch vụ về node đó, cần kiểm tra kỹ toàn bộ node, các dịch vụ cần được chuyển thủ công về node để phòng tránh trường hợp data trên node lỗi dẫn đến việc lỗi trên tất cả các node.
    • Về MySQL Replication, nếu node slave fail, dẫn đến không đồng bộ dữ liệu, sau khi bật lại node slave, cần start slave từ đầu.
    Thực hiện tương tự lệnh sau:
    #mysql -u root -p -e "change master to master_host='node1', master_user='root', master_password='1', master_log_file='log-bin.000003', master_log_pos=10880071; start slave;"

    ***Các kiến thức và lệnh cấu hình sử dụng trong bài viết là một phần về toàn bộ các giải pháp.

    ---HẾT---
     
    Last edited: Jun 19, 2019

Share This Page