Совместное использование базы данных между двумя приложениями в Heroku

91

Я хочу получить доступ к базе данных приложения из другого приложения Heroku. Возможно ли это в общей базе данных?

Дональд
источник

Ответы:

100

ОБНОВЛЕНО

Первоначально в этом ответе говорилось, что, хотя это возможно с помощью нескольких уловок, это категорически не рекомендуется. Это было основано на совете на сайте поддержки разработчиков Heroku. Однако недавно Heroku выпустила сообщение, в котором конкретно описывается, как этого добиться, и смягчила свои рекомендации на сайте разработчиков. Полный текст этого раздела их электронного письма приведен ниже:

Знаете ли вы, что приложения Heroku могут использовать общую базу данных? Например, вы можете поместить функции аналитики в отдельное приложение от вашего пользовательского кода.

Просто установите для переменной конфигурации DATABASE_URL одно и то же значение для нескольких приложений. Сначала получите DATABASE_URL для существующего приложения:

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

Затем установите DATABASE_URL для новых приложений на это значение:

$ 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

- теперь оба приложения будут использовать одну базу данных.

Первоначальный совет Heroku в качестве ориентира заключался в создании и использовании API для удаленного доступа к данным. Я лично считаю, что в целом для многих ситуаций это хороший совет (т.е. лучше, чем просто подключение нескольких приложений к одной и той же БД), хотя я вижу ситуации, когда это было бы больше проблем, чем того стоит.

ОБНОВИТЬ

Согласно комментариям к этому ответу, стоит отметить, что Heroku оставляет за собой право изменять URL-адреса базы данных по мере необходимости. Если это произойдет, это приведет к сбою ваших вторичных подключений, и вам потребуется соответствующим образом обновить URL-адреса.

Пол Рассел
источник
1
просто установите приложения на Heroku, чтобы доказать, что это возможно - подробности в моем ответе.
Джон Бейнон,
1
Достаточно справедливо, голосование "против" отозвано ... Поддержка Heroku дает другой ответ! Вопрос: Если я разработаю два приложения heroku, смогут ли они получить доступ к одной базе данных? Причина, по которой я спрашиваю, заключается в том, что у нас есть приложение rails и приложение sinatra, и они должны совместно использовать базу данных postgres. Я бы предпочел не делать этого по http! Ответ от поддержки heroku: Да, если нужно, можно. Каждое приложение Heroku получает базу данных, подготовленную по умолчанию, но одно приложение может использовать базу данных другого приложения, просто скопировав переменную конфигурации DATABASE_URL из одного приложения в другое.
Джон Бейнон
1
Я отозвал свой голос против, но принятый ответ по-прежнему неверен, как и примечание.
Джон Бейнон
1
они говорят, что оставляют за собой право изменить URL-адрес базы данных вашего приложения, поэтому, если это произойдет, вам придется изменить URL-адрес базы данных, который вы использовали вручную.
Джон Бейнон
7
теперь есть официальный способ heroku для обмена DATABASE_URL между приложениями. см. ответ @ c360ian ниже .
mobeets
84

Поздний ответ на уместный вопрос!

Heroku теперь официально поддерживает лучшее / изящное решение посредством своей аддонной структуры. Это описано в их последнем информационном бюллетене о том, как обмениваться надстройками между приложениями. Ниже приведены фрагменты, упомянутые в описании:

$ 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

Ссылка: expanding_the_power_of_add_ons

c360ian
источник
Большое спасибо !, это должен быть приоритетный ответ!
HLL
2
Это правильный ответ. Все остальные ответы устарели, и большинство из них в любом случае дублируются.
jelder
5
Я использовал формат командыheroku addons:attach originating_app_name::HEROKU_POSTGRESQL_COLOR_URL -a no_db_app_name
Marklar
15

насколько я знаю, это возможно - вам нужно будет посмотреть переменные конфигурации heroku для вашего приложения с БД, а затем установить database_url в приложении, которое хочет поделиться базой данных с тем же значением. Как бы то ни было, и как это поддерживается, я не знаю.

РЕДАКТИРОВАТЬ Чтобы успокоиться, я создал два приложения на Heroku - простую «публикацию» с заголовком.

http://evening-spring-734.heroku.com/posts - это мастер

http://electric-galaxy-230.heroku.com/posts - это раб

Таким образом, сообщения, созданные на любом из них, будут записаны в URL-адрес базы данных Evening-Spring-734.

Все, что я сделал, это использовал конфигурацию heroku, чтобы получить DATABASE_URL для Evening-spring-734, а затем установить то же значение в DATABASE_URL для electric-galaxy-230.

Вы могли бы закончить с некоторыми плодотворными условиями гонки БД, но это определенно возможно.

Магия, да?

Джон Бейнон
источник
+1: Я считаю, что это очень полезно для создания коротких или скрытых URL ... например, myapp.me/iwasrobbed (приложение Heroku № 1) перенаправляет на myapp.com/users/1 (приложение Heroku № 2), поскольку теперь я могу хранить название тщеславия в стандартной пользовательской БД. Спасибо, Джон!
iwasrobled
1
heroku pg: promo DATABASE_URL --app your_app_name - это поддерживаемый способ установки этой переменной.
Нил Миддлтон
мой единственный комментарий относится к условиям гонки .. Рабочие и веб-экземпляр будут такими же, как и удаленные рабочие, такие как Iron worker или resqueue.
baash05 05
12

Я получил это недавно в информационном бюллетене Heroku. Я отправляю им электронное письмо, чтобы узнать, действительно ли это одобренное использование.

ВЫ ЗНАЛИ?

Совместное использование одной базы данных с несколькими приложениями

Знаете ли вы, что приложения Heroku могут использовать общую базу данных? Например, вы можете поместить функции аналитики в отдельное приложение от вашего пользовательского кода.

Просто установите для DATABASE_URL переменной конфигурации для нескольких приложений одно и то же значение. Сначала получите DATABASE_URLдля существующего приложения:

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

Затем установите DATABASE_URLдля новых приложений это значение:

$ 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.

Вот и все - теперь оба приложения будут использовать одну базу данных.

ДжошРиверс
источник
4
Я спросил Heroku об использовании этого метода для получения как бесплатного веб-дино, так и бесплатного рабочего дино. Вот их ответ. >> "Джош, мы не рекомендуем делать это, но, кроме того, могут возникнуть проблемы с простаивающим воркером. После простоя он перестанет выполнять какую-либо работу, и ничто не может его" разбудить ", как веб-запрос, бесполезен в качестве работника. "<< Похоже, вы можете использовать несколько приложений в одной БД, но это не очень полезно бесплатно.
JoshRivers
Я использую его для разработки, у меня уже есть тысячи строк в моем живом приложении, а новый внешний вид разрабатывается в другом небольшом приложении heroku, поэтому возможность делиться данными - это круто, я могу разработать и увидеть новые взгляды с помощью те же данные
Двид Сильва
7

Для этого хорошо подходит плагин Amazon RDS. Несколько приложений могут использовать один и тот же экземпляр RDS.

У вас есть гибкость, позволяющая им совместно использовать таблицы или избежать конфликта имен таблиц с помощью active_record.table_name_prefix.

Стив Вильгельм
источник
1

См. Ссылку на Heroku: https://devcenter.heroku.com/categories/heroku-postgres

В: Могут ли несколько приложений Heroku подключаться к одной базе данных?

Да. Вы можете настроить несколько приложений, работающих на Heroku, для подключения к одной базе данных, при условии, что у вас есть учетные данные базы данных. Просто переопределите DATABASE_URL приложений, которые вы хотите подключить, используя команду heroku config: add DATABASE_URL = ...

jmk
источник