Hướng dẫn cài đặt và cấu hình cơ bản Mysql Replication

Giới thiệu Mysql Replication

Để mở rộng một hệ thống cũng như để đảm bảo một cơ sở dữ liệu toàn vẹn, không bị mất mát trước những sự cố ta có hai phương pháp là Scale up và Scale out, trong đó:

Scale up là với một máy chủ ta tìm cách để nó có thể đáp ứng nhiều hơn số lượng kết nối, truy vấn. Ví dụ:

  • Tăng phần cứng lên cho máy chủ
  • Optimize các phần mềm, ứng dụng giúp tăng tốc độ truy vấn lấy, nhập dữ liệu.

Scale out là giải pháp tăng số lượng server hoặc dùng các giải pháp load-balancer để phân phối các kết nối, truy vấn ra nhiều server.

Mysql Replication là một giải pháp scale out, có thể dùng trong các trường hợp sau:

  • Trường hợp các ứng dụng mà có số truy vấn đọc dữ liệu nhiều hơn ghi ( ví dụ như các trang báo, trang tin tức ).
  • Trường hợp cần backup real-time.

Hoạt động của Mysql replication

Có 2 giải pháp cho việc replication:

  • Master - Slave: Là dạng replication trong đó data được ghi trên Master server và đồng bộ sang Slave server
  • Master - Master: Là dạng replication trong đó dữ liệu có thể ghi trên cả các Mysql server chạy replication.

1. Master - Slave:

replication.png

Ở mô hình trên ta thấy có 1 Master database phục vụ cho việc ghi dữ liệu, còn có thể có một hoặc nhiều Slave database. Các ứng dụng sẽ được kết nối cả vào Master lẫn Slave, tuy nhiên với các tác vụ ghi dữ liệu thì sẽ được trỏ đến Master còn với tác vụ đọc dữ liệu thì trỏ đến Slave. Khi có một thay đổi trên Master server, thay đổi đó sẽ được ghi lại vào binlog và Slave server sẽ đọc binlog và ghi lại các thông tin thay đổi vào relay log, sau đó sẽ dựa vào relay log để cập nhật dữ liệu.

2. Master - Master:

master master.png

Ở mô hình trên, toàn bộ dữ liệu được lưu trên 1 nhóm server và được cập nhật bởi bất kỳ server Master nào của nhóm. Tất cả Master server có nhiệm vụ phản hồi lại các truy vấn dữ liệu của người dùng và đồng bộ, cập nhật những thay đổi về dữ liệu từ các Master server khác trong nhóm.

Hướng dẫn cài đặt cơ bản Mysql replication

Ở đây mình sẽ cài đặt trên hệ điều hành centos 6.5, sử dụng 2 server với ip: Master server: 192.168.2.159 Slave server: 192.168.2.231

1. Mysql replication Master - Slave:

step 1: Cài đặt mysql server

Trên server Master chạy các câu lệnh sau: [[email protected] ~]# yum install -y mysql-server

Để chạy Mysql server [[email protected] ~]# service mysql start

Cài đặt các thông số ban đầu cho Mysql [[email protected] ~]# mysql_secure_installation

Thực hiện tương tự các bước trên đối với Mysql slave

step 2: Cấu hình Master-Slave Ở đây mình chỉ hướng dẫn cách cấu hình cơ bản nhất, chưa tối ưu cấu hình cho Mysql.

Trên Master server:

Cấu hình file my.cnf: [[email protected] ~]# vim /etc/my.cnf

Các bạn thêm các dòng dưới vào bên dưới phần [mysqld]:

server-id=1 log_bin=/var/log/mysql/mysql-bin.log binlog_do_db=replication_database`

Trong đó:

  • server-id để xác định các mysql server, nếu không khai báo thông số này mysql server sẽ mặc định server-id là 0 hay nếu đặt server-id trên các mysql server giống nhau thì sẽ không nhận các kết nối từ các server mysql khác.
  • log_bin để khai báo file log ghi lại các thay đổi dữ liệu
  • binlog_do_db để xác định database sẽ được replication

Khởi động lại mysql để nhận cấu hình [[email protected] ~]# service mysqld restart

Giờ ta cần tạo user replication [[email protected] ~]# mysql -uroot -ppassword

mysql> grant replication slave on *.* to [email protected]'%' identified by 'mysql';

mysql> flush privileges;

Bước tiếp ta phải đồng bộ database giữa Master và Slave [[email protected] ~]# mysqldump -u root -p replication_database > replication_database.sql

Copy database sang server Slave [[email protected] ~]# scp replication_database.sql 192.168.2.231:/opt

Lấy giá trị Position - giá trị này sẽ được Slave sử dụng để xác định thời điểm đồng bộ dữ liệu với Master. mysql> show master status;

Trên Slave server:

Cấu hình file my.cnf: [[email protected] ~]# vim /etc/my.cnf

Các bạn thêm các dòng dưới vào bên dưới phần [mysqld]

server-id=2 relay-log=/var/log/mysql/mysql-relay-bin.log binlog_do_db=replication_database

Trong đó:

  • relay-log là nơi ghi lại thông tin dữ liệu bị thay đổi được lấy từ Master server.

Khởi động lại mysql để nhận cấu hình [[email protected] ~]# service mysqld restart

Tạo database và đồng bộ dữ liệu với database của Master server

mysql> CREATE DATABASE replication_database;

mysql -u root -p replication_database < /opt/replication_database.sql

cấu hình replication trên slave bằng câu lệnh trong mysql như sau:

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.159',MASTER_USER='mysql', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 106;

Start server Slave:

mysql> start slave;

step 3: Kiểm tra hoạt động Replication

Để kiểm tra, ta thử thay đổi dữ liệu trên Master bằng cách tạo 1 table mới

mysql> use replication_database;

mysql> create table test(job varchar(20), salary int(10));

mysql> show tables;

Trên Slave server ta chạy lệnh:

mysql> use replication_database;

mysql> show tables;

Ta thấy database trên Slave đã được cập nhật table "test", như vậy là Replication đã hoạt động tốt.

2. Mysql replication Master - Master:

step 1: Cài đặt mysql server Các bước cài đặt tương tự như step 1 của phần Master-Slave

step 2: Cấu hình Master - Master Trên Master server: Cấu hình file my.cnf: [[email protected] ~]# vim /etc/my.cnf

Các bạn thêm các dòng dưới vào bên dưới phần [mysqld]

server-id=1 log_bin=/var/log/mysql/mysql-bin.log relay-log=/var/log/mysql/mysql-relay-bin.log binlog_do_db=replication_database

Khởi động lại mysql để nhận cấu hình [[email protected] ~]# service mysqld restart

Giờ ta cần tạo user replication [[email protected] ~]# mysql -uroot -ppassword

mysql> grant replication slave on *.* to [email protected]'%' identified by 'mysql';

mysql> flush privileges;

Bước tiếp ta phải đồng bộ database giữa Master và Slave [[email protected] ~]# mysqldump -u root -p replication_database > replication_database.sql

Copy database sang server Slave [[email protected] ~]# scp replication_database.sql 192.168.2.231:/opt

Lấy giá trị Position - giá trị này sẽ được Slave sử dụng để xác định thời điểm đồng bộ dữ liệu với Master. mysql> show master status;

Trên Slave server: Cấu hình file my.cnf: [[email protected] ~]# vim /etc/my.cnf

Các bạn thêm các dòng dưới vào bên dưới phần [mysqld]

server-id=2 log_bin=/var/log/mysql/mysql-bin.log relay-log=/var/log/mysql/mysql-relay-bin.log binlog_do_db=replication_database

Khởi động lại mysql để nhận cấu hình [[email protected] ~]# service mysqld restart

Giờ ta cần tạo user replication [[email protected] ~]# mysql -uroot -ppassword

mysql> grant replication slave on *.* to [email protected]'%' identified by 'mysql';

mysql> flush privileges;

Lấy giá trị Position - giá trị này sẽ được Slave sử dụng để xác định thời điểm đồng bộ dữ liệu với Master. mysql> show master status;

Tạo database và đồng bộ dữ liệu với database của Master server

mysql> CREATE DATABASE replication_database;

mysql -u root -p replication_database < /opt/replication_database.sql

Cấu hình Replication trên 2 server Trên Master: Chạy lệnh sau trong mysql terminal: mysql> stop slave;

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.231',MASTER_USER='mysql', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;

mysql> start slave;

Trên Slave: Chạy lệnh sau trong mysql terminal: mysql> stop slave;

mysql> CHANGE MASTER TO MASTER_HOST='192.168.2.159',MASTER_USER='mysql', MASTER_PASSWORD='mysql', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS= 107;

mysql> start slave;