Dùng nhiều máy chủ cho Website của bạn

0
1482
(Last Updated On: Th9 17, 2018)

Ghi chú: Các bạn có thể kiểm tra trạng thái repication trên 2 server bằng dòng lệnh (chạy dòng lệnh trên cả 2 server):

show slave status\G;

Thông tin từ server B:

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 45.32.5.234
                  Master_User: replicator
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000019
          Read_Master_Log_Pos: 685
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 469
        Relay_Master_Log_File: mysql-bin.000019
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 685
              Relay_Log_Space: 626
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
1 row in set (0.00 sec)

ERROR:
No query specified

Thông tin từ server A:

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 45.77.128.21
                  Master_User: replicator_user
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000016
          Read_Master_Log_Pos: 11865717
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 11865329
        Relay_Master_Log_File: mysql-bin.000016
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 11865717
              Relay_Log_Space: 11865486
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 2
1 row in set (0.01 sec)

ERROR:
No query specified

Như vậy không có lỗi phát sinh.

Bước đi lớn tiếp theo đó là chúng ta tiến hành đồng bộ tập tin trên 2 server A và B.

Có khá nhiều công cụ nhưng mình dùng Syncthing.

Đầu tiên chúng ta cào đặt curl để có thể lấy về gói cài đặt Syncthing

Đầu tiên chúng ta thêm PGP key cho gói cài đặt Syncthing:

curl -s https://syncthing.net/release-key.txt | sudo apt-key add –

Thêm repository với gói “stable” vào APT source:

echo "deb https://apt.syncthing.net/ syncthing stable" | sudo tee /etc/apt/sources.list.d/syncthing.list

Tiếp tục Update gói package:

sudo apt-get update

Và cài đặt Syncthing ngay bây giờ:

sudo apt-get install syncthing

Ngay sau khi cài đặt xong Syncthing, chúng ta chạy thử xem nó có hoạt động hay không:

syncthing

Các bạn sẽ thấy rằng nó đã hoạt động:

root@vngeek:/# syncthing

[monitor] 15:38:49 INFO: Starting syncthing

[QK4WB] 15:38:50 INFO: syncthing v0.14.38 "Dysprosium Dragonfly" (go1.9 linux-amd64) deb@build.syncthing.net 2017-09-07 09:40:46 UTC [noupgrade]

[QK4WB] 15:38:50 INFO: My ID: QK4WBRM-GVMHWX7-QDPIWQ7-IZFOTO7-SGCFJEZ-2P5M6XN-GJYA53C-KJO7MQ2

[QK4WB] 15:38:51 INFO: Single thread SHA256 performance is 196 MB/s using crypto/sha256 (189 MB/s using minio/sha256-simd).

[QK4WB] 15:38:51 INFO: Default folder created and/or linked to new config

[QK4WB] 15:38:51 INFO: Defaults saved. Edit /root/.config/syncthing/config.xml to taste or use the GUI

[QK4WB] 15:38:51 INFO: Hashing performance with weak hash is 200.96 MB/s

Bây giờ chúng ta thoát ra ngoài dòng lệnh bằng CTRL + C

Việc tiếp theo là thiết lập Syncthing để chúng ta có thể quản lý bằng GUI qua giao diện Web:

Các bạn tìm file thiết lập Syncthing và chỉnh sửa nó:

nano ~/.config/syncthing/config.xml

Tìm đến dòng:

<gui enabled="true" tls="false">

<address>127.0.0.1:8080</address>

</gui>

Phần address 127.0.0.1 chỉ cho phép Localhost hay chính máy chủ cài đặt Syncthing có thể truy cập phần quản lý qua Web. Các bạn sửa 127.0.0.1 thành 0.0.0.0 để có thể truy cập bằng bất cứ địa chỉ nào:

<gui enabled="true" tls="false">

<address>0.0.0.0:8080</address>

</gui>

Lưu lại tập tin cài đặt.

Tiếp theo chúng sẽ tạo script để giúp Syncthing tự chạy mỗi khi khởi động hệ thống và cũng tự khởi động lại nếu có vấn đề.

Các bạn tạo tập tin khởi động syncthing.conf:

nano /etc/init/syncthing.conf

Thêm nội dung dưới đây vào file syncthing.conf:

description "Syncthing Service"

start on (local-filesystems and net-device-up IFACE!=lo)

stop on runlevel [!2345]

env STNORESTART=yes

env HOME=/home/vngeek

setuid "vngeek"

setgid "www-data"

exec /usr/bin/syncthing

respawn

Chú ý: phần setgid với thông số “www-data” là để user vngeek vào group www-data.

Vì chúng ta cần đồng bộ dữ liệu webserver (Apache hoặc nginx).

Thêm user vngeek chạy Syncthing vào Group www-data:

usermod -a -G www-data vngeek

Thêm quyền cho user vngeek:

chgrp -R www-data /var/www/

Và cuối cùng:

chmod -R g+w /var/www/

Trong đó /var/www là thư mục web root.

Các bạn đừng quên dòng lệnh sau cùng:

chown -R vngeek:www-data /var/www

Trong đó: vngeek là người dùng mà chúng ta đã cài đặt Syncthing.

Trong đó vngeek là User hiện tại mà bạn đăng nhập vào server. Bạn đổi thành tên người dung của bạn cho phù hợp nhé.

Sau đó chúng ta khởi động dịch vụ Syncthing bằng lệnh:

initctl start syncthing

Bạn sẽ thấy tựa như sau:

root@vngeek:/# initctl start syncthing

syncthing start/running, process 2598

root@vngeek:/#

Như vậy là dịch vụ Syncthing đã chạy

Thử khởi động lại dịch vụ thế nào:

service syncthing restart

Như vậy là ổn rồi.

Nếu bạn gặp rắc rối như lỗi:

stop: Unable to connect to Upstart: Failed to connect to socket /com/ubuntu/upstart: Connection refused

thì có thể sửa bằng cách:

apt-get install upstart-sysv
update-initramfs -u
reboot

Trên Ubuntu 16.04:

systemctl enable syncthing@ten_nguoi_dung.service
systemctl start syncthing@ten_nguoi_dung.service

Kiểm tra bằng dòng lệnh:

systemctl status syncthing@root.service
Như vậy là đã xong, dịch vụ Syncthing sẽ tự động chạy mỗi khi khởi động hệ thống.

Vậy là coi như xong phần thiết lập ban đầu cho Syncthing.

Phần quan trọng tiếp theo là chúng ta truy cập giao diện GUI của Synthing bằng cách truy cập bằng trình duyệt web đến địa chỉ:

http://server_IP:8384

Trong đó server_IP là IP máy chủ hiện tại mà bạn đã cài đặt Syncthing lên trên nó.

Một số bạn không thể kết nối được đến với Syncthing thì một phần là do sau khi dịch vụ Syncthing khởi động nó đã khởi tạo một file config.xml khác với mặc định là chỉ cho Localhost kết nối.

Các bạn tim file config.xml mới bằng dòng lệnh:

updatedb

Sẽ trông như thế này:

root@vngeek:/# updatedb

root@vngeek:/# locate config.xml

/home/root/.config/syncthing/config.xml

/root/.config/syncthing/config.xml

Vâng và tập tin config.xml mới nằm ở /home/root/.config/syncthing/config.xml

Các bạn mở ra và chỉnh sửa lại dòng:

<gui enabled="true" tls="false" debugging="false">

<address>127.0.0.1:8384</address>

Thành thế này:

<gui enabled="true" tls="false" debugging="false">

<address>0.0.0.0:8384</address>

Sau đó lưu lại và khởi động lại dịch vụ Syncthing:

service syncthing restart

Bây giờ truy cập lại địa chỉ:

http://server_IP:8384

Trình GUI Syncthing trông như thế này:

Các bạn vào tạo tài khoản quản lý GUI cho Syncthing để bảo mật an toàn nhé.

Sau đó thiết lập thư mục cần đồng bộ:

Tiếp tục nào:

Syncthing đang quét thư mục

Giờ đã quét xong rồi. Có thống kê khá chi tiết và giao diện dễ sử dụng với tiếng Việt.

Các bạn cài đặt Syncthing tương tự lên trên máy chủ mà các bạn muốn đồng bộ tập tin với nhau nhé.

Mình cũng đã cài đặt xong Syncthing trên máy chủ cần đồng bộ (vngeek2):

Để có thể bắt đầu động bộ các tập tin giữa hai server, các bạn cần kết nối chúng lại với nhau bằng “danh tính thiết bị” là một đoạn mã bất kỳ được tạo ra trên mỗi server và nó như một ID định danh (Y như số CMND của các bạn vậy).

Chép lấy ID và thêm thiết bị này thong qua Thêm thiết bị từ xa

Bây giờ chúng ta quay lại máy chủ vngeek để đồng ý kết nối:

Máy chủ vngeek đã được thêm vào danh sách các thiết bị từ xa trên vngeek2.

Và chúng ta chia sẻ thư mục đã thiết lập trước đó luôn cho vngeek2:

Quay lại với vngeek2 để đồng ý việc chia sẻ thư mục:

Và một lần nữa thiết lập thư mục sẽ đồng bộ tại thư mục nào trên server vngeek2:

Vâng và hai thư mục /var/www trên cả 2 server đang được đồng bộ:

Đợi sau khi đồng bộ xong. Như vậy chúng ta đã xong 2 nhiệm vụ lớn đó là đồng bộ cơ sở dữ liệu và tập tin trên 2 server.

Chú ý: Máy chủ A là vngeek – Máy chủ B là vngeek2.

Cuối cùng:

Bây giờ chúng ta thiết lập DNS Round Robin trong phần quản lý DNS của tên miền, hoặc là dịch vụ DNS trung gian mà bạn đang sử dụng. Mình thì dùng CloudFlare, các bạn thêm 2 record vào root domain dẫn đến 2 IP máy chủ – trong trường hợp mình là máy chủ A và B.

Mình thử ping đến vngeek.com xem trả về thế nào:

Như vậy DNS trả về lần lượt 2 IP từ 2 máy chủ mình đã thiết lập đồng bộ.

Vâng đến đây là mình đã hoàn thành sử dụng 2 máy chủ với phương thức Round Robin DNS. Với cơ sở dữ liệu và tập tin media được đồng bộ trên 2 server.

Ngay thời điểm mình Upload hình ảnh trên thì mình tiến hành kiểm tra xem trên 2 server đã đồng bộ ảnh này chưa, và kết quả là cực kỳ nhanh:

Chúc các bạn thành công!

Có những bài viết về LoadBalancer và Highscalability đối với web. Các bạn tìm đọc trên VnGeek.com nhé.

Bình luận