Trong blog trước, chúng tôi đã đề cập đến một số mẹo và thủ thuật để chuẩn bị một máy chủ MySQL cho việc sử dụng sản xuất từ góc độ quản trị viên hệ thống. Bài đăng trên blog này là sự tiếp nối ...
Sử dụng Công cụ sao lưu cơ sở dữ liệu
Mỗi công cụ sao lưu đều có ưu và nhược điểm riêng. Ví dụ:Percona Xtrabackup (hoặc MariaDB Backup cho MariaDB) có thể thực hiện sao lưu nóng vật lý mà không khóa cơ sở dữ liệu nhưng nó chỉ có thể được khôi phục về cùng một phiên bản trên một phiên bản khác. Trong khi đối với mysqldump, nó tương thích chéo với các phiên bản MySQL chính khác và cách đơn giản hơn để sao lưu một phần, mặc dù nó tương đối chậm hơn trong quá trình khôi phục nếu so với Percona Xtrabackup trên cơ sở dữ liệu lớn. MySQL 5.7 cũng giới thiệu mysqlpump, tương tự như mysqldump với khả năng xử lý song song để tăng tốc quá trình kết xuất.
Đừng bỏ lỡ cấu hình tất cả các công cụ sao lưu này trong máy chủ MySQL của bạn vì chúng có sẵn miễn phí và rất quan trọng để khôi phục dữ liệu. Vì mysqldump và mysqlpump đã được bao gồm trong MySQL 5.7 trở lên, chúng tôi chỉ cần cài đặt Percona Xtrabackup (hoặc MariaDB Backup cho MariaDB) nhưng nó yêu cầu một số chuẩn bị, như được hiển thị trong các bước sau:
Bước Một
Đảm bảo rằng công cụ sao lưu và các phần phụ thuộc của nó được cài đặt:
$ yum install -y epel-release
$ yum install -y socat pv percona-xtrabackup
Đối với máy chủ MariaDB, hãy sử dụng MariaDB Backup thay thế:
$ yum install -y socat pv MariaDB-Backup
Bước Hai
Tạo người dùng 'xtrabackup' trên trang cái nếu nó không tồn tại:
mysql> CREATE USER 'xtrabackup'@'localhost' IDENTIFIED BY 'Km4z9^sT2X';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'xtrabackup'@'localhost';
Bước Ba
Tạo một người dùng khác có tên 'mysqldump' trên master nếu nó không tồn tại. Người dùng này sẽ được sử dụng cho 'mysqldump' và 'mysqlpump':
mysql> CREATE USER 'mysqldump'@'localhost' IDENTIFIED BY 'Km4z9^sT2X';
mysql> GRANT SELECT, SHOW VIEW, EVENT, TRIGGER, LOCK TABLES, RELOAD, REPLICATION CLIENT ON *.* TO 'mysqldump'@'localhost';
Bước Bốn
Thêm thông tin đăng nhập của người dùng sao lưu bên trong tệp cấu hình MySQL theo chỉ thị [xtrabackup], [mysqldump] và [mysqlpump]:
$ cat /etc/my.cnf
...
[xtrabackup]
user=xtrabackup
password='Km4z9^sT2X'
[mysqldump]
user=mysqldump
password='Km4z9^sT2X'
[mysqlpump]
user=mysqldump
password='Km4z9^sT2X'
Bằng cách chỉ định các dòng trên, chúng ta không cần chỉ định tên người dùng và mật khẩu trong lệnh sao lưu vì công cụ sao lưu sẽ tự động tải các tùy chọn cấu hình đó từ tệp cấu hình chính.
Đảm bảo rằng các công cụ sao lưu đã được kiểm tra đúng cách trước đó. Đối với Xtrabackup hỗ trợ phát trực tuyến sao lưu qua mạng, điều này phải được kiểm tra trước để đảm bảo rằng liên kết giao tiếp có thể được thiết lập chính xác giữa máy chủ nguồn và máy chủ đích. Trên máy chủ đích, hãy chạy lệnh sau để socat lắng nghe cổng 9999 và sẵn sàng chấp nhận luồng đến:
$ socat -u tcp-listen:9999,reuseaddr stdout 2>/tmp/netcat.log | xbstream -x -C /var/lib/mysql
Sau đó, tạo bản sao lưu trên máy chủ nguồn và truyền trực tuyến đến cổng 9999 trên máy chủ đích:
$ innobackupex --socket=/var/lib/mysql/mysql.sock --stream=xbstream /var/lib/mysql/ | socat - TCP4:192.168.0.202:9999
Bạn sẽ nhận được một luồng đầu ra liên tục sau khi thực hiện lệnh sao lưu. Chờ cho đến khi bạn thấy dòng 'Đã hoàn tất OK' cho biết sao lưu thành công.
Với pv, chúng ta có thể điều chỉnh việc sử dụng băng thông hoặc xem tiến trình như một quá trình được dẫn qua nó. Thông thường, quá trình phát trực tuyến sẽ bão hòa mạng nếu không bật điều tiết và điều này có thể gây ra sự cố với các máy chủ khác tương tác với máy chủ khác trong cùng phân đoạn. Sử dụng pv, chúng ta có thể điều chỉnh quá trình phát trực tuyến trước khi chuyển nó sang công cụ phát trực tuyến như socat hoặc netcat. Ví dụ sau cho thấy luồng sao lưu sẽ được điều chỉnh khoảng 80 MB / s cho cả kết nối đến và đi:
$ innobackupex --slave-info --socket=/var/lib/mysql/mysql.sock --stream=xbstream /var/lib/mysql/ | pv -q -L 80m | socat - TCP4:192.168.0.202:9999
Truyền trực tuyến bản sao lưu thường được sử dụng để tạo máy chủ hoặc lưu trữ bản sao lưu từ xa trên một máy chủ khác.
Đối với mysqldump và mysqlpump, chúng ta có thể kiểm tra bằng các lệnh sau:
$ mysqldump --set-gtid-purged=OFF --all-databases
$ mysqlpump --set-gtid-purged=OFF --all-databases
Đảm bảo rằng bạn thấy các dòng không lỗi xuất hiện trong đầu ra.
Kiểm tra mức độ căng thẳng của Máy chủ
Kiểm tra căng thẳng máy chủ cơ sở dữ liệu là điều quan trọng để hiểu dung lượng tối đa mà chúng tôi có thể dự đoán cho máy chủ cụ thể. Điều này sẽ trở nên hữu ích khi bạn đang đạt đến ngưỡng hoặc nút thắt cổ chai ở giai đoạn sau. Bạn có thể sử dụng nhiều công cụ đo điểm chuẩn có sẵn trên thị trường như mysqlslap, DBT2 và sysbench.
Trong ví dụ này, chúng tôi sử dụng sysbench để đo hiệu suất cao nhất của máy chủ, mức độ bão hòa và cả nhiệt độ của các thành phần khi chạy trong môi trường khối lượng công việc cơ sở dữ liệu cao. Điều này sẽ cung cấp cho bạn hiểu biết cơ bản về mức độ tốt của máy chủ và dự đoán khối lượng công việc mà máy chủ có thể xử lý cho ứng dụng của chúng tôi trong quá trình sản xuất.
Để cài đặt và định cấu hình sysbench, bạn có thể biên dịch nó từ nguồn hoặc cài đặt gói từ kho lưu trữ Percona:
$ yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ yum install -y sysbench
Tạo lược đồ cơ sở dữ liệu và người dùng trên máy chủ MySQL:
mysql> CREATE DATABASE sbtest;
mysql> CREATE USER 'sbtest'@'localhost' IDENTIFIED BY 'sysbenchP4ss';
mysql> GRANT ALL PRIVILEGES ON sbtest.* TO [email protected]'localhost';
Tạo dữ liệu thử nghiệm:
$ sysbench \
/usr/share/sysbench/oltp_common.lua \
--db-driver=mysql \
--mysql-host=localhost \
--mysql-user=sbtest \
--mysql-password=sysbenchP4ss \
--tables=50 \
--table-size=100000 \
prepare
Sau đó chạy điểm chuẩn trong 1 giờ (3600 giây):
$ sysbench \
/usr/share/sysbench/oltp_read_write.lua \
--report-interval=2 \
--threads=64 \
--max-requests=0 \
--db-driver=mysql \
--time=3600 \
--db-ps-mode=disable \
--mysql-host=localhost \
--mysql-user=sbtest \
--mysql-password=sysbenchP4ss \
--tables=50 \
--table-size=100000 \
run
Trong khi chạy thử nghiệm, hãy sử dụng iostat (có sẵn trong gói sysstat) trong một thiết bị đầu cuối khác để theo dõi việc sử dụng đĩa, băng thông, IOPS và chờ I / O:
$ yum install -y sysstat
$ iostat -x 60
avg-cpu: %user %nice %system %iowait %steal %idle
40.55 0.00 55.27 4.18 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.19 6.18 1236.23 816.92 61283.83 14112.44 73.44 4.00 1.96 2.83 0.65 0.34 69.29
Kết quả trên sẽ được in sau mỗi 60 giây. Chờ cho đến khi quá trình kiểm tra kết thúc và lấy giá trị trung bình của r / s (đọc / giây), w / s (ghi / giây),% iowait,% use, rkB / s và wkB / s (băng thông). Nếu bạn đang thấy mức sử dụng đĩa, CPU, RAM hoặc mạng tương đối thấp, bạn có thể cần tăng giá trị "--threads" lên một con số cao hơn nữa để nó sẽ tận dụng tất cả tài nguyên ở mức giới hạn.
Hãy xem xét các khía cạnh sau để đo lường:
- Truy vấn mỗi giây =Tóm tắt Sysbench sau khi kiểm tra hoàn tất trong thống kê SQL -> Truy vấn -> Mỗi giây.
- Độ trễ truy vấn =Tóm tắt Sysbench sau khi kiểm tra hoàn tất trong Độ trễ (mili giây) -> phân vị thứ 95.
- Disk IOPS =Trung bình của r / s + w / s
- Sử dụng đĩa =Trung bình của% sử dụng
- Băng thông đĩa R / W =Trung bình rkB / s / Trung bình wkB / s
- Disk IO wait =Trung bình của% iowait
- Tải trung bình của máy chủ =Trung bình tải trung bình theo báo cáo của lệnh trên cùng.
- Mức sử dụng CPU trong MySQL =Mức sử dụng CPU trung bình theo báo cáo của lệnh trên cùng.
Với ClusterControl, bạn có thể dễ dàng quan sát và lấy các thông tin trên thông qua bảng điều khiển Nodes Tổng quan, như thể hiện trong ảnh chụp màn hình sau:
Hơn nữa, thông tin thu thập được trong quá trình kiểm tra căng thẳng có thể được sử dụng để điều chỉnh MySQL và các biến InnoDB tương ứng như innodb_buffer_pool_size, innodb_io_capacity, innodb_io_capacity_max, innodb_write_io_threads, innodb_read_io_threads và cả max_connections.
Để tìm hiểu thêm về điểm chuẩn hiệu suất của MySQL bằng sysbench, hãy xem bài đăng trên blog này, Cách đánh giá hiệu suất của MySQL &MariaDB bằng SysBench.
Sử dụng Công cụ Thay đổi Lược đồ Trực tuyến
Thay đổi lược đồ là điều không thể tránh khỏi trong cơ sở dữ liệu quan hệ. Khi ứng dụng phát triển và trở nên khắt khe hơn theo thời gian, nó chắc chắn yêu cầu một số thay đổi cấu trúc đối với cơ sở dữ liệu. Có một số thao tác DDL sẽ xây dựng lại bảng do đó chặn các câu lệnh DML khác chạy và điều này có thể ảnh hưởng đến tính khả dụng của cơ sở dữ liệu nếu bạn đang thực hiện các thay đổi cấu trúc trên một bảng lớn. Để xem danh sách các thao tác DDL chặn, hãy xem trang tài liệu MySQL này và tìm các thao tác có "Permits Concurrent DML" =No.
Nếu bạn không thể dành thời gian ngừng hoạt động trên máy chủ sản xuất khi thực hiện thay đổi giản đồ, có lẽ bạn nên định cấu hình công cụ thay đổi giản đồ trực tuyến ở giai đoạn đầu. Trong ví dụ này, chúng tôi cài đặt và định cấu hình gh-ost, một thay đổi giản đồ trực tuyến do Github xây dựng. Gh-ost sử dụng luồng nhật ký nhị phân để nắm bắt các thay đổi của bảng và áp dụng chúng vào bảng ma một cách không đồng bộ.
Để cài đặt gh-ost trên hộp CentOS, chỉ cần làm theo các bước sau:
Bước một
Tải xuống gh-ost mới nhất từ đây:
$ wget https://github.com/github/gh-ost/releases/download/v1.0.48/gh-ost-1.0.48-1.x86_64.rpm
Bước Hai
Cài đặt gói:
$ yum localinstall gh-ost-1.0.48-1.x86_64.rpm
Bước Ba
Tạo người dùng cơ sở dữ liệu cho gh-ost nếu nó không tồn tại và cấp cho nó các đặc quyền thích hợp:
mysql> CREATE USER 'gh-ost'@'{host}' IDENTIFIED BY 'ghostP455';
mysql> GRANT ALTER, CREATE, DELETE, DROP, INDEX, INSERT, LOCK TABLES, SELECT, TRIGGER, UPDATE ON {db_name}.* TO 'gh-ost'@'{host}';
mysql> GRANT SUPER, REPLICATION SLAVE ON *.* TO 'gh-ost'@'{host}';
** Thay {host} và {db_name} bằng các giá trị thích hợp của chúng. Lý tưởng nhất, {host} là một trong những máy chủ phụ sẽ thực hiện thay đổi giản đồ trực tuyến. Tham khảo tài liệu gh-ost để biết thêm chi tiết.
Bước Bốn
Tạo tệp cấu hình gh-ost để lưu tên người dùng và mật khẩu trong /root/.gh-ost.cnf:
[client]
user=gh-ost
password=ghostP455
Tương tự, bạn có thể cấu hình Percona Toolkit Online Schema Change (pt-osc) trên máy chủ cơ sở dữ liệu. Ý tưởng là đảm bảo rằng bạn đã chuẩn bị trước với công cụ này trên máy chủ cơ sở dữ liệu có khả năng sẽ chạy hoạt động này trong tương lai.
Sử dụng Bộ công cụ Percona
Percona Toolkit là một tập hợp các công cụ dòng lệnh mã nguồn mở nâng cao, do Percona phát triển, được thiết kế để thực hiện nhiều loại máy chủ MySQL, MongoDB và PostgreSQL và các tác vụ hệ thống quá khó hoặc phức tạp. thực hiện thủ công. Những công cụ này đã trở thành vị cứu tinh cuối cùng, được sử dụng bởi các DBA trên khắp thế giới để giải quyết hoặc giải quyết các vấn đề kỹ thuật được tìm thấy trong máy chủ MySQL và MariaDB.
Để cài đặt Bộ công cụ Percona, chỉ cần chạy lệnh sau:
$ yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
$ yum install percona-toolkit
Có hơn 30 công cụ có sẵn trong gói này. Một số trong số chúng được thiết kế đặc biệt cho MongoDB và PostgreSQL. Một số công cụ phổ biến nhất để khắc phục sự cố MySQL và điều chỉnh hiệu suất là pt-stalk, pt-mysql-Summary, pt-query-dig, pt-table-checksum, pt-table-sync và pt-archiver. Bộ công cụ này có thể giúp các DBA xác minh tính toàn vẹn của bản sao MySQL bằng cách kiểm tra tính nhất quán của dữ liệu chính và bản sao, lưu trữ hiệu quả các hàng, tìm các chỉ mục trùng lặp, phân tích các truy vấn MySQL từ nhật ký và tcpdump, v.v.
Ví dụ sau cho thấy một trong những công cụ (pt-table-checksum) đầu ra, nơi nó có thể thực hiện kiểm tra tính nhất quán của bản sao trực tuyến bằng cách thực hiện các truy vấn tổng kiểm tra trên bản chính, điều này tạo ra các kết quả khác nhau trên các bản sao không nhất quán với bản chính:
$ pt-table-checksum --no-check-binlog-format --replicate-check-only
Checking if all tables can be checksummed ...
Starting checksum ...
Differences on mysql2.local
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
mysql.proc 1 0 1
mysql.tables_priv 1 0 1
mysql.user 1 1 1
Kết quả trên cho thấy có 3 bảng trên nô lệ (mysql2.local) không phù hợp với bảng chính. Sau đó, chúng tôi có thể sử dụng công cụ pt-table-sync để vá dữ liệu bị thiếu từ cái chính hoặc đơn giản là đồng bộ hóa lại máy phụ một lần nữa.
Khóa Máy chủ
Cuối cùng, sau khi giai đoạn cấu hình và chuẩn bị hoàn tất, chúng ta có thể cách ly nút cơ sở dữ liệu khỏi mạng công cộng và hạn chế quyền truy cập của máy chủ đối với các máy và mạng đã biết. Bạn có thể sử dụng tường lửa (iptables, firewalld, ufw), nhóm bảo mật, hosts.allow và / hoặc hosts.deny hoặc đơn giản là vô hiệu hóa giao diện mạng đối diện với internet nếu bạn có nhiều giao diện mạng.
Đối với iptables, điều quan trọng là chỉ định nhận xét cho mọi quy tắc bằng cách sử dụng cờ '-m comment --comment':
$ iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -m comment --comment 'Allow local net to SSH port' -j ACCEPT
$ iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 3306 -m comment --comment 'Allow local net to MySQL port' -j ACCEPT
$ iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 9999 -m comment --comment 'Allow local net to backup streaming port' -j ACCEPT
$ iptables -A INPUT -p tcp -s 0.0.0.0/0 -m comment --comment 'Drop everything apart from the above' -j DROP
Tương tự đối với Tường lửa của Ubuntu (ufw), trước tiên chúng ta cần xác định quy tắc mặc định và sau đó có thể tạo quy tắc tương tự cho MySQL / MariaDB tương tự như sau:
$ sudo ufw default deny incoming comment 'Drop everything apart from the above'
$ sudo ufw default allow outgoing comment 'Allow outgoing everything'
$ sudo ufw allow from 192.168.0.0/24 to any port 22 comment 'Allow local net to SSH port'
$ sudo ufw allow from 192.168.0.0/24 to any port 3306 comment 'Allow local net to MySQL port'
$ sudo ufw allow from 192.168.0.0/24 to any port 9999 comment 'Allow local net to backup streaming port'
Bật tường lửa:
$ ufw enable
Sau đó, xác minh các quy tắc được tải đúng:
$ ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22 ALLOW IN 192.168.0.0/24 # Allow local net to SSH port
3306 ALLOW IN 192.168.0.0/24 # Allow local net to MySQL port
9999 ALLOW IN 192.168.0.0/24 # Allow local net to backup streaming port
Một lần nữa, điều rất quan trọng là chỉ định nhận xét về mọi quy tắc để giúp chúng tôi hiểu rõ hơn về quy tắc.
Đối với hạn chế truy cập cơ sở dữ liệu từ xa, chúng tôi cũng có thể sử dụng máy chủ VPN như được hiển thị trong bài đăng trên blog này, Sử dụng OpenVPN để Truy cập an toàn vào Cụm cơ sở dữ liệu của bạn trên Đám mây.
Kết luận
Chuẩn bị một máy chủ sản xuất rõ ràng không phải là một nhiệm vụ dễ dàng, điều mà chúng tôi đã trình bày trong loạt bài blog này. Nếu bạn lo lắng rằng mình sẽ làm hỏng, tại sao bạn không sử dụng ClusterControl để triển khai cụm cơ sở dữ liệu của mình? ClusterControl có một hồ sơ theo dõi rất tốt trong việc triển khai cơ sở dữ liệu và đã cho phép hơn 70.000 triển khai MySQL và MariaDB cho tất cả các môi trường cho đến nay.