2012-07-11 32 views
10

Trong khi chuyển đổi bộ sưu tập thành bộ sưu tập có giới hạn tối qua, thời gian rảnh của phụ của tôi bắt đầu tụt lại sau phần chính. Nó tiến triển chậm, vài giây sau vài phút, và cuối cùng rơi ra khỏi cửa sổ oplog của chính. Theo các hướng dẫn here Tôi dừng lại mongod trên thứ cấp, xóa tất cả các tập tin dữ liệu, và khởi động lại nó, mặc dù tôi quên khóa chính từ viết. Trung học đã trải qua giai đoạn khởi tạo của nó, mất một khoảng thời gian vững chắc, và cuối cùng đã trở lại trong kinh doanh, nhưng khi tôi đăng nhập, nhân rộng bây giờ thậm chí còn xa hơn phía sau. Vì đây là đám mây, sau khi tất cả, tôi tạo ra một hình ảnh của chính của tôi (đó là nghĩa vụ phải sao chép tất cả dữ liệu), mặc dù tôi không thể chạy db.fsyncLock() tại thời điểm đó, bởi vì nó đã lấy một số viết. Hình ảnh mới kết thúc, và tôi khởi động một máy chủ mới dựa trên hình ảnh đó, làm cho nó được thêm vào bộ bản sao của tôi, loại bỏ các thứ cấp cũ, và cuộc sống là tốt, phải không? Không hoàn toàn - trung học mới đang tụt hậu khoảng một giờ sau, và thông qua quá trình trong ngày (và tối nay) cuối cùng được đến điểm mà nó là 14 giờ sau (mặc dù đủ kỳ lạ vẫn còn trong cửa sổ oplog).Tại sao bản sao MongoDB của tôi tiếp tục bị tụt hậu?

Tôi thực hiện bước tiếp theo từ việc "đồng bộ hóa trang thành viên cũ". Shutdown mongod trên cả hai máy chủ, gzip và sao chép thư mục dữ liệu của tôi từ tiểu học đến trung học, giải nén, kích hoạt cả hai, db.fsyncLock() của tôi. Điều làm tôi nhớ là ngay cả với DÙNG DỮ LIỆU, sau khi khởi tạo, trung học của tôi nói rằng đó là 1 giờ sau. Tôi thêm nó trở lại vào bộ bản sao, và nó bắt kịp một cách nhanh chóng để được 5 phút sau.

Tất cả tốt, phải không? Không - flash về phía trước, thứ cấp đang tiến lên, và bây giờ là 20 phút sau. Mongostat có chốt thứ cấp ở mức 95% bị khóa%, iostat -xm 2 không hiển thị bất kỳ điều gì điên rồ - chính hiện không hoạt động khi không ghi, thứ hai chắc chắn không làm được gì nhiều (0,04 wMB/giây). Không chắc chắn nếu nó đáng nói đến, nhưng tiểu học hiện đang cảm thấy chó chậm đăng nhập không phản hồi vào vỏ mongo, v.v.

Điều gì cho, Mongo? Tại sao bạn không thể bắt kịp? Tôi đang làm gì sai khi cố gắng bắt kịp thứ cấp của mình?

EDIT câu hỏi Trả lời:

  • Version: 2.0.4
  • Phần cứng: Cả hai nút là cùng một phần cứng, gần như tôi có thể nói - 8GB RAM, CPU lõi quad. Tôi cho rằng đó là một cái gì đó ảo hóa.
  • Tỷ lệ ghi: thay đổi. Như đã đề cập, đêm qua tôi đã chuyển đổi thành một bộ sưu tập giới hạn, điều này đã kích hoạt toàn bộ sự việc. Qua đêm, đã có một quá trình viết xung quanh một vài trăm tài liệu nhỏ (~ 155 byte mỗi) một vài lần một giờ, vì vậy tối đa tôi ước tính khoảng 100-200kbytes/giờ. Trong ngày, xử lý dữ dội hơn, cập nhật hàng trăm nghìn tài liệu 500 byte và viết thêm vài trăm nghìn. Vẫn không nói về số lượng dữ liệu khổng lồ. EDIT tìm thấy một số lượng iostat từ trước ngày hôm nay:
 
Device:   rrqm/s wrqm/s  r/s  w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util 
xvda    1.00 2564.50 243.50 282.50 8986.00 11388.00 77.47 11.32 21.46 2.36 37.93 0.50 26.50 

Đó là một đặc biệt bùng phát tại 11 WMB/s, thấy util% đạt 34% với 7 WMB/s, và 72% ở 52 RMB/S. Vì vậy, không bão hòa, nhưng chắc chắn là một khối lượng công việc nặng vào buổi sáng. Nó là thú vị mặc dù mặc dù có obj. kích thước ~ 5GB và chỉ mục ~ 1GB (xem bên dưới), có quá nhiều hoạt động trên đĩa. Không phải tất cả trong RAM phải không?

  • làm việc thiết lập: Tôi vẫn chưa tìm được phương pháp được chấp nhận cho việc tính toán thiết lập làm việc, nhưng nếu nó giúp:
 
    "collections" : 21, 
    "objects" : 15540092, 
    "avgObjSize" : 325.26198326238995, 
    "dataSize" : 5054601144, 
    "storageSize" : 5874327552, 
    "numExtents" : 132, 
    "indexes" : 43, 
    "indexSize" : 864366720, 
    "fileSize" : 10666115072, 
    "nsSizeMB" : 16, 
    "ok" : 1 

Tôi không thể tưởng tượng rằng đó là áp đảo 8GB RAM, mặc dù Tôi có thể sai.

  • một số mẫu mongostat gần đây từ thứ:
 
insert query update delete getmore command flushes mapped vsize res faults locked % idx miss %  qr|qw ar|aw netIn netOut conn set repl  time 
    *0  *0  *0  *0  0  1|0  0 22.2g 44.9g 912m  0  99.2   0  0|0  0|1  2k 303b 151 mySet SEC 03:47:54 
    *0  *0  *0  *0  0  1|0  0 22.2g 44.9g 1.85g  0  101   0  0|0  0|1  3k 303b 151 mySet SEC 03:48:04 

EDIT

Cố gắng điều hơn. Tôi tắt máy chính (bây giờ được gọi là A, thứ cấp sẽ là B), xóa dữ liệu của nó và giải nén ảnh chụp nhanh của nó (bây giờ là một vài giờ cũ, nhưng tại thời điểm này, chúng tôi không viết gì mới). Bắt đầu với --fastsync, và nó vẫn giống như 45 giây phía sau của B (bây giờ chính) optime, mà đã được treo ra vào khoảng 02: 19: 52UTC. Cuối cùng khoảng một giờ sau đó, A bắt kịp, vì vậy tôi gọi rs.stepDown() trên B. Ngay lập tức, rs.status() cho tôi thấy rằng cả hai máy chủ đều có khoảng thời gian khoảng 04:08 UTC, nhưng B (hiện là phụ) lại bị trễ 17 giây ... sau đó 30 giây ... bây giờ 7 phút ...

EDIT

Một vài phút sau khi uống @ đề nghị matulef và tái tạo chỉ số trên các bộ sưu tập mũ của tôi, cũng như bắt đầu lại quá trình mongod của phụ, thời gian sử dụng của nó chỉ tăng vài giây. Trung bị khóa% từ mongostat vẫn còn lơ lửng từ 95-104%, và thú vị đủ, kích thước res được swinging khá wildly từ 100M đến 2GB và trở lại một lần nữa trước khi giải quyết khoảng 1GB.

EDIT (buổi tối tiếp theo)

Kết luận câu chuyện - @matulef đã đi đúng hướng, tôi cần phải có được cẩn thận hơn về việc chuyển đổi một bộ sưu tập sao chép đến một bộ sưu tập mũ. Điều gì sau là những gì đã xảy ra, mặc dù tôi không quảng cáo điều này như là dữ liệu an toàn - Tôi tự do thừa nhận rằng tôi có thể đã mất một số dữ liệu trong quá trình này, vì vậy YMMV.

Tạo chỉ mục cho các bộ sưu tập được giới hạn trên chính (A) không được truyền cho phụ (B) và A xảy ra để không thành công (không cố tình). Khi B là chính, tôi đã tạo thủ công các chỉ mục trên các bộ sưu tập được giới hạn ở đó và thao tác đồng bộ hóa để mang A theo B bắt đầu di chuyển nhanh chóng. Thật không may cho tôi, cửa sổ oplog của tôi không còn xếp hàng nữa, vì vậy tôi đã phải chụp nhanh dữ liệu từ B đến A. Khi tôi khởi động lại mongo với cùng một tập hợp dữ liệu, A & B đã vui vẻ trở lại và sao chép đã trở lại đồng bộ kể từ đó.

+0

là sản phẩm phụ có phần cứng giống như sản phẩm chính? phiên bản của mongoDB là gì? –

+0

Tỷ lệ ghi là bao nhiêu? RAM bao nhiêu và bộ công việc mong muốn là gì? – Kevin

+1

Bạn có chỉ mục _id cho bộ sưu tập giới hạn của mình không? Theo mặc định, nó không được tạo trên các bộ sưu tập giới hạn, do đó, tôi đoán là khi bạn đã làm một "convertToCapped" bạn bị mất nó. Đây là nguyên nhân phổ biến (và dễ khắc phục) của sự chậm trễ nhân rộng. Xem cảnh báo ở đây: http://www.mongodb.org/display/DOCS/Capped+Collections – matulef

Trả lời

6

Vấn đề ở đây là các bộ sưu tập được giới hạn không có chỉ mục _id theo mặc định (và lệnh "convertToCapped" thực sự giảm xuống tất cả chỉ mục cho bộ sưu tập đó). Đây là vấn đề bởi vì người thứ hai thực hiện cập nhật bằng cách áp dụng các op từ oplog, tham chiếu đến tài liệu theo _ids của họ. Nếu bạn thiếu chỉ mục _id, mỗi lần cập nhật yêu cầu quét toàn bộ bảng trên các trang web thứ hai, khiến chúng tụt hậu phía sau.

Giải pháp là tạo chỉ mục _id trên bộ sưu tập được giới hạn. Tuy nhiên, nếu bạn tạo chỉ mục trên danh mục chính, nhưng những người thứ hai của bạn đã tụt lại phía sau, họ sẽ không nhận được thao tác tạo chỉ mục đủ nhanh. Thay vào đó, cách tốt nhất để khắc phục sự cố là trước hết hãy sửa từng thứ hai, từng người một.Đối với mỗi một, tắt nó và khởi động lại ở chế độ độc lập (trên một cổng khác, không có tùy chọn --replSet), xây dựng chỉ mục _id, sau đó thêm nó trở lại vào tập hợp. Cuối cùng, khi các phiên bản thứ hai được cố định, bạn có thể rút xuống phần chính và lặp lại quy trình với nó.

Cập nhật: Trong mongoDB 2.0.x trở về trước, bộ sưu tập có giới hạn không có chỉ mục _id theo mặc định. Tuy nhiên, hành vi mặc định được lên lịch để thay đổi trong mongoDB 2.2, do đó các bộ sưu tập được giới hạn được tạo trong 2.2+ sẽ có chỉ mục _id được tạo tự động, giống như với các bộ sưu tập không được giới hạn. Đối với các bộ sưu tập được giới hạn được tạo trước phiên bản 2.2, bạn sẽ vẫn cần tạo chỉ mục _id theo cách thủ công bằng cách sử dụng các bước được nêu ở trên, nhưng các bộ sưu tập mới sẽ không bị các vấn đề ở trên.

Các vấn đề liên quan