Sao chép cơ sở dữ liệu chính bằng MariaDB 10 trên Debian 8

theanh

Administrator
Nhân viên
Sao chép cơ sở dữ liệu tạo ra sự dự phòng có thể bảo vệ chống lại mất dữ liệu và cho phép tối ưu hóa hiệu suất cho các ứng dụng. Hướng dẫn này sẽ trình bày những điều cơ bản về sao chép cơ sở dữ liệu chính MariaDB 10.0 hiện có sang một hoặc nhiều máy phụ. Trong các ví dụ sau, hệ điều hành máy chủ là Debian 8.

Những hướng dẫn này có thể được áp dụng cho các hệ điều hành khác, nhưng hãy lưu ý rằng một số lệnh và vị trí tệp mặc định sẽ khác nhau. Cụ thể, bạn nên thay thế tên đường dẫn của /etc/mysql/my.cnf, /var/lib/mysql, tên và đường dẫn mặc định của tệp nhật ký nhị phân của bạn và các lệnh để khởi động, dừng và khởi động lại mysqld theo thông số kỹ thuật của hệ thống bạn.


1. Xác minh kết nối​

Trước khi tiến hành, hãy đảm bảo máy chủ chính và máy phụ có thể kết nối với nhau trên mạng và mỗi máy chủ đều có mục nhập cho máy chủ kia trong các tệp /etc/hosts tương ứng của chúng. Mỗi máy chủ phải có thể ping máy chủ kia và bạn phải có thể ssh từ máy chủ này đến máy chủ kia như một người dùng bình thường.


2. Bật nhật ký nhị phân mysqld trên máy chủ chính​

Trên máy chủ chính, hãy kiểm tra xem nhật ký nhị phân đã được bật chưa. Gọi mysqld bằng các công tắc --verbose --help sẽ hiển thị các giá trị hoạt động cho daemon MariaDB. Với tư cách là root:
Mã:
mysqld --verbose --help | grep log-bin
Mã:
...
log-bin (Không có giá trị mặc định)
...
Giá trị của mục log-bin định nghĩa quy ước đặt tên của các tệp nhật ký nhị phân. Trên Debian, các tệp này nằm trong /var/lib. Nếu giá trị của log-bin(Không có giá trị mặc định), bạn sẽ cần bật ghi nhật ký bằng cách sửa đổi tệp cấu hình my.cnf. Trên Debian, my.cnf nằm trong thư mục /etc/mysql.

Mở /etc/mysql/my.cnf trong trình soạn thảo văn bản và định vị nhóm [mysqld]. Nếu không tồn tại, hãy tạo nó và nhập một dòng chỉ đọc là log-bin.
Mã:
[mysqld]
log-bin
Bao gồm mục nhập này sẽ kích hoạt ghi nhật ký nhị phân khi mysqld được khởi động lại.

Bạn có thể chọn đặt giá trị cho log-bin, ví dụ: log-bin=filename, để xác định tên tùy chỉnh cho tệp nhật ký nhị phân. Trong hướng dẫn này, chúng tôi sẽ không đặt giá trị và tên tệp nhật ký mặc định sẽ được sử dụng.

Khởi động lại mysqld:
Mã:
service mysql restart
Xác minh rằng thay đổi đã có hiệu lực:
Mã:
mysqld --verbose --help | grep log-bin
Mã:
...
log-bin mysqld-bin
...
Như được hiển thị ở đây, tên tệp nhật ký nhị phân mặc định trên Debian bắt đầu bằng mysqld-bin, ví dụ: mysqld-bin.nnnnnn.


3. Cấp quyền cho người dùng sao chép​

Thực hành tốt nhất là để tất cả các tác vụ sao chép được thực hiện bởi một người dùng sao chép chuyên dụng. Trong các ví dụ này, chúng tôi sẽ đặt tên cho người dùng là repluser và đặt mật khẩu của người dùng này thành chuỗi replpass.

Cấp cho người dùng này các quyền toàn cục SUPER, RELOADREPLICATION SLAVE. Những lệnh này sẽ cho phép người dùng sao chép thực thi các lệnh siêu người dùng, xóa bộ đệm cơ sở dữ liệu và tải các bản cập nhật từ máy chủ chính.

Nhập máy khách MariaDB làm gốc cơ sở dữ liệu:
Mã:
mysql -u root -p
Tại dấu nhắc MariaDB, nhập lệnh:
Mã:
GRANT SUPER, RELOAD, REPLICATION SLAVE ON *.* TO 'repluser'@'%' IDENTIFIED BY 'replpass';
Tại đây, ký tự đại diện tên máy chủ '%' cho phép người dùng sao chép kết nối từ bất kỳ máy chủ nào.

Xác minh rằng các quyền đã được cấp:
Mã:
SHOW GRANTS FOR 'repluser'\G;

4. Xả bộ nhớ đệm cơ sở dữ liệu và đặt bảng ở chế độ chỉ đọc​

Để chuẩn bị tạo ảnh chụp nhanh cơ sở dữ liệu, hãy xả tất cả các bảng và đặt chúng thành READ LOCK. Việc này cần được thực hiện nhanh chóng, trong giờ thấp điểm hoặc thời gian bảo trì hệ thống.

Trên máy chủ chính:
Mã:
XẢ BẢNG CÓ READ LOCK;
Bây giờ các bảng đã bị khóa, hãy kiểm tra trạng thái máy chủ chính:

HIỂN THỊ TRẠNG THÁI MÁY CHỦ;
Mã:
+-------------------+----------+--------------+-----------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+-----------------+
| mysqld-bin.000005 | 995 | |
+-------------------+----------+------------------+------------------+
Thông tin của bạn sẽ khác, nhưng hãy ghi lại các giá trị của FilePosition. Bạn sẽ sử dụng thông tin này ở bước 7.

Thoát khỏi máy khách MariaDB:
Mã:
\q

5. Cơ sở dữ liệu ảnh chụp nhanh cho máy chủ phụ​

Tạo kho lưu trữ cơ sở dữ liệu hoặc các cơ sở dữ liệu hiện có trên máy chủ chính mà bạn muốn sao chép. Mỗi cơ sở dữ liệu này có thư mục riêng trong /var/lib/mysql. Trong ví dụ này, chúng ta sẽ tar một cơ sở dữ liệu duy nhất, nằm tại đường dẫn /var/lib/mysql/dbname.

Lệnh này lưu trữ một cơ sở dữ liệu duy nhất. Nếu bạn đang lưu trữ các cơ sở dữ liệu bổ sung, hãy thêm tên đường dẫn đầy đủ của chúng vào lệnh, ví dụ: /var/lib/mysql/dbname1 /var/lib/mysql/dbname2 ...
Mã:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
Bây giờ, với tư cách là username người dùng bình thường, hãy chuyển tệp này đến một tài khoản người dùng bình thường trên máy chủ phụ:
Mã:
rsync -avP mysql-master.tar.bz2 [username]@slavehost:~/.
hoặc sử dụng scp:
Mã:
scp mysql-master.tar.bz2 [username]@slavehost:~/.
Sau đó, SSH đến máy chủ phụ:
Mã:
ssh [username]@slavehost
Với tư cách là root, hãy dừng mysqld trên máy chủ phụ:
Mã:
service mysql stop
...và giải nén tệp lưu trữ:
Mã:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.

6. Cấu hình ID máy chủ cho máy chủ chính và máy chủ phụ​

Sửa đổi /etc/mysql/my.cnf trên máy chủ chính, thêm mục server-id=n trong nhóm [mysqld], trong đó n là số nguyên duy nhất xác định máy chủ. Thông thường, n=1 đối với máy chủ chính, nhưng n có thể là bất kỳ số nguyên duy nhất nào trong phạm vi [1, 2^32-1]. Chúng ta sẽ đặt máy chủ chính của mình thành server-id=1 và máy chủ phụ của mình thành server-id=100.

(Nếu my.cnf không tồn tại trên máy chủ phụ, hãy tạo nó. Nếu nó tồn tại, hãy tìm kiếm mục server-id hiện có và bỏ chú thích/sửa dòng đó).

Trong /etc/mysql/my.cnf trên máy chủ chính:
Mã:
[mysqld]
server-id=1
Trong /etc/mysql/my.cnf trên máy chủ phụ:
Mã:
[mysqld]
server-id=100

7. Mở khóa bảng và bắt đầu/khởi động lại mysqld trên máy chủ chính và máy chủ phụ

Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, hãy mở khóa bảng:
Mã:
mysql -u root -p
Mã:
UNLOCK TABLES;
Mã:
\q
Khởi động lại mysqld trên máy chủ chính:
Mã:
service mysql restart
Và khởi động nó trên máy chủ phụ:
Mã:
service mysql start
Bạn có thể xác minh rằng giá trị server-id mới đã có hiệu lực trên mỗi máy chủ. Với tư cách là root:
Mã:
mysqld --verbose --help | grep server-id

8. Cấu hình danh tính của máy chủ chính trên máy chủ phụ​

Trên máy chủ phụ, cấu hình danh tính của máy chủ chính. Nhập máy khách MariaDB:
Mã:
mysql -u root -p
Thực hiện lệnh sau, thay thế các giá trị của MASTER_LOG_FILEMASTER_LOG_POS bằng tệp nhật ký nhị phân FilePosition mà bạn đã ghi lại ở bước 4, và các giá trị của MASTER_HOST, MASTER_USERMASTER_PASSWORD bằng các giá trị của riêng bạn.
Mã:
ĐỔI MASTER THÀNH MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.000005', MASTER_LOG_POS=995;

9. Kích hoạt slave​

Trên slave, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu:
Mã:
START SLAVE;
Bây giờ bạn có thể kiểm tra trạng thái của slave:
Mã:
SHOW SLAVE STATUS \G;
Mã:
****************************** 1. hàng ***************************
 Slave_IO_State: Đang chờ master gửi sự kiện
 Master_Host: masterhost
 Master_User: repluser
 Master_Port: 3306
 Connect_Retry: 60
 Master_Log_File: mysqld-bin.000009
 Read_Master_Log_Pos: 1330
 Relay_Log_File: mysqld-relay-bin.000008
 Relay_Log_Pos: 1618
 Relay_Master_Log_File: mysqld-bin.000009
 Slave_IO_Running: Có
 Slave_SQL_Running: Có
 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: 1330
 Relay_Log_Space: 2204
 Until_Condition: Không có
 Until_Log_File: 
 Until_Log_Pos: 0
 Master_SSL_Allowed: Không
 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: Không
 Last_IO_Errno: 0
 Last_IO_Error: 
 Last_SQL_Errno: 0
 Last_SQL_Error: 
 Replicate_Ignore_Server_Ids: 
 Master_Server_Id: 1
 Master_SSL_Crl: 
 Master_SSL_Crlpath: 
 Using_Gtid: No
 Gtid_IO_Pos:
Nếu có bất kỳ lỗi nào trong quá trình sao chép, bạn sẽ thấy chúng được liệt kê ở đây.


10. Thực hiện thay đổi trên máy chủ chính và xác minh bản sao trên máy phụ​

Bạn có thể xác minh rằng bản sao đang diễn ra bằng cách tạo cơ sở dữ liệu mới trên máy chủ chính và xem các thay đổi trên máy phụ.
Mã:
mysql -u root -p
Tạo cơ sở dữ liệu mới:
Mã:
CREATE DATABASE repltest;
Mã:
USE repltest
Tạo bảng và chèn giá trị:
Mã:
CREATE TABLE test (hello VARCHAR(10));
Mã:
INSERT INTO test VALUES ('world');
Mã:
\q
Bây giờ hãy nhập máy khách MariaDB trên máy phụ:
Mã:
mysql -u root -p
Mã:
USE repltest
Mã:
SELECT * FROM test;
Mã:
+-------+
| hello |
+-------+
| world |
+-------+
1 hàng trong tập hợp (0,00 giây)

11. Lặp lại quy trình cho các nô lệ bổ sung​

Bạn có thể lặp lại quy trình này cho mỗi nô lệ bổ sung. Cụ thể, hãy thực hiện các bước sau:

11(a). Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, hãy xóa và khóa các bảng:
Mã:
FLUSH TABLES WITH READ LOCK;
Sau khi khóa, hãy hiển thị trạng thái của máy chủ chính:
Mã:
[B][/b]SHOW MASTER STATUS;
Ghi lại các giá trị FilePosition.



11(b). Trên máy chủ chính, với tư cách là root:
Mã:
tar cjvf /home/[username]/mysql-master.tar.bz2 /var/lib/mysql/dbname
11(c). Trên máy chủ chính, với tư cách là người dùng bình thường:
Mã:
rsync -avP mysql-master.tar.bz2 [username]@slavehost2:~/.
11(d). Trên máy chủ phụ, với tư cách là root:
Mã:
service mysql stop
Mã:
tar xjvf /home/[username]/mysql-master.tar.bz2 -C /.
11(e). Trong /etc/mysql/my.cnf trên máy chủ phụ, thêm hoặc chỉnh sửa dòng server-id= trong [mysqld] nhóm, trong đó giá trị của server-id là mới và duy nhất:
Mã:
[mysqld]
server-id=200
11(f). Trên máy chủ chính, trong máy khách MariaDB với tư cách là root cơ sở dữ liệu, mở khóa các bảng:
Mã:
UNLOCK TABLES;
11(g). Trên máy chủ chính, với tư cách là root, khởi động lại mysqld:
Mã:
service mysql restart
11(h). Trên máy phụ, với tư cách là root, khởi động mysqld:
Mã:
[B][/b]service mysql start
11(i). Trên máy phụ, trong máy khách MariaDB với tư cách là gốc cơ sở dữ liệu, cấu hình danh tính chính, tên tệp nhật ký nhị phân và vị trí từ bước 10(a):
Mã:
THAY ĐỔI MASTER THÀNH MASTER_HOST='masterhost', MASTER_USER='repluser', MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysqld-bin.nnnnnn’, MASTER_LOG_POS=n;
11(j). Trên slave, trong máy khách MariaDB với tư cách là gốc cơ sở dữ liệu, kích hoạt sao chép:
Mã:
KHỞI ĐỘNG SLAVE;

12. Xử lý sự cố: Slave không thể kết nối với master​

Kiểm tra /var/mysql/my.cnf trên máy chủ chính để tìm mục bind-address. Nếu bind-address được đặt thành 127.0.0.1, máy chủ sẽ chỉ chấp nhận kết nối từ máy chủ cục bộ. Bình luận dòng này hoặc đặt giá trị thành * để cho phép kết nối từ tất cả các địa chỉ IPv4 và IPv6. Nếu bạn sửa đổi my.cnf, đừng quên khởi động lại mysqld.

Nếu kết nối vẫn không hoạt động, hãy đảm bảo rằng máy chủ của bạn đang cho phép kết nối trên cổng 3306. Trên máy chủ chính, hãy liệt kê các bảng tường lửa của hạt nhân:
Mã:
iptables -L
Bạn có thể tạo một khoản trợ cấp cho các kết nối trên cổng 3306 bằng lệnh sau, thay thế tên thiết bị giao diện mạng của bạn cho eth0 nếu cần:
Mã:
iptables -A INPUT -i eth0 -p tcp --destination-port 3306 -j ACCEPT
 
Back
Bên trên