Replicate AWS MySQL Aurora to External Replica

Posted by MinhHungTrinh on 2021-01-17
Estimated Reading Time 6 Minutes
Words 1.1k In Total
Viewed Times

Đây là bài mình viết cũng đã trình bày trên blog kaopiz.kipalog của công ty.
Trong bài viết này mình sẽ giải thích về cách replicate data từ 1 cụm cluster AWS MySQL Aurora tới 1 external database. Ở đây External database này có thể là 1 EC2, 1 Onpremise. Thực chất đây là việc thiết lập replica, kể cả không phải từ Aurora, bạn có thể áp dụng với chính MySQL Database của bạn khi cần tạo Replica thủ công. Còn mình, Aurora đã có thiết lập đầy đủ về primary và replica rồi. Mình thực hiện Replicate data ra 1 external Database với mục đích đặc biệt của dự án là backup, để lấy license.

main

Điều kiện tiên quyết:

  • Ở case này mình lựa chọn MySQL 5.7 (hình như chỉ hỗ trợ từ 5.6 nên mọi người lưu ý nhé)
  • Slave Database - ở đây có thể là External EC2 hoặc OnPremise Server (cùng mysql version nhé)
  • MySQL port được mở ở cả bên Aurora và Slave, allow NACL, Security Group.
  • Nếu Slave là External Server ở bên ngoài AWS, bạn cần phải public Aurora để có thể connect với External Server qua Internet. Tất nhiên việc làm này có vẻ là sẽ không đảm bảo security. Vì vậy với hệ thống mình đang làm thì connect giữa AWS Aurora và Slave (Onpremise Server) qua VPN Site-to-Site để đảm bảo security. Vậy nên cũng chú ý là allow đầy đủ Access Control Filter.
  • Tạo 1 User trên Aurora phục vụ chỉ cho việc replication thôi nhé
  • Cần custom DB Cluster parameter group (cái này là thay đổi binlog_format thành Mixed)
  • Automated Backup phải được Enabled

Các steps nếu cảm thấy thiếu thốn hoặc không hiểu ae có thể đọc thêm ở https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.html?fbclid=IwAR1jqTbUiKT01LmyfSyYpHa_7drCNBAX0wTgVlXrZuA9Ys2U5RC7BxQBNaA

1. Tạo Replica User

Access tới MySQL Aurora và thực hiện tạo Replica user

1
2
CREATE USER 'replica'@'%' IDENTIFIED BY 'slavepass'; 
GRANT REPLICATION SLAVE ON *.* TO 'replica'@'%';

2. Enable binary logs trong paramater group (Binlog format = mixed)

Với AWS Aurora bạn có thể tham khảo https://aws.amazon.com/premiumsupport/knowledge-center/enable-binary-logging-aurora/ . Nhớ là sau khi thực hiện xem việc này hãy reboot các con Writer của cluster nhé.

Sau khi thực hiện reboot. Hãy access mysql vào con Writer và thực hiện show master status để kiểm tra đã enable binary log chưa nhé :

main

Đại khái sẽ hiện như trên, thông số File, position sẽ có thể khác nhau.

3. Dump database master

Tiện thể đang access con master thì dump luôn database. Nếu sợ ảnh hưởng master thì chuyển sang con replica của aurora mà dump nhé.

1
mysqldump --single-transaction --routines --triggers --events -h XXX.azhxxxxxx2zkqxh3j.us-east-1.rds.amazonaws.com -u bhuvi –pxxxxx puc_aurora > /mnt/d/puc_aurora.sql

4. Cài đặt Replica Server

Access vào Onpremise Server, Ở đây mình dung Ubuntu cho server này. Install Mysql 5.7 như hướng dẫn https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-18-04 . Nhớ set security với password cho account luôn nhé.

Truy cập file /etc/mysql/my.cnf và thêm nội dung:

1
2
[mysqld]
server-id=2

Sau đó restart `sudo service mysql restart

Restore dump của database master lên Replica server.
Tạo sẵn database puc_aurora và import data.

1
mysql -u rootpxxx puc_aurora < puc_aurora.sql

Cuối cùng thì thực hiện tạo connect từ replica tới con master. Access lại vào mysql của replica server. Thực hiện command dưới với các thông số về endpoint, user và binlog đã được tạo ở các step trước.

1
2
3
4
5
6
7
CHANGE MASTER TO  
master_host = 'RDS END Point name', #Cái này là endpoint của con master (Writer)
master_port = 3306,
master_user = '<Replication user>',
master_passwowrd = '<Replication users pasword>',
master_log_file='<bin log file name-noted from Master>',
master_log_pos=<Log position-noted from master>;

Cuối cùng là Start Slave và kiểm tra xem cấu hình:

1
2
start slave;
show slave status\G;

Hình ảnh hiển thị như dưới đây là OK. Lưu ý kiểm tra các thông số giống như cấu hình (endpoint, binlog, port…). Slave_IO_Running và Slave_SQL_Running ở trạng thái Yes là OK nhé.

main

Có 1 trường hợp là có thể RDS endpoint của bạn quá dài (quá 60 ký tự) thì khi thực hiện cấu hình nó sẽ không update đầy đủ full endpoint (endpoint thành ra bị sai). Dẫn đến việc cấu hình k connect được. Mình chưa tìm thấy giải pháp nào tốt ngoài trừ tạo private dns cho endpoint đó để rút ngắn lại.

Tổng kết

Tư tưởng bài viết này cũng gần giống việc replicate RDS tới External server, hoặc bạn tự cấu hình Mysql database và tự thực hiện replicate. Bài viết còn sơ sài rất mong mọi người góp ý. :D
Bài viết có tham khảo từ vài tài liệu

https://aws.amazon.com/premiumsupport/knowledge-center/enable-binary-logging-aurora/
https://www.percona.com/blog/2018/07/04/how-to-setup-replication-between-aws-aurora-external-mysql-instance/
https://www.powerupcloud.com/how-to-configure-replication-from-aws-mysql-aurora-to-external-replica/
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Replication.MySQL.html?fbclid=IwAR1jqTbUiKT01LmyfSyYpHa_7drCNBAX0wTgVlXrZuA9Ys2U5RC7BxQBNaA


Đây là Blog cá nhân của MinhHungTrinh, nơi mình chia sẻ, lưu giữ kiến thức. Nếu các bạn có góp ý, thắc mắc thì vui lòng comment bên dưới cho mình biết nhé. Mình luôn là người lắng nghe và ham học hỏi. Các vấn đề đặc biệt hoặc tế nhị mọi người có thể gửi email tới minhhungtrinhvn@gmail.com. Cảm ơn Mọi Người đã đọc Blog của mình. Yolo!