Làm thế nào để kết xuất hiệu quả một cơ sở dữ liệu innodb MySQL khổng lồ?


8

Tôi đã nhận được một máy chủ cơ sở dữ liệu MySQL sản xuất Ubuntu 10.04 với tổng kích thước cơ sở dữ liệu là 260 GB trong khi kích thước của phân vùng gốc là 300 GB nơi lưu trữ DB, về cơ bản có nghĩa là khoảng 96% / đã đầy và không còn chỗ để lưu trữ kết xuất / sao lưu vv Hiện tại không có đĩa nào khác được gắn vào máy chủ.

Nhiệm vụ của tôi là di chuyển cơ sở dữ liệu này sang máy chủ khác trong trung tâm dữ liệu khác nhau. Câu hỏi là làm thế nào để làm điều đó một cách hiệu quả với thời gian chết tối thiểu?

Tôi đang suy nghĩ theo dòng:

  • Yêu cầu gắn thêm một ổ đĩa vào máy chủ và kết xuất trong ổ đĩa đó. [EDIT: Hiện tại không thể.]
  • Chuyển kết xuất sang máy chủ mới, khôi phục nó và tạo nô lệ máy chủ mới của máy chủ hiện có để giữ dữ liệu đồng bộ
  • Khi cần di chuyển, ngắt sao chép, cập nhật cấu hình nô lệ để chấp nhận các yêu cầu đọc / ghi và làm cho máy chủ cũ chỉ đọc để nó không giải trí bất kỳ yêu cầu ghi nào và yêu cầu các nhà phát triển ứng dụng cập nhật cấu hình với địa chỉ IP mới cho db.

Đề xuất của bạn để cải thiện điều này hoặc bất kỳ cách tiếp cận tốt hơn thay thế cho nhiệm vụ này là gì?

Câu trả lời:


9

Nếu bạn đang cân nhắc chuyển sang một DB Server với cùng một phiên bản chính xác của MySQL, bạn có thể muốn rsynccác datadirtừ server cũ sang máy chủ mới.

Điều này sẽ hoạt động bất kể bố cục tệp InnoDB hoặc thậm chí sự hiện diện của các bảng MyISAM.

  1. cài đặt cùng một phiên bản mysql trên ServerB mà ServerA có
  2. Trên ServerA, chạy RESET MASTER;để xóa tất cả các bản ghi nhị phân trước quá trình rsycn. Nếu đăng nhập nhị phân không được kích hoạt, bạn có thể bỏ qua bước này.
  3. Trên ServerA, chạy SET GLOBAL innodb_max_dirty_pages_pct = 0;từ mysql và khoảng 10 phút (Thao tác này sẽ xóa các trang bẩn từ Nhóm đệm InnoDB. Nó cũng giúp thực hiện tắt máy mysql nhanh hơn) Nếu cơ sở dữ liệu của bạn là tất cả MyISAM, bạn có thể bỏ qua bước này.
  4. rsync / var / lib / mysql của ServerA thành / var / lib / mysql trên ServerB
  5. Lặp lại Bước 3 cho đến khi rsync mất ít hơn 1 phút
  6. service mysql stop trên ServerA
  7. Thực hiện thêm một rsync
  8. scp ServerA: /etc/my.cnf đến ServerB: / etc /.
  9. service mysql start trên ServerB
  10. service mysql start trên ServerA (tùy chọn)

Về cơ bản, đây là những gì một kịch bản như vậy muốn

mysql -u... -p... -e"RESET MASTER;"
mysql -u... -p... -e"SET GLOBAL innodb_max_dirty_pages_pct = 0;"
RSYNCSTOTRY=10
cd /var/lib/mysql
X=0
while [ ${X} -lt ${RSYNCSTOTRY} ]
do
    X=`echo ${X}+1|bc`
    rsync -r * targetserver:/var/lib/mysql/.
    sleep 60
done
service mysql stop
rsync -r * targetserver:/var/lib/mysql/.
service mysql start

Một thành viên của DBA StackExchange nói rằng tôi nên tránh xa FLUSH TABLES WITH READ LOCK;dựa trên một cái gì đó trong mysqlperformanceblog.com

Tôi đã đọc qua và biết rằng các CHỌN đối với các bảng InnoDB ở giữa một FLUSH TABLES WITH READ LOCK;vẫn có thể cho phép ghi xảy ra theo một cách nào đó. Như Arlukin đã chỉ ra trong nhận xét , LVM sẽ hoạt động với FLUSH TABLES WITH READ LOCKInnoDB tốt (+1 cho nhận xét của anh ấy).

Đối với tất cả người dùng không phải LVM, bạn có thể sử dụng cơ sở dữ liệu toàn bộ MyISAM để sử dụng FLUSH TABLES WITH READ LOCK;. Đối với InnoDB, --single-tranactionvui lòng sử dụng trong mysqldumps.


2
Đó là cách chúng tôi thực hiện, khi chúng tôi cần đồng bộ hóa thủ công thiết lập chủ-nô. Hoạt động thực sự tốt. Nhưng trên các máy chủ mới nhất của chúng tôi, chúng tôi đang sử dụng ảnh chụp nhanh LVM, vì vậy chúng tôi không cần phải dừng máy chủ. Ngay trước khi thực hiện ảnh chụp nhanh LVM, chúng tôi thực hiện "BẢNG XÓA B READNG ĐỌC KHÓA", vì vậy các tệp được sao chép. Ảnh chụp nhanh lvm cũng thực sự tốt nếu bạn muốn sao chép tất cả các tệp trong mục đích sao lưu. Vì vậy, hãy thiết lập máy chủ mới của bạn với LVM và thêm một số không gian để có thể thực hiện các ảnh chụp nhanh.
Arlukin

Cảm ơn đã trả lời chi tiết. Nếu phiên bản MySQL khác nhau thì sao? Phiên bản cũ hơn là 5.1 với Ubuntu 10.04 trong khi mới hơn tôi sẵn sàng sử dụng 12.04 với mặc định 5.5. Cách tiếp cận nào trong trường hợp như vậy bạn đề nghị? Ngoài ra, việc gắn thêm ổ đĩa hiện không còn nghi ngờ nữa vì vậy dữ liệu cần phải được gửi từ xa cho dù bằng cách kết xuất / rsync hay bất kỳ cách nào khác.
Jagbir

1

Một bãi chứa và khôi phục cơ sở dữ liệu có kích thước sẽ mất nhiều giờ. Tôi sẽ, Tùy thuộc vào các phiên bản của mysql miễn là số phiên bản tăng lên và không có bước nhảy nào trong số sửa đổi chính. Bạn sẽ có thể lấy các tệp cơ sở dữ liệu thô trong / var / lib / mysql và đặt chúng trên máy chủ mới, đặt quyền và kích hoạt máy chủ bằng công tắc --skip-Grant-bảng. Thêm các khoản trợ cấp cần thiết cho người dùng phản ánh địa chỉ IP mới sau đó khởi động lại bình thường.

Tôi sẽ giải quyết kích thước của cơ sở dữ liệu của bạn vì nó quá lớn để có hiệu quả.


Có 4 cơ sở dữ liệu có kích thước khoảng 50-90 GB, kích thước tổng thể là 260 GB. Nó có thể không hiệu quả nhưng tôi vẫn sống với nó như bây giờ. Ngoài ra các phiên bản MySQL là khác nhau, những gì bạn đề nghị trong trường hợp đó?
Jagbir

Nếu các phiên bản mysql khác nhau, hãy chạy khô trước và kiểm tra kỹ miễn là số phiên bản trên máy chủ mới cao hơn so với phiên bản cũ, bạn sẽ ổn. Nếu nó không thành công thì bạn có thể bị kẹt khi sử dụng mysqldump && restore.
James Park-Watt

1

Bạn có thể làm theo các bước sau để di chuyển cơ sở dữ liệu InnoDB khổng lồ này.

  • Cài đặt SSHFS và gắn kết phân vùng có liên quan của máy chủ từ xa trên máy chủ sản xuất
  • Sử dụng Percona XtraBackup để lấy bản sao nóng của cơ sở dữ liệu InnoDB và lưu trực tiếp vào thư mục được gắn SSHFS
  • Nhiệm vụ này sẽ mất vài giờ. Để giảm thiểu ảnh hưởng của tập lệnh hotcopy trên máy chủ trực tiếp, hãy đặt mức độ ưu tiên thấp cho nó bằng cách sử dụng renice

    $ renice -n 5 -p <SCRIPT-PID>

  • Đảm bảo rằng cả hai máy chủ đang chạy cùng một bản phát hành của máy chủ MySQL.
  • Khi hotcopy hoàn tất, bạn có thể khôi phục nó trong máy chủ mới bắt đầu quá trình sao chép

Bạn có thể gặp sự chậm chạp trong quá trình này nhưng chắc chắn không có thời gian chết. Percona XtraBackup sẽ tạo ra một bản sao nóng nhanh hơn và tiêu tốn ít tài nguyên hơn so với mysqldump. Điều này là lý tưởng cho một cơ sở dữ liệu InnoDB khổng lồ.

Tùy thuộc vào kiểu sử dụng và số liệu thống kê, bạn có thể chạy quy trình này khi có lưu lượng tối thiểu trên máy chủ. Có lẽ làm điều này vào cuối tuần là một ý tưởng tốt? Trên đây chỉ là một phác thảo của quá trình. Bạn có thể cần phải xem qua tài liệu Percona XtraBackup và SSHFS.


1

Bạn chỉ có thể chuyển cơ sở dữ liệu thẳng đến máy chủ từ xa ...

$ mysqldump | ssh user@server 'cat - > dumpfile.sql.gz'

... SQL nên nén tốt, do đó bạn sẽ hoàn thành việc này nhanh hơn rất nhiều với một trong các tùy chọn này mặc dù nó cũng phụ thuộc vào dung lượng RAM bạn có trong hộp ...

$ mysqldump | ssh -C user@server 'cat - > dumpfile.sql.gz'
$ mysqldump | gzip -c | ssh user@server 'cat - > dumpfile.sql.gz'
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.