Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 12:21
Оценка:
Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.
В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.
Работа с основной предполагается через EF Core.

Как бы это реализовать?
Очевидные проблемы:
1. Оно не должно тормозить
2. Логирование должно быть в одном месте что бы не забывать его включать/отключать. Соответственно вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 23.10.19 12:26
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

А цель этого какая?
Sic luceat lux!
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 12:34
Оценка:
Здравствуйте, Kernan, Вы писали:

K>Здравствуйте, BlackEric, Вы писали:


BE>>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

K>А цель этого какая?

Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: vsb Казахстан  
Дата: 23.10.19 12:56
Оценка:
В Java вся работа с базой идёт через JDBC. Это набор интерфейсов, которые реализует драйвер. Собственно я бы сделал свою реализацию этих интерфейсов, которая просто пробрасывает все вызовы к драйверу, а после успешного завершения операции логгировала бы эту операцию во второй базе. Если в .NET похожая архитектура драйверов базы, можно попробовать примерно так же сделать.
Re: Логирование работы с бд в другой бд
От: AleksandrN Россия  
Дата: 23.10.19 13:17
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

BE>В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.
BE>Работа с основной предполагается через EF Core.

Посмотри на GridGain. Там есть средства интеграции с РСУБД, в том числе и с PostgreSQL. Эта интеграция использует GridGain как In-memory кэш для РСУБД. Но GridGain ещё умеет сохранять данные на диск. Возможно, это как раз то, что тебе нужно. Но детальнее подсказать, к сожалению, не смогу т.к. сам знаком с GridGain'ом поверхностно.
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 13:17
Оценка:
Здравствуйте, vsb, Вы писали:

vsb>В Java вся работа с базой идёт через JDBC. Это набор интерфейсов, которые реализует драйвер. Собственно я бы сделал свою реализацию этих интерфейсов, которая просто пробрасывает все вызовы к драйверу, а после успешного завершения операции логгировала бы эту операцию во второй базе. Если в .NET похожая архитектура драйверов базы, можно попробовать примерно так же сделать.


Не хотелось бы в драйвера лезть.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 13:27
Оценка:
Здравствуйте, BlackEric, Вы писали:

А в CQRS внедрить логирование?
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: Milena США  
Дата: 23.10.19 14:13
Оценка: 78 (2)
Здравствуйте, BlackEric, Вы писали:

BE>В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.

Как бы это реализовать?
BE>Очевидные проблемы:
BE>1. Оно не должно тормозить
BE>2. Логирование должно быть в одном месте что бы не забывать его включать/отключать. Соответственно вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.

PostgreSQL уже пишет лог, поэтому можно (основываюсь на опыте с другой СУБД) просто постоочно читать лог из системных таблиц с отбором ненужного и асинхронно писать в data lake (чтобы была schema on read и недорого).
Re: Логирование работы с бд в другой бд
От: Sharov Россия  
Дата: 23.10.19 15:19
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.


Не проще репликацию настроить?
Кодом людям нужно помогать!
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:27
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, BlackEric, Вы писали:


BE>>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.


S>Не проще репликацию настроить?


Репликацию тоже хотят, но это не заменяет логирования всего и вся.
https://github.com/BlackEric001
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:28
Оценка:
Здравствуйте, Milena, Вы писали:

M>PostgreSQL уже пишет лог, поэтому можно (основываюсь на опыте с другой СУБД) просто постоочно читать лог из системных таблиц с отбором ненужного и асинхронно писать в data lake (чтобы была schema on read и недорого).


Что-то я не знаю где у постгреса логи такого уровня. Я в нем не спец, правда.
https://github.com/BlackEric001
Re: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:32
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>Заказчик хочет сохранять, причем отключаемо, все данные читаемые или модифицируемые в основной бд в дополнительную.

BE>В качестве дополнительной предполагается использование какой-либо NoSQL базы. Основная — PostgreSQL.
BE>Работа с основной предполагается через EF Core.

BE>Как бы это реализовать?

BE>Очевидные проблемы:
BE>1. Оно не должно тормозить
BE>2. Логирование должно быть в одном месте что бы не забывать его включать/отключать. Соответственно вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.

У меня вырисовывается что-то типа класса с двумя дженерик функциями для get и post.
Они будут в себя принимать реквест, его логировать и через медиатор передавать реквест в репозиторный хандлер. Ну и обратно респонс репозитория логировать.
https://github.com/BlackEric001
Re[3]: Логирование работы с бд в другой бд
От: Milena США  
Дата: 23.10.19 19:47
Оценка: 17 (3)
Здравствуйте, BlackEric, Вы писали:

BE>Здравствуйте, Milena, Вы писали:


M>>PostgreSQL уже пишет лог, поэтому можно (основываюсь на опыте с другой СУБД) просто постоочно читать лог из системных таблиц с отбором ненужного и асинхронно писать в data lake (чтобы была schema on read и недорого).


BE>Что-то я не знаю где у постгреса логи такого уровня. Я в нем не спец, правда.


Я имею в виду обычный транзакционный лог базы данных, которую пишет любая СУБД. Я делала подобное в SQL Server, но в целом это доступно в любой БД, так как это основа ее функционирования, просто реализация разная будет.
То, что я описала, можно сделать через write-ahead log stream: https://stackoverflow.com/questions/36291676/query-transaction-log-in-postgresql/36292724


Если вам ещё нужен лог всех запросов к БД, то его нужно отдельно включить в настройках PostgreSQL — см. тут: https://tableplus.com/blog/2018/10/how-to-show-queries-log-in-postgresql.html
Re[4]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 23.10.19 19:57
Оценка:
Здравствуйте, Milena, Вы писали:

M>Я имею в виду обычный транзакционный лог базы данных, которую пишет любая СУБД. Я делала подобное в SQL Server, но в целом это доступно в любой БД, так как это основа ее функционирования, просто реализация разная будет.

M>То, что я описала, можно сделать через write-ahead log stream: https://stackoverflow.com/questions/36291676/query-transaction-log-in-postgresql/36292724


M>Если вам ещё нужен лог всех запросов к БД, то его нужно отдельно включить в настройках PostgreSQL — см. тут: https://tableplus.com/blog/2018/10/how-to-show-queries-log-in-postgresql.html


Спасибо, это близко к тому что нужно.
https://github.com/BlackEric001
Re[3]: Логирование работы с бд в другой бд
От: wildwind Россия  
Дата: 23.10.19 20:03
Оценка:
Здравствуйте, BlackEric, Вы писали:

K>>А цель этого какая?

BE>Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.

Так цель-то какая? Аудит? Восстановление после сбоя? История изменений?
Отредактировано 23.10.2019 20:06 wildwind . Предыдущая версия .
Re: Логирование работы с бд в другой бд
От: wildwind Россия  
Дата: 23.10.19 20:05
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>1. Оно не должно тормозить


Так не бывает, в общем случае.

BE>вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.


Ты же понимаешь, что эти требования взаимоисключающие.
Re[4]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 24.10.19 07:18
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, BlackEric, Вы писали:


K>>>А цель этого какая?

BE>>Залогировать всЁ. В том числе чтение. Да, там будут терабайты логов. Требование такое.

W>Так цель-то какая? Аудит? Восстановление после сбоя? История изменений?


История изменений
https://github.com/BlackEric001
Re[2]: Логирование работы с бд в другой бд
От: BlackEric http://black-eric.lj.ru
Дата: 24.10.19 07:19
Оценка:
Здравствуйте, wildwind, Вы писали:

W>Здравствуйте, BlackEric, Вы писали:


BE>>1. Оно не должно тормозить


W>Так не бывает, в общем случае.


BE>>вся работа с бд должна пройти через некую точку и эта точка не должна стать узким местом.


W>Ты же понимаешь, что эти требования взаимоисключающие.


Ага. Все в пределах разумного должно быть.
https://github.com/BlackEric001
Re[5]: Логирование работы с бд в другой бд
От: wildwind Россия  
Дата: 24.10.19 14:24
Оценка:
Здравствуйте, BlackEric, Вы писали:

BE>История изменений


Тогда причем тут чтение?

И в каком виде заказчик хочет видеть этот лог, и что еще с ним делать?
Re[5]: Логирование работы с бд в другой бд
От: RushDevion Россия  
Дата: 24.10.19 15:58
Оценка: 1 (1)
BE>История изменений

Имхо, полноценно реализовать такое через автоматический парсинг логов не реально.
Под "полноценно" я имею в виду что в нормальный аудит должны попадать:
информация о пользователе приложения (не пользователе БД!), окружении (e.g. через какой клиент поступил запрос, с какого IP и т.п.),
запрошенной операции (причем не просто read/write базы, а в бизнес-терминах, e.g. "попытка изменения пароля", "попытка проведения платежа" и т.п.),
значения данных до/после изменения.

Вообще задача хорошо ложится на Event Sourcing парадигму. Тогда лог изменений (поток событий) будет из коробки.
Но и в классической схеме с репозиториями можно попробовать построить pipeline обработки входящих запросов по CQRS схеме.
Т.е. чтобы на каждую бизнес транзакцию был свой IQueryHandler<T>/ICommandHandler<T>.
Тогда поверх можно единожды написать универсальный декоратор, который будет логировать контекст (пользователь, IP и т.п.), входные параметры и результаты выполнения.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.