powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Multi-Master в PostgreSQL
22 сообщений из 22, страница 1 из 1
Multi-Master в PostgreSQL
    #35329758
-devICE-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Излазил множество сайтов по инету, нашел из полезных только Cybercluster, который основан на PGCluster (который ещё до кучи и не настроил до конца, т.к. не могу в винде поднять rsync и ssh), кто ещё может посоветовать для решения репликаций мультимастер в постгресе? Нужна мультиплатформенная утилитка, т.к. базы будут стоять и в виндах и в линуксах...
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35329794
Z][ANSWER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну ещё можно глянуть SkyTools, оно вроде тоже, что такое умеет...:-\
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35330936
Thamerlan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkyTools не имеет ничего общего в мультимастером. Это proxy-решение, позволяющее сделать горизонтальное партиционирование между серверами.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35333184
-devICE-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и все же есть ещё решение (кроме pgpool-II, т.к. он только под линух) мультимастера для постгреса? Или все таки придется пытаться писать свою утилиту синхронизации данных... А вообще как бы поподробнее узнать о процессе репликации? Потому что я пока его очень отдаленно понимаю...
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35333371
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-devICE-Ну и все же есть ещё решение (кроме pgpool-II, т.к. он только под линух) мультимастера для постгреса? Или все таки придется пытаться писать свою утилиту синхронизации данных... А вообще как бы поподробнее узнать о процессе репликации? Потому что я пока его очень отдаленно понимаю...1) есть аналоги пгпула для java.
2) если что-то не очень хорошо понимаете, то почитайте сначала общую литературу, тогда и 95% вопросов отпадёт
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35333573
-devICE-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dan Black -devICE-Ну и все же есть ещё решение (кроме pgpool-II, т.к. он только под линух) мультимастера для постгреса? Или все таки придется пытаться писать свою утилиту синхронизации данных... А вообще как бы поподробнее узнать о процессе репликации? Потому что я пока его очень отдаленно понимаю...1) есть аналоги пгпула для java.
2) если что-то не очень хорошо понимаете, то почитайте сначала общую литературу, тогда и 95% вопросов отпадёт
1. можете подсказать аналоги пгпула?
2. посоветуйте литературу по которой можно нормально изучить процесс репликации данных...
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35333668
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-devICE-1. можете подсказать аналоги пгпула?
2. посоветуйте литературу по которой можно нормально изучить процесс репликации данных...Буду краток: тынц , тынц

Q: Почему не даю прямых ссылок?
A: У меня их нет

Q: А почему тогда я влез в эту тему?
A: Потому что где-то, когда-то в интернете видел материалы на эти темы. И считаю, что если топикстартер напряжется, то легко их найдёт.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35334527
A.V.Goncharyk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уже давали на форуме линк http://bucardo.org/
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35338346
alex_v13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вышел Cybercluster 1.2 - http://www.postgresql-support.de/english/downloads_e.html.

Вроде, в отличие от PgPool-II умеет работать с sequence и т.д. Но надо проверять.

Когда же блин, эти ...пипи... разработчики Постгреса дотумкают своим мозгами, что без нормальной репликации и всего с ней связанного функционала, их продукт никогда не перерастет по классу MySQL, а уж про соревнования с Oracle можно не заикаться.

Интересно, у EnterpriseDB все так же плачевно?
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35338364
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_v13Когда же блин, эти ...пипи... разработчики Постгреса дотумкают своим мозгами, что без нормальной репликации и всего с ней связанного функционала, их продукт никогда не перерастет по классу MySQL, а уж про соревнования с Oracle можно не заикаться. Полностью согласен. Отсутствие нормально репликации очень напрягает.
авторИнтересно, у EnterpriseDB все так же плачевно?Год назад ничего принципиально нового не заметил :(
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35340006
drunk2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35340293
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
alex_v13Вышел Cybercluster 1.2 - http://www.postgresql-support.de/english/downloads_e.html.

Вроде, в отличие от PgPool-II умеет работать с sequence и т.д. Но надо проверять.

Когда же блин, эти ...пипи... разработчики Постгреса дотумкают своим мозгами, что без нормальной репликации и всего с ней связанного функционала, их продукт никогда не перерастет по классу MySQL, а уж про соревнования с Oracle можно не заикаться.

Неприятно и отсутствие конструкций вида CREATE ... IF NOT EXISTS, DROP ... IF EXISTS, INSERT OR REPLACE и т.п., что заставляет писать лишние функции и триггеры. В 8.1, который продакшен, нет вообще ничего из перечисленного, в 8.2 что-то есть, но он тормозной и глючный, а 8.3 сырой. Впрочем, когда я обнаружил, что при после переноса базы с 8.1 на 8.3 скорость выполнения многих запросов падает в разы и за несколько часов настройки конфига удалось это компенсировать лишь частично, возникло серьезное раздражение по поводу реализации модных фич вроде работы с xml и полнотекстового поиска (на кой ляд он нужен в ядре, если он может прекрасно работать модулем) на фоне пренебрежения планировщиком, репликацией и многими другими, жизненно необходимыми вещами. Если модуль для работы с xml можно самому написать, не сильно напрягаясь и не влезая в код постгреса, то с планировщиком пусть уж сами разработчики воюют.

Кстати, если кто знает, как можно с постгреса с хорошо настроенной статистикой (то есть БД долго кормим нужными последовательностями соответствующих запросов, статистика собирается, планы выполнения оптимизируются как мы хотим) перенести эту статистику на другой сервер и запретить ее менять при работе? А то сейчас в зависимости от типа активности пользователей план и время выполнения запросов меняются со временем. В итоге два одинаковых хоста с одной и той же базой работают по-разному, чем больше времени проходит, тем больше разница. Какая тут к черту репликация и балансировка нагрузки, когда на одинаковых хостах с одной базой разные планы выполнения (и в разы отличное время выполнения)?

Еще может кто подскажет, в 8.3 исправили наконец баги пгдампа при работе с многими схемами и объектами в них, принадлежащими разным пользователям? В 8.1 приходится дамп патчить, иначе не ресторится, поскольку выставление прав происходит в неверной последовательности и приводит к конфликтам доступа. При переносе на другой хост эти грабли жутко мешают.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35340463
alex_v13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С правами и юзерами в дампах вечные косяки.
Я всегда дамп/рестор делаю на схеме без прав, а потом их накатываю отдельно.

У меня проблем с переходом на 8.3.1 с 8.2.5 не было. Скорость работы базы выросла значительно.

Что делать с планами не могу предположить, они сбрасываются при рестарте сервера.
Физического доступа к статистике нет, есть только аналитика по системным view, ну Вы сами знаете :)
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35341438
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
alex_v13С правами и юзерами в дампах вечные косяки.
Я всегда дамп/рестор делаю на схеме без прав, а потом их накатываю отдельно.

Я маленький патчик состряпал, после него загружается. Типа такого

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
sed -i "
9iALTER SCHEMA public OWNER TO merch;
9iSET SESSION AUTHORIZATION 'merch';
/CREATE PROCEDURAL LANGUAGE plpgsql;/d
/CREATE PROCEDURAL LANGUAGE pltcl;/d
/CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler/,/LANGUAGE c;/d
/ALTER FUNCTION public.plpgsql_call_handler() OWNER TO postgres;/d
...
здесь идет обработка некорректных в дампе записей о назначении прав объектам
...
" schema.sql

Ну и языки в базе создаю до загрузки дампа.

alex_v13У меня проблем с переходом на 8.3.1 с 8.2.5 не было. Скорость работы базы выросла значительно.

Что делать с планами не могу предположить, они сбрасываются при рестарте сервера.
Физического доступа к статистике нет, есть только аналитика по системным view, ну Вы сами знаете :)

8.3 побыстрее 8.2, но во многих случаях медленнее 8.1. А со статистикой проблема получается вроде как вообще нерешаемая, ибо нет возможностей с ней работать вручную, хотя можно опосредованно воздействовать, подобрав соответствующий набор запросов и выполнив их многократно. Но на каждую ночь натравливать такой набор на сервер не хочется, да и за день статистика успевает перестроиться на работающем сервере... В sqlite есть замечательная фишка - статистику планировщика можно выгружать и загружать, что целиком решает указанный вопрос, хотелось бы что-то подобное придумать и с постгресом, но боюсь, это решается только ценой серьезной модификации ядра СУБД.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35341451
alex_v13
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MBG

8.3 побыстрее 8.2, но во многих случаях медленнее 8.1. А со статистикой проблема получается вроде как вообще нерешаемая, ибо нет возможностей с ней работать вручную, хотя можно опосредованно воздействовать, подобрав соответствующий набор запросов и выполнив их многократно. Но на каждую ночь натравливать такой набор на сервер не хочется, да и за день статистика успевает перестроиться на работающем сервере... В sqlite есть замечательная фишка - статистику планировщика можно выгружать и загружать, что целиком решает указанный вопрос, хотелось бы что-то подобное придумать и с постгресом, но боюсь, это решается только ценой серьезной модификации ядра СУБД.

Что-то у Вас странное творится, по моему мнению.
Мне хватает просто адекватно настроенного автовакуума с аналайзом, ну и раз в день принудительный вакуум по тройке критических таблиц (не фриз, его раз в месяц запускаю). И пока все планы адекватные, ну есть пара глюков планировщика, но они запросами перестроенными исправляются.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35341514
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
alex_v13
Что-то у Вас странное творится, по моему мнению.
Мне хватает просто адекватно настроенного автовакуума с аналайзом, ну и раз в день принудительный вакуум по тройке критических таблиц (не фриз, его раз в месяц запускаю). И пока все планы адекватные, ну есть пара глюков планировщика, но они запросами перестроенными исправляются.

На запросах, работающих с двумя-тремя таблицами и у меня все хорошо, а вот когда речь идет примерно о 10 таблицах и более, начинаются вещи совершенно странные. Хотя и таблицы не большие, от тысяч до миллионов записей, и все индексы есть и используются. Тем не менее, запросы на выборку тысячи записей могут требовать удивительно большого времени. Вот пример несложного view:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE OR REPLACE VIEW view_documents AS 
 SELECT d.id, d.save_date, d.exec_date, d.delete_date, d.user_id, u.point_id, u.center_id, u.region_id, u.macroregion_id, d.document_template_id, d.phone_number, d.fields_array, d.users_array, d.dates_array, r.name AS region, m.name AS macroregion, p.code AS point_code, p.town AS point_town, p.address AS point_address, p.trademark AS point_trademark, p.phone AS point_phone, p.email AS point_email, c.name AS center_name, c.code AS center_code, u.name AS user_name, tp.name AS template_name, tp.type_id AS template_type_id, tps.name AS template_type, tp.is_active AS template_is_active, a.value AS status, ( SELECT count(*) AS count
           FROM attributes a
          WHERE a.value = 'Отклонен'::text AND a.document_id = d.id) AS rejects_count
   FROM documents d
   JOIN auth.users u ON d.user_id = u.id
   JOIN auth.macroregions m ON u.macroregion_id = m.id
   JOIN auth.regions r ON u.region_id = r.id
   JOIN auth.points p ON u.point_id = p.id
   JOIN auth.centers c ON u.center_id = c.id
   JOIN attributes a ON d.id = a.document_id AND a.is_last
   JOIN document_templates tp ON d.document_template_id = tp.id
   JOIN document_template_types tps ON tp.type_id = tps.id;

И вот такой довольно элементарный запрос требует существенного времени (извлекается несколько сот записей):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
duration:  555 . 684  ms  statement:

                                select foo.*, e.name as executor, r.name as recenser
                                from (
                                        select id, macroregion, region, center_name, center_code, point_town, point_address, point_code,
                                                user_name as creator, point_trademark, region_id,
                                                (save_date at time zone interval '04:00')::date as create_date,
                                                date_trunc('sec', save_date at time zone interval '04:00')::time as create_time,
                                                phone_number, template_name, document_template_id, status,
                                                lindex(avalue(avalue(fields_array, 'attribute'), 'values'),  0 ) as primary_system,
                                                lindex(avalue(avalue(fields_array, 'attribute'), 'values'),  1 ) as sn,
                                                lindex(avalue(avalue(fields_array, 'attribute'), 'values'),  2 ) as abonent_informed,
                                                avalue(avalue(fields_array, 'transaction_on'), 'values') as ton_values,
                                                avalue(avalue(fields_array, 'transaction_off'), 'values') as toff_values,
                                                (to_timestamp(avalue(dates_array, 'Выполнен')::double precision) at time zone interval '04:00')::date as exec_date,
                                                (to_timestamp(avalue(dates_array, 'Выполнен')::double precision) at time zone interval '04:00')::time as exec_time,
                                                (to_timestamp(avalue(dates_array, 'Рецензирован')::double precision) at time zone interval '04:00')::date as recense_date,
                                                (to_timestamp(avalue(dates_array, 'Рецензирован')::double precision) at time zone interval '04:00')::time as recense_time,
                                                (avalue(dates_array, 'Принят')::int - avalue(dates_array, 'Отправлен')::int +  30 )/ 60  as interval_wait,
                                                (avalue(dates_array, 'Выполнен')::int - avalue(dates_array, 'Принят')::int +  30 )/ 60  as interval_exec,
                                                avalue(users_array, 'Выполнен') as executor_id, avalue(users_array, 'Рецензирован') as recenser_id
                                        from offline.view_documents
                                        where macroregion_id = '1'
        and true and region_id = '5' and center_id = '1046' and point_id = '1000050' and true and true and avalue(dates_array, 'Выполнен')::int BETWEEN
                                                extract (epoch from ('2008-5-1'::date))::int and
                                                extract (epoch from ('2008-5-28'::date + interval '1 day'))::int
                                        ) as foo
                                inner join auth.users e on e.id=foo.executor_id
                                inner join auth.users r on r.id=foo.recenser_id
                                ORDER BY primary_system ASC, sn ASC;

Запрос генерируется автоматически, так что может сильно отличаться от вышеприведенного и занимать время до 10 секунд на сотнях возвращаемых записей. Список возвращаемых полей, временная зона, условия могут варьироваться. Что интересно, попытка добавить два объединения с auth.users непосредственно в offline.view_documents приводят к резкому падению производительности. Притом план выполнения указанного запроса очень сильно зависит от собранной статистики и после нескольких сотен запусков перестраивается и работает намного быстрее. Я рад, разумеется, что на рабочем сервере работает быстрее, но невозможность это воспроизвести на тестовом сервере очень мешает разработке.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35342099
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Едва ли стоит совать с советами плану такого запроса, не зная ни размерности таблиц, ни индексов.
Однако, не пробовали ли вы делать partial index таблицу attribute по условию where value = 'Отклонен' ?
Если отклоненных документов мало, а индекс по attribute.value большой, то ради 100 документов планировщик может предпринять seqscan.

Что за функция lindex(avalue(avalue(fields_array, 'attribute'), 'values'), 0)
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35344364
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
tadminЕдва ли стоит совать с советами плану такого запроса, не зная ни размерности таблиц, ни индексов.
Однако, не пробовали ли вы делать partial index таблицу attribute по условию where value = 'Отклонен' ?
Если отклоненных документов мало, а индекс по attribute.value большой, то ради 100 документов планировщик может предпринять seqscan.

Что за функция lindex(avalue(avalue(fields_array, 'attribute'), 'values'), 0)

Всех статусов может быть много. То есть в идеальном случае отклоненных вообще нет, а на практике их может оказаться сколько угодно, так что приходится "честно" делать индекс по значению статуса.

Функции для работы с тиклевскими структурами данных - список (lindex возвращает элемент списка), массив (avalue возвращает элемент ассоциативного массива по его ключу). Так что конструкция lindex(avalue(avalue( вернет некий элемент многомерного массива, сохраненного в виде строкового значения. Постгресовские массивы меня категорически не устраивают, так что сделал свою реализацию. Вот здесь некоторые функции описаны:

http://postgrestips.blogspot.com/2007/06/array.html
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35345034
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MBG
Всех статусов может быть много. То есть в идеальном случае отклоненных вообще нет, а на практике их может оказаться сколько угодно, так что приходится "честно" делать индекс по значению статуса.
Не уверен, что в вашем случае это поможет, но я получил весьма устойчивый прирост скорости от использования partial index.

Есть таблица объектов и типов (PK ObjectID+ObjectTypeID) в ней же хранятся состояния объектов.
Записей порядка n*10^6.Типов объектов ~200, данные предметной области хранятся в своих таблицах (~200).
Если нужно найти неудаленные объекты с типом Заказ, то нужен запрос (условно)

Код: plaintext
1.
2.
3.
select * from Orders as Or
inner join Objects as Ob on (Ob.ObjectID = Or.OrderID and Ob.ObjectTypeID = 6  and Ob.ObjectStatusID > 0 )
wHERE ...

В этом запросе используется индекс по таблице объектов ObjectID+ObjectTypeID+ObjectStatusID.
Беда в том, что размер этого индекса может быть в 10 раз больше таблицы предметной области (orders).

Для меня было выходом создать partial index по таблице объектов для некоторых типов:

Код: plaintext
1.
2.
3.
4.
create index I_ObjectsCustom_Customers on Objects (
ObjectID,
ObjectTypeID,
ObjectStatusID
)  where (ObjectTypeID= 84  and ObjectStatusID<= 1 );

В чем выигрыш?
При выборках планировщик вместо индекса общего из 700 страниц использует частные индексы из 5-6 страниц.
Если для данного вида объекта частный индекс не создан, то используется общий (лучше чем ничего).
Если таблицу объектов кластеризовать по нему раз в сутки, это тоже улучшает жизнь.

Есть и проигрыш, потому что при записи в таблицу объектов почти всегда приходится обновлять 2 индекса - один общий и один частный. На практике замедления не заметил.

Пока я не создал частные индексы - наблюдал невоспроизводимость плана и времени выполнения сложных запросов (10-12 таблиц).
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35348256
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_v13
Когда же блин, эти ...пипи... разработчики Постгреса дотумкают своим мозгами, что без нормальной репликации и всего с ней связанного функционала, их продукт никогда не перерастет по классу MySQL, а уж про соревнования с Oracle можно не заикаться.

Типа докумекали :)
== PostgreSQL Weekly News - June 01 2008 ==
Core has announced the goal of including easy-to-use WAL-based
replication in PostgreSQL.
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35348610
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле они давно это докумекали :) но сначала нужно сделать определённые шаги в этом направлении, например изменение связанное с НЕ увеличением номера транзакции для только читающих транзакций в 8.3 - как раз направлено в том числе и на облегчение реализации репликации в будущем. :)


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
Multi-Master в PostgreSQL
    #35349897
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
tadminНе уверен, что в вашем случае это поможет, но я получил весьма устойчивый прирост скорости от использования partial index.
Сколько у вас таких индексов на таблицу? Если один-два, то все должно быть хорошо, но это недостаточно для типичных запросов. Для десятков будет намного хуже из-за их количества и размера на диске. А планировщик умеет пользоваться частными индексами в конструкциях вида between?

tadminПока я не создал частные индексы - наблюдал невоспроизводимость плана и времени выполнения сложных запросов (10-12 таблиц).
То есть с этими индексами план выполнения стабилизируется и перестает перестраиваться во время работы? Это интересно, хотя пока я даже не могу придумать такую ситуацию, когда можно воспользоваться подобным индексом - это должно быть какое-то приложение, где диапазоны выборки забиты "намертво".
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Multi-Master в PostgreSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]