MySQL InnoDB Cluster bao gồm 3 thành phần:
- MySQL Group Replication (một nhóm máy chủ cơ sở dữ liệu sao chép lẫn nhau với khả năng chịu lỗi).
- Bộ định tuyến MySQL (bộ định tuyến truy vấn đến các nút cơ sở dữ liệu lành mạnh)
- MySQL Shell (trình trợ giúp, ứng dụng khách, công cụ cấu hình)
Trong phần đầu tiên của hướng dẫn này, chúng ta sẽ triển khai MySQL InnoDB Cluster. Có một số hướng dẫn thực hành trực tuyến nhưng hướng dẫn này bao gồm tất cả các bước / lệnh cần thiết để cài đặt và chạy cụm ở một nơi. Chúng tôi sẽ đề cập đến hoạt động giám sát, quản lý và mở rộng quy mô cũng như một số vấn đề cần giải quyết khi xử lý MySQL InnoDB Cluster trong phần thứ hai của bài đăng blog này.
Sơ đồ sau minh họa kiến trúc sau triển khai của chúng tôi:
Chúng tôi sẽ triển khai tổng cộng 4 nút; Một bản sao nhóm MySQL ba nút và một nút bộ định tuyến MySQL cùng nằm trong máy chủ ứng dụng. Tất cả các máy chủ đang chạy trên Ubuntu 18.04 Bionic.
Cài đặt MySQL
Các bước sau phải được thực hiện trên tất cả các nút cơ sở dữ liệu db1, db2 và db3.
Đầu tiên, chúng ta phải thực hiện một số ánh xạ máy chủ. Điều này rất quan trọng nếu bạn muốn sử dụng tên máy chủ lưu trữ làm định danh máy chủ lưu trữ trong InnoDB Cluster và đây là cách được khuyến nghị nên làm. Ánh xạ tất cả các máy chủ như sau bên trong / etc / hosts:
$ vi /etc/hosts
192.168.10.40 router apps
192.168.10.41 db1 db1.local
192.168.10.42 db2 db2.local
192.168.10.43 db3 db3.local
127.0.0.1 localhost localhost.localdomain
Dừng và tắt AppArmor:
$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor
Tải xuống kho lưu trữ cấu hình APT mới nhất từ trang web kho lưu trữ MySQL Ubuntu tại https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/ . Tại thời điểm viết bài này, tệp mới nhất là vào ngày 15 tháng 10 năm 2019 là mysql-apt-config_0.8.14-1_all.deb:
$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb
Cài đặt gói và định cấu hình gói cho "mysql-8.0":
$ dpkg -i mysql-apt-config_0.8.14-1_all.deb
Cài đặt khóa GPG:
$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5
Cập nhật trình duyệt lại:
$ apt-get update
Cài đặt Python và theo sau là máy chủ MySQL và MySQL shell:
$ apt-get -y install mysql-server mysql-shell
Bạn sẽ thấy các trình hướng dẫn cấu hình sau:
- Đặt mật khẩu gốc - Chỉ định mật khẩu mạnh cho người dùng gốc MySQL.
- Đặt phương thức xác thực - Chọn "Sử dụng phương thức xác thực kế thừa (Duy trì khả năng tương thích MySQL 5.x)"
MySQL nên đã được cài đặt tại thời điểm này. Xác minh bằng:
$ systemctl status mysql
Đảm bảo bạn có trạng thái "hoạt động (đang chạy)".
Chuẩn bị Máy chủ cho Cụm InnoDB
Các bước sau phải được thực hiện trên tất cả các nút cơ sở dữ liệu db1, db2 và db3.
Định cấu hình máy chủ MySQL để hỗ trợ Nhân rộng Nhóm. Cách dễ nhất và được khuyến nghị để làm điều này là sử dụng MySQL Shell mới:
$ mysqlsh
Xác thực với tư cách là người dùng root cục bộ và làm theo trình hướng dẫn cấu hình tương ứng như được hiển thị trong ví dụ bên dưới:
MySQL JS > dba.configureLocalInstance("[email protected]:3306");
Sau khi xác thực, bạn sẽ nhận được một số câu hỏi như sau:
Trả lời những câu hỏi đó bằng các câu trả lời sau:
- Lựa chọn 2 - Tạo tài khoản quản trị mới cho cụm InnoDB với các khoản trợ cấp bắt buộc tối thiểu
- Tên tài khoản:[email protected]%
- Mật khẩu:mys3cret &&
- Xác nhận mật khẩu:mys3cret &&
- Bạn có muốn thực hiện các thay đổi cấu hình bắt buộc không ?:y
- Bạn có muốn khởi động lại phiên bản sau khi định cấu hình không ?:y
Đừng quên lặp lại điều trên trên tất cả các nút cơ sở dữ liệu. Tại thời điểm này, MySQL daemon sẽ lắng nghe tất cả các địa chỉ IP và Group Replication được kích hoạt. Bây giờ chúng ta có thể tiến hành tạo cụm.
Tạo Cụm
Bây giờ chúng ta đã sẵn sàng để tạo một cụm. Trên db1, kết nối với tư cách quản trị viên cụm từ MySQL Shell:
MySQL|JS> shell.connect('[email protected]:3306');
Creating a session to '[email protected]:3306'
Please provide the password for '[email protected]:3306': ***********
Save password for '[email protected]:3306'? [Y]es/[N]o/Ne[v]er (default No): Y
Fetching schema names for autocompletion... Press ^C to stop.
Your MySQL connection id is 9
Server version: 8.0.18 MySQL Community Server - GPL
No default schema selected; type \use <schema> to set one.
<ClassicSession:[email protected]:3306>
Bạn sẽ được kết nối dưới dạng [email protected] (bạn có thể biết bằng cách xem chuỗi dấu nhắc trước '>'). Bây giờ chúng ta có thể tạo một cụm mới:
MySQL|db1:3306 ssl|JS> cluster = dba.createCluster('my_innodb_cluster');
Kiểm tra trạng thái cụm:
MySQL|db1:3306 ssl|JS> cluster.status()
{
"clusterName": "my_innodb_cluster",
"defaultReplicaSet": {
"name": "default",
"primary": "db1:3306",
"ssl": "REQUIRED",
"status": "OK_NO_TOLERANCE",
"statusText": "Cluster is NOT tolerant to any failures.",
"topology": {
"db1:3306": {
"address": "db1:3306",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.18"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "db1:3306"
}
Tại thời điểm này, chỉ có db1 là một phần của cụm. Chế độ cấu trúc liên kết mặc định là Single-Primary, tương tự như khái niệm tập hợp bản sao trong đó chỉ có một nút là trình ghi tại một thời điểm. Các nút còn lại trong cụm sẽ là đầu đọc.
Chú ý đến trạng thái cụm cho biết OK_NO_TOLERANCE và giải thích thêm trong khóa statusText. Trong khái niệm tập hợp bản sao, một nút sẽ không cung cấp khả năng chịu lỗi. Cần có tối thiểu 3 nút để tự động chuyển đổi dự phòng nút chính. Chúng ta sẽ xem xét vấn đề này sau.
Bây giờ, hãy thêm nút thứ hai, db2 và chấp nhận phương thức khôi phục mặc định, "Nhân bản":
MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');
Ảnh chụp màn hình sau đây cho thấy tiến trình khởi tạo của db2 sau khi chúng tôi thực hiện lệnh trên. Hoạt động đồng bộ hóa được thực hiện tự động bởi MySQL:
Kiểm tra trạng thái cụm và db2:
MySQL|db1:3306 ssl|JS> cluster.status()
{
"clusterName": "my_innodb_cluster",
"defaultReplicaSet": {
"name": "default",
"primary": "db1:3306",
"ssl": "REQUIRED",
"status": "OK_NO_TOLERANCE",
"statusText": "Cluster is NOT tolerant to any failures.",
"topology": {
"db1:3306": {
"address": "db1:3306",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.18"
},
"db2:3306": {
"address": "db2:3306",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.18"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "db1:3306"
}
Tại thời điểm này, chúng ta có hai nút trong cụm, db1 và db2. Trạng thái vẫn hiển thị OK_NO_TOLERANCE với giải thích thêm dưới giá trị statusText. Như đã nêu ở trên, MySQL Group Replication yêu cầu ít nhất 3 nút trong một cụm để chịu lỗi. Đó là lý do tại sao chúng ta phải thêm nút thứ ba như hình tiếp theo.
Thêm nút cuối cùng, db3 và chấp nhận phương thức khôi phục mặc định, "Sao chép" tương tự như db2:
MySQL|db1:3306 ssl|JS> cluster.addInstance('[email protected]:3306');
Ảnh chụp màn hình sau đây cho thấy tiến trình khởi tạo của db3 sau khi chúng tôi thực hiện lệnh trên. Hoạt động đồng bộ hóa được thực hiện tự động bởi MySQL:
Kiểm tra trạng thái cụm và db3:
MySQL|db1:3306 ssl|JS> cluster.status()
{
"clusterName": "my_innodb_cluster",
"defaultReplicaSet": {
"name": "default",
"primary": "db1:3306",
"ssl": "REQUIRED",
"status": "OK",
"statusText": "Cluster is ONLINE and can tolerate up to ONE failure.",
"topology": {
"db1:3306": {
"address": "db1:3306",
"mode": "R/W",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.18"
},
"db2:3306": {
"address": "db2:3306",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.18"
},
"db3:3306": {
"address": "db3:3306",
"mode": "R/O",
"readReplicas": {},
"replicationLag": null,
"role": "HA",
"status": "ONLINE",
"version": "8.0.18"
}
},
"topologyMode": "Single-Primary"
},
"groupInformationSourceMember": "db1:3306"
}
Bây giờ cụm có vẻ ổn, ở đó trạng thái là OK và cụm có thể chịu đựng tối đa một nút lỗi cùng một lúc. Nút chính là db1 nơi nó hiển thị "chính":"db1:3306" và "chế độ":"R / W", trong khi các nút khác ở trạng thái "R / O". Nếu bạn kiểm tra giá trị read_only và super_read_only trên các nút RO, cả hai đều hiển thị là true.
Việc triển khai Nhân rộng Nhóm MySQL của chúng tôi hiện đã hoàn tất và được đồng bộ hóa.
Triển khai Bộ định tuyến
Trên máy chủ ứng dụng mà chúng tôi sẽ chạy ứng dụng của mình, hãy đảm bảo ánh xạ máy chủ lưu trữ là chính xác:
$ vim /etc/hosts
192.168.10.40 router apps
192.168.10.41 db1 db1.local
192.168.10.42 db2 db2.local
192.168.10.43 db3 db3.local
127.0.0.1 localhost localhost.localdomain
Dừng và tắt AppArmor:
$ service apparmor stop
$ service apparmor teardown
$ systemctl disable apparmor
Sau đó cài đặt gói kho lưu trữ MySQL, tương tự như những gì chúng ta đã thực hiện khi thực hiện cài đặt cơ sở dữ liệu:
$ wget https://repo.mysql.com/apt/ubuntu/pool/mysql-apt-config/m/mysql-apt-config/mysql-apt-config_0.8.14-1_all.deb
$ dpkg -i mysql-apt-config_0.8.14-1_all.deb
Thêm khóa GPG:
$ apt-key adv --recv-keys --keyserver ha.pool.sks-keyservers.net 5072E1F5
Cập nhật danh sách repo:
$ apt-get update
Cài đặt bộ định tuyến và ứng dụng khách MySQL:
$ apt-get -y install mysql-router mysql-client
MySQL Router hiện đã được cài đặt trong / usr / bin / mysqlrouter. Bộ định tuyến MySQL cung cấp cờ bootstrap để tự động cấu hình hoạt động của bộ định tuyến với cụm MySQL InnoDB. Những gì chúng ta cần làm là chỉ định chuỗi URI cho một trong các nút cơ sở dữ liệu với tư cách là người dùng quản trị cụm InnoDB (clusteradmin).
Để đơn giản hóa cấu hình, chúng tôi sẽ chạy quy trình mysqlrouter với tư cách người dùng root:
$ mysqlrouter --bootstrap [email protected]:3306 --directory myrouter --user=root
Đây là những gì chúng ta sẽ nhận được sau khi chỉ định mật khẩu cho người dùng clusteradmin:
Lệnh bootstrap sẽ hỗ trợ chúng tôi tạo tệp cấu hình bộ định tuyến tại /root/myrouter/mysqlrouter.conf. Bây giờ chúng ta có thể khởi động trình nền mysqlrouter bằng lệnh sau từ thư mục hiện tại:
$ myrouter/start.sh
Xác minh xem các cổng dự kiến có đang lắng nghe chính xác hay không:
$ netstat -tulpn | grep mysql
tcp 0 0 0.0.0.0:6446 0.0.0.0:* LISTEN 14726/mysqlrouter
tcp 0 0 0.0.0.0:6447 0.0.0.0:* LISTEN 14726/mysqlrouter
tcp 0 0 0.0.0.0:64470 0.0.0.0:* LISTEN 14726/mysqlrouter
tcp 0 0 0.0.0.0:64460 0.0.0.0:* LISTEN 14726/mysqlrouter
Giờ đây, ứng dụng của chúng tôi có thể sử dụng cổng 6446 để đọc / ghi và 6447 cho các kết nối MySQL chỉ đọc.
Kết nối với Cụm
Hãy tạo một người dùng cơ sở dữ liệu trên nút chính. Trên db1, kết nối với máy chủ MySQL thông qua MySQL shell:
$ mysqlsh [email protected]:3306
Chuyển từ chế độ Javascript sang chế độ SQL:
MySQL|localhost:3306 ssl|JS> \sql
Switching to SQL mode... Commands end with ;
Tạo cơ sở dữ liệu:
MySQL|localhost:3306 ssl|SQL> CREATE DATABASE sbtest;
Tạo người dùng cơ sở dữ liệu:
MySQL|localhost:3306 ssl|SQL> CREATE USER [email protected]'%' IDENTIFIED BY 'password';
Cấp cho người dùng cơ sở dữ liệu:
MySQL|localhost:3306 ssl|SQL> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected]'%';
Bây giờ cơ sở dữ liệu và người dùng của chúng tôi đã sẵn sàng. Hãy cài đặt sysbench để tạo một số dữ liệu thử nghiệm. Trên máy chủ ứng dụng, hãy thực hiện:
$ apt -y install sysbench mysql-client
Bây giờ chúng ta có thể kiểm tra trên máy chủ ứng dụng để kết nối với máy chủ MySQL thông qua bộ định tuyến MySQL. Để ghi kết nối, hãy kết nối với cổng 6446 của máy chủ bộ định tuyến:
$ mysql -usbtest -p -h192.168.10.40 -P6446 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user() | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db1 | 0 | 0 |
+---------------+------------+-------------+-------------------+
Đối với kết nối chỉ đọc, hãy kết nối với cổng 6447 của máy chủ bộ định tuyến:
$ mysql -usbtest -p -h192.168.10.40 -P6447 -e 'select user(), @@hostname, @@read_only, @@super_read_only'
+---------------+------------+-------------+-------------------+
| user() | @@hostname | @@read_only | @@super_read_only |
+---------------+------------+-------------+-------------------+
| [email protected] | db3 | 1 | 1 |
+---------------+------------+-------------+-------------------+
Có vẻ tốt. Bây giờ chúng ta có thể tạo một số dữ liệu thử nghiệm với sysbench. Trên máy chủ ứng dụng, tạo 20 bảng với 100.000 hàng trên mỗi bảng bằng cách kết nối với cổng 6446 của máy chủ ứng dụng:
$ sysbench \
/usr/share/sysbench/oltp_common.lua \
--db-driver=mysql \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--mysql-port=6446 \
--mysql-host=192.168.10.40 \
--tables=20 \
--table-size=100000 \
prepare
Để thực hiện kiểm tra đọc-ghi đơn giản trên cổng 6446 trong 300 giây, hãy chạy:
$ sysbench \
/usr/share/sysbench/oltp_read_write.lua \
--report-interval=2 \
--threads=8 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6446 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run
Đối với khối lượng công việc chỉ đọc, chúng tôi có thể gửi kết nối MySQL đến cổng 6447:
$ sysbench \
/usr/share/sysbench/oltp_read_only.lua \
--report-interval=2 \
--threads=1 \
--time=300 \
--db-driver=mysql \
--mysql-host=192.168.10.40 \
--mysql-port=6447 \
--mysql-user=sbtest \
--mysql-db=sbtest \
--mysql-password=password \
--tables=20 \
--table-size=100000 \
run
Kết luận
Vậy là xong. Thiết lập MySQL InnoDB Cluster của chúng tôi hiện đã hoàn tất với tất cả các thành phần của nó đang chạy và thử nghiệm. Trong phần thứ hai, chúng ta sẽ xem xét các hoạt động quản lý, giám sát và mở rộng quy mô của cụm cũng như các giải pháp cho một số vấn đề thường gặp khi xử lý MySQL InnoDB Cluster. Hãy theo dõi!