Chia sẻ cơ sở dữ liệu giữa 2 ứng dụng trong Heroku


89

Tôi muốn truy cập cơ sở dữ liệu của một ứng dụng từ một ứng dụng Heroku khác. Điều đó có khả thi trong cơ sở dữ liệu được chia sẻ không?

Câu trả lời:


100

ĐÃ CẬP NHẬT

Ban đầu, câu trả lời này nói rằng mặc dù điều này có thể thực hiện được với một vài thủ thuật, nhưng nó rất không được khuyến khích. Điều này dựa trên lời khuyên trên trang web hỗ trợ nhà phát triển Heroku. Tuy nhiên, gần đây Heroku đã đưa ra một thông báo mô tả cụ thể cách đạt được điều này và đã đưa ra lời khuyên của họ trên trang web của nhà phát triển. Nội dung hoàn chỉnh của phần này trong e-mail của họ được bao gồm bên dưới:

Bạn có biết rằng các ứng dụng Heroku có thể chia sẻ một cơ sở dữ liệu chung? Ví dụ: bạn có thể đặt các chức năng phân tích trong một ứng dụng riêng biệt từ mã giao diện người dùng của bạn.

Chỉ cần đặt var cấu hình DATABASE_URL cho một số ứng dụng thành cùng một giá trị. Trước tiên, hãy tải DATABASE_URL cho ứng dụng hiện có của bạn:

$ heroku config | grep DATABASE_URL  --app sushi DATABASE_URL => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute1.amazonaws.com/ldfoiusfsf

Sau đó, đặt DATABASE_URL cho các ứng dụng mới thành giá trị này:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf Restarting app... done, v74. That's it

- bây giờ cả hai ứng dụng sẽ chia sẻ một cơ sở dữ liệu.

Chỉ là một điểm tham khảo, lời khuyên ban đầu của Heroku là tạo và sử dụng một API để truy cập dữ liệu từ xa. Quan điểm cá nhân của tôi là về tổng thể, đối với nhiều trường hợp, đây là lời khuyên tốt , (nghĩa là tốt hơn là chỉ kết nối nhiều ứng dụng với cùng một DB) mặc dù tôi có thể thấy những tình huống mà điều đó sẽ rắc rối hơn đáng giá.

CẬP NHẬT

Theo nhận xét về câu trả lời này, cần lưu ý rằng Heroku bảo lưu quyền thay đổi URL cơ sở dữ liệu theo yêu cầu. Nếu điều này xảy ra, nó sẽ khiến các kết nối phụ của bạn không thành công và bạn sẽ cần cập nhật các URL cho phù hợp.


1
chỉ cần thiết lập ứng dụng trên Heroku để chứng minh điều đó có thể - chi tiết trong phản hồi của tôi.
John Beynon

1
Đủ công bằng, bỏ phiếu xuống đã được rút lại ... Hỗ trợ Heroku đưa ra một câu trả lời khác! Câu hỏi: Nếu tôi phát triển hai ứng dụng heroku, chúng có thể truy cập vào một cơ sở dữ liệu duy nhất không? Lý do tôi hỏi là chúng tôi có một ứng dụng rails và một ứng dụng sinatra, và họ cần chia sẻ cơ sở dữ liệu postgres. Không muốn làm điều đó bằng http! Câu trả lời từ bộ phận hỗ trợ của heroku: Có, nếu bạn cần, bạn có thể. Mọi ứng dụng Heroku đều được cung cấp cơ sở dữ liệu theo mặc định, nhưng một ứng dụng có thể sử dụng cơ sở dữ liệu của ứng dụng khác chỉ bằng cách sao chép var cấu hình DATABASE_URL từ ứng dụng này sang ứng dụng khác.
John Beynon

1
Tôi đã rút lại phiếu bầu nhưng câu trả lời được chấp nhận vẫn không chính xác giống như FYI.
John Beynon

1
họ nói rằng họ có quyền thay đổi URL cơ sở dữ liệu ứng dụng của bạn, vì vậy nếu điều đó xảy ra, bạn cần thay đổi url cơ sở dữ liệu mà bạn đang sử dụng theo cách thủ công.
John Beynon

7
hiện có một cách heroku chính thức để chia sẻ DATABASE_URL giữa các ứng dụng. xem câu trả lời của @ c360ian bên dưới .
mobeets

81

Câu trả lời muộn màng cho câu hỏi thích hợp!

Heroku chính thức hỗ trợ một giải pháp tốt hơn / duyên dáng hơn bằng khung công tác bổ trợ của họ ngay bây giờ. Nó được mô tả trong bản tin mới nhất của họ về cách chia sẻ addon giữa các ứng dụng. Dưới đây là các đoạn trích được đề cập trong bài viết:

$ heroku addons:attach my-sushi-db -a my-sushi-reporting --as MAIN_SUSHI_DB    
  Adding MAIN_SUSHI_DB to my-sushi-reporting... done
  Setting MAIN_SUSHI_DB vars and restarting my-sushi-app-reporting... done, v3

Liên kết: expand_the_power_of_add_ons


Cảm ơn rất nhiều !, đây phải là câu trả lời được ưu tiên!
HLL

2
Đây là câu trả lời đúng. Tất cả các câu trả lời khác không được dùng nữa và hầu hết chúng đều trùng lặp.
jelder

3
Định dạng của lệnh Tôi đã từng làheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar

15

Theo như tôi biết là có thể - bạn sẽ phải xem xét các biến cấu hình heroku cho ứng dụng của mình bằng DB và sau đó đặt database_url trên ứng dụng muốn chia sẻ cơ sở dữ liệu thành cùng một giá trị. Tuy nhiên, Kinda đi chệch hướng và nó được hỗ trợ như thế nào thì tôi không biết.

CHỈNH SỬA Chỉ để cho tâm trí của tôi được nghỉ ngơi, tôi đã tạo ra hai ứng dụng trên Heroku - một 'bài đăng' đơn giản với tiêu đề.

http://evening-spring-734.heroku.com/posts là bậc thầy

http:// Electro-galaxy-230.heroku.com/posts - là nô lệ

Vì vậy, các bài đăng được tạo trên một trong hai sẽ được ghi vào URL cơ sở dữ liệu của Evening-spring-734.

Tất cả những gì tôi đã làm là sử dụng cấu hình heroku để lấy DATABASE_URL của Evening-spring-734 và sau đó đặt cùng một giá trị vào DATABASE_URL của electric-galaxy-230.

Bạn có thể kết thúc với một số điều kiện cuộc đua DB trái cây nhưng chắc chắn là có thể làm được.

Phép thuật hả?


+1: Tôi thấy điều này rất hữu ích khi thực hiện các URL ngắn hoặc vô nghĩa .. như myapp.me/iwasrobbed (Ứng dụng Heroku # 1) chuyển hướng đến myapp.com/users/1 (Ứng dụng Heroku # 2) vì bây giờ tôi có thể lưu trữ tên ảo trong DB người dùng chuẩn. Cảm ơn John!
iwasrobbed

1
heroku pg: promotion DATABASE_URL --app your_app_name là cách được hỗ trợ để đặt biến này.
Neil Middleton

nhận xét duy nhất của tôi là về điều kiện chủng tộc .. Công nhân và cá thể web sẽ giống nhau, cũng như nhân viên làm việc từ xa như công nhân sắt hoặc xếp hàng lại.
baash05

12

Tôi đã nhận được điều này trong bản tin Heroku gần đây. Tôi đang gửi email cho họ để tìm hiểu xem đó có thực sự là cách sử dụng được chấp thuận hay không.

BẠN CÓ BIẾT KHÔNG?

Chia sẻ một cơ sở dữ liệu với nhiều ứng dụng

Bạn có biết rằng các ứng dụng Heroku có thể chia sẻ một cơ sở dữ liệu chung không? Ví dụ: bạn có thể đặt các chức năng phân tích trong một ứng dụng riêng biệt từ mã giao diện người dùng của bạn.

Chỉ cần đặt DATABASE_URL var cấu hình cho một số ứng dụng thành cùng một giá trị. Đầu tiên, hãy tải DATABASE_URLứng dụng hiện có của bạn:

$ heroku config | grep DATABASE_URL  --app sushi
DATABASE_URL   => postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf

Sau đó, đặt DATABASE_URLcho các ứng dụng mới thành giá trị này:

$ heroku config:add DATABASE_URL=postgres://lswlmfdsfos:5FSLVUSLLT123@ec2-123-456-78-90.compute-1.amazonaws.com/ldfoiusfsf --app sushi-analytics
Adding config vars: DATABASE_URL => postgres://lswlm...m/ldfoiusfsf
Restarting app... done, v74.

Vậy là xong - bây giờ cả hai ứng dụng sẽ chia sẻ một cơ sở dữ liệu.


4
Tôi đã hỏi Heroku về việc sử dụng phương pháp này để nhận cả dyno Web miễn phí và dyno Worker miễn phí. Đây là phản hồi của họ. >> "Josh - chúng tôi không khuyến khích làm điều này, nhưng ngoài ra sẽ có vấn đề với nhân viên ở chế độ không tải. Một khi nó không hoạt động, nó sẽ ngừng thực hiện bất kỳ công việc nào và không có gì để 'đánh thức' nó như một yêu cầu web, nó sẽ vô dụng như một công nhân. "<< Vì vậy, có vẻ như bạn có thể sử dụng nhiều ứng dụng trên cùng một DB, nhưng nó không hữu ích cho lắm miễn phí.
JoshRivers

Tôi đang sử dụng nó cho mục đích phát triển, tôi đã có hàng nghìn hàng trong ứng dụng trực tiếp của mình và giao diện mới đang được phát triển trong một ứng dụng heroku nhỏ hơn khác, vì vậy có thể chia sẻ dữ liệu thật tuyệt, tôi có thể phát triển và xem giao diện mới với dữ liệu tương tự
Dvid Silva

7

Plugin Amazon RDS hoạt động tốt cho việc này. Nhiều ứng dụng có thể chia sẻ cùng một phiên bản RDS.

Bạn có thể linh hoạt để họ chia sẻ bảng hoặc tránh xung đột tên bảng bằng cách sử dụng active_record.table_name_prefix.


1

Xem tài liệu tham khảo về Heroku: https://devcenter.heroku.com/categories/heroku-postgres

Hỏi: Nhiều ứng dụng Heroku có thể kết nối với một cơ sở dữ liệu không?

Đúng. Bạn có thể định cấu hình nhiều ứng dụng chạy trên Heroku để kết nối với một cơ sở dữ liệu duy nhất, miễn là bạn có thông tin đăng nhập cơ sở dữ liệu. Chỉ cần ghi đè DATABASE_URL của các ứng dụng bạn muốn kết nối bằng cách sử dụng lệnh heroku config: add DATABASE_URL = ....

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.