Tìm kiếm Blog này

Translate

Hiển thị các bài đăng có nhãn database. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn database. Hiển thị tất cả bài đăng

Thứ Bảy, 7 tháng 11, 2020

MySql Replication - Phần 1

 

Replication là gì?

Replication cho phép sao chép dữ liệu từ một máy chủ cơ sở dữ liệu MySql (source) sang một hoặc nhiều máy chủ cơ sở dữ liệu MySql khác (gọi là replicas). Đây là quá trình sao chép dữ liệu không đồng bộ, và replicas không cần phải giữ kết nối liên tục đến source. Chúng ta có thể sao chép tất cả cơ sở dữ liệu, một hoặc một số nhất định, thậm chí sao chép một số bảng cụ thể trong cơ sở dữ liệu.


Vì sao nên triển khai Replication?

  • Mở rộng quy mô: có thể phân tán traffic giữa các replicas để cải thiện hiệu suất đọc (Read). Do dữ liệu chỉ được ghi và cập nhật vào source, sau đó đồng bộ qua các replicas, cho nên nó cũng cải thiện hiệu suất ghi trên source. Mặt khác, tốc độ đọc cũng sẽ được tăng đáng kể tương ứng với số lượng replicas tăng.

  • An toàn dữ liệu: do cơ chế đồng bộ có thể tạm dừng nên quá trình backup dữ liệu có thể thực hiện trên replicas thay vì source nhằm đảm bảo không có sự cố gì xảy ra làm ảnh hưởng hay mất mát dữ liệu trên server chính (source).

  • Phân tích/Làm báo cáo: các quá trình phân tích dữ liệu cũng như xuất bản báo cáo luôn tiêu tốn rất nhiều tài nguyên hệ thống. Do đó, chúng ta có thể tiến hành trên các replicas thay vì chạy trực tiếp trên source nhằm tránh làm ảnh hưởng đến hiệu suất máy chủ.

  • Không bị giới hạn khoảng cách địa lý: các replicas không nhất thiết phải nằm trong cùng data center với source server. Replicas có thể ở bất kỳ đâu, miễn sao chúng ta có thể tạo được kênh kết nối đảm bảo an toàn đến source server.


Trong phạm vi bài viết này, chúng ta sẽ tiến hành thiết lập một replication đơn giản với 1 master và 1 slaver. Bắt đầu với Multipass thiết lập 2 VM với các thông số như sau:



Nếu server chưa cài đặt MySql, bạn thực hiện các bước sau

Cài đặt MySql

# mysql-server


ubuntu@mysql-master:~$ sudo apt update

ubuntu@mysql-master:~$ sudo apt install mysql-server mysql-client


#mysql-slaver


ubuntu@mysql-slaver:~$ sudo apt update

ubuntu@mysql-slaver:~$ sudo apt install mysql-server mysql-client


Thiết lập master

Mở file my.cnf trong folder /etc/mysql

Đầu tiên, thiết lập bind-address:

bind-address = 192.168.60.6


Chỉ định server-id cho master, ID này phải là duy nhất và không trùng với replica khác:

server-id = 1


Chỉ định file binary log:

log_bin = /var/log/mysql/mysql-bin.log


Chỉ định cơ sở dữ liệu cần sao chép:

binlog_do_db = replication_demo


Thiết lập tham số innodb-flush-log-at-trx-commit

innodb-flush-log-at-trx-commit = 1


Để có thể thiết lập giá trị phù hợp nhất, trước tiên chúng ta nên hiểu rõ nguyên lý hoạt động của InnoDB. Về cơ bản gói gọi lại như sau:


  • InnoDB xử lý hầu hết mọi hoạt động bằng memory - buffer pool.

  • Mọi thay đổi trong memory được ghi vào transaction log - Log file.

  • Cuối cùng dữ liệu sẽ được ghi vào disk và log sẽ được xóa.


Các giá trị có thể thiết lập như sau:


  • 0: log và data được cập nhập mỗi giây một lần. Trường hợp server xảy ra sự cố, khả năng bị mất 1 giây dữ liệu.

  • 1: default - log và data sẽ được cập nhật theo từng transaction. Khả năng bị mất dữ liệu thấp nhất, bù lại ảnh hưởng đến hiệu suất.

  • 2: log sẽ được cập nhật theo transaction, data ghi vào disk mỗi giây 1 lần. Nếu server xảy ra sự cố, vẫn có thể phục hồi lại được.


Kết quả cuối cùng tương tự như sau:

#

# The MySQL database server configuration file.

#

# You can copy this to one of:

# - "/etc/mysql/my.cnf" to set global options,

# - "~/.my.cnf" to set user-specific options.

#

# One can use all long options that the program supports.

# Run program with --help to get a list of available options and with

# --print-defaults to see which it would actually understand and use.

#

# For explanations see

# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

 

#

# * IMPORTANT: Additional settings that can override those from this file!

#   The files must end with '.cnf', otherwise they'll be ignored.

#

 

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

[mysqld]

bind-address = 192.168.60.6

server-id = 1

log_bin = /var/log/mysql/mysql-bin.log

binlog_do_db = replication_demo

innodb-flush-log-at-trx-commit = 1


Khởi động lại MySql

ubuntu@mysql-master:~$ sudo service mysql restart


Đảm bảo MySql restart thành công và đang trong trạng thái Active

ubuntu@mysql-master:/etc/mysql$ sudo service mysql status

● mysql.service - MySQL Community Server

     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)

     Active: active (running) since Fri 2020-11-06 11:27:48 +07; 17min ago

    Process: 4195 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)

   Main PID: 4214 (mysqld)

     Status: "Server is operational"

      Tasks: 38 (limit: 1060)

     Memory: 329.5M

     CGroup: /system.slice/mysql.service

             └─4214 /usr/sbin/mysqld

 

Nov 06 11:27:48 mysql-master systemd[1]: Starting MySQL Community Server...

Nov 06 11:27:48 mysql-master systemd[1]: Started MySQL Community Server.


Bước cuối cùng, mở MySql Shell trên master, và tạo một user dùng cho replication:

mysql> CREATE USER 'slave_user'@'%' IDENTIFIED BY mysql_native_password 'password';

Query OK, 0 rows affected (0.02 sec)

mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%';

Query OK, 0 rows affected (0.01 sec)

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.01 sec)


Chúng ta nên thay ‘slave_user’@’%’ bằng ‘slave_user’@’[Slave Ip Address]’ cho an toàn hơn.


Như vậy là chúng ta đã hoàn thành phần cài đặt cho Master.

Backup database

Khóa database replication_demo, nhằm đảm bảo không có dữ liệu mới phát sinh trong quá trình backup, bằng cách chạy dòng lệnh sau:


mysql> FLUSH TABLES WITH READ LOCK;


Kiểm tra trạng thái binary logs trên server Master:


mysql> SHOW MASTER STATUS;


Ghi lại thông tin sau:

  • File: mysql-bin.000001

  • Position: 1988

Mở terminal mới, chạy lệnh mysqldump như sau:


ubuntu@mysql-master:~$ mysqldump -uroot -p --opt replication_demo > /tmp/replication_demo.sql

Unlock database


mysql> UNLOCK TABLES;

mysql> QUIT;

Thiết lập replica

Mở MySql shell trên replica server, tạo database replication_demo:


mysql> CREATE DATABASE replication_demo;

Query OK, 1 row affected (0.02 sec)

mysql> QUIT;

Bye


Sửng dụng file replication_demo.sql đã có ở bước trước đó, import database vào replica server.


ubuntu@mysql-slaver:~$ mysql -uroot -p replication_demo < /path/to/replication__demo.sql


Mở file my.cnf trong folder /etc/mysql, dán vào nội dung tương tự bên dưới:


#

# The MySQL database server configuration file.

#

# You can copy this to one of:

# - "/etc/mysql/my.cnf" to set global options,

# - "~/.my.cnf" to set user-specific options.

#

# One can use all long options that the program supports.

# Run program with --help to get a list of available options and with

# --print-defaults to see which it would actually understand and use.

#

# For explanations see

# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

 

#

# * IMPORTANT: Additional settings that can override those from this file!

#   The files must end with '.cnf', otherwise they'll be ignored.

#

 

!includedir /etc/mysql/conf.d/

!includedir /etc/mysql/mysql.conf.d/

[mysqld]

server-id    = 2

relay-log    = /var/log/mysql/mysql-relay-bin.log

log-bin      = /var/log/mysql/mysql-bin.log

binlog_do_db = replication_demo


server-id: không được trùng với Id của master


Restart Mysql


ubuntu@mysql-slaver:~$ sudo service mysql restart


Mở MySql shell, và chạy dòng lệnh sau:


mysql> CHANGE MASTER TO MASTER_HOST='192.168.60.6',MASTER_USER='slave_user', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1988;


  • MASTER_HOST='192.168.60.6': chỉ định source server là 192.168.60.6

  • MASTER_USER='slave_user', MASTER_PASSWORD='password': replica sẽ sử dụng thông tin user này để kết nối đến source server.

  • MASTER_LOG_FILE='mysql-bin.000001': thông tin có được trong quá trình backup database

  • MASTER_LOG_POS=1988: thông tin có được trong quá trình backup database


Cuối cùng, chạy lệnh sau để hoàn tất thiết lập replica:


mysql> START SLAVE; 


Kiểm tra

Mở MySql Shell trên Master 192.168.60.9, insert một số record vào database replication_demo, sau đó kiểm tra lại trên Replica xem dữ liệu đồng bộ thành công hay không nhé!


CHÚC CÁC BẠN THÀNH CÔNG!


Xem tiếp phần 2 tại đây

Thứ Tư, 4 tháng 11, 2020

Galera Cluster với MySql và Ubuntu Server

Galera Cluster là gì?

Galera cluster là giải pháp phân cụm máy chủ cơ sở dữ liệu có các tính năng sau theo như quảng cáo:

  • Multi-master: có thể đọc và ghi cùng lúc trên bất kỳ node nào tại bất kỳ thời điểm nào.

  • Sao chép đồng bộ tự động: không có độ trễ, không bị mất dữ liệu khi 1 node gặp sự cố.

  • Liên kết chặt chẽ: tất cả các node trong cụm là giống nhau về mặt dữ liệu, trạng thái. Không có sự phân kỳ giữa các node.

  • Multi-threads: tối ưu hiệu suất tốt hơn.

  • Do không áp dụng cơ chế master-slave nên không cần phải chuyển đổi khi master node gặp sự cố.

  • Không có thời gian chờ khi master node chết...vì node nào cũng là master

  • Tự động hóa quá trình cấp phép cho node mới.

  • Không cần chỉnh sửa source code khi chuyển đổi từ mô hình máy chủ co sở dữ liệu đơn sang mô hình cụm (cluster).

  • Không cần phân luồng đọc/ghi kiểu như mô hình Replication.

  • Dễ sử dụng và triển khai.

  • Hỗ trợ triển khai trên Cloud.

Hướng dẫn thực hành cài đặt Galera Cluster

Đầu tiên là chúng ta cần có ít nhất 3 linux server để tạo thành 1 cụm cluster. 

  • Trong phạm vi bài viết này, mình sẽ sử dụng phần mềm ảo hóa có tên Multipass để làm môi trường thực hành.

  • Hệ điều hành chạy linux Ubuntu 20.04 LTS

  • MySql phiên bản 5.7

1. Chuẩn bị môi trường máy chủ

Giả sử chúng ta có 3 máy chủ linux chạy chung 1 network với các thông số sau đây:


2. Thêm Mysql repo vào tất cả máy chủ

Chạy các lệnh theo thứ tự sau trên toàn bộ các máy chủ.

Đầu tiên thêm khóa repo của Galera vào kho APT

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv BC19DDBA

Sau đó thêm Galera repo vào kho APT bằng cách tạo file gelera.list trong folder /etc/apt/sources.list.d/

sudo nano /etc/apt/sources.list.d/galera.list

Thêm 2 dòng bên dưới rồi lưu lại và thoát khỏi Editor

deb http://releases.galeracluster.com/mysql-wsrep-5.7/ubuntu bionic main

deb http://releases.galeracluster.com/galera-3/ubuntu bionic main

Trường hợp sử dụng nano như trong ví dụ, bạn sử dụng tổ hợp phím Ctrl+X, Y, sau đó bấm ENTER

Tiếp theo, gán thứ tự ưu tiên cho Galera repo để đảm bảo APT lấy các cập nhật từ Galera. Tạo file galera.pref trong folder /etc/apt/preferences.d/

sudo nano /etc/apt/preferences.d/galera.pref

Thêm nội dung bên dưới vào file vừa tạo rồi lưu lại và thoát khỏi Editor

# Prefer Codership repository

Package: *

Pin: origin releases.galeracluster.com

Pin-Priority: 1001

Cuối cùng chạy lệnh cập nhật manifest

sudo apt update

3. Cài đặt MySql trên toàn bộ máy chủ

Chạy lệnh sau để download và cài đặt MySql (phiên bản đã chỉnh sửa từ Galera)

sudo apt install galera-3 mysql-wsrep-5.7

Trong quá trình cài đặt, chúng ta sẽ tạo mật khẩu root cho MySql.

Tắt cấu hình mặc định MySql trong AppArmor

sudo ln -s /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.mysqld

Sau khi cài đặt hoàn tất MySql trên toàn bộ server, chúng ta qua bước quan trọng kế tiếp

4. Thiết lập cấu hình cho Galera Cluster

Tạo file galera.cnf trong folder /etc/mysql/conf.d/ trên server db-1

sudo nano /etc/mysql/conf.d/galera.cnf

Thêm nội dung sau và lưu lại

[mysqld]

binlog_format=ROW

default-storage-engine=innodb

innodb_autoinc_lock_mode=2

bind-address=0.0.0.0

 

# Galera Provider Configuration

wsrep_on=ON

wsrep_provider=/usr/lib/galera/libgalera_smm.so

 

# Galera Cluster Configuration

wsrep_cluster_name="mysql_cluster_local"

wsrep_cluster_address="gcomm://192.168.206.230,192.168.206.232,192.168.206.235"

 

# Galera Synchronization Configuration

wsrep_sst_method=rsync

 

# Galera Node Configuration

wsrep_node_address="192.168.206.230"

wsrep_node_name="db-1"


binlog_format=ROW Galera chỉ chạy ổn định với binlog theo hàng.

default-storage-engine mặc định là innodb, Galera không hỗ trợ MyISAM

bind-address không bind được local ip 127.0.0.1

wsrep_cluster_name tên cluster

wsrep_cluster_address theo format "gcomm://IP.node1,IP.node2,IP.node3"

wsrep_node_address địa chỉ IP của server

wsrep_node_name Đặt tên tùy chọn, giúp chúng ta xác định và tham chiếu trong một số trường hợp, như là xác định máy chủ đang xảy ra sự cố trong logs.


Thực hiện lại các bước cho server db-2 và db-3, trong đó cần thay đổi 2 nội dung sau


# db-2

# Galera Node Configuration

wsrep_node_address="192.168.206.232"

wsrep_node_name="db-2"


# db-3

# Galera Node Configuration

wsrep_node_address="192.168.206.235"

wsrep_node_name="db-3"


Nếu server có firewall thì chuyển qua bước 5, không thì bỏ qua bước 5, đi đến bước 6

5. Cấu hình firewall

Galera cần 4 ports sau

3306: mysql client, mysqldump

4567: Galera cluster replication, sử dụng TCP và UDP

4568: Incremetal state transfer

4444: Snapshot state transfer

sudo ufw allow 3306,4567,4568,4444/tcp

sudo ufw allow 4567/udp

6. Khởi động node "số 1"

Bật chế độ chạy mysqld lúc server khởi động

sudo systemctl enable mysql


Tiếp theo chay bootstrap để tạo cluster mới


sudo mysqld_bootstrap

7. Khởi động các node còn lại

sudo systemctl start mysql


Đến đây, chúng ta đã thiết lập thành công một database cluster với 3 node sử dụng Galera cluster.

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

Bài đăng phổ biến