Hiệu suất sao chép MySQL


15

Tôi đang gặp vấn đề nghiêm trọng với hiệu suất sao chép của MySQL 5.5 giữa hai máy, chủ yếu là các bảng myISAM với sao chép dựa trên câu lệnh. Nhật ký nhị phân và thư mục dữ liệu mysql đều nằm trên cùng một Fusion ioDrive.

Vấn đề là một vấn đề lớn gần đây khi chúng tôi cần tạm dừng nhân rộng cho khoảng. 3 giờ. Mất khoảng 10 giờ để bắt kịp lại mà không có tải khác.

10 giờ để bắt kịp

Làm thế nào tôi có thể tăng hiệu suất của bản sao? Máy B về cơ bản là không hoạt động (ít, IO, 2 lõi tối đa trong số 16, rất nhiều RAM miễn phí), vì chỉ có 1 luồng myQuery đang ghi dữ liệu. Dưới đây là một số ý tưởng tôi đã có:

  • Chuyển sang nhân rộng dựa trên hàng. Trong các thử nghiệm, điều này chỉ mang lại hiệu suất tăng 10-20%
  • Nâng cấp lên myQuery 5.6 với bản sao đa luồng. Chúng tôi có thể dễ dàng phân chia dữ liệu của mình thành các cơ sở dữ liệu riêng biệt và các điểm chuẩn dường như cho thấy điều này sẽ giúp ích, nhưng mã dường như không sẵn sàng sản xuất.
  • Một số biến cấu hình sẽ giúp tăng tốc độ sao chép

Vấn đề chính là nếu phải mất 10h để bắt kịp sau khi tạm dừng 3h, điều này có nghĩa là sao chép đang ghi 13h dữ liệu trong 10h hoặc có thể ghi với tốc độ 130% tốc độ của dữ liệu. Tôi đang tìm kiếm ít nhất là gấp đôi ghi trên máy chủ trong tương lai gần, vì vậy rất cần một cách để cải thiện hiệu suất sao chép.

Máy A:

  • Bậc thầy
  • Ram 24GB
  • Hợp nhất 1.2TB ioDrive2
  • 2x E5620
  • Kết nối Gigabit

my.cnf:

[mysqld]
server-id=71
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp

log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306

log-bin=/data_fio/mysqlbinlog/mysql-bin.log
binlog-format=STATEMENT
replicate-ignore-db=mysql

log-slave-updates = true

# Performance Tuning
max_allowed_packet=16M
max_connections=500
table_open_cache = 2048
max_connect_errors=1000
open-files-limit=5000

# mem = key_buffer + ( sort_buffer_size + read_buffer_size ) * max_connections
key_buffer=4G
max_heap_table_size = 1G
tmp_table_size = 4G
myisam_sort_buffer_size = 256M
sort_buffer_size=4M
read_buffer_size=2M
query_cache_size=16M
query_cache_type=2
thread_concurrency=32

user=mysql

symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

Máy B:

  • Nô lệ
  • Ram 36GB
  • Hợp nhất 1.2TB ioDrive2
  • 2x E5620
  • Kết nối Gigabit

my.cnf:

[mysqld]
server-id=72
datadir=/data_fio/mysqldata
socket=/var/lib/mysql/mysql.sock
tmpdir=/data_fio/mysqltmp

log-error = /data/logs/mysql/error.log
log-slow-queries = /data/logs/mysql/stats03-slowquery.log
long_query_time = 2
port=3306

# Performance Tuning
max_allowed_packet=16M
max_connections=500
table_open_cache = 2048
max_connect_errors=1000
open-files-limit=5000

# mem = key_buffer + ( sort_buffer_size + read_buffer_size ) * max_connections
key_buffer=4G
max_heap_table_size = 1G
tmp_table_size = 4G
myisam_sort_buffer_size = 256M
sort_buffer_size=4M
read_buffer_size=2M
query_cache_size=16M
query_cache_type=2
thread_concurrency=32

user=mysql

symbolic-links=0

plugin-load=archive=ha_archive.so;blackhole=ha_blackhole.so

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[mysql]
socket=/var/lib/mysql/mysql.sock

[client]
socket=/var/lib/mysql/mysql.sock

Máy B về cơ bản là không hoạt động . Đây là kinh nghiệm của tôi với việc nhân rộng trên MySQL 5.1. Bản sao chỉ là một luồng và một CPU sẽ được tối đa hóa trong khi các CPU khác ở đó không hoạt động.
Stefan Lasiewski

bạn đang làm bản sao lưu ra khỏi nô lệ?
Mike

@ stefan-lasiewski Để rõ ràng, đây là MySQL 5.5, nhưng đúng vậy. Nó là một luồng đơn và rất bực bội
Nick

@Mike Có, cũng như các truy vấn nặng mất nhiều phút trong suốt cả ngày. Sao chép chậm lại ~ 100 giây hoặc lâu hơn, sau đó mất một lúc để bắt kịp lại. Dịch vụ chạy các truy vấn này sẽ chạy một truy vấn, đợi cho đến khi bắt kịp, sau đó chạy một truy vấn khác, chờ đợi, v.v ... Nếu chúng tôi có thể tăng tốc độ sao chép, chúng tôi có thể tăng tần suất chúng tôi chạy các truy vấn này
Nick

1
@ stefan-lasiewski Có - Nếu không có gì ngăn cản sự sao chép, rõ ràng nó sẽ không bị tụt lại phía sau. Vấn đề chính là tốc độ sao chép là một nút cổ chai để tăng ghi trên bản gốc. Nếu phải mất 3,3 giây để bắt kịp 1 giây, điều đó có nghĩa là sao chép đang ghi 4,3 giây dữ liệu trong 3,3 giây hoặc chỉ có thể sao chép ở tốc độ 130% của dữ liệu đến. Tôi đang tìm cách viết ít nhất là gấp đôi tải trên máy chủ này.
Nick

Câu trả lời:


4

Wow, bạn có một số phần cứng khủng khiếp cho vấn đề này. Không có nhiều hơn nữa bạn có thể sử dụng phần cứng một cách khôn ngoan, ngoại trừ việc nâng cấp lên CPU Sandy / Ivy Bridge có thể cho hiệu suất tốt hơn 20-50% trong các tìm kiếm Btree, v.v.

Xin lưu ý rằng sở trường của tôi là Innodb, vì vậy tôi sẽ

  1. Bỏ qua rằng bạn là myisam và hành động như thể nó sẽ không tạo ra sự khác biệt.
  2. Giả sử vấn đề này là đủ động lực để giúp bạn nâng cấp. Vâng, nó là một bản nâng cấp.

Innodb có thể giúp tận dụng lợi thế của tất cả bộ nhớ đó bằng cách lưu trữ các hàng thường xuyên truy cập này trong vùng đệm của nó. Bạn có thể điều chỉnh nó lớn đến mức bạn muốn (giả sử 80% bộ nhớ) và đọc / ghi mới vẫn còn trong bộ nhớ cho đến khi cần đẩy chúng vào đĩa để có thêm chỗ cho dữ liệu truy cập mới nhất. Trong bộ nhớ là một thứ tự cường độ nhanh hơn so với FusionIO của bạn.

Có nhiều tính năng khác của Innodb, chẳng hạn như băm thích ứng, cơ chế khóa tự động, vv có thể là một lợi ích cho môi trường của bạn. Bạn, tuy nhiên, biết dữ liệu của bạn tốt hơn tôi.

Trong thế giới innodb, một giải pháp ngắn hạn tốt là tối ưu hóa nô lệ của bạn - bạn có thực sự cần mọi chỉ số về nô lệ mà bạn có trên chủ của mình không? Các chỉ mục là một quả bóng và chuỗi trên các chèn / cập nhật / xóa, NGAY với các thẻ Fusion IO. IOPS không phải là tất cả mọi thứ ở đây. Các procs cầu Sandy / Ivy có thông lượng bộ nhớ và hiệu năng tính toán tốt hơn nhiều - chúng có thể tạo ra sự khác biệt rất lớn của Westmeres mà bạn có bây giờ. (Hình 20-50% tổng thể). Xóa tất cả các chỉ mục bạn không cần trên nô lệ!

Thứ hai, và gần như chắc chắn chỉ áp dụng cho innodb, là mk-prefetch có thể biết bản cập nhật nào và trước khi nô lệ viết chúng. Điều này cho phép mk-prefetch chạy một truy vấn đọc trước, do đó buộc dữ liệu phải ở trong bộ nhớ vào thời điểm đơn thay thế chạy truy vấn ghi. Điều này có nghĩa là dữ liệu nằm trong bộ nhớ chứ không phải trong fusionIO, một thứ tự tăng nhanh hiệu suất cường độ. Điều này làm cho một HUGE khác biệt, hơn người ta có thể mong đợi. Rất nhiều công ty sử dụng điều này như một giải pháp lâu dài. Tìm hiểu thêm bằng cách kiểm tra Bộ công cụ Percona .

Thứ ba, và quan trọng nhất, một khi bạn đã nâng cấp lên Innodb, hãy kiểm tra Tokutek. Những kẻ này có một số thứ tuyệt vời xấu xa vượt quá hiệu suất ghi / cập nhật / xóa của Innodb bằng một cú sút xa. Họ khuyến khích tốc độ sao chép được cải thiện như một trong những lợi ích chính và bạn có thể thấy từ điểm chuẩn của họ tại sao Fusions crazy IOPS vẫn không giúp bạn trong trường hợp Btrees . (Lưu ý: Không được tôi xác minh độc lập.) Họ sử dụng thay thế chỉ số btree, trong khi phức tạp hơn nhiều, cải thiện nhiều hạn chế về tốc độ thuật toán của các chỉ mục btree.

Tôi đang trong quá trình xem xét việc áp dụng Tokutek. Nếu họ giải phóng quá nhiều tốc độ ghi, điều đó cho phép tôi thêm nhiều chỉ mục hơn. Vì họ nén dữ liệu và chỉ mục theo tỷ lệ tuyệt vời như vậy (25 lần họ trích dẫn), bạn thậm chí không phải trả giá (hiệu suất, bảo trì) cho dữ liệu tăng. Bạn phải trả ($) cho công cụ của họ, $ 2500 / năm cho mỗi GB, IIRC được nén trước. Họ có giảm giá nếu bạn sao chép dữ liệu, nhưng bạn thậm chí có thể chỉ cần cài đặt Tokutek trên nô lệ của mình và giữ nguyên chủ của mình. Kiểm tra các chi tiết kỹ thuật trong bài giảng Khóa học mở MIT Algoritms . Ngoài ra, họ có hàng tấn công cụ kỹ thuật trên blog và các trang trắng thông thường cho những người không có 1:20 để xem video. Tôi tin rằng video này cũng cung cấp công thức Big-O cho tốc độ đọc nhanh như thế nào. Tôi giả sử rằng việc đọc chậm hơn (Luôn có sự đánh đổi!), nhưng công thức quá phức tạp đối với tôi để đánh giá mức độ. Họ cho rằng nó gần giống nhau, nhưng tôi thích hiểu toán hơn (không có khả năng!). Bạn có thể ở trong một tình huống tốt hơn để khám phá điều này hơn tôi.

Ps tôi không liên kết với Tokutek, tôi chưa bao giờ chạy sản phẩm của họ và họ thậm chí không biết tôi đang nhìn họ.

Cập nhật :

Tôi thấy bạn có một số câu hỏi khác trên trang này và nghĩ rằng tôi sẽ tham gia:

Đầu tiên, tìm nạp trước nô lệ gần như chắc chắn sẽ không hoạt động cho myisam trừ khi bạn có một môi trường đặc biệt. Điều này chủ yếu là do việc tìm nạp trước sẽ khóa chính các bảng bạn định ghi hoặc chủ đề nô lệ có bảng bị khóa mà trình nền tìm nạp trước cần. Nếu các bảng của bạn được cân bằng cực kỳ tốt để sao chép và các bảng khác nhau được viết theo kiểu vòng tròn, thì điều này có thể hoạt động - nhưng hãy nhớ rằng điều này rất lý thuyết. Cuốn sách "Hiệu suất cao Mysql" có nhiều thông tin hơn trong phần "Các vấn đề sao chép".

Thứ hai, có lẽ nô lệ của bạn giữ tải 1.0-1.5, có thể cao hơn nếu bạn có các procs hoặc truy vấn khác đang chạy nhưng đường cơ sở là 1.0. Điều này có nghĩa là bạn có khả năng bị ràng buộc CPU, có khả năng với FusionIO của bạn trên tàu. Như tôi đã đề cập trước đó, Sandy / Ivy Bridge sẽ cung cấp thêm một chút sức mạnh, nhưng có lẽ không đủ để giúp bạn vượt qua thời điểm khó khăn hơn với độ trễ tối thiểu. Nếu tải trên nô lệ này chủ yếu là chỉ ghi (nghĩa là không đọc nhiều), CPU của bạn gần như chắc chắn sẽ dành thời gian để tính toán vị trí cho các lần chèn / xóa btree. Điều này sẽ củng cố quan điểm của tôi ở trên về việc loại bỏ các chỉ mục không quan trọng - bạn luôn có thể thêm lại chúng sau này. Vô hiệu hóa siêu phân luồng sẽ không hoạt động, nhiều CPU không phải là kẻ thù của bạn. Khi bạn nhận được ram trên 32 GB, giả sử là 64 GB, bạn cần lo lắng về việc phân phối ram, nhưng ngay cả sau đó các triệu chứng là khác nhau.

Cuối cùng, và quan trọng nhất (đừng bỏ qua phần này;)), tôi cho rằng bạn hiện đang chạy RBR (sao chép dựa trên hàng) vì bạn đã đề cập đến việc tăng hiệu suất không tầm thường khi chuyển đổi quá. Tuy nhiên - có thể có một cách để có được hiệu suất cao hơn ở đây. Lỗi Mysql 53375 có thể hiển thị nếu bạn có các bảng được sao chép mà không có khóa chính. Các nô lệ về cơ bản không đủ thông minh để sử dụng bất cứ thứ gì ngoại trừ một khóa chính, do đó, việc không có một chủ đề sao chép để thực hiện quét toàn bộ bảng cho mỗi bản cập nhật. Một sửa chữa chỉ đơn giản là thêm một khóa chính tự động thay thế lành tính. Tôi chỉ làm điều này nếu cái bàn lớn (ví dụ vài hàng ngàn hàng hoặc lớn hơn). Điều này, tất nhiên, đi kèm với chi phí có một chỉ số khác trên bàn, điều này làm tăng giá mà bạn phải trả trong CPU. Lưu ý rằng có rất ít đối số lý thuyết chống lại điều này, vì InnoDB sẽ thêm một lý do phía sau hậu trường nếu bạn không. Tuy nhiên, bóng ma không phải là một biện pháp phòng thủ hữu ích chống lại 53375. Vonfram cũng có thể khắc phục vấn đề này, nhưng bạn cần chắc chắn khi sử dụng Vonfram mà bạn có mã hóa thẳng. Lần cuối cùng tôi chơi với nó, nó sẽ chết một cách khủng khiếp khi bất kỳ chuỗi không phải UTF8 nào cần sao chép. Đó là khoảng thời gian tôi từ bỏ nó.


Cảm ơn rất nhiều vì thời gian của bạn! Tôi thực sự đánh giá cao thông tin bạn đã cung cấp ở đây. Chuyển đến InnoDB là điều mà chúng tôi đã cân nhắc trong một thời gian, chủ yếu là vì lợi ích của việc khóa cấp hàng. Điều này cho tôi một số thực phẩm cho suy nghĩ. Cảm ơn một lần nữa.
Nick

Ồ, đây là một số phân tích mysql cực kỳ xuất sắc :)
Kevin

4

không phải là một câu trả lời nhưng bạn có thể xem xét sao chép vonfram và các sản phẩm thương mại của họ để linh hoạt hơn. Có phải việc sử dụng cpu 100% trên lõi đơn là nút cổ chai?


Cảm ơn! Đó là một giải pháp thú vị, mặc dù tôi hơi ngần ngại khi cắm phần mềm của bên thứ 3 vào MySQL. Trong các tài liệu có ghi "Không cần nâng cấp để chờ các phiên bản MySQL trong tương lai hoặc di chuyển sang các lựa chọn chưa được kiểm tra", do đó, nó có vẻ giống với những gì MySQL 5.6 sẽ hỗ trợ. Bạn có bất kỳ kinh nghiệm với vonfram tái tạo?
Nick

Không, chỉ cần biết rằng người đóng góp hệ sinh thái mysql có uy tín làm việc cho họ [ datacharmer.blogspot.com ]. Làm thế nào về nút cổ chai - bạn có chắc rằng đó là một tải trọng lõi đơn là yếu tố hạn chế?
pQd

Cảm ơn bạn về thông tin. RE: yếu tố giới hạn, không tôi không chắc chắn gì cả. Tôi không nghĩ rằng đó là I / O, vì iuler báo cáo rằng Fusion ioDrive đang thực hiện <10 MB / s ghi. Tôi khá chắc chắn rằng thiết bị có khả năng xa hơn. Mặt khác, luôn có 1 và xen kẽ 1 lõi bổ sung được chốt ở mức 100%, trong khi các lõi khác không hoạt động. Điều gì về việc vô hiệu hóa siêu phân luồng?
Nick

@Nick - xin lỗi, tôi không thể tư vấn về siêu phân luồng. nhưng hãy thử ... cũng vậy - hãy thử cài đặt munin hoặc cacti với các mẫu mysql và xem chi tiết hơn những gì đang diễn ra.
pQd

Kiểm tra bài đăng này từ folks Continuent: scale-out-blog.blogspot.ca/2011/10/ Trích dẫn: "Nhìn chung, chúng tôi có thể nói rằng sao chép gốc đơn luồng có khả năng không thể thực hiện được trong giới hạn I / O trường hợp không đi đến một số kết hợp của SSD và / hoặc tìm nạp trước nô lệ. "
HTTP500

2

Vì vậy, nếu bạn đang thực hiện sao lưu trên nô lệ .. và bạn sử dụng bảng myiasm .. bạn đang khóa các bảng để thực hiện sao lưu để ngăn ngừa tham nhũng. Vì vậy, sao chép không thể làm việc cho đến khi sao lưu hoàn tất .. sau đó nó bắt kịp.


Chắc chắn rồi. Chúng tôi thường xuyên khóa các bảng để sao lưu hoặc truy vấn dài, nhưng vấn đề nằm ở tốc độ sao chép sau khi luồng IO tiếp tục. Tôi ước tính rằng nó chỉ sao chép ở mức 130% tốc độ của dữ liệu đến, điều này giới hạn mức độ chúng tôi có thể mở rộng quy mô thiết lập này trừ khi chúng tôi có thể cải thiện tốc độ sao chép. Điều đó có ý nghĩa?
Nick
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.