MariaDB MaxScale là một proxy cơ sở dữ liệu plug-in nâng cao dành cho các máy chủ cơ sở dữ liệu MariaDB. Nó nằm giữa các ứng dụng khách và máy chủ cơ sở dữ liệu, định tuyến các truy vấn của máy khách và phản hồi của máy chủ. MaxScale cũng giám sát các máy chủ, vì vậy nó sẽ nhanh chóng nhận thấy bất kỳ thay đổi nào về trạng thái máy chủ hoặc cấu trúc liên kết sao chép. Điều này làm cho MaxScale trở thành một lựa chọn tự nhiên để kiểm soát chuyển đổi dự phòng và các tính năng tương tự.
Trong loạt bài blog gồm hai phần này, chúng tôi sẽ hướng dẫn đầy đủ về cách chạy MariaDB MaxScale trên Docker. Phần này bao gồm việc triển khai như một vùng chứa Docker độc lập và phân cụm MaxScale thông qua Docker Swarm để có tính khả dụng cao.
MariaDB MaxScale trên Docker
Có một số hình ảnh MariaDB Docker có sẵn trong Docker Hub. Trong blog này, chúng tôi sẽ sử dụng hình ảnh chính thức do MariaDB duy trì và xuất bản có tên "mariadb / maxscale" (thẻ:mới nhất). Hình ảnh có kích thước khoảng 71MB. Tại thời điểm viết bài này, hình ảnh đã được cài đặt sẵn MaxScale 2.3.4 như một phần của các gói bắt buộc của nó.
Nói chung, các bước sau là bắt buộc để chạy MaxScale với hình ảnh này trên môi trường vùng chứa:
- Bản sao MariaDB (master-slave hoặc master-master) đang chạy / Cụm Galera hoặc Cụm NDB
- Tạo và cấp cho người dùng cơ sở dữ liệu dành riêng cho việc giám sát MaxScale
- Chuẩn bị tệp cấu hình MaxScale
- Ánh xạ tệp cấu hình vào vùng chứa hoặc tải vào Kubernetes ConfigMap hoặc Docker Swarm Configs
- Khởi động vùng chứa / pod / service / replicaset
Lưu ý rằng MaxScale là một sản phẩm của MariaDB, có nghĩa là nó được thiết kế riêng cho máy chủ MariaDB. Hầu hết các tính năng vẫn tương thích với MySQL ngoại trừ một số phần như xử lý GTID ví dụ, cấu hình Galera Cluster và các tệp dữ liệu nội bộ. Phiên bản mà chúng tôi sẽ sử dụng là 2.3.4, được phát hành theo Giấy phép Nguồn Kinh doanh (BSL). Nó cho phép mở tất cả mã và việc sử dụng trong BA máy chủ là miễn phí. Khi việc sử dụng vượt qua ba máy chủ phụ trợ, công ty sử dụng nó phải trả tiền cho một đăng ký thương mại. Sau một khoảng thời gian cụ thể (2 năm đối với MaxScale), bản phát hành sẽ chuyển sang GPL và tất cả việc sử dụng đều miễn phí.
Chỉ cần nói rõ, vì đây là một môi trường thử nghiệm, chúng ta có thể có nhiều hơn 2 nút. Như đã nêu trong trang Câu hỏi thường gặp về MariaDB BSL:
Q:Tôi có thể sử dụng các sản phẩm MariaDB được cấp phép theo BSL trong môi trường thử nghiệm và phát triển không?
Đ:Có, Trong môi trường thử nghiệm và phát triển phi sản xuất, bạn có thể sử dụng các sản phẩm được cấp phép theo BSL mà không cần đăng ký từ MariaDB
Trong hướng dẫn này, chúng ta đã có một Bản sao MariaDB ba nút được triển khai bằng ClusterControl. Sơ đồ sau minh họa thiết lập mà chúng tôi sẽ triển khai:
Kiến trúc hệ thống của chúng tôi bao gồm:
- mariadb1 - 192.168.0.91 (chính)
- mariadb2 - 192.168.0.92 (nô lệ)
- mariadb3 - 192.168.0.93 (nô lệ)
- docker1 - 192.168.0.200 (Máy chủ Docker cho vùng chứa - maxscale, ứng dụng)
Chuẩn bị Người dùng MaxScale
Đầu tiên, tạo người dùng cơ sở dữ liệu MySQL cho MaxScale và cho phép tất cả các máy chủ trong mạng 192.168.0.0/24:
MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';
Sau đó, cấp các đặc quyền cần thiết. Nếu bạn chỉ muốn giám sát các máy chủ phụ trợ với cân bằng tải, các khoản trợ cấp sau đây là đủ:
MariaDB> GRANT SHOW DATABASES ON *.* TO 'maxscale'@'192.168.0.%';
MariaDB> GRANT SELECT ON `mysql`.* TO 'maxscale'@'192.168.0.%';
Tuy nhiên, MaxScale có thể làm được nhiều hơn các truy vấn định tuyến. Nó có khả năng thực hiện chuyển đổi dự phòng và chuyển đổi, ví dụ như quảng bá một nô lệ cho một chủ mới. Điều này yêu cầu đặc quyền SUPER và REPLICATION CLIENT. Nếu bạn muốn sử dụng tính năng này, hãy chỉ định TẤT CẢ CÁC QUYỀN RIÊNG TƯ cho người dùng thay thế:
mysql> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';
Đó là nó cho phần người dùng.
Chuẩn bị tệp cấu hình MaxScale
Hình ảnh yêu cầu tệp cấu hình đang hoạt động được ánh xạ vào vùng chứa trước khi bắt đầu. Tệp cấu hình tối thiểu được cung cấp trong vùng chứa sẽ không giúp chúng tôi tạo proxy ngược mà chúng tôi muốn. Do đó, tệp cấu hình phải được chuẩn bị trước.
Danh sách sau đây có thể giúp chúng tôi thu thập thông tin cơ bản cần thiết để xây dựng tệp cấu hình của chúng tôi:
- Loại cụm - MaxScale hỗ trợ sao chép MariaDB (master-slave, master-master), Galera Cluster, Amazon Aurora, MariaDB ColumnStore và NDB Cluster (hay còn gọi là MySQL Cluster).
- Địa chỉ IP phụ trợ và / hoặc tên máy chủ - Địa chỉ IP hoặc tên máy chủ có thể truy cập cho tất cả các máy chủ phụ trợ.
- Thuật toán định tuyến - MaxScale hỗ trợ hai loại định tuyến truy vấn - phân tách đọc-ghi và cân bằng tải theo vòng lặp.
- Cổng để nghe theo MaxScale - Theo mặc định, MaxScale sử dụng cổng 4006 cho các kết nối quay vòng và 4008 cho các kết nối phân chia đọc-ghi. Bạn có thể sử dụng ổ cắm UNIX nếu muốn.
Trong thư mục hiện tại, hãy tạo một tệp văn bản có tên là maxscale.cnf để chúng ta có thể ánh xạ nó vào vùng chứa khi khởi động. Dán các dòng sau vào tệp:
########################
## Server list
########################
[mariadb1]
type = server
address = 192.168.0.91
port = 3306
protocol = MariaDBBackend
serv_weight = 1
[mariadb2]
type = server
address = 192.168.0.92
port = 3306
protocol = MariaDBBackend
serv_weight = 1
[mariadb3]
type = server
address = 192.168.0.93
port = 3306
protocol = MariaDBBackend
serv_weight = 1
#########################
## MaxScale configuration
#########################
[maxscale]
threads = auto
log_augmentation = 1
ms_timestamp = 1
syslog = 1
#########################
# Monitor for the servers
#########################
[monitor]
type = monitor
module = mariadbmon
servers = mariadb1,mariadb2,mariadb3
user = maxscale
password = my_s3cret
auto_failover = true
auto_rejoin = true
enforce_read_only_slaves = 1
#########################
## Service definitions for read/write splitting and read-only services.
#########################
[rw-service]
type = service
router = readwritesplit
servers = mariadb1,mariadb2,mariadb3
user = maxscale
password = my_s3cret
max_slave_connections = 100%
max_sescmd_history = 1500
causal_reads = true
causal_reads_timeout = 10
transaction_replay = true
transaction_replay_max_size = 1Mi
delayed_retry = true
master_reconnection = true
master_failure_mode = fail_on_write
max_slave_replication_lag = 3
[rr-service]
type = service
router = readconnroute
servers = mariadb1,mariadb2,mariadb3
router_options = slave
user = maxscale
password = my_s3cret
##########################
## Listener definitions for the service
## Listeners represent the ports the service will listen on.
##########################
[rw-listener]
type = listener
service = rw-service
protocol = MariaDBClient
port = 4008
[ro-listener]
type = listener
service = rr-service
protocol = MariaDBClient
port = 4006
Một chút giải thích cho mọi phần:
- Danh sách Máy chủ - Các máy chủ phụ trợ. Xác định mọi máy chủ MariaDB của cụm này trong khổ thơ của riêng nó. Tên khổ thơ sẽ được sử dụng khi chúng tôi chỉ định định nghĩa dịch vụ sâu hơn. Loại thành phần phải là "máy chủ".
- Cấu hình MaxScale - Xác định tất cả các cấu hình liên quan đến MaxScale ở đó.
- Mô-đun giám sát - MaxScale sẽ giám sát các máy chủ phụ trợ như thế nào. Loại thành phần phải là "màn hình" theo sau là một trong các mô-đun giám sát. Để biết danh sách các màn hình được hỗ trợ, hãy tham khảo Màn hình MaxScale 2.3.
- Dịch vụ - Nơi định tuyến truy vấn. Loại thành phần phải là "dịch vụ". Để biết danh sách các bộ định tuyến được hỗ trợ, hãy tham khảo Bộ định tuyến MaxScale 2.3.
- Trình nghe - Cách MaxScale sẽ lắng nghe các kết nối đến. Nó có thể là cổng hoặc tệp ổ cắm. Loại thành phần phải là "người nghe". Thông thường, người nghe gắn liền với các dịch vụ.
Vì vậy, về cơ bản, chúng tôi muốn MaxScale lắng nghe trên hai cổng, 4006 và 4008. Cổng 4006 dành riêng cho kết nối mạng, phù hợp với khối lượng công việc chỉ đọc cho MariaDB Replication của chúng tôi trong khi cổng 4008 dành riêng cho khối lượng công việc đọc và ghi quan trọng. Chúng tôi cũng muốn sử dụng MaxScale để thực hiện hành động đối với bản sao của chúng tôi trong trường hợp chuyển đổi dự phòng, chuyển đổi hoặc tham gia lại nô lệ, do đó chúng tôi sử dụng mô-đun giám sát có tên "mariadbmon".
Chạy vùng chứa
Bây giờ chúng tôi đã sẵn sàng chạy vùng chứa MaxScale độc lập của mình. Ánh xạ tệp cấu hình với -v và đảm bảo xuất bản cả hai cổng lắng nghe 4006 và 4008. Theo tùy chọn, bạn có thể bật giao diện API MaxScale REST tại cổng 8989:
$ docker run -d \
--name maxscale \
--restart always \
-p 4006:4006 \
-p 4008:4008 \
-p 8989:8989 \
-v $PWD/maxscale.cnf:/etc/maxscale.cnf \
mariadb/maxscale
Xác minh bằng:
$ docker logs -f maxscale
...
2019-06-14 07:15:41.060 notice : (main): Started REST API on [127.0.0.1]:8989
2019-06-14 07:15:41.060 notice : (main): MaxScale started with 8 worker threads, each with a stack size of 8388608 bytes.
Đảm bảo bạn không thấy lỗi khi xem các bản ghi trên. Xác minh xem các quy trình docker-proxy có đang lắng nghe trên các cổng đã xuất bản hay không - 4006, 4008 và 8989:
$ netstat -tulpn | grep docker-proxy
tcp6 0 0 :::8989 :::* LISTEN 4064/docker-proxy
tcp6 0 0 :::4006 :::* LISTEN 4092/docker-proxy
tcp6 0 0 :::4008 :::* LISTEN 4078/docker-proxy
Tại thời điểm này, MaxScale của chúng tôi đang chạy và có khả năng xử lý các truy vấn.
MaxCtrl
MaxCtrl là một ứng dụng quản trị dòng lệnh cho MaxScale sử dụng API REST MaxScale để giao tiếp. Nó được dự định là phần mềm thay thế cho máy khách dòng lệnh MaxAdmin kế thừa.
Để vào bảng điều khiển MaxCtrl, hãy thực thi lệnh "maxctrl" bên trong vùng chứa:
$ docker exec -it maxscale maxctrl
maxctrl: list servers
┌──────────┬──────────────┬──────┬─────────────┬─────────────────┬─────────────┐
│ Server │ Address │ Port │ Connections │ State │ GTID │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb1 │ 192.168.0.91 │ 3306 │ 0 │ Master, Running │ 0-5001-1012 │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb2 │ 192.168.0.92 │ 3306 │ 0 │ Slave, Running │ 0-5001-1012 │
├──────────┼──────────────┼──────┼─────────────┼─────────────────┼─────────────┤
│ mariadb3 │ 192.168.0.93 │ 3306 │ 0 │ Slave, Running │ 0-5001-1012 │
└──────────┴──────────────┴──────┴─────────────┴─────────────────┴─────────────┘
Để xác minh xem mọi thứ có ổn không, chỉ cần chạy các lệnh sau:
maxctrl: list servers
maxctrl: list services
maxctrl: list filters
maxctrl: list sessions
Để biết thêm thông tin về mọi thành phần, thay vào đó hãy đặt tiền tố bằng lệnh "show", ví dụ:
maxctrl: show servers
┌──────────────────┬──────────────────────────────────────────┐
│ Server │ mariadb3 │
├──────────────────┼──────────────────────────────────────────┤
│ Address │ 192.168.0.93 │
├──────────────────┼──────────────────────────────────────────┤
│ Port │ 3306 │
├──────────────────┼──────────────────────────────────────────┤
│ State │ Slave, Running │
├──────────────────┼──────────────────────────────────────────┤
│ Last Event │ new_slave │
├──────────────────┼──────────────────────────────────────────┤
│ Triggered At │ Mon, 17 Jun 2019 08:57:59 GMT │
├──────────────────┼──────────────────────────────────────────┤
│ Services │ rw-service │
│ │ rr-service │
├──────────────────┼──────────────────────────────────────────┤
│ Monitors │ monitor │
├──────────────────┼──────────────────────────────────────────┤
│ Master ID │ 5001 │
├──────────────────┼──────────────────────────────────────────┤
│ Node ID │ 5003 │
├──────────────────┼──────────────────────────────────────────┤
│ Slave Server IDs │ │
├──────────────────┼──────────────────────────────────────────┤
│ Statistics │ { │
│ │ "connections": 0, │
│ │ "total_connections": 0, │
│ │ "persistent_connections": 0, │
│ │ "active_operations": 0, │
│ │ "routed_packets": 0, │
│ │ "adaptive_avg_select_time": "0ns" │
│ │ } │
├──────────────────┼──────────────────────────────────────────┤
│ Parameters │ { │
│ │ "address": "192.168.0.93", │
│ │ "protocol": "MariaDBBackend", │
│ │ "port": 3306, │
│ │ "extra_port": 0, │
│ │ "authenticator": null, │
│ │ "monitoruser": null, │
│ │ "monitorpw": null, │
│ │ "persistpoolmax": 0, │
│ │ "persistmaxtime": 0, │
│ │ "proxy_protocol": false, │
│ │ "ssl": "false", │
│ │ "ssl_cert": null, │
│ │ "ssl_key": null, │
│ │ "ssl_ca_cert": null, │
│ │ "ssl_version": "MAX", │
│ │ "ssl_cert_verify_depth": 9, │
│ │ "ssl_verify_peer_certificate": true, │
│ │ "disk_space_threshold": null, │
│ │ "type": "server", │
│ │ "serv_weight": "1" │
│ │ } │
└──────────────────┴──────────────────────────────────────────┘
Kết nối với Cơ sở dữ liệu
Người dùng cơ sở dữ liệu của ứng dụng phải được cấp máy chủ MaxScale vì từ góc nhìn máy chủ MariaDB, nó chỉ có thể nhìn thấy máy chủ MaxScale. Hãy xem xét ví dụ sau không có MaxScale trong hình:
- Tên cơ sở dữ liệu:myapp
- Người dùng:myapp_user
- Máy chủ:192.168.0.133 (máy chủ ứng dụng)
Để cho phép người dùng truy cập cơ sở dữ liệu bên trong máy chủ MariaDB, người ta phải chạy câu lệnh sau:
MariaDB> CREATE USER 'myapp_user'@'192.168.0.133' IDENTIFIED BY 'mypassword';
MariaDB> GRANT ALL PRIVILEGES ON myapp.* to 'myapp_user'@'192.168.0.133';
Với MaxScale trong hình, người ta phải chạy câu lệnh sau để thay thế (thay thế địa chỉ IP của máy chủ ứng dụng bằng địa chỉ IP MaxScale, 192.168.0.200):
MariaDB> CREATE USER 'myapp_user'@'192.168.0.200' IDENTIFIED BY 'mypassword';
MariaDB> GRANT ALL PRIVILEGES ON myapp.* to 'myapp_user'@'192.168.0.200';
Từ ứng dụng, có hai cổng bạn có thể sử dụng để kết nối với cơ sở dữ liệu:
- 4006 - Trình nghe tổng hợp, phù hợp với khối lượng công việc chỉ đọc.
- 4008 - Trình nghe chia tách đọc-ghi, phù hợp với khối lượng công việc ghi.
Nếu ứng dụng của bạn chỉ được phép chỉ định một cổng MySQL (ví dụ:Wordpress, Joomla, v.v.), hãy chọn cổng RW 4008 để thay thế. Đây là kết nối điểm cuối an toàn nhất bất kể loại cụm. Tuy nhiên, nếu ứng dụng của bạn có thể xử lý các kết nối đến nhiều cổng MySQL, bạn có thể gửi các lần đọc tới trình nghe tổng hợp. Trình nghe này có ít chi phí hơn và nhanh hơn nhiều nếu so sánh với trình nghe chia tách đọc-ghi.
Đối với thiết lập sao chép MariaDB của chúng tôi, hãy kết nối với một trong những điểm cuối này dưới dạng kết hợp máy chủ / cổng cơ sở dữ liệu:
- 192.168.0.200 cổng 4008 - MaxScale - chỉ đọc / ghi hoặc ghi
- 192.168.0.200 cổng 4006 - MaxScale - chỉ đọc cân bằng
- 192.168.0.91 cổng 3306 - Máy chủ MariaDB (chính) - đọc / ghi
- 192.168.0.92 cổng 3306 - Máy chủ MariaDB (máy chủ) - chỉ đọc
- 192.168.0.93 cổng 3306 - Máy chủ MariaDB (máy chủ) - chỉ đọc
Lưu ý đối với loại cụm đa tổng thể như Cụm Galera và Cụm NDB, cổng 4006 có thể được sử dụng làm kết nối cân bằng đa ghi. Với MaxScale, bạn có nhiều tùy chọn để chọn khi kết nối với cơ sở dữ liệu, với mỗi tùy chọn đều cung cấp những ưu điểm riêng.
MaxScale Clustering với Docker Swarm
Với Docker Swarm, chúng ta có thể tạo một nhóm các phiên bản MaxScale thông qua dịch vụ Swarm với nhiều hơn một bản sao cùng với Swarm Configs. Đầu tiên, nhập tệp cấu hình vào Swarm:
$ cat maxscale.conf | docker config create maxscale_config -
Xác minh bằng:
$ docker config inspect --pretty maxscale_config
Sau đó, cấp cho người dùng cơ sở dữ liệu MaxScale kết nối từ bất kỳ máy chủ Swarm nào trong mạng:
MariaDB> CREATE USER 'maxscale'@'192.168.0.%' IDENTIFIED BY 'my_s3cret';
MariaDB> GRANT ALL PRIVILEGES ON *.* TO [email protected]'192.168.0.%';
Khi khởi động dịch vụ Swarm cho MaxScale, chúng ta có thể tạo nhiều vùng chứa (được gọi là bản sao) ánh xạ tới cùng một tệp cấu hình như bên dưới:
$ docker service create \
--name maxscale-cluster \
--replicas=3 \
--publish published=4008,target=4008 \
--publish published=4006,target=4006 \
--config source=maxscale_config,target=/etc/maxscale.cnf \
mariadb/maxscale
Ở trên sẽ tạo ba vùng chứa MaxScale trải rộng trên các nút Swarm. Xác minh bằng:
$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
yj6u2xcdj7lo maxscale-cluster replicated 3/3 mariadb/maxscale:latest *:4006->4006/tcp, *:4008->4008/tcp
Nếu các ứng dụng đang chạy trong mạng Swarm, bạn có thể chỉ cần sử dụng tên dịch vụ "maxscale-cluster" làm máy chủ cơ sở dữ liệu cho các ứng dụng của mình. Ở bên ngoài, bạn có thể kết nối với bất kỳ máy chủ lưu trữ Docker nào trên các cổng đã xuất bản và mạng Swarm sẽ định tuyến và cân bằng các kết nối đến các vùng chứa chính xác theo kiểu vòng tròn. Tại thời điểm này, kiến trúc của chúng tôi có thể được minh họa như sau:
Trong phần thứ hai, chúng ta sẽ xem xét các trường hợp sử dụng nâng cao của MaxScale trên Docker như kiểm soát dịch vụ, quản lý cấu hình, xử lý truy vấn, bảo mật và điều chỉnh cụm.