Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL репликация на основе log-statement / 17 сообщений из 17, страница 1 из 1
25.09.2008, 16:45
    #35560214
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Тут подумал, почему нельзя сделать репликацию на основе только модифицирующих запросов: log-statement = mod, а затем его распарсить, и заливать на слейв?

минусы:
* что в самих запросах явно не указана база. Поэтому репликация возможна только при внесении изменений в единственную базу.
* в лог попадают запросы в явном, а не фактическом виде (собственно потому базу и не видно). Хотя может быть лог можно настроить, чтобы выделить DB

плюсы:
*В отличие от Slony-никаких изменений в схему. Нормальная асинхронная репликация на основе лога запросов :)

Есть ли у кого-то такой опыт. Сильно сомневаюсь что я один до этого додумался :)
...
Рейтинг: 0 / 0
26.09.2008, 03:38
    #35561013
не взлетит
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
ИМХО, репликация получится такая же как в pgpool, только менее производительная (удвоенный поток записи на диск + парсинг).

Кстати имя базы можно логировать (log_line_prefix).
...
Рейтинг: 0 / 0
26.09.2008, 15:29
    #35562491
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
не взлетитИМХО, репликация получится такая же как в pgpool, только менее производительная (удвоенный поток записи на диск + парсинг).

Кстати имя базы можно логировать (log_line_prefix).

Спасибо, попробую на счет разделения попробую.

Минус pgpool что репликация синхронная. Для надежность все-таки лучше асинхронная, примерно такая как в MySQL.
А лог физически можно сливать на другой винт, возможно даже сетевой или лучше слейвовый.

Распарсиванием будет заниматься собственно слейв и заливать изменения в собственную базу. Дело мастера - положить в лог.

Остается только выяснить, на сколько корректно PostgreSQL определяет, изменяют запрос базу фактически. Все-таки существуют не явные с т.з. синтаксис изменения. Например
* при вызове хранимой функции. SELECT [функция]. Чем занимается функция внутри - синтаксис анализатор не знает.
* триггеры могуд изменять и другие таблицы... Хотя если и на слейве они есть - то исходный запрос вызовет тот же каскад изменений.
...
Рейтинг: 0 / 0
26.09.2008, 15:41
    #35562522
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
vkhai
Спасибо, попробую на счет разделения попробую.
Ура! Базу писать можно. Вот кусок лога (база test таблица test_1):

test 48dccbdf.5dd1LOG: statement: ALTER TABLE test_1 ADD PRIMARY KEY (id);

test 48dccbdf.5dd1NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test_1_pkey" for table "
test_1"
test 48dccbdf.5dd1STATEMENT: ALTER TABLE test_1 ADD PRIMARY KEY (id);

test 48dccbfa.5dd4LOG: statement: INSERT INTO public.test_1("name") VALUES ('name_5'::text)
test 48dccbfa.5dd4LOG: statement: INSERT INTO public.test_1("name") VALUES ('name_6'::text)

ALTER TABLE - вот чего в репликации на триггерах не хватало. И отсутствие изменений в схеме.

Дальше попробую следующее:
* Договариваемся о формате
* Пишем парсер.
* Заливаем дамп изменений на слейв.
...
Рейтинг: 0 / 0
26.09.2008, 16:24
    #35562646
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Выявлен "минус".
Судя по всему тип запроса для 'mod' READ/WRETE определяется по синтаксису.

Если сделать хранимую функцию делающую фактически INSERT:

CREATE OR REPLACE FUNCTION execute1("value" character varying)
RETURNS integer AS
$BODY$
DECLARE
BEGIN
INSERT INTO test_1 (name) VALUES (value);
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

то вызов её SELECT execute1('name_11'); в 'mod' лог не попадает
Это в принципе свойственно любым разделителям потоков READ/WRETE на основе синтаксиса.
В репликации на триггерах все работает корректно.

Как выход - в перспективе логировать вообще все запросы, и от туда выбрасывать READ на основе регулярных выражений, где явно прописаны имена модифицирующих данные функций.
...
Рейтинг: 0 / 0
26.09.2008, 17:30
    #35562802
alex_v13
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
По моему полный бред, только не обижайтесь.
Ни по надежности, ни по скорости это не прокатит.
Тем более, что данные prepared запросов в лог не попадют.
Единственный нормальный способ репликации - парсинг и выполнение WAL-логов.
...
Рейтинг: 0 / 0
26.09.2008, 19:07
    #35562946
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
alex_v13По моему полный бред, только не обижайтесь.
Ни по надежности, ни по скорости это не прокатит.
Тем более, что данные prepared запросов в лог не попадют.
Единственный нормальный способ репликации - парсинг и выполнение WAL-логов.

От асинхронной репликации скорости никто не ждет. А вот на счет надежности я бы поспорил :)

На счет WAL-логов: нескоглко мегабайт изменений при возможных фактическиих изменениях пару килобайт - не совсем гуманно к трафику.

Хотя я читал, что хотят оптимизировать WAL журнал и относительно репликации связывают надежды именно с ним. Но пока много недостатков. Сейчас в случае WALL изменения данных в 1кб будут весить несколько Мб. В данном же случае почти точно 1кб (чуть больше за счет служебной информ.).

===
То что выше - идинтичные по структуре и данным мастер и слейв + компактный поток запросов на изменение в фактическом синтаксисе. PREPARED попадает как на мастер, так и на слейв. Ровно как и EXECUTE этого PREPARED.

Ещё один плюс, о котором подумал, не нужно синхронизировать SEQUENSES (ибо nextval и там и там) . :)

Вот немного более "причесанный" лог:

test LOG: statement: ALTER TABLE public.test_1 DROP CONSTRAINT test_1_pkey;
test LOG: statement: ALTER TABLE test_1 ADD PRIMARY KEY (id);

test NOTICE: ALTER TABLE / ADD PRIMARY KEY will create implicit index "test_1_pkey" for table "test_1"
test STATEMENT: ALTER TABLE test_1 ADD PRIMARY KEY (id);

test LOG: statement: INSERT INTO public.test_1("name") VALUES ('name_7'::text)
test LOG: statement: INSERT INTO public.test_1("name") VALUES ('name_8'::text)
test LOG: statement: CREATE OR REPLACE FUNCTION execute1("value" character varying) RETURNS integer AS
$BODY$
DECLARE
BEGIN
INSERT INTO test_1 (name) VALUES (value);
RETURN 1;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;

test LOG: statement: INSERT INTO public.test_1("name") VALUES ('name_12'::text)
test LOG: statement: INSERT INTO public.test_1("name") VALUES ('name_13'::text)

Какая красота! Где ещё в АСИНХРОННОЙ репликации вы такое видели? ;)
...
Рейтинг: 0 / 0
26.09.2008, 19:08
    #35562950
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
vkhai...Где ещё в АСИНХРОННОЙ репликации вы такое видели? ;) Асинхронной репликации PostgreSQL конечно же.
...
Рейтинг: 0 / 0
26.09.2008, 21:15
    #35563062
Konstantin~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
UPDATE sometable SET something=random() WHERE ... будет классно реплицироватся

Вообще полезно ознакомится http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling
...
Рейтинг: 0 / 0
26.09.2008, 22:08
    #35563112
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Konstantin~UPDATE sometable SET something=random() WHERE ... будет классно реплицироватся

Вообще полезно ознакомится http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling Такие проблемы существуют и в репликации MySQL. Однако никто не считает её непригодной. Надо сказать что PostgreSQL до такой репликации ещё расти и рести :) Как собственно любая система репликация, работающая со стейтметнами, а не фактическими значениями (pgpool например) :)
...
Рейтинг: 0 / 0
26.09.2008, 22:45
    #35563131
Konstantin~
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
сутъ в том что постгрес часто используется там где нужна нормальная база, т.е сложные запросы, хранимые процедуры, триггера, и т.д. поэтому система репликации которая не позволяет все это использовать нужна далеко не всем (в отличии от mysql где ранее ничего толком не было кроме select,update,insert ) .

отсюда и системы типа slony-I/longiste которые поддерживают весь сложный функционал базы но имееют существенные недостатки типа сложности с изменениями DDL. и сложностъ настройки.

Никто не говорит что такая репликация не нужна совсем, поэтому и естъ системы типа pgpool-II и sequoia, но как универсальная система для постгреса это не подходит т.к. органичивает функционал
...
Рейтинг: 0 / 0
29.09.2008, 16:15
    #35565685
vkhai
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Согласен. Тем не менее мне такой подход кажется тоже интересным.

В дополнение. Чтобы правильно работали транзакции нужно разделять сессии/процессы. Для каждой нити запускать свой процесс.

В выходные заработала первая версия :)
...
Рейтинг: 0 / 0
04.10.2008, 08:21
    #35576100
Gold_
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
alex_v13По моему полный бред, только не обижайтесь.
Ни по надежности, ни по скорости это не прокатит.
Тем более, что данные prepared запросов в лог не попадют.
Единственный нормальный способ репликации - парсинг и выполнение WAL-логов.

Подскажите где можно почитать о структуре WAL-логов?
...
Рейтинг: 0 / 0
04.10.2008, 17:41
    #35576321
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Так сделано в MySQL.

Минус тут в том, что чтобы пронести изменения, внесённые например 1-им оператором DELETE, который сканирует всю таблицу в N записей и удаляет две записи, на принимающем сервере вместо удаления двух записей также надо сканировать всю таблицу из N записей.

Также подозреваю, что проблемы с сериализацией транзакций также более сложны.
А достоинств только - более тупая реализация.
...
Рейтинг: 0 / 0
04.10.2008, 17:45
    #35576324
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Konstantin~UPDATE sometable SET something=random() WHERE ... будет классно реплицироватся

Вообще полезно ознакомится http://wiki.postgresql.org/wiki/Replication,_Clustering,_and_Connection_Pooling

Ну принципиально это возможно, сделано же как-то в mysql.

Видимо, в этом случае у них результат репликации непредсказуем или они запоминают значения
random и пишут их в лог вместо исходного оператора.
...
Рейтинг: 0 / 0
04.10.2008, 17:46
    #35576325
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
Такие проблемы существуют и в репликации MySQL. Однако никто не считает её непригодной.

Почему никто не считает ?
Я считаю.

А можно спросить, чего вы добиться -то хотите ?
...
Рейтинг: 0 / 0
04.10.2008, 17:47
    #35576326
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PostgreSQL репликация на основе log-statement
В дополнение. Чтобы правильно работали транзакции нужно разделять сессии/процессы. Для каждой нити запускать свой процесс.

Нужно транзакции сериализовать. Потом, для повышения скорости репликации, десериализовать.
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / PostgreSQL репликация на основе log-statement / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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