Một lớp proxy giữa các ứng dụng và cơ sở dữ liệu thường sẽ bao gồm nhiều nút proxy để có tính khả dụng cao. Điều này không khác gì đối với ProxySQL. ProxySQL, cũng giống như các proxy hiện đại khác, có thể được sử dụng để xây dựng logic phức tạp cho các truy vấn định tuyến. Bạn có thể thêm quy tắc truy vấn để gửi truy vấn đến các máy chủ cụ thể, bạn có thể lưu truy vấn vào bộ nhớ cache, bạn có thể thêm và xóa máy chủ phụ trợ hoặc quản lý người dùng được phép kết nối với ProxySQL và MySQL. Tuy nhiên, nhiều nút ProxySQL trong lớp proxy lại gây ra một vấn đề khác - đồng bộ hóa giữa các phiên bản phân tán. Mọi quy tắc hoặc logic khác cần phải được đồng bộ hóa giữa các phiên bản, để đảm bảo chúng hoạt động theo cùng một cách. Ngay cả khi không phải tất cả proxy đang xử lý lưu lượng truy cập, chúng vẫn hoạt động ở chế độ chờ. Trong trường hợp họ cần tiếp quản công việc, bạn không muốn bất kỳ điều gì bất ngờ nếu phiên bản được sử dụng không có những thay đổi cấu hình gần đây nhất.
Việc đảm bảo điều này theo cách thủ công là khá cồng kềnh - thực hiện các thay đổi bằng tay trên tất cả các nút. Bạn có thể sử dụng các công cụ như Ansible, Chef hoặc Puppet để quản lý cấu hình, nhưng quá trình đồng bộ hóa phải được mã hóa và kiểm tra. ClusterControl có thể giúp bạn ở đây thông qua một tùy chọn để đồng bộ hóa cấu hình giữa các phiên bản ProxySQL, nhưng nó cũng có thể thiết lập và quản lý các thành phần khác cần thiết để có tính khả dụng cao, ví dụ:IP ảo. Nhưng bắt đầu từ phiên bản 1.4.2, ProxySQL cung cấp cơ chế đồng bộ hóa cấu hình và phân cụm riêng. Trong bài đăng trên blog này, chúng tôi sẽ thảo luận về cách thiết lập nó với sự kết hợp của các hành động được thực hiện trong giao diện quản trị dòng lệnh ClusterControl và ProxySQL.
Trước hết, hãy xem xét một môi trường nhân rộng điển hình được triển khai bởi ClusterControl.
Như bạn có thể thấy từ ảnh chụp màn hình, đây là thiết lập sao chép MySQL với ba phiên bản ProxySQL. Tính khả dụng cao của ProxySQL được triển khai thông qua Keepalived và IP ảo luôn được gán cho một trong các nút ProxySQL. Có một số bước chúng ta phải thực hiện để định cấu hình phân cụm ProxySQL. Đầu tiên, chúng ta phải xác định ProxySQL của người dùng nào nên được sử dụng để trao đổi thông tin giữa các nút. Hãy xác định một cái mới bên trên người dùng quản trị hiện tại:
Tiếp theo, chúng ta cần xác định người dùng đó trong cài đặt admin-cluster_password và admin-cluster_username.
Điều này đã được thực hiện chỉ trên một trong các nút (10.0.0.126). Hãy đồng bộ hóa thay đổi cấu hình này với các nút ProxySQL còn lại.
Như chúng tôi đã nêu, ClusterControl cho phép bạn đồng bộ hóa cấu hình giữa các nút ProxySQL chỉ với một vài bước. Khi công việc kết thúc đồng bộ hóa 10.0.0.127 với 10.0.0.126, chỉ có nút cuối cùng mà chúng tôi cần đồng bộ hóa.
Sau đó, chúng tôi cần thực hiện một thay đổi nhỏ trong giao diện dòng lệnh quản trị ProxySQL, thường có thể truy cập được trên cổng 6032. Chúng tôi phải tạo các mục nhập trong bảng 'proxysql_servers' để xác định các nút trong cụm ProxySQL của chúng tôi.
mysql> INSERT INTO proxysql_servers (hostname) VALUES ('10.0.0.126'), ('10.0.0.127'), ('10.0.0.128');
Query OK, 3 rows affected (0.00 sec)
mysql> LOAD PROXYSQL SERVERS TO RUNTIME;
Query OK, 0 rows affected (0.01 sec)
mysql> SAVE PROXYSQL SERVERS TO DISK;
Query OK, 0 rows affected (0.01 sec)
Sau khi tải thay đổi vào thời gian chạy, ProxySQL sẽ bắt đầu đồng bộ hóa các nút. Có một số nơi bạn có thể theo dõi trạng thái của cụm.
mysql> SELECT * FROM stats_proxysql_servers_checksums;
+------------+------+-------------------+---------+------------+--------------------+------------+------------+------------+
| hostname | port | name | version | epoch | checksum | changed_at | updated_at | diff_check |
+------------+------+-------------------+---------+------------+--------------------+------------+------------+------------+
| 10.0.0.128 | 6032 | admin_variables | 0 | 0 | | 0 | 1539773916 | 0 |
| 10.0.0.128 | 6032 | mysql_query_rules | 2 | 1539772933 | 0x3FEC69A5C9D96848 | 1539773546 | 1539773916 | 0 |
| 10.0.0.128 | 6032 | mysql_servers | 4 | 1539772933 | 0x3659DCF3E53498A0 | 1539773546 | 1539773916 | 0 |
| 10.0.0.128 | 6032 | mysql_users | 2 | 1539772933 | 0xDD5F0BB01235E930 | 1539773546 | 1539773916 | 0 |
| 10.0.0.128 | 6032 | mysql_variables | 0 | 0 | | 0 | 1539773916 | 0 |
| 10.0.0.128 | 6032 | proxysql_servers | 2 | 1539773835 | 0x8EB13E2B48C3FDB0 | 1539773835 | 1539773916 | 0 |
| 10.0.0.127 | 6032 | admin_variables | 0 | 0 | | 0 | 1539773916 | 0 |
| 10.0.0.127 | 6032 | mysql_query_rules | 3 | 1539773719 | 0x3FEC69A5C9D96848 | 1539773546 | 1539773916 | 0 |
| 10.0.0.127 | 6032 | mysql_servers | 5 | 1539773719 | 0x3659DCF3E53498A0 | 1539773546 | 1539773916 | 0 |
| 10.0.0.127 | 6032 | mysql_users | 3 | 1539773719 | 0xDD5F0BB01235E930 | 1539773546 | 1539773916 | 0 |
| 10.0.0.127 | 6032 | mysql_variables | 0 | 0 | | 0 | 1539773916 | 0 |
| 10.0.0.127 | 6032 | proxysql_servers | 2 | 1539773812 | 0x8EB13E2B48C3FDB0 | 1539773813 | 1539773916 | 0 |
| 10.0.0.126 | 6032 | admin_variables | 0 | 0 | | 0 | 1539773916 | 0 |
| 10.0.0.126 | 6032 | mysql_query_rules | 1 | 1539770578 | 0x3FEC69A5C9D96848 | 1539773546 | 1539773916 | 0 |
| 10.0.0.126 | 6032 | mysql_servers | 3 | 1539771053 | 0x3659DCF3E53498A0 | 1539773546 | 1539773916 | 0 |
| 10.0.0.126 | 6032 | mysql_users | 1 | 1539770578 | 0xDD5F0BB01235E930 | 1539773546 | 1539773916 | 0 |
| 10.0.0.126 | 6032 | mysql_variables | 0 | 0 | | 0 | 1539773916 | 0 |
| 10.0.0.126 | 6032 | proxysql_servers | 2 | 1539773546 | 0x8EB13E2B48C3FDB0 | 1539773546 | 1539773916 | 0 |
+------------+------+-------------------+---------+------------+--------------------+------------+------------+------------+
18 rows in set (0.00 sec)
Bảng stats_proxysql_servers_checksums chứa danh sách các nút trong cụm, các bảng được đồng bộ hóa, các phiên bản và tổng tổng của bảng. Nếu tổng kiểm tra không thẳng hàng, ProxySQL sẽ cố gắng lấy phiên bản mới nhất từ một đồng đẳng cụm. Thông tin chi tiết hơn về nội dung của bảng này có thể được tìm thấy trong tài liệu ProxySQL.
Một nguồn thông tin khác về quy trình là nhật ký ProxySQL (theo mặc định, nhật ký này nằm trong /var/lib/proxysql/proxysql.log).
2018-10-17 11:00:25 [INFO] Cluster: detected a new checksum for mysql_query_rules from peer 10.0.0.126:6032, version 2, epoch 1539774025, checksum 0xD615D5416F61AA72 . Not syncing yet …
2018-10-17 11:00:27 [INFO] Cluster: detected a peer 10.0.0.126:6032 with mysql_query_rules version 2, epoch 1539774025, diff_check 3. Own version: 2, epoch: 1539772933. Proceeding with remote sync
2018-10-17 11:00:28 [INFO] Cluster: detected a peer 10.0.0.126:6032 with mysql_query_rules version 2, epoch 1539774025, diff_check 4. Own version: 2, epoch: 1539772933. Proceeding with remote sync
2018-10-17 11:00:28 [INFO] Cluster: detected peer 10.0.0.126:6032 with mysql_query_rules version 2, epoch 1539774025
2018-10-17 11:00:28 [INFO] Cluster: Fetching MySQL Query Rules from peer 10.0.0.126:6032 started
2018-10-17 11:00:28 [INFO] Cluster: Fetching MySQL Query Rules from peer 10.0.0.126:6032 completed
2018-10-17 11:00:28 [INFO] Cluster: Loading to runtime MySQL Query Rules from peer 10.0.0.126:6032
2018-10-17 11:00:28 [INFO] Cluster: Saving to disk MySQL Query Rules from peer 10.0.0.126:6032
Như bạn có thể thấy, chúng tôi có ở đây thông tin rằng một tổng kiểm tra mới đã được phát hiện và quá trình đồng bộ hóa đang diễn ra.
Hãy dừng lại một chút ở đây và thảo luận về cách ProxySQL xử lý các bản cập nhật cấu hình từ nhiều nguồn. Trước hết, ProxySQL theo dõi tổng kiểm tra để phát hiện khi cấu hình đã thay đổi. Nó cũng lưu trữ khi nó xảy ra - dữ liệu này được lưu trữ dưới dạng dấu thời gian, vì vậy nó có độ phân giải một giây. ProxySQL có hai biến cũng ảnh hưởng đến cách các thay đổi đang được đồng bộ hóa.
Cluster_check_interval_ms - nó xác định tần suất ProxySQL nên kiểm tra các thay đổi cấu hình. Theo mặc định, nó là 1000ms.
Cluster_mysql_servers_diffs_before_sync - nó cho chúng ta biết bao nhiêu lần kiểm tra sẽ phát hiện ra thay đổi cấu hình trước khi nó được đồng bộ hóa. Cài đặt mặc định là 3.
Điều này có nghĩa là, ngay cả khi bạn sẽ thực hiện thay đổi cấu hình trên cùng một máy chủ, nếu bạn thực hiện nó thường xuyên dưới 4 giây, các nút ProxySQL còn lại có thể không đồng bộ hóa được vì một thay đổi mới sẽ hiển thị trước thay đổi trước đó đã được đồng bộ hóa. Điều đó cũng có nghĩa là nếu bạn thực hiện các thay đổi cấu hình trên nhiều phiên bản ProxySQL, bạn nên thực hiện chúng với khoảng thời gian nghỉ giữa chúng ít nhất 4 giây vì nếu không một số thay đổi sẽ bị mất và kết quả là các cấu hình sẽ khác nhau. Ví dụ:bạn thêm Server1 trên Proxy1 và sau 2 giây, bạn thêm Server2 trên Proxy2. Tất cả các proxy khác sẽ từ chối thay đổi trên Proxy1 vì chúng sẽ phát hiện ra rằng Proxy2 có cấu hình mới hơn. 4 giây sau khi thay đổi trên Proxy2, tất cả proxy (bao gồm cả Proxy1) sẽ kéo cấu hình từ Proxy2.
Vì giao tiếp trong cụm không đồng bộ và nếu một nút ProxySQL mà bạn thực hiện thay đổi không thành công, các thay đổi có thể không được sao chép đúng lúc. Cách tiếp cận tốt nhất là thực hiện cùng một thay đổi trên hai nút ProxySQL. Bằng cách này, trừ khi cả hai đều bị lỗi chính xác cùng một lúc, một trong số chúng sẽ có thể phổ biến cấu hình mới.
Cũng đáng chú ý là cấu trúc liên kết cụm ProxySQL có thể khá linh hoạt. Trong trường hợp của chúng tôi, chúng tôi có ba nút, tất cả đều có ba mục trong bảng proxysql_servers. Các nút như vậy tạo thành một cụm nơi bạn có thể ghi vào bất kỳ nút nào và các thay đổi sẽ được phổ biến. Trên hết, có thể thêm các nút bên ngoài sẽ hoạt động ở chế độ “chỉ đọc”, có nghĩa là chúng sẽ chỉ đồng bộ hóa các thay đổi được thực hiện đối với cụm “lõi” nhưng chúng sẽ không phổ biến các thay đổi đã được thực hiện trực tiếp trên chính họ. Tất cả những gì bạn cần trên nút mới là chỉ định cấu hình các nút cụm “lõi” trong proxysql_servers và kết quả là nó sẽ kết nối với các nút đó và nhận các thay đổi dữ liệu, nhưng nó sẽ không bị phần còn lại của cụm truy vấn. để thay đổi cấu hình của nó. Thiết lập này có thể được sử dụng để tạo nguồn sự thật với một số nút trong cụm và các nút ProxySQL khác, chỉ lấy cấu hình từ cụm "lõi" chính.
Ngoài tất cả những điều đó, cụm ProxySQL hỗ trợ tự động nối lại các nút - chúng sẽ đồng bộ hóa cấu hình của mình trong khi khởi động. Nó cũng có thể dễ dàng thu nhỏ bằng cách thêm nhiều nút hơn.
Chúng tôi hy vọng bài đăng trên blog này cung cấp cho bạn cái nhìn sâu sắc về cách có thể định cấu hình cụm ProxySQL. Cụm ProxySQL sẽ trong suốt với ClusterControl và nó sẽ không ảnh hưởng đến bất kỳ hoạt động nào bạn có thể muốn thực thi từ giao diện người dùng ClusterControl.