Ad Widget

Collapse

данные в исторических таблицах НЕ привязанные к hosts

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • a.l.r.e
    Member
    • May 2021
    • 45

    #1

    данные в исторических таблицах НЕ привязанные к hosts

    Сразу скажу, что всё что ниже, на zabbix 6.4 используемом для разработки и тестирования шаблонов.

    Предистория
    В какой-то момент обнаружилось, что размер базы zabbix в postgres гораздо больше, чем раньше был в 5.2
    Полез в базу смотреть что и как. Далее текст к размеру базы не имеет отношения, но непонятно.
    Типа:
    Code:
    -- Item count by Hosts
    SELECT h.hostid, h.host, c.cnt as items
    FROM public.hosts as h
    INNER JOIN (
        SELECT hostid, count(*) as cnt
        FROM public.items
        WHERE hostid in (SELECT distinct hostid FROM public.hosts WHERE status not in (3,5) and flags <> 2) AND flags not in (1,2)
        GROUP BY hostid
    ) as c
        ON c.hostid = h.hostid
    ORDER BY h.host​
    
    -- Item count by Template
    SELECT c.tplid, h.host as tplname, c.cnt as items
    FROM public.hosts as h
    INNER JOIN (
        SELECT hostid as tplid, count(*) as cnt
        FROM public.items
        WHERE hostid in (SELECT distinct hostid FROM public.hosts WHERE status=3)
        GROUP BY hostid
    ) as c
        ON c.tplid = h.hostid
    ORDER BY tplname
    
    -- Template by Hosts
    SELECT t1.host, t1.status, t2.templates, t2.templateids
    FROM (
        SELECT h.hostid, h.host, CASE h.status WHEN 1 THEN 'disables' ELSE 'enabled' END as status
        FROM public.hosts h
        WHERE h.status not in (3,5) and h.flags <> 2
    ) as t1
    INNER JOIN (
        SELECT public.hosts_templates.hostid, array_agg(public.hosts.host) as templates, array_agg(public.hosts_templates.templateid) as templateids
        FROM public.hosts_templates
        INNER JOIN public.hosts
            ON public.hosts.status=3 AND public.hosts_templates.templateid=public.hosts.hostid
        GROUP BY public.hosts_templates.hostid
    ) as t2
        ON t2.hostid=t1.hostid
    ORDER BY t1.host​​
    Поиск в исторических таблицах:
    Code:
    -- items НЕ привязанные к Hosts
    
    SELECT itemid, count(*)
    FROM public.history
    WHERE itemid not in (
        SELECT distinct itemid
        FROM public.items
        WHERE hostid in (
            SELECT distinct hostid FROM public.hosts
            WHERE status not in (1,3,5)    -- disable,template,proxy
            AND flags <> 2
        )
    )
    GROUP BY itemid
    
    SELECT itemid, count(*)
    FROM public.history_uint
    WHERE itemid not in (
        SELECT distinct itemid
        FROM public.items
        WHERE hostid in (
            SELECT distinct hostid FROM public.hosts
            WHERE status not in (1,3,5)    -- disable,template,proxy
            AND flags <> 2
        )
    )
    GROUP BY itemid​​
    И натолкнулся, что в таблице history появились не привязанные к hosts записи. В других исторических таблицах всё чисто.

    В history 1259 записей не привязанных к hosts. Причём только один itemid.
    "itemid" "count"
    59328 1259

    housekeeper не зачищает. Пробовал в housekeeping выставить все сроки на 1 день.

    SELECT to_timestamp(clock), * FROM public.history WHERE itemid=59328 ORDER BY clock DESC
    -- 1259 rows

    Все эти записи за некоторый интервал времени назад.

    SELECT now(), MIN(to_timestamp(clock)), MAX(to_timestamp(clock)) FROM public.history WHERE itemid=59328
    -- "2023-11-17 03:13:27.176696+00" 2023-11-02 14:26:48+00" "2023-11-06 17:26:48+00"

    ​Как появились и как их аккуратно зачистить непонятно.
    Вдруг в какой-то момент их будет гораздо больше.

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

    #2
    Originally posted by a.l.r.e

    Поиск в исторических таблицах:
    [...]
    И натолкнулся, что в таблице history появились не привязанные к hosts записи. В других исторических таблицах всё чисто.

    В history 1259 записей не привязанных к hosts. Причём только один itemid.
    "itemid" "count"
    59328 1259
    Я не уверен, что эти записи не привязаны к хосту. В вашей выборке вы же сами выбираете не все хосты, а фильтруете их - например, убирая из списка хостов задизейбленные. Возможно, ваш призрачный элемент данных как раз относится к такому хосту, который был отключён.

    Посмотрите сами, что это за элемент данных (тем более, что он у вас один - сами же пишете, что itemid единственный).
    Например, идёте в Monitoring -> Latest data, выбираете любой хост, затем жмёте на ссылку "График" для любого числового элемента данных.
    А затем в адресной строке браузера руками меняете ID текущего элемента данных на тот, который вас интересует (в данном случае 59328) - должна отобразиться информация о нём (по крайней мере, что это за элемент данных и к какому хосту относится).

    Comment

    • a.l.r.e
      Member
      • May 2021
      • 45

      #3
      Попробовал по ссылке:


      Получил:
      No permissions to referred object or it does not exist!

      Логично, ведь в items нет такого itemid.

      Убрал в запросе ограничения:
      Code:
      SELECT itemid, count(*) as rows_cnt
      FROM public.history
      WHERE itemid not in (
          SELECT distinct itemid
          FROM public.items
          WHERE hostid in (
              SELECT distinct hostid FROM public.hosts
          )
      )
      GROUP BY itemid
      /*
      "itemid"    "rows_cnt"
      59328        1259
      */
      ​

      Как-бы проблема на том же самом месте.

      Посмотрел на production:
      Code:
      SELECT count(itemid), SUM(rows_cnt)
      FROM (
          SELECT itemid, count(*) as rows_cnt
          FROM public.history
          WHERE itemid not in (
              SELECT distinct itemid
              FROM public.items
              WHERE hostid in (
                  SELECT distinct hostid FROM public.hosts
              )
          )
          GROUP BY itemid
      ) tmp
      /*
      "count"    "sum"
      628    9199941
      */
      Это уже хуже. 628 itemid и почти 10 млн. rows.​

      Comment

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

        #4
        Originally posted by a.l.r.e
        Попробовал по ссылке:


        Получил:
        No permissions to referred object or it does not exist!

        Логично, ведь в items нет такого itemid.

        Убрал в запросе ограничения:
        [...]​
        Как-бы проблема на том же самом месте.
        [...]
        Это уже хуже. 628 itemid и почти 10 млн. rows.​
        Согласен с тем, что это уже хуже. По-видимому, нарушена целостность базы по какой-то причине. Честно говоря, я сомневаюсь, что штатный процесс Housekeeper вычистит такие записи (мне кажется, что он удаляет только корректные, хотя я могу ошибаться). Можно попытаться отсортировать такие записи по полю clock и посмотреть, насколько древняя самая старая из них (только преобразовать этот clock из формата unix time) и как давно появилась самая новая.
        Наверное, я бы эти записи из таблиц истории просто аккуратно бы удалил вручную.

        Comment

        • Alex_UUU
          Senior Member
          • Dec 2018
          • 541

          #5
          Таблица хистори - конечная, не завязанная ни с чем. В ней можно делать все, что угодно.
          ПРоверено на Кликхаузе с 5.2 версией.
          Особенно интересно, когда менаешь тип элемента (с дабла на целый) и приходится перезаполнять столбец.

          Comment

          • a.l.r.e
            Member
            • May 2021
            • 45

            #6
            На тестовом проделал следующее:

            1 Взял шаблон, который стоит на 8 серверах и выполнил экспорт

            Export to XML

            2 Удалил этот шаблон с 8 серверов

            Unlink and clear

            3 Удалил этот шаблон из zabbix с очисткой. Выполнил импорт этого шаблона.

            Delete and clear
            Import

            4 Добавил этот шаблон на те же 8 серверов. Выполнил mass update для этих 8 серверов.

            add template to hosts
            Mass update

            Подождал​ пару часов для того, чтобы housekeeper отработал.

            Напомню, было.
            Code:
            SELECT itemid, count(*) as rows_cnt
            FROM public.history
            WHERE itemid not in (
            SELECT distinct itemid
            FROM public.items
            WHERE hostid in (
            SELECT distinct hostid FROM public.hosts
            )
            )
            GROUP BY itemid
            /*
            "itemid" "rows_cnt"
            59328 1259
            */​
            Стало:
            Code:
            SELECT count(itemid), SUM(rows_cnt)
            FROM (
                SELECT itemid, count(*) as rows_cnt
                FROM public.history
                WHERE itemid not in (
                    SELECT distinct itemid
                    FROM public.items
                    WHERE hostid in (
                        SELECT distinct hostid FROM public.hosts
                    )
                )
                GROUP BY itemid
            ) tmp
            /*
            "count"    "sum"
            619        952304
            */
            ​
            Похоже, вот так они и появляются.

            Comment

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

              #7
              Originally posted by a.l.r.e
              Напомню, было.
              [...]
              Стало:
              [...]

              Похоже, вот так они и появляются.
              Честно говря, не очень понятно, что с чем вы сравниваете: у вас в "было" и "стало" разные запросы к базе.

              Comment

              • a.l.r.e
                Member
                • May 2021
                • 45

                #8
                Если бы на тестовом я изначально выполнил
                Code:
                SELECT count(itemid), SUM(rows_cnt)
                FROM (
                    SELECT itemid, count(*) as rows_cnt
                    FROM public.history
                    WHERE itemid not in (
                        SELECT distinct itemid
                        FROM public.items
                        WHERE hostid in (
                            SELECT distinct hostid FROM public.hosts
                        )
                    )
                    GROUP BY itemid
                ) tmp​​
                то получил бы
                Code:
                /*
                "count" "sum"
                1 1259
                */​
                а сейчас после всех операций
                Code:
                /*
                "count" "sum"
                619 952304
                */​

                Comment

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

                  #9
                  Т.е. получается, что эти бесхозные исторические данные относятся к элементам данных, которые когда-то существовали и для которых была собрана некоторая история, но сами элементы данных (айтемы) затем были удалены? Странно; вроде бы при удалении элементов данных относящаяся к ним история должна зачищаться сразу же. Если нет - то таки действительно, либо история должна удаляться процессом housekeeper (но не обязательно сразу, у него своеобразная логика работы), либо это баг. Можно подождать какое-то время и повторить сбор статистики - если количество таких айтемов уменьшается, значит, их действительно подчищает housekeeper.

                  Comment

                  • a.l.r.e
                    Member
                    • May 2021
                    • 45

                    #10
                    Выставил в настройках housekeeping везде 1d и через какое-то время все новые itemid ушли.
                    Осталось как и было:
                    Code:
                    /*
                    "count" "sum"
                    1 1259
                    */​​​
                    Вспомнилось тут, чтобы не ждать когда там применятся новые настройки и отработает housekeeper, можно пнуть его

                    https://www.zabbix.com/documentation.../zabbix_server

                    # zabbix_server --runtime-control config_cache_reload
                    Runtime control command was forwarded successfully

                    # zabbix_server --runtime-control housekeeper_execute
                    Runtime control command was forwarded successfully


                    Надо бы разобраться с логикой работы housekeeper.
                    Может быть пойму почему застрял itemid в history у меня...

                    Real-time monitoring of IT components and services, such as networks, servers, VMs, applications and the cloud. - zabbix/zabbix


                    Для начала нашёл, как именно отбираются items для удаления

                    Real-time monitoring of IT components and services, such as networks, servers, VMs, applications and the cloud. - File not found · zabbix/zabbix

                    Code:
                    result = zbx_db_select(
                    "select i.itemid,i.value_type,i.history,i.trends,h.hostid"
                    " from items i,hosts h"
                    " where i.flags in (%d,%d)"
                    " and i.hostid=h.hostid"
                    " and h.status in (%d,%d)",
                    ZBX_FLAG_DISCOVERY_NORMAL, ZBX_FLAG_DISCOVERY_CREATED,
                    HOST_STATUS_MONITORED, HOST_STATUS_NOT_MONITORED);
                    Real-time monitoring of IT components and services, such as networks, servers, VMs, applications and the cloud. - zabbix/zabbix

                    #define ZBX_FLAG_DISCOVERY_NORMAL 0x00
                    #define ZBX_FLAG_DISCOVERY_CREATED 0x04

                    https://github.com/zabbix/zabbix/blo...st_constants.h
                    #define HOST_STATUS_MONITORED 0
                    #define HOST_STATUS_NOT_MONITORED 1
                    Code:
                    select i.itemid,i.value_type,i.history,i.trends,h.hostid
                    from items i,hosts h
                    where i.flags in (0,4)
                    and i.hostid=h.hostid
                    and h.status in (0,1)
                    Но похоже, не всё так просто и там есть ещё обработка autoreg hosts....​

                    Comment

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

                      #11
                      Originally posted by a.l.r.e
                      Надо бы разобраться с логикой работы housekeeper.
                      Вкратце логика его работы описана в документации (см тут описание параметра "HousekeepingFrequency").
                      Originally posted by a.l.r.e
                      Но похоже, не всё так просто и там есть ещё обработка autoreg hosts....​
                      А это добавили совсем недавно (ссылка).

                      Comment

                      Working...