Ad Widget

Collapse

База данных Zabbix стала быстро разрастаться

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • Kolmik
    Member
    • Jul 2024
    • 56

    #16
    Originally posted by Griboed0ff

    ну удаление из таблиц элементарно:
    Code:
    delete FROM public.history where clock > тут временная метка старше, которой хотите удалить
    Получается, если я хочу удалить всё раньше 1 января 2024 года, то будет:
    delete FROM public.history where clock > 1704056400 ?
    А точно знак >? А то по логике удалить всё, где время больше 1704056400, то есть всё что было после Нового года, а не до...

    Comment

    • Griboed0ff
      Senior Member
      • Sep 2022
      • 153

      #17
      Originally posted by Kolmik

      Получается, если я хочу удалить всё раньше 1 января 2024 года, то будет:
      delete FROM public.history where clock > 1704056400 ?
      А точно знак >? А то по логике удалить всё, где время больше 1704056400, то есть всё что было после Нового года, а не до...
      Ну для начала перед удалением сделайте просто селект и посмотрите в какую сторону вам знак нужен.
      Code:
      select * FROM public.history where clock > 1704056400
      Ну и судя по скрину вы у себя выставляли 7 дней хранения истории, зачем вам история с начала года?

      Comment

      • Kolmik
        Member
        • Jul 2024
        • 56

        #18
        Originally posted by Griboed0ff

        Ну для начала перед удалением сделайте просто селект и посмотрите в какую сторону вам знак нужен.
        Code:
        select * FROM public.history where clock > 1704056400
        Ну и судя по скрину вы у себя выставляли 7 дней хранения истории, зачем вам история с начала года?
        Вроде если хочешь удалить всё до нового года, то нужен знак < 1704056400, так как все числа до НГ меньше чем 1704056400
        По поводу 7 дней - НГ это просто пример. Кстати, а чем отличается тренды от хистори?

        Comment

        • Kos
          Senior Member
          Zabbix Certified SpecialistZabbix Certified Professional
          • Aug 2015
          • 3404

          #19
          Originally posted by Kolmik
          а чем отличается тренды от хистори?
          Тренды - это то, что в русском переводе названо "динамика изменений" (ссылка).
          Используется для числовых типов, в двух словах - вместо всех собранных значений сохраняется только 4 числа за каждый час: минимум, максимум, среднее и количество значений за этот час.

          Comment

          • Griboed0ff
            Senior Member
            • Sep 2022
            • 153

            #20
            Originally posted by Kolmik
            Вроде если хочешь удалить всё до нового года, то нужен знак < 1704056400, так как все числа до НГ меньше чем 1704056400
            По поводу 7 дней - НГ это просто пример. Кстати, а чем отличается тренды от хистори?
            Да, это верно, что знак может стоять в ту сторону. Я просто приводил пример, как можно удалить что-либо, хотя обычно это делают более осмысленно.

            Также хотелось бы напомнить, что задавать вопросы, не относящиеся к теме топика, — плохая практика. Топики, заполненные посторонними вопросами, которые можно легко найти в документации или через поиск в интернете, не приносят пользы форуму.

            Цель топика на форуме — найти решение проблемы. Когда решение найдено и отмечено, в будущем это может помочь другим пользователям справиться с аналогичной задачей.​

            Comment

            • Kolmik
              Member
              • Jul 2024
              • 56

              #21
              Originally posted by Griboed0ff

              Да, это верно, что знак может стоять в ту сторону. Я просто приводил пример, как можно удалить что-либо, хотя обычно это делают более осмысленно.

              Также хотелось бы напомнить, что задавать вопросы, не относящиеся к теме топика, — плохая практика. Топики, заполненные посторонними вопросами, которые можно легко найти в документации или через поиск в интернете, не приносят пользы форуму.

              Цель топика на форуме — найти решение проблемы. Когда решение найдено и отмечено, в будущем это может помочь другим пользователям справиться с аналогичной задачей.
              Спасибо. Так я всё об этом, как справится с проблемой возросшей базой Zabbix.

              Я планирую выполнить следующие действия:
              1. Клонировать машину, чтобы провести на ней тесты.
              2. Удалить все данные из больших таблиц хистори через delete FROM
              3. Затем пока не определился - попытаться сделать VACUUM FULL или сразу установить timescaledb и конвертнуть таблицы.

              Comment

              • Kolmik
                Member
                • Jul 2024
                • 56

                #22
                На тестовой машине по результатам всего плана:

                delete FROM public.history where clock < 1723842000; 88минут заняло удаление
                delete FROM public.history_uint where clock < 1723842000; 100минут заняло удаление
                delete FROM public.history_text where clock < 1723842000; 570минут заняло удаление
                VACUUM FULL public.history_text; 13:12 - 13:41 29минут
                VACUUM FULL public.history_uint; 13:42 - 14:33 51минута
                VACUUM FULL public.history; 14:34 - 15:15 41минута
                timescaleDB старт миграции 159минут

                Итоговый размер базы около 257гб.

                Результат до и после:

                relation | total_size
                --------------------------+------------
                public.history_text | 927 GB
                public.history_uint | 645 GB
                public.history | 552 GB
                public.trends_uint | 77 GB
                public.trends | 38 GB
                public.item_discovery | 13 GB

                relation | total_size
                --------------------------+------------
                public.trends_uint | 79 GB
                public.history_uint | 48 GB
                public.history | 39 GB
                public.trends | 39 GB
                public.history_text | 37 GB

                Comment

                • Griboed0ff
                  Senior Member
                  • Sep 2022
                  • 153

                  #23
                  А очистка данных после всего этого заработала? Самая главная проблема решена?

                  Comment

                  • Kolmik
                    Member
                    • Jul 2024
                    • 56

                    #24
                    Originally posted by Griboed0ff
                    А очистка данных после всего этого заработала? Самая главная проблема решена?
                    Не могу пока точно сказать. В логах до всех этих операций housekeeper ничего удалял - везде было по нулям. После очистки в логах появились записи об удалениях, которых не было раньше вообще.

                    Почему не могу определить в данный момент - я очистил данные с запасом, но по факту меня попросили хранить хистори в 30 дней, поэтому пока не упрусь в 30 дней не смогу убедится, что данные удаляются и рост базы остановился. Могу отписать позже.
                    Сегодня запустил конвертацию таблиц на боевом сервере.

                    Comment

                    • Kolmik
                      Member
                      • Jul 2024
                      • 56

                      #25
                      Ничего не получилось(
                      Хотя на клоне всё прекрасно отработало и таблицы конвертнулись...

                      2024-09-02 22:07:54.829 MSK [2131010] LOG: starting PostgreSQL 13.11 (Debian 13.11-0+deb11u1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 10.2.1-6) 10.2.1 20210110, 64-bit
                      2024-09-02 22:07:54.830 MSK [2131010] LOG: listening on IPv4 address "0.0.0.0", port 5432
                      2024-09-02 22:07:54.830 MSK [2131010] LOG: listening on IPv6 address "::", port 5432
                      2024-09-02 22:07:54.831 MSK [2131010] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
                      2024-09-02 22:07:54.841 MSK [2131011] LOG: database system was shut down at 2024-09-02 22:07:50 MSK
                      2024-09-02 22:07:54.864 MSK [2131010] LOG: database system is ready to accept connections
                      2024-09-02 22:07:54.865 MSK [2131017] LOG: TimescaleDB background worker launcher connected to shared catalogs
                      2024-09-02 22:09:05.728 MSK [2131122] LOG: the "timescaledb" extension is not up-to-date
                      2024-09-02 22:09:05.728 MSK [2131122] HINT: The most up-to-date version is 2.16.1, the installed version is 2.15.3.
                      2024-09-02 23:10:44.756 MSK [2131121] WARNING: terminating background worker "Telemetry Reporter [1]" due to timeout
                      2024-09-02 23:10:44.757 MSK [2132524] FATAL: terminating connection due to administrator command
                      2024-09-02 23:10:44.766 MSK [2131010] LOG: background worker "Telemetry Reporter [1]" (PID 2132524) exited with exit code 1
                      2024-09-02 23:10:44.766 MSK [2131121] LOG: job 1 failed
                      2024-09-03 00:17:34.150 MSK [2131121] WARNING: terminating background worker "Telemetry Reporter [1]" due to timeout
                      2024-09-03 00:17:34.152 MSK [2133072] FATAL: terminating connection due to administrator command
                      2024-09-03 00:17:34.161 MSK [2131010] LOG: background worker "Telemetry Reporter [1]" (PID 2133072) exited with exit code 1
                      2024-09-03 00:17:34.161 MSK [2131121] LOG: job 1 failed
                      2024-09-03 00:40:28.916 MSK [2131317] zabbix@zabbix WARNING: column type "character varying" used for "source" does not follow best practices
                      2024-09-03 00:40:28.916 MSK [2131317] zabbix@zabbix HINT: Use datatype TEXT instead.
                      2024-09-03 00:40:28.916 MSK [2131317] zabbix@zabbix CONTEXT: SQL statement "SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true)"
                      PL/pgSQL function inline_code_block line 66 at PERFORM
                      2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix LOG: could not send data to client: Broken pipe
                      2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix CONTEXT: SQL statement "SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true)"
                      PL/pgSQL function inline_code_block line 66 at PERFORM
                      2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix STATEMENT: DO $$
                      DECLARE
                      minimum_postgres_version_major INTEGER;
                      minimum_postgres_version_minor INTEGER;
                      current_postgres_version_major INTEGER;
                      current_postgres_version_minor INTEGER;
                      current_postgres_version_full VARCHAR;

                      minimum_timescaledb_version_major INTEGER;
                      minimum_timescaledb_version_minor INTEGER;
                      current_timescaledb_version_major INTEGER;
                      current_timescaledb_version_minor INTEGER;
                      current_timescaledb_version_full VARCHAR;

                      current_db_extension VARCHAR;
                      BEGIN
                      SELECT 10 INTO minimum_postgres_version_major;
                      SELECT 9 INTO minimum_postgres_version_minor;
                      SELECT 2 INTO minimum_timescaledb_version_major;
                      SELECT 0 INTO minimum_timescaledb_version_minor;

                      SHOW server_version INTO current_postgres_version_full;

                      IF NOT found THEN
                      RAISE EXCEPTION 'Cannot determine PostgreSQL version, aborting';
                      END IF;

                      SELECT substring(current_postgres_version_full, '^(\d+).') INTO current_postgres_version_major;
                      SELECT substring(current_postgres_version_full, '^\d+.(\d+)') INTO current_postgres_version_minor;

                      IF (current_postgres_version_major < minimum_postgres_version_major OR
                      (current_postgres_version_major = minimum_postgres_version_major AND
                      current_postgres_version_minor < minimum_postgres_version_minor)) THEN
                      RAISE EXCEPTION 'PostgreSQL version % is NOT SUPPORTED (with TimescaleDB)! Minimum is %.%.0 !',
                      current_postgres_version_full, minimum_postgres_version_major,
                      minimum_postgres_version_minor;
                      ELSE
                      RAISE NOTICE 'PostgreSQL version % is valid', current_postgres_version_full;
                      END IF;

                      SELECT extversion INTO current_timescaledb_version_full FROM pg_extension WHERE extname = 'timescaledb';

                      IF NOT found THEN
                      RAISE EXCEPTION 'TimescaleDB extension is not installed';
                      ELSE
                      RAISE NOTICE 'TimescaleDB extension is detected';
                      END IF;

                      SELECT substring(current_timescaledb_version_full, '^(\d+).') INTO current_timescaledb_version_major;
                      SELECT substring(current_timescaledb_version_full, '^\d+.(\d+)') INTO current_timescaledb_version_minor;

                      IF (current_timescaledb_version_major < minimum_timescaledb_version_major OR
                      (current_timescaledb_version_major = minimum_timescaledb_version_major AND
                      current_timescaledb_version_minor < minimum_timescaledb_version_minor)) THEN
                      RAISE EXCEPTION 'TimescaleDB version % is UNSUPPORTED! Minimum is %.%.0!',
                      current_timescaledb_version_full, minimum_timescaledb_version_major,
                      minimum_timescaledb_version_minor;
                      ELSE
                      RAISE NOTICE 'TimescaleDB version % is valid', current_timescaledb_version_full;
                      END IF;

                      SELECT db_extension FROM config INTO current_db_extension;

                      PERFORM create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('auditlog', 'auditid', chunk_time_interval => 604800,
                      time_partitioning_func => 'cuid_timestamp', migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);

                      IF (current_db_extension = 'timescaledb') THEN
                      RAISE NOTICE 'TimescaleDB extension is already installed; not changing configuration';
                      ELSE
                      UPDATE config SET db_extension='timescaledb',hk_history_global=1,hk_ trends_global=1;
                      UPDATE config SET compression_status=1,compress_older='7d';
                      END IF;

                      RAISE NOTICE 'TimescaleDB is configured successfully';
                      END $$;
                      2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix FATAL: connection to client lost
                      2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix CONTEXT: SQL statement "SELECT create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true)"
                      PL/pgSQL function inline_code_block line 66 at PERFORM
                      2024-09-03 00:40:28.949 MSK [2131317] zabbix@zabbix STATEMENT: DO $$
                      DECLARE
                      minimum_postgres_version_major INTEGER;
                      minimum_postgres_version_minor INTEGER;
                      current_postgres_version_major INTEGER;
                      current_postgres_version_minor INTEGER;
                      current_postgres_version_full VARCHAR;

                      minimum_timescaledb_version_major INTEGER;
                      minimum_timescaledb_version_minor INTEGER;
                      current_timescaledb_version_major INTEGER;
                      current_timescaledb_version_minor INTEGER;
                      current_timescaledb_version_full VARCHAR;

                      current_db_extension VARCHAR;
                      BEGIN
                      SELECT 10 INTO minimum_postgres_version_major;
                      SELECT 9 INTO minimum_postgres_version_minor;
                      SELECT 2 INTO minimum_timescaledb_version_major;
                      SELECT 0 INTO minimum_timescaledb_version_minor;

                      SHOW server_version INTO current_postgres_version_full;

                      IF NOT found THEN
                      RAISE EXCEPTION 'Cannot determine PostgreSQL version, aborting';
                      END IF;

                      SELECT substring(current_postgres_version_full, '^(\d+).') INTO current_postgres_version_major;
                      SELECT substring(current_postgres_version_full, '^\d+.(\d+)') INTO current_postgres_version_minor;

                      IF (current_postgres_version_major < minimum_postgres_version_major OR
                      (current_postgres_version_major = minimum_postgres_version_major AND
                      current_postgres_version_minor < minimum_postgres_version_minor)) THEN
                      RAISE EXCEPTION 'PostgreSQL version % is NOT SUPPORTED (with TimescaleDB)! Minimum is %.%.0 !',
                      current_postgres_version_full, minimum_postgres_version_major,
                      minimum_postgres_version_minor;
                      ELSE
                      RAISE NOTICE 'PostgreSQL version % is valid', current_postgres_version_full;
                      END IF;

                      SELECT extversion INTO current_timescaledb_version_full FROM pg_extension WHERE extname = 'timescaledb';

                      IF NOT found THEN
                      RAISE EXCEPTION 'TimescaleDB extension is not installed';
                      ELSE
                      RAISE NOTICE 'TimescaleDB extension is detected';
                      END IF;

                      SELECT substring(current_timescaledb_version_full, '^(\d+).') INTO current_timescaledb_version_major;
                      SELECT substring(current_timescaledb_version_full, '^\d+.(\d+)') INTO current_timescaledb_version_minor;

                      IF (current_timescaledb_version_major < minimum_timescaledb_version_major OR
                      (current_timescaledb_version_major = minimum_timescaledb_version_major AND
                      current_timescaledb_version_minor < minimum_timescaledb_version_minor)) THEN
                      RAISE EXCEPTION 'TimescaleDB version % is UNSUPPORTED! Minimum is %.%.0!',
                      current_timescaledb_version_full, minimum_timescaledb_version_major,
                      minimum_timescaledb_version_minor;
                      ELSE
                      RAISE NOTICE 'TimescaleDB version % is valid', current_timescaledb_version_full;
                      END IF;

                      SELECT db_extension FROM config INTO current_db_extension;

                      PERFORM create_hypertable('history', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_uint', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_log', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_text', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('history_str', 'clock', chunk_time_interval => 86400, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('auditlog', 'auditid', chunk_time_interval => 604800,
                      time_partitioning_func => 'cuid_timestamp', migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('trends', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);
                      PERFORM create_hypertable('trends_uint', 'clock', chunk_time_interval => 2592000, migrate_data => true, if_not_exists => true);

                      IF (current_db_extension = 'timescaledb') THEN
                      RAISE NOTICE 'TimescaleDB extension is already installed; not changing configuration';
                      ELSE
                      UPDATE config SET db_extension='timescaledb',hk_history_global=1,hk_ trends_global=1;
                      UPDATE config SET compression_status=1,compress_older='7d';
                      END IF;

                      RAISE NOTICE 'TimescaleDB is configured successfully';
                      END $$;
                      2024-09-03 00:47:06.451 MSK [2133330] postgres@postgres ERROR: relation "timescaledb_information.hypertables" does not exist at character 29
                      2024-09-03 00:47:06.451 MSK [2133330] postgres@postgres STATEMENT: SELECT hypertable_name FROM timescaledb_information.hypertables;
                      2024-09-03 00:47:13.240 MSK [2131010] LOG: received fast shutdown request
                      2024-09-03 00:47:13.253 MSK [2131010] LOG: aborting any active transactions
                      2024-09-03 00:47:13.253 MSK [2131121] FATAL: terminating connection due to administrator command
                      2024-09-03 00:47:13.253 MSK [2131017] FATAL: terminating connection due to administrator command
                      2024-09-03 00:47:13.257 MSK [2131010] LOG: background worker "logical replication launcher" (PID 2131018) exited with exit code 1
                      2024-09-03 00:47:13.257 MSK [2131010] LOG: background worker "TimescaleDB Background Worker Launcher" (PID 2131017) exited with exit code 1
                      2024-09-03 00:47:13.268 MSK [2131010] LOG: background worker "TimescaleDB Background Worker Scheduler" (PID 2131121) exited with exit code 1
                      2024-09-03 00:47:14.067 MSK [2131012] LOG: shutting down
                      2024-09-03 00:47:18.160 MSK [2131010] LOG: database system is shut down

                      Comment

                      • Kolmik
                        Member
                        • Jul 2024
                        • 56

                        #26
                        Выполнил конвертацию на боевом сервере, работы были сопряжены со сложностями миграции виртуальной машины между двумя Дата-центрами, простой занял около суток.
                        По итогу когда конвертация прошла, боевая база вместо 2.3ТБ, стала весить 136гб, сжатие данных старше 7 дней включено.

                        Comment

                        Working...