Microsegment.ru
  • Главная страница
  • О проекте
  • Портфолио
  • Блог
Системы

Расчет параметров инфраструктуры гибридного хранилища данных

Расчет параметров инфраструктуры гибридного хранилища данных
Системы

В данной статье приведен код расчета параметров инфраструктуры для трех этапов (создание MVP, промышленного внедрения и развития) проекта четырёхслойного (STG, ODS, DDS, CDM) гибридного хранилища данных (далее DLH) построенного на RedHat и PostgreSQL с квартальным партиционированием и долгосрочным хранением данных, а также с использованием оркестратора Airflow и мониторинга на основе Zabbix и Grafana.

Создание класса для расчета параметров инфраструктуры DLH¶

In [4]:
import pandas as pd
import numpy as np
In [5]:
# Класс для расчета параметров инфраструктуры 
# гибридного хранилища данных 
# на виртуальной машине RedHat с PostgreSQL
class infrastructure_requirements:
    # Конструктор класса
    def __init__(
        self, 
        # Параметры данных
        #base_table_size_tb: float = 3.0,  # исходный размер данных (Тб)
        yearly_growth_tb: float = 2.0,    # ожидаемый средний ежегодный прирост данных (Тб)
        hot_years: int = 2,               # количество лет в активном слое (быстрые диски)
        years_to_store: int = 3,          # количество лет, которые требуется хранпить данные (медленные, но надежные диски)
        # Параметры включения компонентов
        include_cold_data: bool = True,   # потребность в исторических (холодных) данных
        include_derived: bool = True,     # потребность в дополнительных слоях (ODS, DDS, CDM)
        include_indexed: bool = True,     # потребность в индексировании
        include_wal: bool = True,         # потребность в оперативном журнале транзакций (Write-Ahead Log, WAL)
        include_wal_archive: bool = True, # потребность в непрерывном архивировании WAL
        include_backups: bool = True,     # потребность в бэкапировании
        include_logs: bool = True,        # потребность в логировании
        include_airflow: bool = True,     # потребность в оркестрации (Airflow)
        include_monitoring: bool = True,  # потребность в мониторинге (Zabbix, Grafana)
        # Параметры размещения
        airflow_on_separate_vm: bool = True,     # размещение Airflow на отдельной ВМ
        monitoring_on_separate_vm: bool = True,  # размещение систем мониторинга на отдельной ВМ
        # Коэфициенты компонентов
        raw_to_derived_coefficient: float = 1.5, # коэффициент прироста размера данных в производных слях (ODS, DDS, CDN)
        index_overhead_coefficient: float = 1.3, # коэффициент прироста размера данных за счет индексов
        backup_multiple: float = .5,             # коэффициент сжатия данных при бэкапировании
        # RAID конфигурации (можно переопределить)
        #raid_configs: Optional[Dict[str, str]] = None, # RAID-конфигурация дисков
        #disk_types: Optional[Dict[str, str]] = None,   # типы дисков
        hdd_raid6_disk_count: int = 8,     # количество дисков RAID6
        # Дополнительные тома
        #additional_volumes: Optional[Dict[str, float]] = None, # дополнительные тома дисков
        # Прочее
        raw_data_download_num: int = 365,  # количество загрузок за год (1 раз в день)
        days_backups: int = 12,            # количество ежедневных бэкапов
        weeks_backups: int = 6,            # количество еженедельных бэкапов
        months_backups: int = 12,          # количество ежемесячных бэкапов
        logs_size_tb: float = .2,          # размер диска для логов (Тб)
        system_size_per_vm_tb: float = .1, # размер системных дисков (Тб)
        app_size_tb: float = .1            # размер диска для приложений (Тб)
    ):
        # Базовые параметры
        # Параметры данных
        #self.base_table_size_tb = base_table_size_tb
        self.yearly_growth_tb = yearly_growth_tb
        self.hot_years = hot_years
        self.years_to_store = years_to_store
        # Параметры включения компонентов
        self.include_cold_data = include_cold_data
        self.include_derived = include_derived
        self.include_indexed = include_indexed
        self.include_wal = include_wal
        self.include_wal_archive = include_wal_archive
        self.include_backups = include_backups
        self.include_logs = include_logs
        self.include_airflow = include_airflow
        self.include_monitoring = include_monitoring
        # Параметры размещения
        self.airflow_on_separate_vm = airflow_on_separate_vm
        self.monitoring_on_separate_vm = monitoring_on_separate_vm
        # Коэфициенты компонентов
        self.raw_to_derived_coefficient = raw_to_derived_coefficient
        self.index_overhead_coefficient = index_overhead_coefficient
        self.backup_multiple = backup_multiple
        # RAID конфигурации (можно переопределить)
        #self.raid_configs = raid_configs
        #self.disk_types = disk_types
        self.hdd_raid6_disk_count = hdd_raid6_disk_count
        # Дополнительные тома
        #self.additional_volumes = additional_volumes
        # Прочее
        self.raw_data_download_num = raw_data_download_num
        self.days_backups = days_backups
        self.weeks_backups = weeks_backups
        self.months_backups = months_backups
        self.logs_size_tb = logs_size_tb
        self.system_size_per_vm_tb = system_size_per_vm_tb
        self.app_size_tb = app_size_tb

        # Базовые параметры проекта в одном датафрейме
        self.basic = pd.DataFrame({
            '':vars(self).keys(),
            'parametr_description':[
                # Параметры данных
                #'Исходный размер данных (Тб)',
                'Ожидаемый средний ежегодный прирост данных (Тб)',
                'Количество лет в активном слое (быстрые диски)',
                'Количество лет, которые требуется хранпить данные (медленные, но надежные диски)',
                # Параметры включения компонентов
                'Потребность в исторических (холодных) данных',
                'Потребность в дополнительных слоях (ODS, DDS, CDM)',
                'Потребность в индексировании',
                'Потребность в оперативном журнале транзакций (Write-Ahead Log, WAL)',
                'Потребность в непрерывном архивировании WAL',
                'Потребность в бэкапировании',
                'Потребность в логировании',
                'Потребность в оркестрации (Airflow)',
                'Потребность в мониторинге (Zabbix, Grafana)',
                # Параметры размещения
                'Размещение Airflow на отдельной ВМ',
                'Размещение систем мониторинга на отдельной ВМР',
                # Коэфициенты компонентов
                'Коэффициент прироста размера данных в производных слях (ODS, DDS, CDN)',
                'Коэффициент прироста размера данных за счет индексов',
                'Коэффициент сжатия данных при бэкапировании',
                # RAID конфигурации (можно переопределить)
                #'RAID-конфигурация дисков',
                #'Типы дисков',
                'Количество дисков RAID6',
                # Дополнительные тома
                #'Дополнительные тома дисков',
                # Прочее
                'Кличество загрузок за год',
                'Количество ежедневных бэкапов',
                'Количество еженедельных бэкапов',
                'Количество ежемесячных бэкапов',
                'Размер диска для логов (Тб)',
                'Размер системных дисков (Тб)',
                'Размер диска для приложений (Тб)'
            ],
            'values':vars(self).values()
        }).set_index('')
        
        # Размер данных
        self.calculate_data_size()
        self.data = pd.DataFrame({
            'data_descriptions': self.data_size_descriptions, 
            'data_size': self.data_size
        })
        
        # Размер дискового пространства
        self.calculate_disk_requirements()
        self.disks = pd.DataFrame({
            'disk_descriptions': self.disk_size_descriptions, 
            'disk_type': self.default_disk_type, 
            'disk_raid': self.default_raid, 
            'disk_size': self.disk_size, 
            'disk_iops': self.iops_text
        })
        # Удаление пустых дисков
        self.disks.dropna(subset=['disk_size'], inplace=True)
        # Ранжирование данных по типу диска, RAID и размеру
        self.disks = self.disks.sort_values(by=['disk_type', 'disk_raid', 'disk_size'], ascending=[False, False, False])

        # Размер дисков по типам, RAID, IOPS и виртуальным машинам
        self.vm_disks = self.disks[['disk_type', 'disk_raid', 'disk_size', 'disk_iops']].groupby(['disk_type', 'disk_raid', 'disk_iops']).sum('disk_size').reset_index()
        self.vm_disks['vm'] = 'dlh'
        # Диски для Airflow и мониторинга
        vm = pd.DataFrame(index=['vm', 'disk_type', 'disk_raid', 'disk_size', 'disk_iops'])
        # Если требуется Airflow
        if include_airflow:
            vm = self.disks[['disk_type', 'disk_raid', 'disk_size', 'disk_iops']].iloc[5:, :].groupby(['disk_type', 'disk_raid', 'disk_iops']).sum('disk_size').reset_index()
            # размещение Airflow на отдельной ВМ
            if airflow_on_separate_vm:
                vm['vm'] = 'airflow'
                self.vm_disks = pd.concat([self.vm_disks, vm], ignore_index=True)
            else:
                vm['vm'] = self.vm_disks.loc[0, 'vm'] + '_airflow'
                self.vm_disks.loc[self.vm_disks['vm'].str.contains('dlh'), 'vm'] = self.vm_disks.loc[self.vm_disks['vm'].str.contains('dlh'), 'vm'] + '_airflow'
                self.vm_disks = pd.concat([self.vm_disks, vm], ignore_index=True)
                self.vm_disks = self.vm_disks.groupby(['vm', 'disk_type', 'disk_raid', 'disk_iops']).sum('disk_size').reset_index()
        # Если требуется мониторинг
        if include_monitoring:
            vm = self.disks[['disk_type', 'disk_raid', 'disk_size', 'disk_iops']].iloc[5:, :].groupby(['disk_type', 'disk_raid', 'disk_iops']).sum('disk_size').reset_index()
            # размещение систем мониторинга на отдельной ВМ
            if monitoring_on_separate_vm:
                vm['vm'] = 'zabbix_grafana'
                self.vm_disks = pd.concat([self.vm_disks, vm], ignore_index=True)
            else:
                vm['vm'] = self.vm_disks.loc[0, 'vm'] + '_zabbix_grafana'
                self.vm_disks.loc[self.vm_disks['vm'].str.contains('dlh'), 'vm'] = self.vm_disks.loc[self.vm_disks['vm'].str.contains('dlh'), 'vm'] + '_zabbix_grafana'
                self.vm_disks = pd.concat([self.vm_disks, vm], ignore_index=True)
                self.vm_disks = self.vm_disks.groupby(['vm', 'disk_type', 'disk_raid', 'disk_iops']).sum('disk_size').reset_index()
        # Ранжирование параметров датафрейма
        self.vm_disks = self.vm_disks[['vm', 'disk_type', 'disk_raid', 'disk_size', 'disk_iops']]
        # Ранжирование данных по виртуальной машине, типу диска, RAID и размеру
        self.vm_disks = self.vm_disks.sort_values(by=['vm', 'disk_type', 'disk_raid', 'disk_size'], ascending=[True, False, False, False])

        # Уменьшение количества знаков в мантисе значений 'data_size' и 'disk_size' датафреймов
        self.data['data_size'] = self.data['data_size'].round(2)
        self.disks['disk_size'] = self.disks['disk_size'].round(2)
        self.vm_disks['disk_size'] = self.vm_disks['disk_size'].round(2)
        
        # Снятие ограничение на ширину столбцов датафрейма
        pd.set_option('display.max_colwidth', None)

    # Размер данных
    def calculate_data_size(self):
        # Свежие сырые данные, помещаемые в слой STG за одну итерацию
        frash_raw_tb = self.yearly_growth_tb / self.raw_data_download_num
        self.data_size = {'frash_raw': frash_raw_tb}
        self.data_size_descriptions = {'frash_raw': 'Свежие сырые данные'}
        
        # Горячие сырые данные (активные), хранящиеся в RTG
        hot_raw_tb = frash_raw_tb + (self.yearly_growth_tb * self.hot_years)
        self.data_size['hot_raw'] = hot_raw_tb
        self.data_size_descriptions['hot_raw'] = 'Горячие сырые данные'
        
        # Холодные сырые данные (архивные), хранящиеся в RTG
        #total_raw_tb = self.base_table_size_tb + (self.years_to_store - 1) * self.yearly_growth_tb
        cold_raw_tb = self.yearly_growth_tb * self.years_to_store
        self.data_size['cold_raw'] = cold_raw_tb
        self.data_size_descriptions['cold_raw'] = 'Холодные сырые данные'
        
        # Все сырые данные (архивные), хранящиеся в RTG
        #total_raw_tb = self.base_table_size_tb + (self.years_to_store - 1) * self.yearly_growth_tb
        total_raw_tb = hot_raw_tb + cold_raw_tb
        self.data_size['total_raw'] = total_raw_tb
        self.data_size_descriptions['total_raw'] = 'Все сырые данные'
        
        # Сырые и производные данные (слои ODS, DDS, витрины) без индексов
        # (если требуются дополнительные слои)
        if self.include_derived:
            derived_tb = total_raw_tb * self.raw_to_derived_coefficient
            self.data_size['derived'] = derived_tb
            self.data_size_descriptions['derived'] = 'Сырые и производные данные'
        else:
            derived_tb = total_raw_tb
    
        # Сырые и производные данные с индексами 
        # (индексы занимают дополнительное место)
        if self.include_indexed:
            indexed_tb = derived_tb * self.index_overhead_coefficient
            self.data_size['indexed'] = indexed_tb
            self.data_size_descriptions['indexed'] = 'Сырые и производные данные с индексами'
        else:
            indexed_tb = derived_tb
        
        # Активные данные
        hot_data_tb = hot_raw_tb
        if self.include_derived:
            hot_data_tb = hot_data_tb * self.raw_to_derived_coefficient
        if self.include_indexed:
            hot_data_tb = hot_data_tb * self.index_overhead_coefficient
        self.data_size['hot_data'] = hot_data_tb
        self.data_size_descriptions['hot_data'] = 'Активные данные'
        
        # Исторические данные
        if self.include_cold_data:
            cold_data_tb = cold_raw_tb
            if self.include_derived:
                hot_data_tb = hot_data_tb * self.raw_to_derived_coefficient
            if self.include_indexed:
                hot_data_tb = hot_data_tb * self.index_overhead_coefficient
            self.data_size['cold_data'] = cold_data_tb
            self.data_size_descriptions['cold_data'] = 'Исторические данные'
        
        # WAL
        if self.include_wal:
            # Оценка WAL: обычно ~10% от годовой записи или фиксированный запас.
            # Возьмём как 0.2 ТБ (200 ГБ) + небольшой запас.
            self.data_size["wal"] = .2
            self.data_size_descriptions["wal"] = 'WAL (оперативный журнал транзакций, Write-Ahead Log)'
            # WAL архив (непрерывное архивирование)
            if self.include_wal_archive:
                # Пусть будет 0.5 ТБ (500 ГБ) для хранения 2 недель архива при интенсивной загрузке
                self.data_size["wal_archive"] = .5
                self.data_size_descriptions["wal_archive"] = 'Архив WAL'
    
        # Бэкапы
        if self.include_backups:
            # Обычно бэкапы занимают примерно backup_multiple от общего объёма (с учётом сжатия)
            # Для упрощения: берём indexed_tb * backup_multiple
            # Но в реальности политика может быть сложнее.
            self.data_size["backups"] = indexed_tb * self.backup_multiple * (self.days_backups + self.weeks_backups + self.months_backups)
            self.data_size_descriptions["backups"] = 'Бэкап'
    
        # Логи
        if self.include_logs:
            self.data_size["logs"] = self.logs_size_tb
            self.data_size_descriptions["logs"] = 'Логи'

        # Системные тома (под ОС каждой ВМ)
        # По умолчанию предполагаем 3 ВМ: БД, Airflow, мониторинг
        self.data_size["system"] = self.system_size_per_vm_tb
        self.data_size_descriptions["system"] = 'Системные тома (под ОС каждой ВМ)'
        
        # Том для приложений (Airflow, скрипты)
        self.data_size["app"] = self.app_size_tb
        self.data_size_descriptions["app"] = 'Том для приложений (Airflow, скрипты)'
        
        # Дополнительные тома (если указаны)
        '''
        if self.additional_volumes:
            for name, size in self.additional_volumes.items():
                self.data_size[f"additional_{name}_tb"] = size
                self.data_size_descriptions[f"additional_{name}_tb"] = f'Дополнительный том {name}'
        '''

    # Размер дискового пространства
    def calculate_disk_requirements(self):
        # Значения по умолчанию для RAID, 
        # типов дисков (можно переопределить через параметры)
        # и коэффициенты эеективности дисков в зависимости от RAID
        self.default_disk_type = {
            "hot_data": "SSD",
            "cold_data": "HDD",
            "wal": "SSD",
            "wal_archive": "HDD", #"SSD or HDD",
            "backups": "HDD",
            "logs": "SSD",
            "system": "SSD",
            "app": "SSD",
        }
        self.default_raid = {
            "hot_data": "RAID10",
            "cold_data": "RAID6",
            "wal": "RAID10",
            "wal_archive": "RAID10",
            "backups": "RAID6",
            "logs": "RAID1",
            "system": "RAID1",
            "app": "RAID1",
        }
        self.raid_efficiency = {
            "RAID0": 1., # использует весь объём дисков без резервирования
            "RAID1": .5, # данные полностью дублируются на пары дисков
            "RAID6": (self.hdd_raid6_disk_count - 2.) / self.hdd_raid6_disk_count, # фактически не используется 2 диска из массива RAID6
            "RAID10": .5, # фактический объём составляет примерно половину суммарного объёма дисков
        }

        # Расчет размера дисков
        self.disk_size = {}
        self.disk_size_descriptions = {}
        for i in self.default_disk_type:
            if i in self.data_size:
                raid = self.default_raid[i]
                self.disk_size[i] = self.data_size[i] / self.raid_efficiency[raid]
                self.disk_size_descriptions[i] = self.data_size_descriptions[i]
        
        # IOPS в зависимости от типа диска и назначения
        self.iops_text = {
            "hot_data": "Высокие IOPS (случайная запись/чтение), требуется низкая задержка",
            "cold_data": "Низкие IOPS (редкие запросы)",
            "wal": "Высокие IOPS (случайная запись/чтение), требуется низкая задержка",
            "wal_archive": "Высокие IOPS (случайная запись/чтение), требуется низкая задержка",
            "backups": "Низкие IOPS, важна пропускная способность при записи/чтении",
            "logs": "Умеренные IOPS",
            "system": "Умеренные IOPS",
            "app": "Умеренные IOPS",
        }
        self.iops_text = {
            "hot_data": "Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись",
            "cold_data": "Низкие (достаточно 500-1000) IOPS (редкие запросы), пропускная способность 100-200 МБ/с",
            "wal": "Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)",
            "wal_archive": "Высокие IOPS (случайная запись/чтение), низкая задержка",
            "backups": "Низкие IOPS, важна пропускная способность при записи/чтении",
            "logs": "Умеренные IOPS",
            "system": "Умеренные IOPS",
            "app": "Умеренные IOPS",
        }

    # Демонстрация результатов работы класса
    def print(self):
        print('\n', '='*5, 'Заданные параметры инфраструктуры', '='*5)
        display(self.basic)
        print('\n', '='*5, 'Размер данных (Тб)', '='*5)
        display(self.data)
        print('\n', '='*5, 'Дисковое пространство (Тб)', '='*5)
        display(self.disks)
        print('\n', '='*5, 'Размер дисков (Тб) по типам, RAID, IOPS и виртуальным машинам', '='*5)
        display(self.vm_disks)

Поэтапный расчет параметров инфраструктуры DLH¶

Важно! Если требуется в схеме резервного копирования (далее СРК):

  • Ежедневные бэкапы хранить 14 дней в СРК DLH;
  • Еженедельные бэкапы хранить 2 месяца в СРК DLH;
  • Ежемесячные бэкапы хранить 1 год в СРК DLH,
  • Ежегодные бэкапы хранить 10 лет на отдельных носителях.

то, фактически требуется в СРК DLH:

  • 12 ежедневных бэкапа хранить 14 дней;
  • 6 еженедельных бэкапа хранить 2 месяца;
  • 12 ежемесячных бэкапа хранить 1 год.

Следовательно, ежемоментно на серврере DLH должно храниться 30 бэкапов.

Этап MVP¶

In [8]:
# Этап MVP DLH
ir = infrastructure_requirements(
    # Параметры данных
    #base_table_size_tb = .0,    # исходный размер данных (Тб)
    yearly_growth_tb = 2.0,     # ожидаемый средний ежегодный прирост данных (Тб)
    hot_years = 2,              # количество лет в активном слое (быстрые диски)
    years_to_store = 5,         # количество лет, которые требуется хранпить данные (медленные, но надежные диски)
    # Параметры включения компонентов
    include_cold_data = False,  # потребность в исторических (холодных) данных
    include_derived = False,    # потребность в дополнительных слоях (ODS, DDS, CDM)
    include_indexed = True,     # потребность в индексировании
    include_wal = True,         # потребность в оперативном журнале транзакций (Write-Ahead Log, WAL)
    include_wal_archive = True, # потребность в непрерывном архивировании WAL
    include_backups = True,     # потребность в бэкапировании
    include_logs = True,        # потребность в логировании
    include_airflow = False,    # потребность в оркестрации (Airflow)
    include_monitoring = False, # потребность в мониторинге (Zabbix, Grafana)
    # Параметры размещения
    airflow_on_separate_vm = True,    # размещение Airflow на отдельной ВМ
    monitoring_on_separate_vm = True, # размещение систем мониторинга на отдельной ВМ
    # Коэфициенты компонентов
    raw_to_derived_coefficient = 1.5, # коэффициент прироста размера данных в производных слях (ODS, DDS, CDN)
    index_overhead_coefficient = 1.3, # коэффициент прироста размера данных за счет индексов
    backup_multiple = .5, # коэффициент сжатия данных при бэкапировании
    # RAID конфигурации (можно переопределить)
    #raid_configs = None,       # RAID-конфигурация дисков
    #disk_types = None,         # типы дисков
    hdd_raid6_disk_count = 8,   # количество дисков RAID6
    # Дополнительные тома
    #additional_volumes = None, # дополнительные тома дисков
    # Прочее
    raw_data_download_num = 365,# количество загрузок за год (1 раз в день)
    days_backups = 12,          # количество ежедневных бэкапов
    weeks_backups = 6,          # количество еженедельных бэкапов
    months_backups = 12,        # количество ежемесячных бэкапов
    logs_size_tb = .2,          # размер диска для логов (Тб)
    system_size_per_vm_tb = .1, # размер системных дисков (Тб)
    app_size_tb = .1            # размер диска для приложений (Тб)
)

ir.print()
 ===== Заданные параметры инфраструктуры =====
parametr_description values
yearly_growth_tb Ожидаемый средний ежегодный прирост данных (Тб) 2.0
hot_years Количество лет в активном слое (быстрые диски) 2
years_to_store Количество лет, которые требуется хранпить данные (медленные, но надежные диски) 5
include_cold_data Потребность в исторических (холодных) данных False
include_derived Потребность в дополнительных слоях (ODS, DDS, CDM) False
include_indexed Потребность в индексировании True
include_wal Потребность в оперативном журнале транзакций (Write-Ahead Log, WAL) True
include_wal_archive Потребность в непрерывном архивировании WAL True
include_backups Потребность в бэкапировании True
include_logs Потребность в логировании True
include_airflow Потребность в оркестрации (Airflow) False
include_monitoring Потребность в мониторинге (Zabbix, Grafana) False
airflow_on_separate_vm Размещение Airflow на отдельной ВМ True
monitoring_on_separate_vm Размещение систем мониторинга на отдельной ВМР True
raw_to_derived_coefficient Коэффициент прироста размера данных в производных слях (ODS, DDS, CDN) 1.5
index_overhead_coefficient Коэффициент прироста размера данных за счет индексов 1.3
backup_multiple Коэффициент сжатия данных при бэкапировании 0.5
hdd_raid6_disk_count Количество дисков RAID6 8
raw_data_download_num Кличество загрузок за год 365
days_backups Количество ежедневных бэкапов 12
weeks_backups Количество еженедельных бэкапов 6
months_backups Количество ежемесячных бэкапов 12
logs_size_tb Размер диска для логов (Тб) 0.2
system_size_per_vm_tb Размер системных дисков (Тб) 0.1
app_size_tb Размер диска для приложений (Тб) 0.1
 ===== Размер данных (Тб) =====
data_descriptions data_size
frash_raw Свежие сырые данные 0.01
hot_raw Горячие сырые данные 4.01
cold_raw Холодные сырые данные 10.00
total_raw Все сырые данные 14.01
indexed Сырые и производные данные с индексами 18.21
hot_data Активные данные 5.21
wal WAL (оперативный журнал транзакций, Write-Ahead Log) 0.20
wal_archive Архив WAL 0.50
backups Бэкап 273.11
logs Логи 0.20
system Системные тома (под ОС каждой ВМ) 0.10
app Том для приложений (Airflow, скрипты) 0.10
 ===== Дисковое пространство (Тб) =====
disk_descriptions disk_type disk_raid disk_size disk_iops
hot_data Активные данные SSD RAID10 10.41 Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись
wal WAL (оперативный журнал транзакций, Write-Ahead Log) SSD RAID10 0.40 Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)
logs Логи SSD RAID1 0.40 Умеренные IOPS
system Системные тома (под ОС каждой ВМ) SSD RAID1 0.20 Умеренные IOPS
app Том для приложений (Airflow, скрипты) SSD RAID1 0.20 Умеренные IOPS
backups Бэкап HDD RAID6 364.14 Низкие IOPS, важна пропускная способность при записи/чтении
wal_archive Архив WAL HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
 ===== Размер дисков (Тб) по типам, RAID, IOPS и виртуальным машинам =====
vm disk_type disk_raid disk_size disk_iops
4 dlh SSD RAID10 10.41 Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись
3 dlh SSD RAID10 0.40 Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)
2 dlh SSD RAID1 0.80 Умеренные IOPS
1 dlh HDD RAID6 364.14 Низкие IOPS, важна пропускная способность при записи/чтении
0 dlh HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка

Этап промышленного внедрения¶

In [10]:
# Этап промышленного внедрения DLH
ir = infrastructure_requirements(
    # Параметры данных
    #base_table_size_tb = 3.0,   # исходный размер данных (Тб)
    yearly_growth_tb = 2.0,     # ожидаемый средний ежегодный прирост данных (Тб)
    hot_years = 2,              # количество лет в активном слое (быстрые диски)
    years_to_store = 5,         # количество лет, которые требуется хранпить данные (медленные, но надежные диски)
    # Параметры включения компонентов
    include_cold_data = False,  # потребность в исторических (холодных) данных
    include_derived = False,    # потребность в дополнительных слоях (ODS, DDS, CDM)
    include_indexed = True,     # потребность в индексировании
    include_wal = True,         # потребность в оперативном журнале транзакций (Write-Ahead Log, WAL)
    include_wal_archive = True, # потребность в непрерывном архивировании WAL
    include_backups = True,     # потребность в бэкапировании
    include_logs = True,        # потребность в логировании
    include_airflow = True,     # потребность в оркестрации (Airflow)
    include_monitoring = True,  # потребность в мониторинге (Zabbix, Grafana)
    # Параметры размещения
    airflow_on_separate_vm = True,    # размещение Airflow на отдельной ВМ
    monitoring_on_separate_vm = True, # размещение систем мониторинга на отдельной ВМ
    # Коэфициенты компонентов
    raw_to_derived_coefficient = 1.5, # коэффициент прироста размера данных в производных слях (ODS, DDS, CDN)
    index_overhead_coefficient = 1.3, # коэффициент прироста размера данных за счет индексов
    backup_multiple = .5, # коэффициент сжатия данных при бэкапировании
    # RAID конфигурации (можно переопределить)
    #raid_configs = None,       # RAID-конфигурация дисков
    #disk_types = None,         # типы дисков
    hdd_raid6_disk_count = 8,   # количество дисков RAID6
    # Дополнительные тома
    #additional_volumes = None, # дополнительные тома дисков
    # Прочее
    raw_data_download_num = 365,# количество загрузок за год (1 раз в день)
    days_backups = 12,          # количество ежедневных бэкапов
    weeks_backups = 6,          # количество еженедельных бэкапов
    months_backups = 12,        # количество ежемесячных бэкапов
    logs_size_tb = .2,          # размер диска для логов (Тб)
    system_size_per_vm_tb = .1, # размер системных дисков (Тб)
    app_size_tb = .1            # размер диска для приложений (Тб)
)

ir.print()
 ===== Заданные параметры инфраструктуры =====
parametr_description values
yearly_growth_tb Ожидаемый средний ежегодный прирост данных (Тб) 2.0
hot_years Количество лет в активном слое (быстрые диски) 2
years_to_store Количество лет, которые требуется хранпить данные (медленные, но надежные диски) 5
include_cold_data Потребность в исторических (холодных) данных False
include_derived Потребность в дополнительных слоях (ODS, DDS, CDM) False
include_indexed Потребность в индексировании True
include_wal Потребность в оперативном журнале транзакций (Write-Ahead Log, WAL) True
include_wal_archive Потребность в непрерывном архивировании WAL True
include_backups Потребность в бэкапировании True
include_logs Потребность в логировании True
include_airflow Потребность в оркестрации (Airflow) True
include_monitoring Потребность в мониторинге (Zabbix, Grafana) True
airflow_on_separate_vm Размещение Airflow на отдельной ВМ True
monitoring_on_separate_vm Размещение систем мониторинга на отдельной ВМР True
raw_to_derived_coefficient Коэффициент прироста размера данных в производных слях (ODS, DDS, CDN) 1.5
index_overhead_coefficient Коэффициент прироста размера данных за счет индексов 1.3
backup_multiple Коэффициент сжатия данных при бэкапировании 0.5
hdd_raid6_disk_count Количество дисков RAID6 8
raw_data_download_num Кличество загрузок за год 365
days_backups Количество ежедневных бэкапов 12
weeks_backups Количество еженедельных бэкапов 6
months_backups Количество ежемесячных бэкапов 12
logs_size_tb Размер диска для логов (Тб) 0.2
system_size_per_vm_tb Размер системных дисков (Тб) 0.1
app_size_tb Размер диска для приложений (Тб) 0.1
 ===== Размер данных (Тб) =====
data_descriptions data_size
frash_raw Свежие сырые данные 0.01
hot_raw Горячие сырые данные 4.01
cold_raw Холодные сырые данные 10.00
total_raw Все сырые данные 14.01
indexed Сырые и производные данные с индексами 18.21
hot_data Активные данные 5.21
wal WAL (оперативный журнал транзакций, Write-Ahead Log) 0.20
wal_archive Архив WAL 0.50
backups Бэкап 273.11
logs Логи 0.20
system Системные тома (под ОС каждой ВМ) 0.10
app Том для приложений (Airflow, скрипты) 0.10
 ===== Дисковое пространство (Тб) =====
disk_descriptions disk_type disk_raid disk_size disk_iops
hot_data Активные данные SSD RAID10 10.41 Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись
wal WAL (оперативный журнал транзакций, Write-Ahead Log) SSD RAID10 0.40 Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)
logs Логи SSD RAID1 0.40 Умеренные IOPS
system Системные тома (под ОС каждой ВМ) SSD RAID1 0.20 Умеренные IOPS
app Том для приложений (Airflow, скрипты) SSD RAID1 0.20 Умеренные IOPS
backups Бэкап HDD RAID6 364.14 Низкие IOPS, важна пропускная способность при записи/чтении
wal_archive Архив WAL HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
 ===== Размер дисков (Тб) по типам, RAID, IOPS и виртуальным машинам =====
vm disk_type disk_raid disk_size disk_iops
6 airflow HDD RAID6 364.14 Низкие IOPS, важна пропускная способность при записи/чтении
5 airflow HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
4 dlh SSD RAID10 10.41 Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись
3 dlh SSD RAID10 0.40 Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)
2 dlh SSD RAID1 0.80 Умеренные IOPS
1 dlh HDD RAID6 364.14 Низкие IOPS, важна пропускная способность при записи/чтении
0 dlh HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
8 zabbix_grafana HDD RAID6 364.14 Низкие IOPS, важна пропускная способность при записи/чтении
7 zabbix_grafana HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка

Этап развития¶

In [12]:
# Этап развития DLH
ir = infrastructure_requirements(
    # Параметры данных
    #base_table_size_tb = 3.0,   # исходный размер данных (Тб)
    yearly_growth_tb = 2.0,     # ожидаемый средний ежегодный прирост данных (Тб)
    hot_years = 2,              # количество лет в активном слое (быстрые диски)
    years_to_store = 5,         # количество лет, которые требуется хранпить данные (медленные, но надежные диски)
    # Параметры включения компонентов
    include_cold_data = False,  # потребность в исторических (холодных) данных
    include_derived = True,     # потребность в дополнительных слоях (ODS, DDS, CDM)
    include_indexed = True,     # потребность в индексировании
    include_wal = True,         # потребность в оперативном журнале транзакций (Write-Ahead Log, WAL)
    include_wal_archive = True, # потребность в непрерывном архивировании WAL
    include_backups = True,     # потребность в бэкапировании
    include_logs = True,        # потребность в логировании
    include_airflow = True,     # потребность в оркестрации (Airflow)
    include_monitoring = True,  # потребность в мониторинге (Zabbix, Grafana)
    # Параметры размещения
    airflow_on_separate_vm = True,    # размещение Airflow на отдельной ВМ
    monitoring_on_separate_vm = True, # размещение систем мониторинга на отдельной ВМ
    # Коэфициенты компонентов
    raw_to_derived_coefficient = 1.5, # коэффициент прироста размера данных в производных слях (ODS, DDS, CDN)
    index_overhead_coefficient = 1.3, # коэффициент прироста размера данных за счет индексов
    backup_multiple = .5, # коэффициент сжатия данных при бэкапировании
    # RAID конфигурации (можно переопределить)
    #raid_configs = None,       # RAID-конфигурация дисков
    #disk_types = None,         # типы дисков
    hdd_raid6_disk_count = 8,   # количество дисков RAID6
    # Дополнительные тома
    #additional_volumes = None, # дополнительные тома дисков
    # Прочее
    raw_data_download_num = 365,# количество загрузок за год (1 раз в день)
    days_backups = 12,          # количество ежедневных бэкапов
    weeks_backups = 6,          # количество еженедельных бэкапов
    months_backups = 12,        # количество ежемесячных бэкапов
    logs_size_tb = .2,          # размер диска для логов (Тб)
    system_size_per_vm_tb = .1, # размер системных дисков (Тб)
    app_size_tb = .1            # размер диска для приложений (Тб)
)

ir.print()
 ===== Заданные параметры инфраструктуры =====
parametr_description values
yearly_growth_tb Ожидаемый средний ежегодный прирост данных (Тб) 2.0
hot_years Количество лет в активном слое (быстрые диски) 2
years_to_store Количество лет, которые требуется хранпить данные (медленные, но надежные диски) 5
include_cold_data Потребность в исторических (холодных) данных False
include_derived Потребность в дополнительных слоях (ODS, DDS, CDM) True
include_indexed Потребность в индексировании True
include_wal Потребность в оперативном журнале транзакций (Write-Ahead Log, WAL) True
include_wal_archive Потребность в непрерывном архивировании WAL True
include_backups Потребность в бэкапировании True
include_logs Потребность в логировании True
include_airflow Потребность в оркестрации (Airflow) True
include_monitoring Потребность в мониторинге (Zabbix, Grafana) True
airflow_on_separate_vm Размещение Airflow на отдельной ВМ True
monitoring_on_separate_vm Размещение систем мониторинга на отдельной ВМР True
raw_to_derived_coefficient Коэффициент прироста размера данных в производных слях (ODS, DDS, CDN) 1.5
index_overhead_coefficient Коэффициент прироста размера данных за счет индексов 1.3
backup_multiple Коэффициент сжатия данных при бэкапировании 0.5
hdd_raid6_disk_count Количество дисков RAID6 8
raw_data_download_num Кличество загрузок за год 365
days_backups Количество ежедневных бэкапов 12
weeks_backups Количество еженедельных бэкапов 6
months_backups Количество ежемесячных бэкапов 12
logs_size_tb Размер диска для логов (Тб) 0.2
system_size_per_vm_tb Размер системных дисков (Тб) 0.1
app_size_tb Размер диска для приложений (Тб) 0.1
 ===== Размер данных (Тб) =====
data_descriptions data_size
frash_raw Свежие сырые данные 0.01
hot_raw Горячие сырые данные 4.01
cold_raw Холодные сырые данные 10.00
total_raw Все сырые данные 14.01
derived Сырые и производные данные 21.01
indexed Сырые и производные данные с индексами 27.31
hot_data Активные данные 7.81
wal WAL (оперативный журнал транзакций, Write-Ahead Log) 0.20
wal_archive Архив WAL 0.50
backups Бэкап 409.66
logs Логи 0.20
system Системные тома (под ОС каждой ВМ) 0.10
app Том для приложений (Airflow, скрипты) 0.10
 ===== Дисковое пространство (Тб) =====
disk_descriptions disk_type disk_raid disk_size disk_iops
hot_data Активные данные SSD RAID10 15.62 Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись
wal WAL (оперативный журнал транзакций, Write-Ahead Log) SSD RAID10 0.40 Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)
logs Логи SSD RAID1 0.40 Умеренные IOPS
system Системные тома (под ОС каждой ВМ) SSD RAID1 0.20 Умеренные IOPS
app Том для приложений (Airflow, скрипты) SSD RAID1 0.20 Умеренные IOPS
backups Бэкап HDD RAID6 546.21 Низкие IOPS, важна пропускная способность при записи/чтении
wal_archive Архив WAL HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
 ===== Размер дисков (Тб) по типам, RAID, IOPS и виртуальным машинам =====
vm disk_type disk_raid disk_size disk_iops
6 airflow HDD RAID6 546.21 Низкие IOPS, важна пропускная способность при записи/чтении
5 airflow HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
4 dlh SSD RAID10 15.62 Высокие (не менее 5000, но лучше 10000+) IOPS (случайная запись/чтение), низкая задержка, пропускная способность не менее 500 МБ/с на последовательное чтение/запись
3 dlh SSD RAID10 0.40 Высокие (в пределах 1000-2000) IOPS (случайная запись/чтение), низкая задержка (должна быть < 1 мс)
2 dlh SSD RAID1 0.80 Умеренные IOPS
1 dlh HDD RAID6 546.21 Низкие IOPS, важна пропускная способность при записи/чтении
0 dlh HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка
8 zabbix_grafana HDD RAID6 546.21 Низкие IOPS, важна пропускная способность при записи/чтении
7 zabbix_grafana HDD RAID10 1.00 Высокие IOPS (случайная запись/чтение), низкая задержка

AI-Ready платформа Data Lakehouse Python гибридное хранилище данных корпоративная информационная система практика

Предыдущая статьяГибридное хранилище данных

Рубрики

Метки

abc abcd AI-Ready платформа Data Lakehouse ELT excel ms sql pandas PostgreSQL Python sql tessa VBA xyz анализ виртуальный помощник гибридное хранилище данных данные знания информационная система информация искусственный интеллект кластерный анализ комбинаторика компетенции корпоративная информационная система маркетинг математика медальон-архитектура модель предоставления прав мудрость о проекте оптимизация ошибка практика программное обеспечение пэст ролевая модель теория теория вероятностей тесса тест юмор языки программирования

Политика конфиденциальности

Продолжая использовать данный сайт вы подтверждаете свое согласие с условиями его политики конфиденциальности. Подробнее…




Администрация и владельцы данного информационного ресурса не несут ответственности за возможные последствия, связанные с использованием информации, размещенной на нем.


Все права защищены. При копировании материалов сайта обязательно указывать ссылку на © Microsegment.ru (2020-2026)