ИСПОЛЬЗОВАНИЕ СУБД REDIS В КАЧЕСТВЕ ПРОМЕЖУТОЧНОГО ХРАНИЛИЩА ДАННЫХ ДЛЯ POSTGRESQL
USING THE REDIS DBMS AS AN INTERMEDIATE DATA STORE FOR
POSTGRESQL
УДК-004
Рубин Олег Ильич
студент, УрФУ им. Б. Н. Ельцина, ИРИТ РтФ, г.Екатеринбург, ул. Мира, д. 32 Rubin Oleg Ilyich [email protected]
АННОТАЦИЯ
В статье рассмотрена возможность повышения производительности работы информационной системы, в которой в качестве основного хранилища данных используется реляционная система управления базами данных PostgreSQL. Как средство увеличения производительности применяется нереляционная система управления базами данных Redis, используемая в качестве промежуточного хранилища (кэша). Было проведено внедрение Redis в нагруженной информационной системе. Полученные результаты свидетельствуют о том, что использование как Redis, так и других нереляционных хранилищ данных в качестве промежуточного слоя между приложением и основным реляционным хранилищем данных значительно увеличивает производительность системы, особенно за счет уменьшения времени выполнения часто повторяющихся запросов.
ANNOTATION
The article considers the possibility of improving the performance of an information system that uses the PostgreSQL relational database management system as the main data storage. The non-relational database management system Redis is used as an intermediate storage (cache) as a means of increasing performance. Redis was implemented in a loaded information system. The results show that using both Redis and other non-relational data stores as an intermediate layer between the application and the main relational data store significantly increases system performance, especially by reducing the execution time of frequently repeated queries. Ключевые слова: NoSQL, Redis, PostgreSQL, СУБД, базы данных, управление данными.
Keywords: NoSQL, Redis, PostgreSQL, DBMS, databases, data management.
1646
Введение
Redis (remote dictionary server) - это высокопроизводительная БД с открытым исходным кодом, которая хранит данные в памяти, загружая их при старте сервера. Является базой данных класса NoSQL, используется как в качестве баз данных, так и для реализации кэшей (от англ. cache -промежуточное, временное хранилище данных с меньшим временем обращения чем основное хранилище, используемое с целью повышения производительности работы системы). Ориентирована на достижение максимальной производительности на атомарных операциях (set/get).
СУБД Redis написана на языке Си, имеет открытый исходный код и распространяется по лицензии BSD (не запрещающей бесплатное коммерческое использование продукта при условии упоминания авторов в коде программного обеспечения).
В данной статье рассматривается использование СУБД Redis в качестве кэша приложения на платформе ASP.NET Core, написанной на языке программирования C#, представляющей из себя чат-бота в мессенджере (интеллектуального агента) для управления цифровыми финансовыми активами.
Описание приложения и нагрузки на PostgreSQL
В ходе работы бота пользователь вводит команды (либо эти команды вводятся автоматически при нажатии на кнопки), данные поступают на сервер мессенджера, а затем по технологии WebHook (когда мы заранее сообщаем мессенджеру адрес сервера приложения, и он отправляет туда все обновления) поступают на сервер приложений бота на .net core. В качестве основной СУБД приложения используется PostgreSQL версии 9.6.
1647
Рисунок 1 - Интерфейс бота в мессенджере
Количество пользователей приложения на промышленном стенде -100 000 человек, приблизительный средний «онлайн» (количество единовременно работающих с системой пользователей) - 10000. Наиболее частым запросом является запрос данных текущего пользователя - он выполнятся при выполнении абсолютно любых команд в боте, по данным pg_stat_statements среднее время выполнения запроса составляет 112 мс и запрос выполняется порядка 10200 раз в секунду.
Рисунок 2 - Статистика запроса примерно через секунду после вызова pg_stat_statements_reset()
LIMIT ?
102 39 0.112 0 112 0 112 SELEC- usr.id, usi.aUlofiiailbax_enabled: usr 3u1c_mailbcx_ogin. usr aulo_maibox_pas5woid, i FROM public_ussrs AS usr WHERE usr.lelegram usemams = 51 LIMIT ?
15 0.00413зззззззззззз 0 003 0 007 ? ЕТ Ьу1еа_ои1ри1 О гзггре
Согласно документации, СУБД Redis может обрабатывать порядка 81000 GET-запросов и 110000 SET-запросов в секунду, при этом сами запросы происходят практически мгновенно по меркам компьютерной программы, т.к. данные полностью выгружаются в память. Соответственно, в данном случае он идеально подходит, потому что значительного роста числа пользователей не предвидится.
Для использования кеша в приложении изначально был создан интерфейс ICache, имеющий реализацию RedisService, исходный код приведён в приложении.
В метод, запрашивающий в коде приложения пользователя из БД, было добавлено условие, что сначала необходимо запросить пользователя по ключу (в формате {ключ_сервера}telegramPropKey: {идентификатор_пользователя}) из кэша (redis) и, если он там найден, вернуть его ещё до запроса к PostgreSQL.
return^JsoriSerializer^ Deserialize<TelegramLser>( (string)cache[V .CachedDbUser]) j
Рисунок 3 - Код запроса пользователя из БД на языке C#
1648
Научно-образовательный журнал для студентов и преподавателей «StudNet» №9/2020
Конфигурация и внедрение
Была выполнена настройка подключения приложения к базе данных Redis. В частности, были установлены следующие параметры: REDIS_CONNECTION - строка подключения к серверу Redis, содержит хост и порт;
REDIS_DNS - необходимость использования локального DNS-сервера для
резольва домена хоста из REDIS_CONNECTION. Данная настройка
используется только на промышленном контуре, где Redis разворачивается на
отдельной виртуальной машине в локальной сети с доменом mredis;
REDIS_PASSWORD - пароль от redis. Используется только тогда, когда
установлена аутентификация через пароль (де-факто данная настройка так и
не пригодилась - на всех контурах осталась пустой).
"POSTGRE DEV": "Server=35.294.176.154 ;Fort=5432;Database=zilliq
"REDISCONNECTION" : "localhost : 6379" "REDISONS": "false", ■REDIS_PASSWORD":
"BUI lOKtN": "ТТ7зВ7з261:AAGHVClWgZbJKlnyhtOZS/FbSeJwDZcfAXO", Рисунок 4 - Настройки подключения к Redis
Далее была произведена установка redis-server на контуры посредством утилиты apt-get, применены настройки подключения. Полученные результаты
Примерно через 12 часов были сняты метрики и получены результаты работы приложения с применением Redis. Работа всех запросов к серверу приложений от бота ускорена минимум на 100 милисекунд за счёт перехода на in-memory cache в виде Redis. Количество ключей на промышленном сервере Redis (получено командой redis-cli DBSIZE) - 19381. Запрос пользователя по telegram_username ушёл из топа запросов в PostgreSQL представлении pg_stat_statements (остались буквально несколько десятков запросов тех пользователей, которых ещё нет в кэше).
Литература
1. Высоконагруженные приложения. Программирование, масштабирование, поддержка /Клеппман Мартин. — Питер, 2018. — 740с.
2. How fast is redis? [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://redis.io/topics/benchmarks
3. What is redis? [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://github.com/antirez/redis
4. Redis licenses [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://www.openhub.net/p/redis/licenses
1649
5. VMWare: Redis new home [Электронный ресурс] /. — Электрон. журн. — Режим доступа: http://oldblog.antirez.com/post/vmware-the-new-redis-home.html
6. Дополнительно поставляемые модули PostgreSQL [Электронный ресурс] /. — Электрон. журн. — Режим доступа: https://postgrespro.ru/docs/postgrespro/9.6/pgstatstatements
Literature
1. High-load applications. Programming, scaling, support of Klapman Martin. -Peter, 2018 — - 740C.
2. How fast is redis? [Electronic resource] /. — Electron. journal. — Mode of access: https: //redis. io/topics/benchmarks
3. What is redis? [Electronic resource] /. — Electron. journal. — Mode of access: https: //github .com/antirez/redis
4. Redis licenses [Electronic resource] /. - Electron. journal. — Mode of access: https://www.openhub.net/p/redis/licenses
5. VMWare: the new Redis home [Electronic resource] /. — Electron. journal. — Mode of access: http://oldblog.antirez.com/post/vmware-the-new-redis-home.html
6. Additionally delivered PostgreSQL modules [Electronic resource] /. - Electron. journal. — Mode of access: https://postgrespro.ru/docs/postgrespro/9.6/pgstatstatements
1650