|
|
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Нигде не могу найти информацию по поводу того, как же проводить распределенные транзакции в постгресе. Знаю, что для этого необходимо использовать PREPARE TRANSACTION, но как записать данные в удалённую базу? Единственное, что я нашёл, это dblink. Использую его так: Код: plsql 1. 2. 3. 4. 5. 6. 7. Пробовал и dblink и dblink_exec, но в обоих случаях данные коммитятся в удаленную базу сразу же, не дожидаясь того, как я закоммичу транзакцию. Сооветственно, в случае Код: plsql 1. данные из удалённой базы не откатываются. Видимо dblink не поддерживает транзакции? Или что-то не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2012, 12:20 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonio, http://www.postgresql.org/docs/9.2/static/sql-prepare-transaction.html вы наверняка решаете не ту задачу и не так. двухфазный коммит нужен при реализации менеджеров распределенных траназакций. какая у вас исходная проблема? зачем вам всё это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2012, 12:26 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Просто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции. Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2012, 12:31 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверахоткрыть несколько коннектов - к каждому серверу. DAntonioно как записать данные в удалённую базу?подключиться к удаленному серверу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2012, 12:58 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
LeXa NalBat, А как сделать это в одной транзакции и всё откатить в случае неудачи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2012, 13:08 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonio, вообще-то никак. для подобных проблем, согласование транзакционных машин, имеются два рабочих подхода. 1) менеджеры распределенных транзакций, внутри которых протокол двухфазный как раз и еще немного всякой требухи. 2) "транзакционные" очереди - ивентуал-консиcтенси. -- 1) http://en.wikipedia.org/wiki/Two-phase_commit http://ru.wikipedia.org/wiki/XA_Транзакции и данная штука вам, в том числе, будет обеспечивать, что система может достигать состояния, когда все вовлеченные в X-транзакцию транзакции-внутри-узлов могут быть в будущем гарантированно закоммиченны (на второй фазе как раз). при этом "синхронность" второй фазы вам никто не обещает. и суть, каждая i-ая транзакционная машина сама по себе ничего не знает о глобальном замысле) и её состояние может быть не согласованно с состоянием глобальной X-транзакции, в том плане, что Х еще не закоммичена, а х-i-тая транзакция (на узле i которая) уже закоммичена. вооот. ну и вопрос с падениями/восстановлениями. после восстановлений любого из узлов и/или менеджера (который сам по себе тоже транзакционная машина - такая же база) - надо всё "чекать" на согласованность с менеджером. это сложно. но этого можно избежать если коммит синхронный с записью в вал. что, кстати, по дефолту в пг и в добавок может контролироваться с точностью до каждой конкретной транзакции. -- 2) http://en.wikipedia.org/wiki/Eventual_consistency тут суть в том, что событие создается в источнике, в той же транзакции локальной что и полезное действие. а потом уже событие доставляется на другой узел и там "проигрывается". (доставка асинхронная в общем виде всегда) но тут получаем три момента. 2.1) всё может казаться более асинхронным, чем в первом варианте 2.2) можем получить аварию первого рода. на другом узле проигралось, а в источнике событие после этого не проапдейтилось. тогда событие придет еще раз в другой узел - надо быть к этому готовыми. 2.3) можем получить аварию второго рода. случилось "падение" источника, а восстановление в нём удалось не до самой последней транзакции. тогда возможно на другом узле уже успели проиграться события из "параллельной" вселенной, которая умерла. то есть события доставились, транзакции которых недовостановились в источнике. надо тоже проводить синхронизацию убежавшей в "несбыточное" будущее другой базы. ну или касательно падения другой базы, события из источника надо суметь сгенерить повторно, с момента до которого восстановили другую базу. но аварию второго рода можно так же избежать применяя везде синхронный коммит (как и в случае с падениями/востановлениями при распред транзакции). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2012, 20:08 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonioLeXa NalBat, А как сделать это в одной транзакции и всё откатить в случае неудачи? Написать свой менеджер распределенных транзакций как вам и посоветовал Михаил. two-phase commits - это только маленькая часть корректной реализации этой задачи (правда без нее никуда). PS: вообще штука более чем нетривиальная в реализации не зря хорошие коммерческие варианты стоят запредельно дорого. PPS: гарантированно синхронные распределенные транзакции не возможны просто потому что мир так неудачно устроен :). PPPS: Misha Tyurin очень очень хороший и подробный ответ написал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2012, 03:47 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Misha Tyurin, Спасибо большое. Всем спасибо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2012, 12:43 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Тут вам не Оракл! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2012, 13:19 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции. Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах. Не проще ли pg_pool II использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2012, 14:24 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
PYODAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции. Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах. Не проще ли pg_pool II использовать? ага... а он что будет делать если insert на одном из серверов не пройдет? :) pg_pool 2 Это не про надежность ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2012, 14:46 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции. Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах. Да, и этот сервер выпадет из пула. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2012, 01:20 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
авторINSERTы в несколько баз данных на разных серверах в рамках одной транзакции Прошу прощения - внимательно не дочитал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2012, 01:22 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
PYODAntonioПросто необходимо провести INSERTы в несколько баз данных на разных серверах в рамках одной транзакции. Если на одном сервере INSERT не прошёл, откатить транзакцию на всех серверах. Да, и этот сервер выпадет из пула. не в плане критики... а как вы потом этот сервер будете в пул возвращать не останавливая процесс? особенно если бывает такая сказочная вещь как deadlocks которые на 2х серверах возникнут из 10 а на остальных нет... а deadlocks штука в общем то неприятная но в некоторых ситуациях 100% неизбежная... у вас через 10 минут работы в таком режиме останется один сервер :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2012, 02:59 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Maxim BogukPYOпропущено... Да, и этот сервер выпадет из пула. не в плане критики... а как вы потом этот сервер будете в пул возвращать не останавливая процесс? особенно если бывает такая сказочная вещь как deadlocks которые на 2х серверах возникнут из 10 а на остальных нет... а deadlocks штука в общем то неприятная но в некоторых ситуациях 100% неизбежная... у вас через 10 минут работы в таком режиме останется один сервер :) Спасибо. Буду знать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2012, 16:40 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonio, мне кажется, Вам может помочь еще такой вариант: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Конечно, это условная синхронизация, т.к. есть вероятность ошибки на стадии выполнения команды COMMIT во внешней транзакции, например при использовании DEFFERRED констрейнтов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2012, 20:13 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Maxim Boguk PS: вообще штука более чем нетривиальная в реализации не зря хорошие коммерческие варианты стоят запредельно дорого. Штука совершенно тривиальная в реализации и если не устраивают бесплатные реализации J2EE, то можно взять любой оракл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2012, 13:10 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
DAntonio, 1. Все он поддерживает 2. Вам надо: а) зарегистрировать в ТРАНЗАКЦИОННОМ хранилище всех участников транзакции и айдюк оной (и коммит туда же тут же) б) провести транзакции на нодах в) каждую транзакцию отпрепарить с соответствующим айдюком г) тот факт, что отпрепарено на всех нодах - занести в транзакционное хранилище по отдельности с коммитом на каждую д) закоммитить на всех нодах транзакции. е) грохнуть все даные о транзакциях, собранных на предыдущем этапе. Все 2.1 Восстановление после сбоев: нужен демон восстановления, который перебирает транзакции из хранилища из п. 2.а и смотрит, живы ли они. Если транзакции выполняются, это не его дело, а если нет, то он смотрит, удалось ли отпрепарить всех участников каждой транзакции. Если да, то он обходит и докоммичивает,если нет - откатывает на всех нодах. 3. Реализовывать можно как угодно, пусть и дблинком, хотя получается несколько сексуально.Оптимизации по вкусу; вообще процедура достаточно тормозная - на менеджере транзакций надо сделать 2n+1 коммитов, где n - число нод; так что разумнее всего это все делать пачкой, а не по одной записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2012, 13:27 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
некий хрен с горы, опишите как вы будете восстанавливаться если в процессе у вас упадёт ваше "ТРАНЗАКЦИОННОЕ хранилище всех участников транзакции"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2012, 15:18 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Гость_0некий хрен с горы, опишите как вы будете восстанавливаться если в процессе у вас упадёт ваше "ТРАНЗАКЦИОННОЕ хранилище всех участников транзакции"? А что, разве что-то неясно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.12.2012, 16:14 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
некий хрен с горыDAntonio, 1. Все он поддерживает 2. Вам надо: а) зарегистрировать в ТРАНЗАКЦИОННОМ хранилище всех участников транзакции и айдюк оной (и коммит туда же тут же) б) провести транзакции на нодах в) каждую транзакцию отпрепарить с соответствующим айдюком г) тот факт, что отпрепарено на всех нодах - занести в транзакционное хранилище по отдельности с коммитом на каждую д) закоммитить на всех нодах транзакции. е) грохнуть все даные о транзакциях, собранных на предыдущем этапе. Все 2.1 Восстановление после сбоев: нужен демон восстановления, который перебирает транзакции из хранилища из п. 2.а и смотрит, живы ли они. Если транзакции выполняются, это не его дело, а если нет, то он смотрит, удалось ли отпрепарить всех участников каждой транзакции. Если да, то он обходит и докоммичивает,если нет - откатывает на всех нодах. 3. Реализовывать можно как угодно, пусть и дблинком, хотя получается несколько сексуально.Оптимизации по вкусу; вообще процедура достаточно тормозная - на менеджере транзакций надо сделать 2n+1 коммитов, где n - число нод; так что разумнее всего это все делать пачкой, а не по одной записи. как то так оно и делается на практике... реально реализовать эту схему надежно - достаточно интересная задача и весьма нетривиальная... ну и у транзакционного хранилища надо иметь синхронную реплику рядом... Все это делается но если я не слишком отстал от жизни - готового проверенного решения для PostgreSQL нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2012, 04:28 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Maxim Bogukкак то так оно и делается на практике... Ну да, как-то так. Maxim Bogukреально реализовать эту схему надежно - достаточно интересная задача и весьма нетривиальная... Возьмите исходники JTA Maxim Bogukну и у транзакционного хранилища надо иметь синхронную реплику рядом... ? Maxim BogukВсе это делается но если я не слишком отстал от жизни - готового проверенного решения для PostgreSQL нет. JBoss, Glassfish - вот так вот сходу. Жалоб на то, что они плохо живут с постгресом я не слышал, с ораклом/дерби вообще без проблем, многие даже не понимают, что там внутре на самом деле происходит. В чем проблемы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2012, 12:41 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Author the new oneJBoss, Glassfish - вот так вот сходу. Жалоб на то, что они плохо живут с постгресом я не слышал, с ораклом/дерби вообще без проблем, многие даже не понимают, что там внутре на самом деле происходит. В чем проблемы? Добавлю свои 5 копеек. Если вам не хочется тащить весь J2EE стэк то советую попробовать Bitronix http://docs.codehaus.org/display/BTM/Home и в частности его high performance fork https://github.com/brettwooldridge/bitronix-hp . У нас Bitronix с PostgreSQL вполне хорошо живут. Сотни распределённых транзакций в секунду. У распределённых транзакций в PostgreSQL есть парочку не очевидных граблей. Во первых commit prepared ВСЕГДА делает fsync, даже если synchronous commit=off. Во вторых по времени выполнения commit prepared и prepare transaction занимают вполне существенно, около 2-3 времён обычных коммитов. Суммарно это всё приводит к тому, что на одну распределённую транзакцию между двумя нодами вам надо 5 fsync-ов. 2 на 2 commit prepared, 2 на 2 prepare transaction и 1 на fsync лога менеджера транзакций :) Короче я к тому, что по перфомансу распределённые транзакции ударяют весьма заметно, имейте ввиду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2012, 16:20 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
Maxim BogukНаписать свой менеджер распределенных транзакций как вам и посоветовал Михаил. ... PS: вообще штука более чем нетривиальная в реализации не зря хорошие коммерческие варианты стоят запредельно дорого. Transaction Manager-ов для распределённых транзакций есть много open source-ных и вполне надёжных. Нисколько это не стоит. Писать свой точно не стоит, там 100500 маленьких грабелек и стандартов, как надо реагировать на проблемы в разных фазах двухфазного протокола. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2012, 16:29 |
|
||
|
Распределенные транзакции
|
|||
|---|---|---|---|
|
#18+
[quot Пилот Пиркс]Maxim Boguk Писать свой точно не стоит, там 100500 маленьких грабелек и стандартов, как надо реагировать на проблемы в разных фазах двухфазного протокола. Я писал свой - из пг в оракл с логом в мыскль, все очень незамысловато. Работало без проблем; разве что все было свое - может, потому на грабли не набрел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.12.2012, 23:41 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38057671&tid=1997598]: |
0ms |
get settings: |
8ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
156ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 238ms |
| total: | 477ms |

| 0 / 0 |
