Linux P2_High Availability Service on Linux (Apache + MySQL)

vohongnhuy

Internship/Fresher
Mar 11, 2019
21
7
3
27
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:

About us

  • Securityzone.vn là một trang web chuyên về an ninh mạng và công nghệ thông tin. Trang web này cung cấp các bài viết, tin tức, video, diễn đàn và các dịch vụ liên quan đến lĩnh vực này. Securityzone.vn là một trong những cộng đồng IT lớn và uy tín tại Việt Nam, thu hút nhiều người quan tâm và tham gia. Securityzone.vn cũng là nơi để các chuyên gia, nhà nghiên cứu, sinh viên và người yêu thích an ninh mạng có thể trao đổi, học hỏi và chia sẻ kiến thức, kinh nghiệm và giải pháp về các vấn đề bảo mật trong thời đại số.

Quick Navigation

User Menu