Những lý do Docker không nên được sử dụng cho cơ sở dữ liệu là gì?


25

Tôi đang thảo luận với một người bạn về các trường hợp sử dụng cho Docker . Một anh chàng trong đội muốn sử dụng Docker cho mọi thứ - giống như một loại trình bao bọc quy trình unix phổ quát. Người khác nghĩ rằng Docker chỉ nên được sử dụng cho các ứng dụng không trạng thái như các ứng dụng kiểu microserviceAWS Lambda .

Chúng tôi đã thiết kế bằng chứng về các khái niệm cho cả hai. Trên cụm docker của chúng tôi, chúng tôi có một ổ đĩa chung được gắn kết khi máy chủ Docker được gắn kết và nếu Cơ sở dữ liệu trong một container được gắn kết, nó chỉ cần gắn một ổ đĩa vào ổ đĩa chung.

Bạn tôi vẫn bám sát vị trí của mình, mặc dù đã được đưa ra bằng chứng trái ngược. (Ông cũng lập luận rằng Docker thêm rủi ro không cần thiết bằng cách thêm độ phức tạp vào ngăn xếp.)

Tôi đang cố gắng lắng nghe và hiểu quan điểm của anh ấy, cả trong hành động đồng cảm, nhưng cũng là lý do tốt hơn với anh ấy. (Tất cả chúng ta đều khá hợp nhau - vì vậy đây là sự pha trộn giữa thảo luận sôi nổi và nghiêm túc).

Loại câu hỏi đằng sau câu hỏi là: cơ sở dữ liệu gia súc ? Nhận xét này cho thấy rằng một chiến lược sao lưu và truy xuất tự động tốt cho cơ sở dữ liệu của bạn không thể phân biệt được với máy chủ gia súc.

Câu hỏi của tôi là: những lý do nào Docker không nên được sử dụng cho cơ sở dữ liệu?

EDIT: Mọi người đã yêu cầu tôi làm rõ thuật ngữ của mình. Tôi đã giả định rằng ứng dụng cơ sở dữ liệu nằm trong vùng chứa và bộ lưu trữ nằm trong ổ đĩa. Ý tôi là, RDBMS nằm trong vùng chứa và bộ lưu trữ cơ sở dữ liệu nằm trong ổ đĩa.

Một số nhà bình luận cho rằng các trình điều khiển âm lượng docker sẽ không hoạt động với cơ sở dữ liệu ghi rất tốt. (Hoặc một thứ gì đó hiệu quả). Bạn có thể vui lòng mở rộng về điều đó?



Theo tác giả của blog này, người ta KHÔNG nên chạy cơ sở dữ liệu bên trong các thùng chứa vì các nhà cung cấp đám mây cung cấp cơ sở dữ liệu được quản lý.
030

Câu trả lời:


20

Khi mọi người nói về việc chạy cơ sở dữ liệu trong Docker, họ không có nghĩa là lưu trữ dữ liệu trong một thùng chứa; họ đang nói về việc có một hình ảnh docker với phần mềm DB và gắn dữ liệu dưới dạng một khối lượng (một khối lượng liên kết, không phải là một khối lượng container).

Các tập là một phần thiết yếu trong Docker, và không phải là thứ gì đó dễ vỡ hoặc chỉ được xử lý. Docker không chỉ được thực hiện cho các dịch vụ phi trạng thái (vi mô).

Mong muốn như tôi có thể, tôi không thể tìm thấy lý do kỹ thuật để không chạy cơ sở dữ liệu trong Docker, vì vậy thật không may, tôi sẽ chọn phía bên kia của đối số và do đó có thể không cung cấp cho bạn câu trả lời mà bạn đang tìm kiếm.

(Tôi đang sử dụng Oracle làm ví dụ vì tôi quen thuộc với nó, cả kim loại trần và neo, và bởi vì nó khá là một con thú khét tiếng vì chỉ hoạt động một chút không tầm thường nếu bạn đi qua các cài đặt mặc định.)

  • Việc tự đóng gói phần mềm DB trong một thùng chứa mang lại cho bạn những lợi ích thông thường - có cùng một phiên bản ở mọi nơi, tránh các vấn đề thư viện / chia sẻ phụ thuộc, có thể tạo ra DB chính xác trên máy tính xách tay của nhà phát triển hoặc bất cứ nơi nào bạn cần.
  • Đó là một snap khiến nó chạy ở bất cứ đâu; cập nhật là tầm thường, và như vậy. Tất cả các lợi ích Docker áp dụng. Có một hình ảnh Oracle trên Dockerhub cho phép bạn quay DB hoạt động trong một hoặc ba phút (và tất nhiên là cho cả những người khác).
  • Mọi người đã thực hiện các bài kiểm tra hiệu suất và không tìm thấy sự khác biệt I / O giữa khối lượng và kim loại trần ( https://www.percona.com/blog/2016/02/11/measuring-docker-io-overhead/ , https: // stackoverflow .com / câu hỏi / 21889053 / what-is-the-runtime-Performance-cost-of-a-docker-container ).
  • Dù sao, nó không giống như Docker bằng cách nào đó chặn tất cả I / O. Nó chỉ sáng tạo với các công cụ Linux tiêu chuẩn (liên kết gắn kết trong trường hợp này, xáo trộn các bảng nhân bên trong làm cho Docker-fu hoàn toàn có thể).
  • Rõ ràng điều đó không có nghĩa là bạn có thể chạy hai phiên bản của DB và chỉ để chúng hoạt động trên cùng một tệp, nhưng không ai ngụ ý điều đó. Docker không cung cấp cho bạn quyền truy cập tự động đồng thời và không có phép thuật vào các tập, và không bao giờ giả vờ làm như vậy. Phần còn lại của lợi ích vẫn được áp dụng. Nếu bản thân DB của bạn không phát hiện ra các xung đột như thế này, tốt hơn hết bạn nên cung cấp tập lệnh CMD cho hình ảnh từ chối quay một thùng chứa thứ hai khi âm lượng đã được sử dụng.
  • Bạn phải cẩn thận hơn một chút khi quay / tắt container (giống như bạn sẽ không đơn giản tắt máy chủ DB kim loại trần), nhưng điều đó khá dễ quản lý.

Bây giờ, tùy thuộc vào hoàn cảnh, có thể có những lý do mềm để không làm điều đó:

  • Ví dụ, Oracle (công ty) chắc chắn sẽ không hỗ trợ bạn nếu bạn chạy RDBMS của họ trong bộ chứa Docker. Nhưng có lẽ bạn đang sử dụng các hình ảnh Oracle RDBMS được dockerized chỉ cho các nhà phát triển và môi trường thử nghiệm, nơi bạn sẽ không cần sự hỗ trợ của họ trong mọi trường hợp, hãy đặt nó cho một máy chủ sản xuất kim loại trần. (Nhưng đừng quên thanh toán giấy phép của bạn ...).
  • Nếu các anh chàng không quen với Docker, có thể dễ dàng hơn một chút để vô tình giết tất cả mọi thứ, phá hủy các tệp dữ liệu của bạn, v.v.
  • Nếu bạn đã có máy DB kim loại chuyên dụng lớn, với số lượng lớn bộ lưu trữ SAN chuyên dụng rất nhanh và không có gì khác, thì sẽ không có lý do gì khi sử dụng Docker để chứa chúng vì bạn sẽ không bao giờ quay máy chủ khác khi ở đó là 100 GB hoặc thậm chí TB dữ liệu. Xét cho cùng, đối với sản xuất, một RDBMS như Oracle rất, rất tiên tiến trong tất cả các bản sao, tích hợp dữ liệu, chuyển đổi dự phòng không ngừng hoạt động, v.v. Lưu ý rằng đối số này chỉ nói "bạn không cần phải chứa RDBMS". Nó không nói "bạn không nên làm điều đó" - có thể bạn muốn làm điều đó bởi vì bạn muốn triển khai nâng cấp phần mềm cơ sở dữ liệu thông qua các container hoặc vì bất kỳ lý do nào khác mà bạn có thể tưởng tượng.

Vì vậy, có bạn đi. Bằng mọi cách, hãy cập bến DB của bạn, ít nhất là cho các nhà phát triển của bạn (người sẽ biết ơn mãi mãi) và môi trường thử nghiệm của bạn. Về sản xuất, nó sẽ đi xuống để hương vị, và ít nhất, tôi cũng muốn các giải pháp mà ngồi tốt nhất với DBA / Ops chuyên - nếu họ có hàng chục năm kinh nghiệm làm việc bare metal máy chủ DB, sau đó bằng mọi cách tin tưởng họ để tiếp tục như vậy. Nhưng nếu bạn là một người khởi nghiệp có tất cả CNTT trong đám mây, thì một Docker container sẽ chỉ là một mảnh hành nữa trong toàn bộ bức tranh.


Một yếu tố khác là nếu giải pháp thay thế đang sử dụng dịch vụ DB được quản lý so với lưu trữ của riêng bạn.
avi

3

Tôi đã viết về điều này sâu sắc nhưng đây là tóm tắt:

  • Ngăn chặn bộ não phân chia (bầu nhiều hơn một nút chủ) cần phải được giải quyết. Không làm như vậy có thể là thảm họa

  • Không có giải pháp lưu trữ chia sẻ sẵn sàng sản xuất để cho phép cơ sở dữ liệu được tắt trong một trường hợp và đưa lên một trường hợp khác mà không mất tất cả dữ liệu của bạn.


Cảm ơn - đó gần như là một câu trả lời hợp lý. Tuy nhiên, trong bài đăng trên blog của bạn - bạn thêm một cảnh báo xác thực giả định tôi đã viết lên đầu. "Các vấn đề được nêu dưới đây không liên quan đến việc chỉ chạy cơ sở dữ liệu của bạn trong docker mà không có bộ nhớ chia sẻ hoặc khả năng tự động khởi động nó trên một nút khác." Tức là - bài đăng trên blog của bạn nói rằng tình huống tôi đã viết ở trên là hợp lệ.
hawkeye

Từ câu hỏi của bạn, có vẻ như bạn đang sử dụng một số loại phối hợp để bắt đầu db và gắn kết âm lượng. Nhưng sau đó bạn có một vấn đề nhất quán tiềm năng với dàn nhạc, mà tôi nói đến. Thông báo trước của tôi là rõ ràng về khi bạn sử dụng không phối hợp.
Robo

Bạn đã thấy flynn.io chưa? Họ được cho là sẵn sàng sản xuất và tránh các tình huống chia não bằng cách sử dụng máy trạng thái hợp xướng (dựa trên Joyent Manatee).
Alix Axel

Cả hai điểm này đều không áp dụng cho cassandra hoặc các cơ sở dữ liệu phân tán khác nhưng tôi vẫn không nghĩ chạy nó trong một container là một ý tưởng hay.
Dres

0

Khi bạn nói rằng dữ liệu được gắn vào thùng chứa docker, sẽ không đúng hơn khi nói rằng "cơ sở dữ liệu" được gắn vào thùng chứa docker? Nếu bạn đang lưu giữ dữ liệu của mình bên ngoài vùng chứa thì bạn đang thực hiện điều "chính xác" là không đặt cơ sở dữ liệu của mình vào vùng chứa.

Chắc chắn, đi đến thị trấn đặt DBMS vào một thùng chứa để cho phép nó quản lý dữ liệu mà bạn lưu trữ bên ngoài, cá nhân tôi nghĩ rằng đó chỉ là thiết kế tốt vì nó giữ tách biệt rõ ràng giữa logic và dữ liệu. Nhưng một khi bạn đặt dữ liệu của mình vào một thùng chứa thì chúng có khả năng chơi với lửa.

Mặc dù các trình điều khiển lưu trữ container đã đi được một chặng đường dài, nhưng cá nhân tôi vẫn chưa sẵn sàng lao vào và để dữ liệu của mình bị rối trong một container.

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.