По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Виртуализация серверов – это разделение одного физического сервера на несколько виртуальных серверов, каждый из которых работает под управлением собственной операционной системы. Эти операционные системы также известны, как «гостевые операционные системы». Они в свою очередь работают в другой операционной системе, которая также известна, как «хостовая операционная система». Каждый «гость», который работает таким образом, не знает о других «гостях», которые работают на том же хосте. Для того, чтобы обеспечить такую незаметность, используются различные методы виртуализации.  Разновидности виртуализации сервера: Гипервизор Гипервизор, или VMM (virtual machine monitor – монитор виртуальных машин), - это своего рода слой между операционной системой и оборудованием. Он обеспечивает работу необходимых служб и функций для того, чтобы несколько операционных систем могли работать без сбоев.  Он выявляет ловушки, отвечает на инструкции привилегированного процессора, организует очереди, выполняет диспетчеризацию и отвечает на аппаратные запросы. Операционная система хоста, которая управляет виртуальными машинами работает поверх гипервизора. Паравиртуализация Паравиртуализация основана на гипервизоре. В этой модели обрабатывается больше всего ресурсов, которые необходимы для эмуляции и организации программных ловушек в программно реализованной виртуализации. Гостевая операционная система перед установкой на виртуальную машину модифицируется и заново компилируется.  Производительность модифицированной гостевой операционной системы повышается, так как она взаимодействует напрямую с гипервизором, а потребление ресурсов эмуляцией сходит на нет.  Пример : Xen в основном используют паравиртуализацию, где для поддержки административной среды, также известной как домен 0, используется настраиваемая среда Linux. Преимущества: Проще Повышенная производительность Нет дополнительного потребления ресурсов, связанного с эмуляцией Недостатки: Необходима модификация гостевой операционной системы   Полная виртуализация Полная виртуализация очень похожа на паравиртуализацию. Она может эмулировать базовое аппаратное обеспечение, если это необходимо. Гипервизор перехватывает машинные операции, которые операционная система использует для выполнения операций ввода-вывода или изменения состояния системы. После того, как операции были перехвачены, они эмулируются в программном обеспечении, при этом коды состояния почти полностью можно сопоставить с теми, которые могли быть предоставлены реальным аппаратным обеспечением. Именно поэтому немодифицированная операционная система может работать поверх гипервизора.  Пример : данный метод использует VMWare ESX. В качестве административной ОС используется настраиваемая версия Linux, также известная как Service Console. Этот метод не такой быстрый, как паравиртуализация.  Преимущества : Не требуется модификация гостевой операционной системы Недостатки : Сложный метод Более медленный из-за наличия эмуляции Затрудняет установку нового драйвера устройства   Виртуализация с аппаратной поддержкой Если говорить о принципе работы, то этот метод аналогичен полной виртуализации и паравиртуализации, за исключением того факта, что он требует аппаратной поддержки. Большая часть потребляемых гипервизором ресурсов при перехвате и эмуляции операций ввода-вывода и кодов состояния, которые выполняются в гостевой ОС, покрывается аппаратным расширением архитектуры х86.  Здесь можно запустить и немодифицированную ОС, так как для обработки запросов на доступ к оборудованию, привилегированных и защищенных операций, а также для связи с виртуальной машиной будет использоваться аппаратная поддержка виртуализации.  Пример : аппаратную поддержку виртуализации обеспечивают такие технологии, как AMd – V Pacifica и Intel VT Vanderpool. Преимущества : Не требуется модификация гостевой операционной системы Гипервизор потребляет не так много ресурсов Недостатки : Требуется аппаратная поддержка   Виртуализация на уровне ядра Вместо того, чтобы использовать гипервизор, слой виртуализации запускает отдельную версию ядра Linux и рассматривает связанную с ней виртуальную машину как процесс из пользовательского пространства на физическом хосте. Это в какой-то степени упрощает запуск нескольких виртуальных машин на одном хосте. Для связи между основным ядром Linux и виртуальной машиной используется драйвер устройства.  Для виртуализации требуется аппаратная поддержка (Intel VT или AMD - V). В качестве контейнеров отображения и выполнения для виртуальных машин используется немного модифицированный процесс QEMU. Во многом виртуализация на уровне ядра – это специализированная форма виртуализации серверов.  Пример : пользовательский режим Linux (UML - User – Mode Linux) и Kernel Virtual Machine (KVM). Преимущества : Не требуется специальное программное обеспечение для администрирования Низкое потребление ресурсов Недостатки : Требуется аппаратная поддержка   Виртуализация на системном уровне или уровне ОС Эта модель запускает несколько различных (с логической точки зрения) сред на одном экземпляре ядра операционной системы. Иначе его называют «подходом на основе общего ядра», так как все виртуальные машины используют одно общее ядро операционной системы хоста. Эта модель основана на концепции изменения корневого каталога «chroot». сhroot начинает свою работу во время загрузки. Ядро использует корневые файловые системы для загрузки драйверов и выполнения других задач инициализации системы на ранних этапах. Затем оно переключается на другую корневую файловую систему с помощью команды chroot для того, чтобы организовать новую файловую систему на диске в качестве окончательной корневой файловой системы и продолжить инициализацию и настройку системы уже в этой файловой системе.  Механизм chroot виртуализации на системном уровне – это расширение этой концепции. Он позволяет системе запускать виртуальные серверы с их собственным набором процессов, которые выполняются относительно их собственных каталогов файловой системы.  Основное различие между виртуализацией на уровне системы и виртуализацией серверов состоит в том, что в одном случае можно запускать различные операционные системы в разных виртуальных системах, а в другом – нет. Если речь идет о виртуализации на системном уровне, то все виртуальные серверы должны использовать одну и ту же копию операционной системы, а если о виртуализации серверов, то здесь на разных серверах могут быть разные операционные системы (в том числе и разные версии одной операционной системы).  Пример : FreeVPS, Linux Vserver, OpenVZ и другие. Преимущества : Значительно проще, чем укомплектованные машины (включая ядро) Можно разместить гораздо больше виртуальных серверов Повышенная безопасность и улучшенная локализация Виртуализация операционной системы практически не потребляет дополнительных ресурсов Благодаря виртуализации операционной системы возможна динамическая миграция Может использоваться динамическая балансировка нагрузки контейнеров между узлами и кластерами При виртуализации операционной системы можно использовать метод копирования при записи (CoW - copy-on-write) на уровне файла. Он упрощает резервное копирование данных, экономит пространство и упрощает кэширование в сравнении с копированием при записи на уровне блока.  Недостатки : Возникшие проблемы с ядром или драйвером могут вывести из строя все виртуальные серверы  
img
Firebase - это платформа для разработки приложений, запущенная в 2012 году и двумя годами позже приобретенная Google. Изначально Firebase задумывалась как база данных для приложений реального времени, но Google увидел ее потенциал и решил добавить к ней дополнительные сервисы. В настоящее время Firebase представляет собой систему BaaS (Backend as as Service) для упрощения создания веб-приложений и мобильных приложений с 18 службами. Среди компаний, использующих услуги BaaS Firebase, - Accenture, Alibaba Travels, Stack, Twitch и Instacart, а также более 2300 других. Преимущества использования Firebase Первой из услуг, предлагаемых Firebase, была база данных в реальном времени, и она остается одной из самых привлекательных. Real-time базы данных Firebase размещаются в облаке, хранят данные в формате JSON и синхронизируются в реальном времени с каждым подключенным к ним клиентом. Независимо от того, используете ли вы iOS SDK, Android SDK или JavaScript SDK, все приложения, подключенные к Realtime базе данных Firebase, совместно используют один экземпляр базы данных, всегда работают с последними данными. Cloud Firestore - еще один интересный сервис Firebase. Это NoSQL база данных документов, предназначенная для облегчения хранения, синхронизации и выполнения запросов для мобильных и веб-приложений в глобальном масштабе. Создание иерархий для хранения связанных данных и запросов для получения данных позволяет полностью реализовать потенциал Cloud Firestore. В свою очередь, запросы масштабируются в зависимости от размера результатов, а не от размера набора данных. Это позволяет приложениям масштабироваться с самого начала, не дожидаясь момента, когда запрашиваемые ресурсы превысят имеющиеся. В дополнение к вышеупомянутым службам баз данных Firebase также предлагает услуги хостинга, хранилища файлов, функции (в стиле AWS Lambda) и многое другое. Создание API API-интерфейсы - это способ предоставления услуг для использования вашими собственными или сторонними приложениями. Firebase позволяет предоставлять настраиваемые службы, которые, в свою очередь, используют собственные службы Firebase, без необходимости настраивать серверную часть для этих служб. Вы можете, например, предложить доступ к базе данных Firebase в реальном времени для сторонних приложений для запроса информации, собираемой промышленными датчиками. Первым шагом в создании API в Firebase является доступ к консоли Firebase и добавление проекта, нажав «Добавить проект» (Add project) и присвоив название новому проекту. Google предоставит вам возможность включить Google Analytics для вашего нового проекта. Рекомендуется принять эту рекомендацию, так как вы получите такие преимущества, как A/B-тестирование и широкий спектр статистических отчетов относительно вашего API. После создания проекта вы сможете выбрать службы Firebase, которые будет использовать ваш API. Чтобы проиллюстрировать эту задачу, мы разберём, как использовать службу базы данных Firebase Realtime. Настройка базы данных реального времени в Firebase На панели навигации слева в разделе «Разработка» (Develop) щелкните «Realtime Database». Справа появится кнопка «Create Database». Нажмите на нее, чтобы создать свою первую базу данных в Firebase. Затем вам нужно будет выбрать один из нескольких вариантов географического местоположения для вашей новой базы данных. Выберите тот, который ближе всего к вашим пользователям. Это важный аспект для минимизации задержки вашего API, особенно для приложений реального времени. Следующим шагом является настройка основных правил безопасности для вашей базы данных. Вы можете выбрать заблокированный режим, а затем назначить права доступа по мере необходимости или выбрать тестовый режим, который разрешает все операции чтения и записи. Для начала, чтобы не усложнять свою жизнь настройками безопасности, можно выбрать тестовый режим. А правила безопасности можете настроить позже. Как только вы закончите настройку своей базы данных, соответствующий API также будет добавлен в разделе API and Services в консоли Google Cloud Platform. Программирование Firebase API На данный момент у вас уже есть основные элементы вашего проекта, настроенные в консоли Firebase. Следующим шагом будет написание кода API. Для этого вам нужно будет инициализировать хостинг и функции Firebase на вашем локальном компьютере. Вы можете установить firebase-tools с помощью npm: npm install -g firebase-tools Затем вы можете войти в firebase и инициализировать свой проект с помощью следующих команд: firebase login firebase init Отобразится экран приветствия, в котором Firebase укажет папку папке, в которой будет храниться ваш проект, и появится меню параметров. В этом меню выберите Functions and Hosting (опция «Хостинг» позволит вам иметь собственный URL-адрес для API). Затем выберите из списка приложение Firebase, которое вы создали ранее, после чего вы должны выбрать язык для использования. Для разработки веб-API вы можете выбрать JavaScript. Если вы будете использовать зависимости пакетов, установите их с помощью npm внутри папки функций. Затем вы можете начать писать код для своих функций. Не забудьте включить пакеты firebase-functions и firebase-admin наряду с другими пакетами, которые вам нужны: import * as functions from 'firebase-functions'; import * as admin from 'firebase-admin'; Чтобы использовать базу данных в реальном времени, вы должны указать ее URL при инициализации вашего JavaScript SDK. URL-адрес находится в разделе Realtime Database консоли Firebase. Вы можете узнать его по формату: https://<database-name>.<region>.firebasedatabase.app Вы можете использовать следующий фрагмент кода для инициализации вашего SDK, заменяя данные на свои: var config = { apiKey: "apiKey", authDomain: "projectId.firebaseapp.com", databaseURL: "https://databaseName.firebaseio.com", storageBucket: "bucket.appspot.com" }; firebase.initializeApp(config); var database = firebase.database(); После того, как написали код функции API, пора приступить к развертыванию. Но перед этим нужно будет внести некоторые изменения в firebase.json, добавив следующие строки, измененные в соответствии с конфигурацией нашего проекта: "rewrites": [ { "source": "/api/v1/**", "function": "webApi" } ] Следующий шаг - развертывание. В первый раз нужно выполнить полное развертывание, выполнив команду: firebase deploy При последующих развертываниях вы сможете развертывать только функции, используя параметр –only functions. После выполнения команды Firebase CLI в терминале отобразит URL-адреса HTTP эндпоинтов ваших функций, которые вы можете использовать для вызова ваших API-интерфейсов из веб-приложения. URL-адрес содержит идентификатор вашего проекта и регион для функции HTTP. Например, следующий URL-адрес можно использовать для вызова функции запроса элемента, передав его itemid = 1 в качестве параметра: https://us-central1-apiproject-8753c.cloudfunctions.net/itemQuery?itemid=1 Чтобы выполнить функцию, откройте URL-адрес с соответствующими параметрами в браузере. Обратите внимание, что для развертывания в производственной среде требуется подписка на план Firebase Blaze. Данный план снимает деньги по мере использования, о чем вы можете прочитать на странице цен на Firebase. Это услуга выставляет счет по факту использования, что означает, что вам выставляется счет за использование в конце каждого месяца. Если у вас нет подписки на Blaze, команда развертывания не отобразит URL-адрес для API. Вместо этого вы увидите сообщение, информирующее о том, что вы должны подписаться на план Blaze, если вы хотите выполнить развертывание в среде выполнения. В этом случае вы все равно можете использовать Firebase Local Emulation Suite для создания и тестирования приложений на локальном компьютере вместо их развертывания в производственной среде Firebase. Локальное тестирование полезно, чтобы избежать ненужных затрат во время разработки приложения, поскольку каждый запуск теста может приводить к расходам на вашем счете. Локальное тестирование и прототипирование Инструмент Local Emulator Suite предлагает интегрированный пользовательский интерфейс, который делает упрощает создание прототипов и тестирование ваших приложений на локальном компьютере. С помощью пользовательского интерфейса Emulator Suite вы можете тестировать проекты своей базы данных, рабочие процессы облачных функций, анализировать производительность серверных служб и оценивать изменения в правилах безопасности и пр. По сути, это безопасная песочница для проверки функциональности вашего API перед отправкой в производственную среду. Чтобы эмулировать свои функции или протестировать приложение локально, запустите эмуляторы firebase: start. Чтобы использовать эмулятор Firestore, на компьютере должна быть установлена Java. При вызове Firestore Emulator, команда вернет URL-адрес, который позволит вам открыть пользовательский интерфейс Emulator Suite в вашем браузере. По умолчанию этот URL-адрес будет localhost: 4000, но он может отличаться на каждой машине. Вы также получите полный URL-адрес своей функции HTTP. Этот URL будет выглядеть примерно так: http://localhost:5001/apiproject-8753c/us-central1/itemQuery Только он будет иметь имя вашего проекта, имя вашей функции, а также может иметь другой номер порта на вашем локальном компьютере. Чтобы протестировать функцию, скопируйте URL-адрес, возвращаемый эмулятором, добавив все необходимые параметры (например, ?itemid = 1), и откройте в новой вкладке браузера. Результаты выполнения API появятся в пользовательском интерфейсе Emulator Suite. На вкладке «Logs» вы увидите новые логи, указывающие, что функция itemQuery() была выполнена. Если ваша функция генерирует новые данные в базе данных Firestore, вы увидите их на вкладке Firestore. Расширение возможностей вашего API Если вы хотите, чтобы разрабатываемые вами API стали популярными, Firebase может помочь и с этим. Не только потому, что это позволяет вам быстрее создавать приложение, снимая много работы по настройке и запуску серверных сервисов, но также помогая вам в позиционировании вашего продукта. Как такое возможно? Просто потому, что приложения, связанные с Firebase, занимают более высокие позиции в поисковом рейтинге, чем другие приложения. Также примите во внимание API индексирования приложений Firebase. Этот инструмент улучшает поисковый рейтинг ссылок приложений и помогает пользователям находить желаемый контент. Он также помещает кнопку "Установить" после кнопки на главной странице вашего приложения, чтобы заинтересованные пользователи всего за один клик могли пользоваться вашим приложением. В заключение отметим, что Firebase не только предлагает услуги бэкэнда, которые значительно ускоряют разработку собственного API, но и помогает продвигать его и зарабатывать на этом деньги.
img
FHRP (Протокол резервирования первого перехода) - это группа протоколов способные обеспечить клиентов отказоустойчивым шлюзом. Что за первый переход такой?. У нас есть коммутируемая среда (SW1) и есть Internet . Internet это маршрутизируемая среда . И для того чтобы перейти из коммутируемой среды , в маршрутизируемую среду для того чтобы выйти в интернет , как раз эти роутеры(R1,R2,VR - Virtual Router) обеспечивают данный переход и для того ,чтобы обеспечить отказоустойчивость этого перехода , его нужно резервировать . А потому и называется протоколы резервирования первого перехода. И все протоколы группы FHRP будут работать в единой логике: R1 , R2 будут прикидываться VR и в случае отказа одного из маршрутизаторов, то его работу возьмет другой. Forwarding Router ( FR ) - это роутер ,который данный момент активен и маршрутизирует трафик . Standby Router ( SR ) - это роутер ,который стоит в резерве и ждет , когда накроется FR ,чтобы перехватите его работу на себя , в случае сбоя маршрутизатора. FHRPs - это группа ,а значит пришло время познакомить вас с этими протоколами. HSRP (Hot Standby Router Protocol) - Проприетарный протокол разработанный Cisco; VRRP (Virtual Router Redundancy Protocol) - Свободный протокол ,сделан на основе HSRP; GLBP (Gateway Load Balancing Protocol) - Проприетарный протоколCisco , обеспечивающий распределение нагрузки на несколько маршрутизаторов( шлюзов) используя 1 виртуальный адрес. CARP( Common Address Redundancy Protocol) - свободный , разработан как часть OpenBSD , портирован во FreeBSD. Итак начнём с HSRP Протокол HSRP рассчитан на 2 роутера, 3 это уже лишний и с этим уже справиться протокол GLBP Предположим ,что R1 это маршрутизатор выхода в интернет и для этого мы поднимем на нём Loopback 1 с адресом 200.200.200.200 и пропишем его в маршруте по умолчанию. Между маршрутизаторами будет настроен RIPv2 и будут анонсированы 2 классовые сети( network 10.0.0.0 и network 192.168.0.0) для простоты анонсирования маршрутов. R2,R1 настраивается также. А теперь по порядку , настроим HSRP: R1(config)# interface e 0/0 - переходим на интерфейс ethernet 0/0 (этот интерфейс смотрит в локальную сеть на коммутатор ) R1(config-if)# ip address 192.168.0.2 255.255.255.0 - задаем ip адрес для физического интерфейса R1(config-if)# standby 1 ip 192.168.0.254 - задаем виртуальный ip адрес (который будет основным шлюзом для свитчей, смотрящих на конфигурируемый роутер). У обоих роутеров он одинаковый R1(config-if)# stanby 1 priority 110 - устанавливаем приоритет данного роутера в 110 (по умолчанию приоритет 100) R1(config-if)# standby 1 preempt - задаем режим приемтинга R1(config-if)# standby 1 authentication md5 key-string MyPassword - задаем аутентификацию, если необходимо. Пароль будет передаваться с защитой алгоритмом хеширования md5, пароль будет MyPassword R1(config-if)# standby 1 timers 100 255 - регулировка таймеров hsrp, где 100 - hello интервал в секундах (как часто посылаются пакеты hello пакеты keep-alive) и 255 - hold interval в секундах (через какой промежуток времени признавать соседа недоступным) R1(config-if)# standby 1 preempt delay minimum 300 - настройка времени задержки (в секундах), через которое роутер будет становиться главным. Эта команда требуется для того,чтобы сначала отработали другие протоколы,прежде чем заработает HSRP . Пример: OSPF включенный на роутере в большой сети не успеет передать маршруты все ,а тут сразу заработает HSRP ,естественно он знать все маршруты не будет,а значить и стабильно гнать трафик тоже. Как раз время delay он будет использовать для того,чтобы дать OSPF передать все маршруты и после этого вкл HSRP. Сам VPC должен получить следующие настройки: IP : 192.168.0.10/24 GW: 192.168.0.254 Главное ,чтобы клиент был в одной подсети и в качестве шлюза был виртуальный IP адрес. TRACKING Также полезно вешать TRACK на интерфейсы ,так как HSRP работает только в сторону ,куда направлен интерфейс ,то он не сможет отработать,когда упадут линки ,смотрящие на роутеры выше.(в данном случае это R3) Router(config)# track 1 interface fa0/1 line-protocol - отслеживаем состояние интерфейса fa0/1, если он падает, то сработает объект отслеживания track 1. Router(config-if)# standby 1 track 1 decrement 15 - если сработает объект отслеживания track 1, то текущий приоритет будет понижен на 15 единиц. Router(config-if)# standby 1 track 1 fa0/1 20 - работает только в HSRP. Позволяет отслеживать интерфейс без дополнительного создания объекта отслеживания. R1,R2,R0 будут настраиваться одинаково, принцип сохраняется. А теперь нюансы HSRP При работе нескольких VLAN , HSRP может идти трафик не совсем рационально из-за протокола STP. Представим ,что R1 это root primary за 10 VLAN, а R2 это ACTIVE router в HSRP . Это значит ,что любой трафик за этот VLAN будет идти следующим образом:VPC - R2 - R1 - R3 вместо того,чтобы идти напрямую VPC - R1 - R3. (L2 трафик всегда ходит через root во избежание петель) Поэтому рекомендуют использовать HSRP version 2(по умолчанию вкл 1 максимум 255 процессов,а во 2 их 4095) и использовать наилучший приоритет для того роутера, который сейчас в сети root primary за текущий VLAN. И хорошей практикой будет если номер VLAN будет совпадать с номером процесса HSRP. ( № HSRP = VLAN ) 3 Роутера в HSRP не имеет смысла держать,так как он всё равно будет в состоянии Listen и включиться только тогда,если active пропадет, standby займет его место , и только тогда он перейдет в состоянии standby.(речь идет о 3 роутере) Тоже самое будет касаться 4,5 ...n роутеров. SLA Бывает и другая ситуация ,когда не сам линк от R1 падает ,а устройство находящиеся за ним,к примеру SW2 упал link до R3. Проблему способен решить сервис SLA - Service Level Agreement. Суть его проста,он ping сервис до провайдера и если он падает ,то отрабатывает track. R1(config)# ip sla 1 - создаем зонд R1(config-ip-sla)# icmp-echo 215.215.215.2 source-interface e0/2 - посылаем icmp echo ping на 215.215.215.2 R1(config-ip-sla-echo)# frequency 10 - посылаем icmp echo ping с частотой каждые 10 секунд R1(config)# ip sla schedule 1 start-time now life forever - задаем расписание работы ip sla. В данном случае зон будет запущен прямо сейчас, при этом время окончания не задано (навсегда) R1(config)# track 1 ip sla 1 reachability - устанавливаем объект отслеживания на доступность того хоста, на который посылаем icmp echo ping R1(config)# ip route 0.0.0.0 0.0.0.0 2.2.2.2 track 1 - направляем трафик по этому маршруту если объект трекинга track 1 работает (хост пингуется) R1(config)# ip route 0.0.0.0 0.0.0.0 3.3.3.3 10 - если не пингуется, направляем трафик в интернет по другому маршруту (Внимание! Здесь важно задать именно плохую метрику, например 10, иначе будут работать оба маршрута! (балансировка)) R1# show track 1 - показать состояние объекта отслеживания VRRP Настройка VRRP не сильно отличается от HSRP . Настраивается он также как и HSRP, только вместо standby используется vrrp. Router(config-if)# vrrp 1 ip 192.168.1.1 - включение vrrp. Проще пройтись по отличиям ,чем заново описывать все команды. У VRRP тоже только 2 состояния Master и Backup(HSRP active и standby) Preempt включен по умолчанию (HSRP он отключен) При падении линка VRRP проводит выборы роутера(HSRP имеет запасной). Главного выбирают по IP адресу, когда проводят выборы. Поддержка Аутентификации в VRRP отсутствует (RFC отсутствует),но в Cisco она реализована(HSRP по умолчанию) VRRP по умолчанию hello таймер равен 1 секунде , dead таймер равен 3(у HSRP 3 и 10 соответственно) Виртуальный адрес может совпадать с адресом интерфейса(HSRP такой адрес не даст прописать) Использует Multicast HSRP равен 224.0.0.2 ( version 1) 224.0.0.102 (version 2) ,а VRRP 224.0.0.18 Может отслеживать только объекты , а HSRP и интерфейсы , и объекты.(смотри раздел tracking) Диагностика Router# show standby (vrrp or glbp) - показать общую информацию по протоколу группы FHRP Router# show standby brief - показать информацию по протоколу группы FHRP в виде таблицы
ВЕСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59