Làm cách nào để cải thiện hiệu suất sao chép MySQL?

Giới thiệu

mysql
Sao chép là một số công nghệ phức tạp và linh hoạt. Như chúng ta đã thảo luận trong
bài viết gần đây của chúng tôi "Sửa lỗi
Bản sao MySQL", nó có thể được thực hiện khá đáng tin cậy và mạnh mẽ nếu
các công cụ phù hợp được sử dụng để giữ cho nó hoạt động trơn tru

Nhưng mà
những trang web đang gặp tải trọng lớn trên máy chủ chính là gì,
đang quá tải máy chủ nô lệ. Có cách nào để tăng tốc hiệu suất, vì vậy
nô lệ có thể theo kịp?
cái này. Chúng ta sẽ thảo luận về một số trong số họ

Ngành kiến ​​​​trúc

Đầu tiên,
thảo luận nhanh về kiến ​​trúc. Như bạn nhớ lại, có hai chủ đề
trên nô lệ đang thực hiện công việc. Một là chủ đề IO, sao chép
giao dịch từ nhật ký nhị phân của máy chủ chính sang nhật ký chuyển tiếp nô lệ. Các
tiếp theo là luồng SQL. Đây là cái quan trọng. Nó đọc các bản ghi chuyển tiếp
và áp dụng các truy vấn SQL đối với cơ sở dữ liệu nô lệ theo kiểu nối tiếp
Một lần nữa, điều đó có nghĩa là tất cả các ghi được tuần tự hóa trên cơ sở dữ liệu nô lệ. Cái này
có thể trở thành một nút cổ chai hiệu suất trong môi trường giao dịch cao

Sử dụng nhiều nô lệ

Một
phương pháp sẽ là chia nhỏ dữ liệu thành nhiều nô lệ. Điều này có thể được thực hiện
cơ sở dữ liệu theo cơ sở dữ liệu (lược đồ theo lược đồ) tạo một cơ sở dữ liệu nô lệ. Mỗi
nô lệ sẽ trỏ đến cùng một chủ và sử dụng bản sao_do_db và bản sao_ignore_db
các câu lệnh để chỉ định dữ liệu nào cần thu thập cho nô lệ của nó. Tuy nhiên nó có thể là
rằng các ứng dụng của bạn không bị chia nhỏ theo cách đó hoặc cách tải ưu tiên
các bảng nhất định, thay vì các lược đồ nhất định. Vì vậy, đối với trang web của bạn có thể có
lý do để làm điều đó trên cơ sở từng bàn. Sau đó, bạn sẽ sử dụng replica_do_table
và replica_ignore_table. Bạn cũng cần lưu ý rằng nhiều nô lệ hơn
có nghĩa là nhiều luồng hơn trên cơ sở dữ liệu chính, có thể thêm tải ở đó. nếu bạn
gặp sự cố đó, hãy xem xét việc tạo bản phân phối chính, rồi sau đó
làm nô lệ cho điều đó. Khi xem xét thêm, hãy nhận ra rằng nếu bạn
chạy các bản sao lưu của cơ sở dữ liệu nô lệ, các tập lệnh sao lưu của bạn rõ ràng sẽ là
phức tạp hơn trong sự sắp xếp này, vì vậy tài liệu tốt

Mồi bộ đệm

A
phương pháp thứ hai sẽ là thực hiện cái được gọi là "mồi bộ đệm"
Nhớ lại rằng mỗi câu lệnh SQL, được thực thi trên máy chủ, được thực hiện lại
trên cơ sở dữ liệu nô lệ. Tất cả các công việc liên quan đến việc đọc các khối dữ liệu,
sắp xếp và lưu trữ chi tiết thực thi truy vấn phải xảy ra lại trên nô lệ
Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta có thể làm tất cả điều này TRƯỚC KHI chuỗi SQL nô lệ đạt được điều đó
truy vấn. Đó là những gì công cụ tìm nạp trước maatkit mk-slave được xây dựng để làm. Một số
các trang web đã thành công rực rỡ với phương pháp này, vì vậy rất đáng để điều tra
Như với bất kỳ thứ gì, hãy kiểm tra, chỉnh sửa và đánh giá trước khi đưa vào sản xuất

Di chuyển ghi bên ngoài bản sao

A
phương pháp thứ ba sẽ là di chuyển ghi bên ngoài sao chép. cái đó làm gì
nghĩa là?
cơ sở dữ liệu. Sau đó, bạn có thể sử dụng tùy chọn replica_ignore_tables để bỏ qua những
các bảng lưu trữ, sau đó chỉ cần chạy một quy trình tải dữ liệu riêng biệt trên nô lệ để
lấy dữ liệu đó vào cơ sở dữ liệu nô lệ của bạn. Vì điều này cũng có thể được thực hiện song song,
nó có thể cung cấp tốc độ đáng ngạc nhiên

Hệ thống con Tune Disk IO

A
phương pháp thứ tư có thể là xem xét hệ thống con đĩa bên dưới. Bạn đang sử dụng
ĐỘT KÍCH? . Bạn có thể lấy đĩa nhanh hơn không, hoặc thêm nhiều trục quay vào
mảng RAID của bạn?
âm lượng nơi các tệp dữ liệu của bạn đang ngồi

Xem xét Công cụ lưu trữ MyISAM

A
tùy chọn thứ năm sẽ là xem xét sử dụng công cụ lưu trữ MyISAM trên nô lệ
bên cho những bảng cao viết nặng. Nhớ lại rằng MyISAM không phải là
giao dịch. Có một số lượng lớn mã liên quan đến việc cung cấp
khóa dựa trên hàng và tuân thủ ACID bạn tìm thấy trong InnoDB và liên quan
công cụ lưu trữ giao dịch. MyISAM cực kỳ nhanh bởi vì nó không
phải kiểm tra bất cứ điều gì. Nó chỉ đơn giản là viết. Vì vậy, nó rất rất nhanh

Bạn
có thể hỏi, nhưng còn tính toàn vẹn trong giao dịch của tôi thì sao. Hãy nhớ rằng tất cả
các giao dịch được tuần tự hóa trên nô lệ, vì vậy không phải lo lắng về các giao dịch khác
phiên đọc hoặc ghi cùng một dữ liệu. Bạn chỉ cần lo lắng về
chủ đề SQL

Từ bỏ một số an toàn

Các
tùy chọn thứ sáu mà chúng tôi sẽ đề cập liên quan đến việc từ bỏ một số tính năng an toàn và khả năng phục hồi trên
nô lệ. Vì cơ sở dữ liệu nô lệ của bạn có lẽ là một bản sao dữ liệu được giữ
ở nơi khác, đề xuất các tùy chọn kém an toàn hơn có thể được nhìn thấy trong bối cảnh đó. Rõ ràng,
đảm bảo tất cả dữ liệu của bạn đã được sao lưu đầy đủ ở nhiều nơi

Trước hết,
bạn có thể tắt nhật ký nhị phân trên nô lệ. Điều này sẽ làm giảm lượng
dữ liệu cần được ghi trong khi nô lệ đang thực hiện các truy vấn từ SQL
chủ đề

thứ hai
bạn có thể định cấu hình InnoDB để xóa các thay đổi của nó ít thường xuyên hơn bằng cách sử dụng innodb_flush_log_at_trx_commit=2
Ngoài ra, bạn có thể đặt innodb_locks_unsafe_for_binlog=1. Đối với MyISAM có
cài đặt delay_key_write=ALL có thể hữu ích

Từ
các tùy chọn này làm cho cơ sở dữ liệu của bạn khó phục hồi hơn, bạn muốn RẤT CHẮC CHẮN
vô hiệu hóa chúng nếu nô lệ này trở thành chủ tại một số điểm

Nếu
các tùy chọn trên không phù hợp với bạn, hãy cân nhắc xem MySQL 5. 1. Cái mới
phiên bản MySQL bao gồm một tính năng được gọi là sao chép dựa trên hàng. Ngược lại
với bản sao dựa trên câu lệnh hiện có, dựa trên hàng thường có thể tránh thực hiện lại
các câu lệnh trên nô lệ bằng cách chuyển dọc theo vectơ thay đổi của dữ liệu thực tế
thay đổi trên chính. Thời gian sẽ trả lời nếu hiệu suất tổng thể là
nhanh hơn đáng kể, nhưng nó đáng để điều tra

Phần kết luận

Khi nào
tìm cách tăng tốc nô lệ, hãy nhớ rằng độ trễ của nô lệ
máy chủ là bình thường. Công nghệ nô lệ sẵn có của MySQL không có nghĩa là
đồng bộ. Nếu ứng dụng của bạn có yêu cầu đó, chúng tôi khuyên bạn nên xem
các bản vá lỗi của Google để cung cấp bản sao bán đồng bộ. Chúng ta sẽ thảo luận về điều đó
chi tiết hơn trong bài báo của tháng tới khi chúng tôi tiếp tục điều tra về
kỹ thuật sao chép MySQL nâng cao

»
Xem tất cả các bài viết của chuyên mục Sean Hull

Làm cách nào để giảm độ trễ sao chép trong MySQL?

Đầu tiên, chúng tôi đảm bảo rằng MySQL không bao giờ đồng bộ hóa nhật ký nhị phân với đĩa . Thay vào đó, thỉnh thoảng chúng tôi để hệ điều hành làm việc đó. Lưu ý rằng giá trị mặc định của sync_binlog là 0, nhưng chúng tôi đã sử dụng giá trị cao hơn để tránh sự cố thay vì sự cố.

Làm cách nào để sao chép nhanh hơn?

Đảm bảo phân bổ hợp lý tệp dữ liệu cơ sở dữ liệu và tệp nhật ký . Sử dụng một ổ đĩa riêng cho nhật ký giao dịch cho tất cả các cơ sở dữ liệu liên quan đến sao chép. Bạn có thể giảm thời gian ghi giao dịch bằng cách lưu trữ tệp nhật ký trên ổ đĩa khác với ổ đĩa được sử dụng để lưu trữ cơ sở dữ liệu.

Tại sao sao chép MySQL chậm?

Đây là vì bản sao MySQL là luồng đơn (SQL_THREAD), theo mặc định . Nếu một khối lượng lớn ghi vào phiên bản CSDL nguồn diễn ra song song, thì việc ghi vào bản sao chỉ có quyền đọc sẽ được đánh số tuần tự bằng cách sử dụng một SQL_THREAD duy nhất. Điều này có thể gây ra độ trễ giữa phiên bản CSDL nguồn và bản sao chỉ có quyền đọc.

Điều gì gây ra độ trễ sao chép?

Độ trễ sao chép có thể xảy ra trong một số trường hợp, chẳng hạn như. Phiên bản chính không thể gửi các thay đổi đủ nhanh đến bản sao . Bản sao không thể nhận các thay đổi đủ nhanh. Bản sao không thể áp dụng các thay đổi đủ nhanh.