ProxySQL là một giải pháp đã được chứng minh giúp quản trị viên cơ sở dữ liệu giải quyết các yêu cầu về tính khả dụng cao của cơ sở dữ liệu của họ. Bởi vì nó nhận biết được SQL, nó cũng có thể được sử dụng để định hình lưu lượng hướng tới cơ sở dữ liệu - bạn có thể định tuyến các truy vấn đến các nút cụ thể, bạn có thể viết lại các truy vấn nếu cần, bạn cũng có thể điều chỉnh lưu lượng, triển khai tường lửa SQL, tạo một bản sao lưu lượng truy cập của bạn và gửi nó đến một nhóm máy chủ riêng biệt.
ProxySQL 2.0.5 nguyên bản hỗ trợ Galera Cluster, MySQL Replication và MySQL Group Replication. Thật không may, theo mặc định, nó không hỗ trợ AWS Aurora; nhưng vẫn có một giải pháp khác mà bạn có thể sử dụng.
Bạn có thể tự hỏi mình, tại sao tôi phải bận tâm với ProxySQL khi AWS cung cấp cho tôi một điểm cuối sẽ thực hiện phân tách đọc-ghi cho tôi? Thực tế là vậy nhưng nó chỉ là sự phân chia r / w. Mặt khác, ProxySQL mang đến cho bạn cơ hội không chỉ tách các lần đọc khỏi các lần ghi mà còn để kiểm soát lưu lượng cơ sở dữ liệu của bạn. ProxySQL thường có thể cứu cơ sở dữ liệu của bạn khỏi bị quá tải bằng cách chỉ viết lại một truy vấn.
ProxySQL 2.0.5 và AWS Aurora
Nếu bạn quyết định dùng thử ProxySQL, bạn phải thực hiện một số bước. Đầu tiên, bạn sẽ cần một phiên bản EC2 để cài đặt ProxySQL. Khi bạn đã thiết lập và chạy phiên bản, bạn có thể cài đặt ProxySQL mới nhất. Chúng tôi khuyên bạn nên sử dụng kho lưu trữ cho điều đó. Bạn có thể thiết lập nó bằng cách làm theo các bước trong trang tài liệu:https://github.com/sysown/proxysql/wiki. Đối với Ubuntu 16.04 LTS mà chúng tôi đã sử dụng, bạn phải chạy:
apt-get install -y lsb-release
wget -O - 'https://repo.proxysql.com/ProxySQL/repo_pub_key' | apt-key add -
echo deb https://repo.proxysql.com/ProxySQL/proxysql-2.0.x/$(lsb_release -sc)/ ./ \
| tee /etc/apt/sources.list.d/proxysql.list
Đã đến lúc cài đặt ProxySQL:
apt-get update
apt-get install proxysql
Sau đó, chúng tôi phải xác minh rằng chúng tôi có kết nối từ phiên bản ProxySQL của chúng tôi đến các nút AWS Aurora. Chúng tôi sẽ sử dụng các điểm cuối trực tiếp cho kết nối.
Chúng tôi có thể dễ dàng kiểm tra kết nối bằng telnet với điểm cuối chính xác trên cổng 3306 :
[email protected]:~# telnet dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com 3306
Trying 10.0.0.53...
Connected to dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com.
Escape character is '^]'.
J
5.7.12_2>ZWP-&[Ov8NzJ:H#Mmysql_native_password^CConnection closed by foreign host.
Cái đầu tiên có vẻ ổn. Chúng tôi sẽ tiếp tục với nút Aurora thứ hai:
[email protected]:~# telnet dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com 3306
Trying 10.0.1.90...
Connected to dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com.
Escape character is '^]'.
J
tr3'3rynMmysql_native_password^CConnection closed by foreign host.
Hoạt động tuyệt vời. Nếu bạn không thể kết nối với các nút Aurora, bạn cần đảm bảo rằng tất cả các bit bảo mật được căn chỉnh đúng cách:kiểm tra cấu hình VPC, xem nút ProxySQL có thể truy cập VPC của Aurora hay không, kiểm tra xem các nhóm bảo mật có cho phép lưu lượng đi qua hay không. Lớp bảo mật mạng AWS có thể khó định cấu hình nếu bạn không có kinh nghiệm nhưng cuối cùng bạn cũng có thể làm cho nó hoạt động.
Sau khi sắp xếp kết nối, chúng tôi sẽ cần tạo một người dùng trên Aurora. Chúng tôi sẽ sử dụng người dùng đó để giám sát các nút Aurora trong ProxySQL. Đầu tiên, chúng tôi có thể phải cài đặt máy khách MySQL trên nút ProxySQL:
[email protected]:~# apt install mysql-client-core-5.7
Sau đó, chúng tôi sẽ sử dụng điểm cuối của cụm để kết nối với trình viết và tạo người dùng trên đó:
[email protected]:~# mysql -h dbtest.cluster-cqb1vho43rod.eu-central-1.rds.amazonaws.com -u root -ppassword
mysql> CREATE USER 'monuser'@'10.0.0.191' IDENTIFIED BY 'mon1t0r';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT REPLICATION CLIENT ON *.* TO 'monuser'@'10.0.0.191';
Query OK, 0 rows affected (0.00 sec)
Làm xong việc này, chúng ta có thể đăng nhập vào giao diện quản trị ProxySQL (theo mặc định trên cổng 6032) để xác định người dùng màn hình và mật khẩu của nó.
[email protected]:~# mysql -P6032 -u admin -padmin -h127.0.0.1
mysql> SET mysql-monitor_username='monuser';
Query OK, 1 row affected (0.00 sec)
mysql> SET mysql-monitor_password='mon1t0r';
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL VARIABLES TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
mysql> SAVE MYSQL VARIABLES TO DISK;
Query OK, 116 rows affected (0.00 sec)
Bây giờ đã đến lúc xác định các nút Aurora trong ProxySQL:
mysql> INSERT INTO mysql_servers (hostgroup_id, hostname) VALUES (10, 'dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com'), (20, 'dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com');
Query OK, 2 rows affected (0.01 sec)
Như bạn có thể thấy, chúng tôi sử dụng điểm cuối trực tiếp của chúng làm tên máy chủ. Khi điều này được thực hiện, chúng tôi sẽ sử dụng bảng mysql_replication_hostgroup để xác định các nhóm máy chủ người đọc và người viết. Chúng tôi cũng sẽ phải chuyển loại kiểm tra chính xác - theo mặc định, ProxySQL tìm kiếm biến ‘read_only’ trong khi Aurora sử dụng ‘innodb_read_only’ để phân biệt giữa người viết và người đọc.
mysql> SHOW CREATE TABLE mysql_replication_hostgroups\G
*************************** 1. row ***************************
table: mysql_replication_hostgroups
Create Table: CREATE TABLE mysql_replication_hostgroups (
writer_hostgroup INT CHECK (writer_hostgroup>=0) NOT NULL PRIMARY KEY,
reader_hostgroup INT NOT NULL CHECK (reader_hostgroup<>writer_hostgroup AND reader_hostgroup>=0),
check_type VARCHAR CHECK (LOWER(check_type) IN ('read_only','innodb_read_only','super_read_only')) NOT NULL DEFAULT 'read_only',
comment VARCHAR NOT NULL DEFAULT '', UNIQUE (reader_hostgroup))
1 row in set (0.00 sec)
mysql> INSERT INTO mysql_replication_hostgroups VALUES (10, 20, 'innodb_read_only', 'Aurora');
Query OK, 1 row affected (0.00 sec)
mysql> LOAD MYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.00 sec)
Đây là nó, bây giờ chúng ta có thể xem cách ProxySQL định cấu hình các nút trong cấu hình thời gian chạy:
mysql> SELECT hostgroup_id, hostname, port FROM runtime_mysql_servers;
+--------------+-----------------------------------------------------------------------------+------+
| hostgroup_id | hostname | port |
+--------------+-----------------------------------------------------------------------------+------+
| 10 | | 3306 |
| 20 | dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
| 20 | dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
+--------------+-----------------------------------------------------------------------------+------+
3 rows in set (0.00 sec)
Như bạn có thể thấy, dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com là người viết. Hãy thử chuyển đổi dự phòng ngay bây giờ:
mysql> SELECT hostgroup_id, hostname, port FROM runtime_mysql_servers;
+--------------+-----------------------------------------------------------------------------+------+
| hostgroup_id | hostname | port |
+--------------+-----------------------------------------------------------------------------+------+
| 10 | dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
| 20 | dbtest-instance-1-eu-central-1a.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
| 20 | dbtest-instance-1.cqb1vho43rod.eu-central-1.rds.amazonaws.com | 3306 |
+--------------+-----------------------------------------------------------------------------+------+
3 rows in set (0.00 sec)
Như bạn có thể thấy, người viết (nhóm máy chủ 10) đã thay đổi thành nút thứ hai.
Kết luận
Về cơ bản là vậy - như bạn có thể thấy việc thiết lập các nút AWS Aurora trong ProxySQL là một quá trình khá đơn giản.