LAG MySQL

MySQL là một trong những kho lưu trữ dữ liệu giao dịch phổ biến và đáng tin cậy nhất trên thế giới và không có gì ngạc nhiên khi Flipkart quản lý một trong những nhóm MySQL lớn nhất của Ấn Độ vì thương mại điện tử là một miền, vốn nặng về xử lý dữ liệu giao dịch

Bất kỳ ai đã từng làm việc với MySQL đều nhận thức rõ về độ trễ sao chép khi hệ thống trải qua quy mô lớn. Mặc dù không có gì lạ khi xảy ra độ trễ sao chép, kích thước, quy mô và tần suất dữ liệu được xử lý trong suốt cả năm và đặc biệt là trong quá trình bán hàng, nhưng chúng tôi không thể bỏ qua tác động về chức năng, hoạt động và kinh doanh do độ trễ sao chép gây ra. Trong Ngày bán hàng tỷ đô lớn của Flipkart, một số lượng lớn các cụm luôn được sử dụng để tạo độ trễ sao chép trên các bản sao và nhóm Altair đã xây dựng lại các nút để khắc phục sự cố. Chúng tôi đã xác định các cụm đang đối mặt với các vấn đề về độ trễ sao chép cao và đưa ra lý do tương tự

Với vai trò là nền tảng trung tâm, chúng tôi đã phân tích các loại khối lượng công việc, lược đồ và mẫu truy vấn khác nhau để đưa ra một hướng dẫn đầy đủ tài liệu về quản lý độ trễ Sao chép

Bài viết này là tài khoản của cuộc điều tra, phân tích, thử nghiệm, kết quả và đề xuất để quản lý độ trễ sao chép như một phần của nhóm MySQL được quản lý tập trung tại Flipkart

Phân tích

Altair là một dịch vụ DBaaS cho MySQL được xây dựng dựa trên các cấu trúc Nền tảng đám mây Flipkart, cung cấp trải nghiệm quản lý cụm/bảo trì/cung cấp MySQL liền mạch và cung cấp cơ sở hạ tầng tóm tắt với tích hợp dịch vụ nền tảng hoàn chỉnh

Số liệu thống kê và quan sát

Altair (DBaaS của Flipkart) quản lý khoảng 700 cụm tính đến ngày hôm nay và trong số này, 450 cụm lẻ đang chạy trên MySQL v5. 7 và 250 cụm lẻ vẫn đang chạy trên MySQL v. 5. 6. Các cụm này chạy các khối lượng công việc khác nhau, ví dụ: Hệ thống quản lý Đơn hàng, Vận chuyển và Kho hàng, Hệ thống kế toán. Đối với kích thước dữ liệu, các cụm này nằm trong khoảng từ 500GB đến 3TB

Chúng tôi bắt đầu phân tích bằng cách thu thập độ trễ sao chép được quan sát trong khoảng thời gian 3 tháng qua trên tất cả các cụm trong Altair. Cùng với độ trễ sao chép, chúng tôi đã thu thập phiên bản MySQL của cụm và định dạng nhật ký nhị phân được sử dụng trong cụm và QPS cũng được quan sát thấy trên cụm khi độ trễ sao chép cao (> 1000 giây)

Tổng số cụm. 700

Độ trễ sao chép cao MySQL 5. 6 cụm. 26

Độ trễ sao chép cao MySQL 5. 7 cụm. 3

Hầu hết độ trễ sao chép cao trong các phiên bản sao chép được quan sát thấy trong MySQL phiên bản 5. 6. Trong các cụm trên MySQL phiên bản 5. 7, QPS cao trên Master

Độ trễ sao chép là gì?

MySQL hỗ trợ sao chép dữ liệu vào một số nút khác (VM hoặc Pod) được gọi là bản sao để có độ tin cậy và tính khả dụng cao hơn. Các nút này mà dữ liệu được sao chép được gọi đơn giản là Bản sao. Chúng lưu trữ toàn bộ dữ liệu chứ không chỉ một phần dữ liệu (không giống như một số hệ thống phân tán khác) — tuy nhiên, dữ liệu này có thể hoàn toàn đồng bộ (hoặc nhất quán) với nút Nguồn hoặc không đồng bộ (hoặc cuối cùng nhất quán) với nút Nguồn

Có nhiều khía cạnh khác nhau của việc sao chép dữ liệu

  1. Sử dụng tệp/con trỏ có tên là Nhật ký nhị phân hoặc Mã định danh giao dịch toàn cầu
  2. Sử dụng các chế độ ASYNC hoặc SEMI-SYNC hoặc SYNC để đồng bộ hóa dữ liệu này (mỗi chế độ đều có ưu và nhược điểm)

Bản sao này thường được thực hiện theo hai giai đoạn để duy trì tính toàn vẹn của dữ liệu

  1. Truyền mạng — còn được gọi là luồng IO — kéo dữ liệu từ Nguồn đến Bản sao vào một tệp có tên là nhật ký chuyển tiếp
  2. Áp dụng trên MySQL — còn được gọi là luồng SQL — đọc từ nhật ký chuyển tiếp và ghi vào MySQL để giữ nguyên thứ tự

mysql 5. 5 có một luồng SQL duy nhất để áp dụng các sự kiện nhật ký chuyển tiếp và MySQL 5. 6 đã giới thiệu một bản sao song song (nhiều luồng SQL) để áp dụng nhật ký chuyển tiếp ở cấp cơ sở dữ liệu/lược đồ. Trong MySQL5. 7, chúng ta có thể có nhiều luồng SQL trên bản sao để áp dụng các sự kiện nhật ký chuyển tiếp cho cùng một cam kết nhóm

Độ trễ của bản sao là sự bổ sung độ trễ do cả hai luồng gây ra - về mặt thời gian - sự khác biệt giữa thời gian một truy vấn được thực thi trên MySQL nguồn và thời gian nó được thực thi trên MySQL bản sao

Tại sao Replication Lag quan trọng?

Đây là một ví dụ đơn giản về những gì có thể xảy ra nếu các hệ thống được thiết kế mà không tính đến độ trễ sao chép

Hãy xem xét một trang web thương mại điện tử quá đơn giản với hệ thống quản lý đơn hàng đơn giản (OMS) do MySQL cung cấp — bất cứ khi nào ai đó đặt hàng một mặt hàng từ trang web, nó sẽ được ghi vào cơ sở dữ liệu này. Và khi ai đó muốn biết trạng thái đơn đặt hàng của họ, nó sẽ được đọc từ cơ sở dữ liệu này. Nhóm nghĩ rằng tốt nhất là chuyển hướng các lần đọc sang một nút khác để giảm tải cho Chính

Vì vậy, về mặt kỹ thuật, việc ghi đơn đặt hàng đang diễn ra đối với Chính trong khi chi tiết đơn đặt hàng đang được đọc từ Bản sao và hiển thị trên trang web. Có vẻ như đó là một điều công bằng khi không có nhiều quy mô; . e. — vào hầu hết các ngày / BAU — tuy nhiên, đây là điều có thể xảy ra, nếu có quy mô đáng kể và độ trễ của bản sao

Giả sử có thêm một hệ thống ở đây — Hệ thống quản lý kho hàng (WMS), xử lý các đơn đặt hàng từ kho hàng

Bây giờ, hãy tưởng tượng có một đợt giảm giá và do tải quá lớn trên hệ thống, Bản sao bị trễ 10 giờ. Điều này có nghĩa là nó sẽ phản ánh trạng thái của đơn đặt hàng gần 10 giờ trước, trong trường hợp đó, đây là cách mọi thứ hiện tại

  1. Ai đó đặt hàng trên trang web không nhìn thấy đơn hàng đó ngay lập tức trên trang 'Đơn hàng của tôi' — dẫn đến việc leo thang dịch vụ chăm sóc khách hàng không cần thiết
  2. Nếu một đơn đặt hàng đã được gửi đi, khách hàng vẫn thấy bản cập nhật 10 giờ trước được đặt trước và điều này cũng có thể dẫn đến sự leo thang không cần thiết
  3. Nếu một đơn hàng thực sự được gửi đi và chúng tôi hiển thị đơn hàng đó là đã đặt trước, điều này có thể nhắc khách hàng 'hủy' đơn hàng
  4. Việc hủy bỏ như vậy gây tốn kém rất nhiều cho tổ chức vì sản phẩm đã được gửi đi

> Chi phí vận chuyển sản phẩm về kho

> Chi phí kiểm tra QA

> Chi phí đóng gói

Những chi phí bổ sung này không chỉ là tiền bạc mà còn là tổn thất về công sức, thời gian và sự hài lòng của khách hàng, mặc dù khách hàng muốn sản phẩm và quy trình làm việc đang diễn ra theo kế hoạch

Tại sao một số đội trỏ các lần đọc của họ vào Bản sao?

Đôi khi, trường hợp sử dụng không bị ảnh hưởng bởi độ trễ của Bản sao hoặc các hệ thống cũng có thể được thiết kế để đạt được tính nhất quán cuối cùng. Ví dụ,

Hãy nói về cập nhật hàng tồn kho - nếu 1000 số lượng của một hàng tồn kho cụ thể đã được chuyển vào kho tại thời điểm t0 trong khi quá trình cập nhật hệ thống quản lý đơn hàng đang diễn ra từ Bản sao đang chạy chậm vài giờ, thì có

Hoặc một ví dụ khác là — nếu các báo cáo đang được tạo từ cơ sở dữ liệu thường chạy với độ trễ sao chép vài giờ, thì các báo cáo đó không thực sự bị ảnh hưởng bởi vì chúng tôi biết rằng chúng không truy vấn dữ liệu mới nhất mà quan tâm nhiều hơn

Điều đó nói rằng, đôi khi các nhóm bắt đầu với các trường hợp sử dụng thực sự có ít hoặc không có tác động do độ trễ sao chép đối với trường hợp sử dụng cụ thể, nhưng cuối cùng cũng tích hợp một số tính năng vẫn ổn với độ trễ giới hạn chứ không phải độ trễ không giới hạn. Một lý do khác khiến các nhóm làm điều này là để giảm áp lực cho Chính và chuyển hướng một số lưu lượng truy cập sang nhiều Bản sao

Chúng tôi đã chạy thử nghiệm để hiểu liệu việc nâng cấp phiên bản cụm từ 5. 6 đến 5. 7 có thể giúp giảm thiểu các vấn đề về độ trễ sao chép. Điều này giúp chúng tôi kiểm tra các giả thuyết của mình mà không tin tưởng một cách mù quáng vào bất kỳ điểm chuẩn bên ngoài nào

Thiết lập thử nghiệm

Chúng tôi đã triển khai hai cụm MySQL, một với MySQL 5. 6 và một cái khác với MySQL 5. 7, với mỗi cụm chứa hai nút, Master và Hot Standby

Chi tiết phần cứng

Chúng tôi đã chọn một số cấu hình phần cứng được triển khai phổ biến nhất để thử nghiệm

Chi tiết phần mềm

Cấu hình MySQL

Chúng tôi đã kết luận bằng cách thực hiện bài tập bằng cách điều chỉnh các cấu hình bên dưới vì chúng ảnh hưởng đến độ trễ sao chép

Công cụ tính điểm chuẩn

Trong nhóm nền tảng Flipkart, chúng tôi ưu tiên chạy điểm chuẩn bằng nhiều công cụ điểm chuẩn khác nhau có sẵn cho tập hợp xác thực ban đầu và sau đó liên quan đến nhóm chức năng để xác thực các trường hợp sử dụng

Có một số công cụ đo điểm chuẩn có sẵn trên thị trường giúp chúng tôi kiểm tra nhiều tình huống cơ sở dữ liệu. Mỗi công cụ này cung cấp các khối lượng công việc khác nhau có thể phù hợp với các bộ cơ sở dữ liệu khác nhau và khả năng của chúng

  • YCSB. Cung cấp khối lượng công việc đơn giản, phù hợp nhất cho việc đánh giá cơ sở dữ liệu NoSQL
  • TPC-C. Mô phỏng khối lượng công việc OLTP. Nó có các loại giao dịch phức tạp hơn và mô phỏng các hệ thống nhà cung cấp bán buôn, phổ biến hơn trong các hệ thống thương mại điện tử. Về cơ bản được sử dụng để đo thông lượng và độ ổn định của hệ thống
  • sysbench. Cung cấp khối lượng công việc phù hợp nhất cho MySQL (DBMS) và có thể tùy chỉnh theo yêu cầu

Trong thử nghiệm của mình, chúng tôi ưu tiên sử dụng công cụ Sysbench vì nó cung cấp khối lượng công việc giao dịch với nhiều bảng

Lệnh_______0Kế hoạch kiểm tra
  • Triển khai MySQL v5. 6 và v5. 7 cụm với các chi tiết phần cứng nêu trên
  • Thêm cấu hình được đề cập ở trên vào tệp cấu hình và khởi động lại máy chủ
  • Sử dụng khối lượng công việc Sysbench oltp_write_only và bắt đầu thử nghiệm với 8 luồng, 8 bảng và 10 triệu bản ghi
  • Chạy thử nghiệm trong 1200 giây và nắm bắt QPS và độ trễ sao chép trên bản sao
Kết quả kiểm tra

mysql 5. 6 Tải QPS và Độ trễ sao chép

mysql 5. 7 Tải QPS và Độ trễ sao chép

Từ biểu đồ, chúng tôi thấy rằng tải đã chạy trong cùng một khoảng thời gian trong cả 5. 7 và 5. 6 cụm. Độ trễ sao chép 30 phút đã được quan sát thấy trên 5. 6 cụm trong khi độ trễ sao chép 3 phút được nhìn thấy trên 5. 7 cụm

Trong phân tích của mình, chúng tôi cũng nhận thấy rằng một số cụm có vấn đề về độ trễ sao chép cao cũng đang sử dụng sao chép dựa trên STATEMENT. Vì vậy, chúng tôi muốn hiểu liệu sao chép đa luồng trên 5. 7 cũng hoạt động tốt với bản sao dựa trên TUYÊN BỐ

Chúng tôi đã lặp lại trường hợp thử nghiệm bằng câu lệnh binlog_format =. Sau đây là thông số cấu hình thử nghiệm

Công cụ tính điểm chuẩn

sysbench

Chỉ huy

sysbench --db-driver=mysql --mysql-user=sbtest --mysql-host=10.54.2.218 --mysql-password='test' --mysql-db=test --mysql_storage_engine=innodb --table_size=10000000 --tables=8 --threads=8  /usr/share/sysbench/oltp_write_only.lua --time=1200 runTest Results

mysql 5. 6 Tải QPS và Độ trễ sao chép

mysql 5. 7 Tải QPS và Độ trễ sao chép

Từ biểu đồ, chúng tôi thấy rằng tải đã chạy trong cùng một khoảng thời gian trong cả 5. 7 và 5. 6 cụm. Độ trễ sao chép một giờ đã được quan sát trên 5. 6 cụm, trong khi độ trễ sao chép 3 phút đã được nhìn thấy trên 5. 7 cụm

Trong khi cả 5. 6 và 5. 7 phiên bản MySQL cung cấp bản sao đa luồng, MySQL 5. 6 chỉ hỗ trợ kiểu sao chép “Cơ sở dữ liệu”. Điều này chỉ cải thiện hiệu suất sao chép ở một mức độ nào đó khi cụm có nhiều cơ sở dữ liệu. mysql 5. 7 hỗ trợ cả hai kiểu sao chép “Database” và “Logical_clock”. Trong loại LOGICAL_CLOCK, các giao dịch là một phần của cùng một nhóm nhật ký nhị phân cam kết trên bản chính được áp dụng song song với bản sao. Không có ràng buộc cơ sở dữ liệu chéo và dữ liệu không cần phải được phân vùng thành nhiều cơ sở dữ liệu

Cải thiện hiệu suất Sao chép trong v8. 0

MySQL v8. 0 mang đến một vài cải tiến nữa trong hiệu suất sao chép. Nó bổ sung một ứng dụng song song được cải thiện nhiều bằng cách dựa vào các WRITESET giao dịch (đại khái là tập hợp các hàng đã thay đổi). Điều này cũng cho phép ứng dụng cài đặt các thay đổi song song ngay cả đối với khối lượng công việc đơn luồng đến từ quá trình sao chép. Có một cơ chế đồng bộ hóa được cải tiến giữa các luồng nhận và ứng dụng, điều này có nghĩa là ít tranh chấp hơn giữa các luồng nhận và ứng dụng

khuyến nghị

Nếu thiết lập của bạn giống như thiết lập được trình bày trong bài viết này, đây là một số đề xuất có hiểu biết có thể hữu ích để giảm đáng kể độ trễ sao chép

Dẫn đầu và tụt hậu trong MySQL là gì?

DẪN và LAG là chức năng cửa sổ trong MySQL được sử dụng để truy cập giá trị trước và sau của các hàng được chỉ định từ hàng hiện tại trong phân vùng của nó. These functions are the kind of non-aggregate function.

Sự khác biệt giữa tụt hậu và dẫn đầu trong SQL là gì?

Hàm LEAD được sử dụng để truy cập dữ liệu từ các hàng TIẾP THEO cùng với dữ liệu từ hàng hiện tại. Hàm LAG được sử dụng để truy cập dữ liệu từ hàng TRƯỚC cùng với dữ liệu từ hàng hiện tại . Cần có mệnh đề ORDER BY khi làm việc với các hàm LEAD và LAG, nhưng mệnh đề PARTITION BY là tùy chọn.

Làm cách nào để lấy giá trị từ hàng trước trong MySQL?

Chức năng LAG của MySQL .
sự biểu lộ. Hàm LAG() trả về giá trị của biểu thức từ hàng đứng trước hàng hiện tại theo số hàng bù trong phân vùng hoặc tập kết quả của nó
bù lại. .
giá trị mặc định. .
PHẦN THAM GIA THEO mệnh đề. .
Mệnh đề ORDER BY

Làm cách nào để sử dụng Row_number trong MySQL?

Hàm ROW_NUMBER() trong MySQL được sử dụng để trả về số thứ tự cho mỗi hàng trong phân vùng của nó. .
LỰA CHỌN *,
ROW_NUMBER() TRÊN (PHẦN PHẦN THEO NĂM) NHƯ row_num
TỪ Người;