Làm thế nào để làm gián đoạn phần mềm đột kích resync?


50

Tôi muốn làm gián đoạn một hoạt động đồng bộ hóa đang chạy trên một cuộc đột kích phần mềm debian. (Đây là đồng bộ so sánh được lên lịch thường xuyên. Mảng đột kích vẫn sạch trong trường hợp như vậy. Đừng nhầm lẫn điều này với việc xây dựng lại sau khi đĩa bị lỗi và được thay thế.)

Làm thế nào để dừng hoạt động đồng bộ lại theo lịch trình này trong khi nó đang chạy? Một mảng đột kích khác là "resync chờ xử lý", bởi vì tất cả chúng đều được kiểm tra vào cùng một ngày (đêm chủ nhật) lần lượt. Tôi muốn dừng lại hoàn toàn của buổi tối chủ nhật này.

[Chỉnh sửa: sudo kill -9 1010không dừng nó, 1010 là PID của quá trình md2_resync]

Tôi cũng muốn biết làm thế nào tôi có thể kiểm soát khoảng thời gian giữa các resyncs và thời gian còn lại cho đến lần tiếp theo.

[Edit2: Những gì tôi đã làm bây giờ là làm cho đồng bộ hóa trở nên rất chậm, vì vậy nó không làm phiền nữa:

sudo sysctl -w dev.raid.speed_limit_max=1000

lấy từ http://www.cyberciti.biz/tips/linux-ston-increas-resync-rebuild-speed.html

Trong đêm tôi sẽ đặt nó trở lại giá trị cao, vì vậy đồng bộ lại có thể chấm dứt.

Cách giải quyết này là tốt cho hầu hết các tình huống, dù sao sẽ rất thú vị nếu biết những gì tôi yêu cầu là có thể. Ví dụ, dường như không thể phát triển một mảng, trong khi nó đang đồng bộ hóa hoặc đồng bộ lại "đang chờ xử lý"]


Tôi không nghĩ rằng tôi đã có những quả bóng để hủy bỏ đồng bộ hóa. Tôi sợ nó có thể không bao giờ bắt đầu lại.
Tom O'Connor

1
@Tom: đây chỉ là đồng bộ hóa bình thường kiểm tra mọi chủ nhật nếu mọi thứ khớp. nếu nó bị dừng (ví dụ bằng cách tắt máy), nó sẽ tiếp tục trong lần khởi động tiếp theo.
Adam5

Ồ được thôi. Thế là ổn rồi
Tom O'Connor

Câu trả lời:


48

Nếu mảng của bạn là md0sau đóecho "idle" > /sys/block/md0/md/sync_action

'nhàn rỗi' sẽ dừng đồng bộ hóa / khôi phục hoạt động, v.v. Không có gì đảm bảo rằng một đồng bộ hóa / khôi phục khác có thể không được tự động bắt đầu lại, mặc dù một số sự kiện sẽ cần thiết để kích hoạt điều này.

http://www.mjmwired.net/kernel/Documentation/md.txt#477


Tôi có thể cập nhật tệp văn bản sau khi thay đổi quyền của nó, nhưng nội dung của tệp được thay đổi trở lại thành "đồng bộ hóa" từ phía sau trong cùng một ví dụ. Và đồng bộ lại tiếp tục ở mảng khác (trước đây là "đang chờ xử lý"). Khi tôi viết "không hoạt động" vào tập tin của mảng khác, nó sẽ hoán đổi một lần nữa, nhưng không bao giờ dừng lại.
Adam5

2
Nếu bạn có nhiều cuộc đột kích: echo idle | sudo tee / sys / block / md * / md / sync_action
Ole Tange

Trên thực tế "nhàn rỗi" chỉ tạm dừng kiểm tra. "Kiểm tra" tiếp theo sẽ tiếp tục ở /sys/block/md0/md/sync_min’. To reset this write 0` cho tập tin này.
rudimeier

33

Tôi muốn làm chậm hoặc tạm dừng quá trình đồng bộ hóa để lưu một số I / O để sao lưu một số nội dung trên máy tính khác. Chủ đề này đã giúp tôi nhưng tôi tìm thấy một giải pháp khác.

Trên Debian Lenny của tôi:

  • echo "idle" > /sys/block/md0/md/sync_action hoạt động nhưng quá trình đồng bộ lại được khởi động lại ngay lập tức.

  • checkarray -x --all : hoạt động, nhưng kết quả tương tự: quá trình đồng bộ lại được khởi động lại ngay lập tức.

Vì vậy, tôi sử dụng phương pháp này: echo 0 > /proc/sys/dev/raid/speed_limit_max


1
Cách tiếp cận thú vị. Tôi thấy rằng bạn cũng cần giảm giá trị trong speed_limit_min.
Diomidis Spinellis 31/12/13

1
Tôi cũng cần đặt speed_limit_minthành 0 để tạm dừng hoàn toàn đồng bộ lại.
njahnke

12

Bạn có thể hủy đồng bộ hóa mảng đang tiến hành bằng cách sử dụng chuỗi lệnh sau (dưới dạng root):

echo frozen > /sys/block/md0/md/sync_action
echo none > /sys/block/md0/md/resync_start
echo idle > /sys/block/md0/md/sync_action

Lưu ý rằng điều này có thể để mảng của bạn ở trạng thái không nhất quán . Đừng làm điều này trừ khi bạn chắc chắn mảng đó ở trạng thái tốt và chạy lại đồng bộ hóa sau.

(Tín dụng khi tín dụng đáo hạn: tìm thấy câu thần chú này trong chuỗi này .)


8

Như đã đề cập ở trên, trên các hệ thống Debian / Ubuntu, /etc/cron.d/mdadmtập lệnh gọi /usr/share/mdadm/checkarraytập lệnh để bắt đầu kiểm tra đồng bộ hóa lại.

Tập lệnh này có một tùy chọn để hủy tất cả các kiểm tra đồng bộ hóa đang chạy:

/usr/share/mdadm/checkarray -x --all

3

Không chắc chắn về cách hủy đồng bộ hóa lại, nhưng lịch trình được kiểm soát bởi /etc/cron.d/mdadmcác hệ thống Debian / Ubuntu.

Kịch bản /usr/share/mdadm/checkarraycó thể làm sáng tỏ phần khác của câu hỏi của bạn, vì đó là những gì đang được gọi bởi cron.


3

Nếu thiết bị md của bạn là md0 và bạn muốn dừng ghi lại đồng bộ hóa:

echo "idle" > /sys/block/md0/md/sync_action

3

Giải pháp có thể cho việc này, mất một chút để đi vào chi tiết.

Hệ thống của tôi: CentOS 6.5 mdadm v3.3.2

Kiểm tra liên tục mỗi tuần, muốn tạm dừng một trong số chúng, RAID sạch sẽ, kiểm tra được gọi thông qua tập lệnh /etc/cron.d/ston-check được chạy hàng tuần.

Để hủy séc, bạn sử dụng chức năng --misc --action. Giả sử thiết bị RAID là / dev / md0 và đây chỉ là kiểm tra tính nhất quán hàng tuần và không phải là lỗi thiết bị, bạn sẽ, như root:

mdadm --misc --action = nhàn rỗi / dev / md0

Tương tự như vậy, để bắt đầu kiểm tra tính nhất quán

mdadm --misc --action = kiểm tra / dev / md0


2
echo "idle" > /sys/block/md0/md/sync_action

Không hoạt động khi / sys / block / md * / md / sync_action là "resync" (không giống như trạng thái của nó là "check" hoặc "sửa chữa". Bạn có thể lặp lại "idle" vào tệp sync_action, tuy nhiên nó không ảnh hưởng đến tiến trình. Tệp tài liệu kernel này ở đây nói không chính xác rằng nó sẽ hoạt động, nhưng nó chưa bao giờ làm việc cho tôi:

'nhàn rỗi' sẽ dừng đồng bộ hóa / khôi phục hoạt động, v.v. Không có gì đảm bảo rằng một đồng bộ hóa / khôi phục khác có thể không được tự động bắt đầu lại, mặc dù một số sự kiện sẽ cần thiết để kích hoạt điều này.


1
Tuy nhiên, bạn có thể thực hiện tốc độ "đồng bộ hóa" với / sys / block / md * / md / sync_speed_max ở trạng thái này. Tôi không chắc tại sao thông tin không chính xác, có lẽ không ai biết
brian

Vui lòng dành một phút thời gian để tìm hiểu cú pháp đánh dấu Stack Exchange ( meta.serverfault.com/editing-help )
Sven

0

Tôi biết đây là một bài đăng 4 năm tuổi nhưng bạn cũng có thể làm điều này (giả sử md0 là mảng và sdb4 là "đĩa" đồng bộ lại):

    mdadm /dev/md0 --fail /dev/sdb4 && mdadm /dev/md0 --remove /dev/sdb4

Lệnh này giả vờ sdb4 là một đĩa bị lỗi và do đó đá nó từ mảng, dừng đồng bộ lại. Nếu không có lỗi trong hành động dừng đồng bộ lại thì lệnh này cũng sẽ xóa sdb4 khỏi mảng md0. Nếu có bất kỳ lỗi nào thì đĩa vẫn ở trạng thái không thành công nhưng vẫn ở trong mảng.

Nếu bạn thất bại một đĩa bất cứ nơi nào trong mdadm, bạn cài đặt nó một cách hợp lý thất bại. Nếu mảng đã sạch (không bị suy giảm) thì đĩa vẫn ổn định và có thể được thêm lại bằng tùy chọn --add << đĩa >> --assume-clean mà không phải lo sợ. Nếu có bất kỳ hành động nào sau khi nó bị tách ra (ví dụ: resync, xây dựng lại hoặc thậm chí là ghi) thì --assume-clean sẽ probalby thất bại và bắt đầu hành động đồng bộ lại ngay lập tức.

Thay đổi raid.speed_limit_minraid.speed_limit_maxbằng cách nào đó là một ý tưởng tồi vì nó không chỉ ảnh hưởng đến tốc độ đồng bộ hóa / xây dựng lại mà còn cả tốc độ hoạt động bình thường và có thể bạn sẽ mất rất nhiều hiệu suất đạt được khi sử dụng mảng RAID.


5
Tôi nghĩ rằng đó là một ý tưởng tồi để loại bỏ một đĩa lành mạnh khỏi RAID. Hầu hết thời gian nó có thể không gây ra bất kỳ vấn đề nào, nhưng mỗi lần bạn làm điều đó, có nguy cơ gây mất dữ liệu hoặc hỏng dữ liệu.
kasperd

1
Đừng bao giờ làm điều này. Nếu bạn thêm một đĩa --assume-cleantrên hệ thống trực tiếp và bạn có bất kỳ ghi nào xảy ra trên đĩa còn lại, bạn sẽ gặp rắc rối.
sanmai
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.