Trong blog trước của chúng tôi, chúng tôi đã thấy việc bắt đầu với RDS cho MySQL dễ dàng như thế nào. Đây là một cách thuận tiện để triển khai và sử dụng MySQL mà không phải lo lắng về chi phí hoạt động. Tuy nhiên, sự cân bằng làm giảm khả năng kiểm soát, vì người dùng hoàn toàn phụ thuộc vào nhân viên của Amazon trong trường hợp hiệu suất kém hoặc hoạt động bất thường. Không có quyền truy cập vào thư mục dữ liệu hoặc các bản sao lưu vật lý gây khó khăn cho việc di chuyển dữ liệu ra khỏi RDS. Đây có thể là một vấn đề lớn nếu cơ sở dữ liệu của bạn phát triển nhanh hơn RDS và bạn quyết định chuyển sang nền tảng khác. Blog gồm hai phần này hướng dẫn bạn cách thực hiện di chuyển trực tuyến từ RDS sang máy chủ MySQL của riêng bạn.
Chúng tôi sẽ sử dụng EC2 để chạy Máy chủ MySQL của riêng mình. Đây có thể là bước đầu tiên cho những lần di chuyển phức tạp hơn sang trung tâm dữ liệu riêng tư của bạn. EC2 cung cấp cho bạn quyền truy cập vào dữ liệu của mình để có thể sử dụng xtrabackup. EC2 cũng cho phép bạn thiết lập đường hầm SSH và nó loại bỏ yêu cầu thiết lập kết nối VPN phần cứng giữa cơ sở hạ tầng tại chỗ của bạn và VPC.
Giả định
Trước khi bắt đầu, chúng ta cần đưa ra một số giả định - đặc biệt là về vấn đề bảo mật. Đầu tiên và quan trọng nhất, chúng tôi giả định rằng phiên bản RDS không thể truy cập từ bên ngoài AWS. Chúng tôi cũng giả định rằng bạn có đơn đăng ký trong EC2. Điều này ngụ ý rằng cá thể RDS và phần còn lại của cơ sở hạ tầng của bạn chia sẻ một VPC hoặc có quyền truy cập được định cấu hình giữa chúng, theo cách này hay cách khác. Nói tóm lại, chúng tôi giả định rằng bạn có thể tạo một phiên bản EC2 mới và nó sẽ có quyền truy cập (hoặc nó có thể được định cấu hình để có quyền truy cập) vào phiên bản MySQL RDS của bạn.
Chúng tôi đã định cấu hình ClusterControl trên máy chủ ứng dụng. Chúng tôi sẽ sử dụng nó để quản lý phiên bản MySQL EC2 của chúng tôi.
Thiết lập ban đầu
Trong trường hợp của chúng tôi, cá thể RDS chia sẻ cùng một VPC với “ứng dụng” của chúng tôi (cá thể EC2 với IP 172.30.4.228) và máy chủ lưu trữ sẽ là mục tiêu cho quá trình di chuyển (cá thể EC2 với IP 172.30.4.238). Là ứng dụng chúng ta sẽ sử dụng điểm chuẩn tpcc-MySQL được thực thi theo cách sau:
./tpcc_start -h rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com -d tpcc1000 -u tpcc -p tpccpass -w 20 -r 60 -l 600 -i 10 -c 4
Kế hoạch ban đầu
Chúng tôi sẽ thực hiện di chuyển bằng các bước sau:
- Thiết lập môi trường đích của chúng tôi bằng ClusterControl - cài đặt MySQL trên 172.30.4.238
- Sau đó, cài đặt ProxySQL, mà chúng tôi sẽ sử dụng để quản lý lưu lượng truy cập của mình tại thời điểm chuyển đổi dự phòng
- Kết xuất dữ liệu từ phiên bản RDS
- Tải dữ liệu vào máy chủ mục tiêu của chúng tôi
- Thiết lập sao chép giữa phiên bản RDS và máy chủ đích
- Chuyển lưu lượng truy cập từ RDS sang máy chủ đích
Chuẩn bị môi trường bằng ClusterControl
Giả sử chúng tôi đã cài đặt ClusterControl (nếu không, bạn có thể lấy nó từ:https://severalnines.com/download-clustercontrol-database-management-system), chúng tôi cần thiết lập máy chủ đích của mình. Chúng tôi sẽ sử dụng trình hướng dẫn triển khai từ ClusterControl cho việc đó:
Triển khai một cụm cơ sở dữ liệu trong ClusterControl Triển khai một cụm cơ sở dữ liệu trong ClusterControl Triển khai một cụm cơ sở dữ liệu trong ClusterControlKhi việc này được thực hiện xong, bạn sẽ thấy một cụm mới (trong trường hợp này, chỉ là máy chủ duy nhất của bạn) trong danh sách cụm:
Cụm cơ sở dữ liệu trong ClusterControlBước tiếp theo sẽ là cài đặt ProxySQL - bắt đầu từ ClusterControl 1.4, bạn có thể thực hiện dễ dàng từ giao diện người dùng. Chúng tôi đã đề cập chi tiết quá trình này trong bài đăng trên blog này. Khi cài đặt nó, chúng tôi đã chọn máy chủ ứng dụng của mình (172.30.4.228) làm máy chủ để cài đặt ProxySQL. Khi cài đặt, bạn cũng phải chọn một máy chủ để định tuyến lưu lượng truy cập của bạn. Vì chúng tôi chỉ có máy chủ lưu trữ "đích" của mình trong cụm, bạn có thể bao gồm nó nhưng sau đó cần thực hiện một số thay đổi để chuyển hướng lưu lượng truy cập đến phiên bản RDS.
Nếu bạn đã chọn bao gồm máy chủ đích (trong trường hợp của chúng tôi là 172.30.4.238) trong thiết lập ProxySQL, bạn sẽ thấy các mục sau trong bảng mysql_servers:
mysql> select * from mysql_servers\G
*************************** 1. row ***************************
hostgroup_id: 20
hostname: 172.30.4.238
port: 3306
status: ONLINE
weight: 1
compression: 0
max_connections: 100
max_replication_lag: 10
use_ssl: 0
max_latency_ms: 0
comment: read server
*************************** 2. row ***************************
hostgroup_id: 10
hostname: 172.30.4.238
port: 3306
status: ONLINE
weight: 1
compression: 0
max_connections: 100
max_replication_lag: 10
use_ssl: 0
max_latency_ms: 0
comment: read and write server
2 rows in set (0.00 sec)
ClusterControl đã cấu hình ProxySQL để sử dụng các nhóm máy chủ 10 và 20 để định tuyến ghi và đọc tới các máy chủ phụ trợ. Chúng tôi sẽ phải xóa máy chủ hiện được định cấu hình khỏi các nhóm máy chủ đó và thêm phiên bản RDS vào đó. Tuy nhiên, trước tiên, chúng tôi phải đảm bảo rằng người dùng giám sát của ProxySQL có thể truy cập phiên bản RDS.
mysql> SHOW VARIABLES LIKE 'mysql-monitor_username';
+------------------------+------------------+
| Variable_name | Value |
+------------------------+------------------+
| mysql-monitor_username | proxysql-monitor |
+------------------------+------------------+
1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'mysql-monitor_password';
+------------------------+---------+
| Variable_name | Value |
+------------------------+---------+
| mysql-monitor_password | monpass |
+------------------------+---------+
1 row in set (0.00 sec)
Chúng tôi cần cấp cho người dùng này quyền truy cập vào RDS. Nếu chúng tôi cần nó để theo dõi độ trễ sao chép, thì người dùng sẽ phải có đặc quyền ‘REPLICATION CLIENT ’. Trong trường hợp của chúng tôi, nó không cần thiết vì chúng tôi không có phiên bản RDS nô lệ - "USAGE" là đủ.
[email protected]:~# mysql -ppassword -h rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 210
Server version: 5.7.16-log MySQL Community Server (GPL)
Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE USER 'proxysql-monitor'@172.30.4.228 IDENTIFIED BY 'monpass';
Query OK, 0 rows affected (0.06 sec)
Bây giờ đã đến lúc cấu hình lại ProxySQL. Chúng tôi sẽ thêm cá thể RDS vào cả nhóm máy chủ nhà văn (10) và nhóm người đọc (20). Chúng tôi cũng sẽ xóa 172.30.4.238 khỏi các nhóm máy chủ đó - chúng tôi sẽ chỉ chỉnh sửa chúng và thêm 100 vào mỗi nhóm máy chủ.
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, max_connections, max_replication_lag) VALUES (10, 'rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com', 100, 10);
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname, max_connections, max_replication_lag) VALUES (20, 'rds2.cvsw8xpajw2b.us-east-1.rds.amazonaws.com', 100, 10);
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE mysql_servers SET hostgroup_id=110 WHERE hostname='172.30.4.238' AND hostgroup_id=10;
Query OK, 1 row affected (0.00 sec)
mysql> UPDATE mysql_servers SET hostgroup_id=120 WHERE hostname='172.30.4.238' AND hostgroup_id=20;
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.01 sec)
mysql> SAVE MYSQL SERVERS TO DISK;
Query OK, 0 rows affected (0.07 sec)
Bước cuối cùng cần thiết trước khi chúng tôi có thể sử dụng ProxySQL để chuyển hướng lưu lượng truy cập của mình là thêm người dùng ứng dụng của chúng tôi vào ProxySQL.
mysql> INSERT INTO mysql_users (username, password, active, default_hostgroup) VALUES ('tpcc', 'tpccpass', 1, 10);
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL USERS TO RUNTIME; SAVE MYSQL USERS TO DISK; SAVE MYSQL USERS TO MEMORY;
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.05 sec)
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT username, password FROM mysql_users WHERE username='tpcc';
+----------+-------------------------------------------+
| username | password |
+----------+-------------------------------------------+
| tpcc | *8C446904FFE784865DF49B29DABEF3B2A6D232FC |
+----------+-------------------------------------------+
1 row in set (0.00 sec)
Ghi chú nhanh - chúng tôi đã thực hiện “LƯU NGƯỜI DÙNG MYSQL VÀO BỘ NHỚ;” chỉ để băm mật khẩu không chỉ trong RUNTIME mà còn trong bộ đệm bộ nhớ đang hoạt động. Bạn có thể tìm thêm chi tiết về cơ chế băm mật khẩu của ProxySQL trong tài liệu của họ.
Bây giờ chúng ta có thể chuyển hướng lưu lượng truy cập của mình sang ProxySQL. Cách thực hiện tùy thuộc vào thiết lập của bạn, chúng tôi vừa khởi động lại tpcc và trỏ nó tới ProxySQL.
Chuyển hướng lưu lượng truy cập bằng ProxySQLTại thời điểm này, chúng tôi đã xây dựng một môi trường mục tiêu mà chúng tôi sẽ di chuyển đến. Chúng tôi cũng đã chuẩn bị ProxySQL và cấu hình nó để ứng dụng của chúng tôi sử dụng. Bây giờ chúng ta có một nền tảng tốt cho bước tiếp theo, đó là di chuyển dữ liệu thực tế. Trong bài tiếp theo, chúng tôi sẽ hướng dẫn bạn cách sao chép dữ liệu từ RDS vào phiên bản MySQL của riêng chúng tôi (chạy trên EC2). Chúng tôi cũng sẽ chỉ cho bạn cách chuyển lưu lượng truy cập sang phiên bản của riêng bạn trong khi các ứng dụng tiếp tục phục vụ người dùng mà không có thời gian chết.