Дерево страниц
Перейти к концу метаданных
Переход к началу метаданных

Установка ClickHouse

Алгоритм установки с репликацией. 

Для эффективной работы ClickHouse требуется два сервера, на которых не будет другого софта, кроме ClickHouse.

Системные требования

Для каждой реплики требуется:

Отдельный сервер (виртуальная машина)

Архитектура процессора: x86_64 и поддержка инструкций SSE 4.2

Количество ядер процессора: 8 ядер

ОС: Ubuntu 16.04/18.04

RAM: не менее 64 Гб

Жесткий диск: не менее 500 Гб


Установка ClickHouse с репликацией данных

Репликация данных в ClickHouse выполняется на уровне таблиц, а не на уровне сервера.

Zookeeper

ClickHouse хранит метаинформацию о репликах в Apache ZooKeeper. Используйте ZooKeeper 3.4.9 или новее.

Можно указать любой имеющийся у вас ZooKeeper-кластер - система будет использовать в нём одну директорию для своих данных (директория указывается при создании реплицируемой таблицы).

Не запускайте ZooKeeper на тех же серверах, что и ClickHouse. Потому что ZooKeeper очень чувствителен к задержкам, а ClickHouse может использовать все доступные системные ресурсы.

Для стабильности при эксплуатации Zookeeper'а рекомендуется использовать Zookeeper-кластер с нечетным количеством серверов (принцип большинства). Так же лучше настраивать для него кастомную конфигурацию. Подробнее о всех параметрах: http://zookeeper.apache.org/doc/current/zookeeperAdmin.html

Пример настройки  Zookeeper в документации ClickHouse: https://clickhouse.tech/docs/ru/operations/tips/#zookeeper

Установка Zookeeper

На хосте должна быть предустановленная Java JDK 1.7 или выше.

  1. Скачать последнюю релизную версию (на момент написания документации это 3.6.1): http://zookeeper.apache.org/releases.html
    Версия в стабильных дистрибутивах Linux может быть устаревшей.
  2. Распаковать архив в соответствующую директорию. Например:

    cd /opt
    sudo tar -zxf apache-zookeeper-3.6.1-bin.tar.gz
  3. Создать каталоги для хранения состояния сервера Zookeeper'а и для хранения логов

    sudo mkdir /var/lib/zookeeper
    sudo mkdir /var/log/zookeeper
  4. Настроить конфигурацию. Создать или изменить файл /opt/apache-zookeeper-3.6.1-bin/conf/zoo.cfg . Пример конфигурации:

    clientPort=2181
     
    # The number of milliseconds of each tick
    tickTime=2000
     
    # the directory where the snapshot is stored.
    dataDir=/var/lib/zookeeper
    # Place the dataLogDir to a separate physical disc for better performance
    dataLogDir=/var/log/zookeeper
     
    autopurge.snapRetainCount=10
    autopurge.purgeInterval=12
    Настройка autopurge отвечает за  удаление старых снепшотов и логов.
  5. Если используется Zookeeper-кластер, то необходимо дополнить настройки
    1. Добавить в /opt/apache-zookeeper-3.6.1-bin/conf/zoo.cfg

      # The number of ticks that the initial
      # synchronization phase can take
      initLimit=300
       
      # The number of ticks that can pass between
      # sending a request and getting an acknowledgement
      syncLimit=10
       
      server.1=zoo1:2888:3888
      server.2=zoo2:2888:3888
      server.3=zoo3:2888:3888

      где zoo[i] - адрес Zookeeper-ноды. Порты 2181, 2888, 3888 должны быть открыты на всех машинах. Порт 2888 используется для общения между серверами, порт 3888 используется для выбора лидера. Рекомендуется использовать одинаковые порты на всех нодах.

    2. Создать файл /var/lib/zookeeper/myid. В файле должно быть единственное число от 1 до 255, которое означает номер сервера для конфигурации


  6. Запустить Zookeeper

    cd /opt/apache-zookeeper-3.6.1-bin/bin/
    sudo ./zkServer.sh start

ClickHouse

Установка на каждой реплике происходит одинаково.

  1. Установка пакетов

    1. Добавить репозиторий Яндекса в список репозиториев:

      sudo -s
      apt-get update
      echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" > /etc/apt/sources.list.d/clickhouse.list
    2. Установите пакеты:

      sudo apt-get install dirmngr    # optional
      sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4    # optional
      sudo apt-get update
      sudo apt-get install clickhouse-client clickhouse-server

      При установке пакета clickhouse-server запрашивается пароль для пользователя default, при пропуске этого пункта будет установлен пустой пароль.

  2. Настройка конфигурации

    1.  Настройка tcp-порта, по которому будет идти подключение клиента командной строки, , так как порт по умолчанию (9000/tcp) занят Eltex Portal
      1. Замена порта сервера. Создать в /etc/clickhouse-server/config.d/ файл listen.xml

        listen.xml
        <?xml version="1.0"?>
         
        <yandex>
            <tcp_port>9003</tcp_port>
            <!-- <listen_host>::</listen_host> -->
        </yandex>
        Для доступа до БД с другого хоста необходимо так же изменить значение listen_host
      2. Замена порта по умолчанию клиента командной строки. Создать в /etc/clickhouse-client/conf.d/ файл port.xml

        port.xml
        <config>
            <port>9003</port>
        </config>
    2. Добавление пользователя для сервисов Eltex. Создать в /etc/clickhouse-server/users.d/ файл eltex_user.xml
      eltex_user.xml
      <?xml version="1.0"?>
      <yandex>
          <!-- Profiles of settings. -->
          <profiles>
              <eltex>
                  <!-- Maximum memory usage for processing single query, in bytes. (default 10Gb) -->
                  <max_memory_usage>10000000000</max_memory_usage>
                  <!-- Maximum execution time for query, in seconds. -->
                  <max_execution_time>60</max_execution_time>
                  <timeout_overflow_mode>throw</timeout_overflow_mode>
              </eltex>
          </profiles>
       
          <users>
              <javauser>
                  <password_sha256_hex>ce1710d7149c4daf1b38e20f4884d25660bf7da9e3ac61f1247a1a04bf50d779</password_sha256_hex>
                  <profile>eltex</profile>
       
                  <networks incl="networks" replace="replace">
                      <ip>::/0</ip>
                  </networks>
       
                  <quota>default</quota>
              </javauser>
          </users>
      </yandex>
      В профиле задаются ограничения для запросов, исходящих от пользователя с данным профилем.
    3. Для создания собственного пользователя можно в директории /etc/clickhouse-server/users.d/ создать файл user_name.xml. Добавление пользователя отдельным файлом позволит создать его на другой ноде просто скопировав файл.
      Настройка пользователя имеет следующий вид:

      user_name.xml
      <?xml version="1.0"?>
      <yandex>
          <users>
          <!-- If user name was not specified, 'default' user is used. -->
          <user_name>
              <password></password>
              <!-- Or -->
              <password_sha256_hex></password_sha256_hex>
       
              <networks incl="networks" replace="replace">
              </networks>
       
              <profile>profile_name</profile>
       
              <quota>default</quota>
       
              <databases>
                  <database_name>
                      <table_name>
                          <filter>expression</filter>
                      <table_name>
                  </database_name>
              </databases>
          </user_name>
          <!-- Other users settings -->
      </users>
       
      </yandex>

      Пароль можно указать в текстовом виде или в виде SHA256 (шестнадцатеричный формат).
      Чтобы назначить пароль в текстовом виде (не рекомендуется), поместите его в элемент password. Можно оставить пустым. Например:

      <password>qwerty</password>

      Чтобы назначить пароль в виде SHA256, поместите хэш в элемент password_sha256_hex. Например: 

      <password_sha256_hex>d7fa342d4ec19b431ece9eea4a67fbb88ff0f72b2f332b7384de7981129e3190</password_sha256_hex>

      Пример создания пароля в командной строке:

      PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'

      Первая строка результата — пароль. Вторая строка — соответствующий ему хэш SHA256.

      В блоке networks указывается список сетей, из которых пользователь может подключиться к серверу ClickHouse.
      Каждый элемент списка имеет одну из следующих форм:

      1. <ip> — IP-адрес или маска подсети. 

        Примеры: `213.180.204.3`, `10.0.0.1/8`, `10.0.0.1/255.255.255.0`, `2a02:6b8::3`, `2a02:6b8::3/64`, `2a02:6b8::3/ffff:ffff:ffff:ffff::`.
      2. <host> — Имя хоста. 

        Пример: `example01.host.ru`.
        Для проверки доступа выполняется DNS-запрос, и все возвращенные IP-адреса сравниваются с адресом клиента.
      3. <host_regexp> — Регулярное выражение для имен хостов.

        Подробнее про настройку пользователя: https://clickhouse.tech/docs/ru/operations/settings/settings-users/

    4. Добавление настроек для репликации. Создать файл /etc/metrika.xml 

      metrika.xml
      <?xml version="1.0"?>
      <yandex>
          <zookeeper-servers>
              <node index="1">
                  <host>example1</host>
                  <port>2181</port>
              </node>
              <node index="2">
                  <host>example2</host>
                  <port>2181</port>
              </node>
              <node index="3">
                  <host>example3</host>
                  <port>2181</port>
              </node>
          </zookeeper-servers>
          <macros>
              <shard>1</shard>
              <replica>replica_name</replica>
          </macros>
      </yandex>

      В zookeeper-servers  указывается Zookeeper-кластер или один сервер. В macros указывается идентификатор реплики, который будет указан в конфигурации zookeeper'а. Shard - номер шарда при использовании шардирования (разделение данных по серверам, не используется), replica - уникальное имя реплики. 

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

    5. Добавить хосты ZooKeeper'а и нод ClickHouse'а в /etc/hosts.

  3. Запуск сервиса

    sudo service clickhouse-server start
  4. Создание БД radius и таблицы radacct

    1. Подключиться к серверу через клиент командной строки. Для входа под дефолтным пользователем можно воспользоваться следующей командой:

      clickhouse-client

      Если установлен пароль, то нужно добавить аргумент командной строки:

      clickhouse-client --password password

      Если используется не пользователь по умолчанию, то подключиться к клиенту командной строки можно так:

      clickhouse-client --user username --password password

      Можно подключаться с удаленного хоста, если там установлен клиент командной строки, с помощью аргумента командной строки -h или --host

    2. Cоздать базу данных:

      CREATE DATABASE IF NOT EXISTS radius
    3. Создать таблицу для записи аккаунтинга:

      CREATE TABLE IF NOT EXISTS radius.radacct
          (
                  acctsessionid        String,
                  acctuniqueid         String,
                  username             String,
                  groupname            String DEFAULT '',
                  domain               String,
                  realm                String DEFAULT '',
                  nasipaddress         String DEFAULT '',
                  nasportid            String DEFAULT '',
                  nasporttype          String DEFAULT '',
                  acctstarttime        DateTime,
                  acctupdatetime       DateTime,
                  acctstoptime         DateTime,
                  acctinterval         UInt32,
                  acctsessiontime      UInt32,
                  acctauthentic        String DEFAULT '',
                  connectinfo_start    String DEFAULT '',
                  connectinfo_stop     String DEFAULT '',
                  acctinputoctets      UInt64,
                  acctoutputoctets     UInt64,
                  calledstationid      String,
                  callingstationid     FixedString(17),
                  acctterminatecause   String DEFAULT '',
                  servicetype          String DEFAULT '',
                  framedprotocol       String DEFAULT '',
                  framedipaddress      String DEFAULT '',
                  acctstartdelay       UInt32 DEFAULT CAST(0, 'UInt32'),
                  acctstopdelay        UInt32 DEFAULT CAST(0, 'UInt32'),
                  xascendsessionsvrkey String DEFAULT '',
                  inputpacketsdrop     UInt64,
                  outputpacketsdrop    UInt64,
                  inputbytesdrop       UInt64,
                  outputbytesdrop      UInt64,
                  outputpacketlost     UInt64,
                  acctl2interface      String DEFAULT '',
                  acctapdomain         String,
                  acctapid             String DEFAULT '',
                  acctssid             String,
                  security             UInt8 DEFAULT 1,
                  ssidtype             UInt8 DEFAULT 0
          ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/radacct', '{replica}')
              PARTITION BY (toYYYYMM(acctstarttime), ssidtype)
              ORDER BY (acctstarttime)
              SETTINGS index_granularity = 8192;

      Если не получается создать таблицу с помощью команды выше, то можно использовать команду на создание без табуляций и переносов:

      CREATE TABLE IF NOT EXISTS radius.radacct (acctsessionid String, acctuniqueid String, username String, groupname String DEFAULT '', domain String, realm String DEFAULT '', nasipaddress String DEFAULT '', nasportid String DEFAULT '', nasporttype String DEFAULT '', acctstarttime DateTime, acctupdatetime DateTime, acctstoptime DateTime, acctinterval UInt32, acctsessiontime UInt32, acctauthentic String DEFAULT '', connectinfo_start String DEFAULT '', connectinfo_stop String DEFAULT '', acctinputoctets UInt64, acctoutputoctets UInt64, calledstationid String, callingstationid FixedString(17), acctterminatecause String DEFAULT '', servicetype String DEFAULT '', framedprotocol String DEFAULT '', framedipaddress String DEFAULT '', acctstartdelay UInt32 DEFAULT CAST(0, 'UInt32'), acctstopdelay UInt32 DEFAULT CAST(0, 'UInt32'), xascendsessionsvrkey String DEFAULT '', inputpacketsdrop UInt64, outputpacketsdrop UInt64, inputbytesdrop UInt64, outputbytesdrop UInt64, outputpacketlost UInt64, acctl2interface String DEFAULT '', acctapdomain String, acctapid String DEFAULT '', acctssid String, security UInt8 DEFAULT 1, ssidtype UInt8 DEFAULT 0) ENGINE =  ReplicatedMergeTree('/clickhouse/tables/{shard}/radacct', '{replica}') PARTITION BY (toYYYYMM(acctstarttime), ssidtype) ORDER BY (acctstarttime) SETTINGS index_granularity = 8192;

Экспорт данных из MySQL

Для экспорта данных из radacct предлагается использовать скрипт radacct_exporter.py. С помощью него можно выгрузить данные порциями (по дате) и исключить битые строки.

Скрипт выгружает данные на хост в папку, из которой он был запущен. 

Запуск скрипта следует проводить на хосте, имеющем достаточно свободного места на жестком диске. 

Выгрузка представляет собой архивы с именем, соответствующим дате,  за которую были выгружены данные. 

Таким образом можно выгружать данные частями (например, по месяцам или неделям) в зависимости от того, сколько места на жестком диске есть в наличии.

Установка зависимостей

Для работы скрипта radacct_exporter.py требуется установленный python3. Проверить наличие можно выполнив команду в терминале:

python3 --version

Если пакет отсутствует, то необходимо установить его:

sudo apt-get install python3

Если версия пакета >= 3.4, то устанавливать pip не требуется. Иначе необходимо установить его:

sudo apt install python3-pip

Когда все пакеты будут установлены, надо установить зависимости для скрипта radacct_exporter.py из requirements.txt. Это можно выполнить так:

pip3 install -r requirements.txt

Описание и запуск скрипта

Скрипт radacct_exporter.py имеет следующие аргументы строки:

  • start_date - Дата начала выгрузки. Обязательный параметр. Формат ISO YYYY-mm-dd
  • stop_date - Дата окончания выгрузки, не включая этот день. Формат ISO YYYY-mm-dd. Необязательный параметр. Если он не будет указан, то датой окончания будет считаться start_date + 1 день
  • db_login - Логин для подключения к MySQL. По умолчанию - javauser
  • db_password - Пароль для подключения к MySQL. По умолчанию - javapassword
  • host - Адрес сервера, на котором расположен MySQL. По умолчанию - localhost
  • ssh_login - Логин для подключения к удаленному серверу по SSH. Если он не будет указан, то будет запрошен при запуске скрипта.
  • ssh_password - Пароль для подключения к удаленному серверу по SSH. Если пароль не будет указан, то он будет запрошен при запуске скрипта.
  • ssh_port - Порт для подключения по SSH. По умолчанию - 22 порт.
  • time_shift - Шаг выгрузки. Если он не будет указан, то шаг будет равен 1 дню.

Запуск скрипта:

python3 radacct_exporter.py --start_date 2020-01-01 --stop_date 2020-02-01 --host mysql_slave_host

Так будут выгружены данные с 01.01.2020 по 31.01.2020 включительно.


Для исключения дублирования данных рекомендуется выгрузить граничные данные перед включением записи аккаунтинга в ClickHouse в настройках pcrf. Граничными данными считаются данные за дни, для которых существуют незакрытые сессии (другими словами, данные за текущий день).


Настройка PCRF

После установки пакета eltex-pcrf версии 1.17 необходимо отредактировать конфигурационный файл /etc/eltex-pcrf/eltex-pcrf.json. 

Нужно добавить/отредактировать секцию, настраивающую запись аккаунтинга в ClickHouse.

...,
 
  "clickhouse": {
    "url": "jdbc:clickhouse://localhost:8123/radius",
    "user_name": "javauser",
    "user_password": "javapassword"
    "actualization_period_ms": 5000
  },
 
  "accounting.options": {
    "use_clickhouse": true,
    "use_mysql": true,
    "batch_interval_ms": 300000,
    "max_queue_load": 1000
  }
 
...

Где :

localhost следует заменить на адрес одной из нод ClickHouse.

actualization_period_ms - время актуализации нод


Вторая нода добавляется в формате:

"url": "jdbc:clickhouse://localhost:8123/radius",


Для применения настроек следует перезагрузить сервис:

service eltex-pcrf restart

Импорт данных в ClickHouse

Для корректного импорта данных в ClickHouse требуется создать временную таблицу с столбцами, порядок которых совпадает с порядком столбцов в MySQL radius.radacct.

  1. Узнать какой порядок столбцов в radius.radacct в MySQL: 

    DESCRIBE radius.radacct;
  2. Создать временную таблицу в ClickHouse на одной из нод, учитывая порядок столбцов в MySQL radacct (он должен совпадать):

    CREATE TABLE radius.radacct_tmp
    (
        radacctid     UInt64,
        acctsessionid        Nullable(String),
        acctuniqueid         Nullable(String),
        username             Nullable(String),
        groupname            Nullable(String),
        domain               Nullable(String),
        realm                Nullable(String),
        nasipaddress         FixedString(15),
        nasportid            Nullable(String),
        nasporttype          Nullable(String),
        acctstarttime        DateTime,
        acctupdatetime       Nullable(DateTime),
        acctstoptime         Nullable(DateTime),
        acctinterval         Nullable(Int32),
        acctsessiontime      Nullable(Int32),
        acctauthentic        Nullable(String),
        connectinfo_start    Nullable(String),
        connectinfo_stop     Nullable(String),
        acctinputoctets      Nullable(Int64),
        acctoutputoctets     Nullable(Int64),
        calledstationid      String,
        callingstationid     FixedString(17),
        acctterminatecause   String,
        servicetype          Nullable(String),
        framedprotocol       Nullable(String),
        framedipaddress      FixedString(15),
        acctstartdelay       Nullable(Int32),
        acctstopdelay        Nullable(Int32),
        xascendsessionsvrkey Nullable(String),
        inputpacketsdrop     Nullable(Int64),
        outputpacketsdrop    Nullable(Int64),
        inputbytesdrop       Nullable(Int64),
        outputbytesdrop      Nullable(Int64),
        outputpacketlost     Nullable(Int64),
        acctl2interface      Nullable(String),
        acctapdomain         Nullable(String),
        acctapid             Nullable(String),
        acctssid             Nullable(String),
        security             UInt8 DEFAULT 1,
        ssidtype             UInt8 DEFAULT 0
    ) ENGINE = MergeTree
        PARTITION BY toYYYYMM(acctstarttime)
        ORDER BY (acctstarttime)
        SETTINGS index_granularity = 8192

    Версия без переносов строк и табуляций:

    CREATE TABLE radius.radacct_tmp (radacctid UInt64, acctsessionid Nullable(String), acctuniqueid Nullable(String), username Nullable(String), groupname Nullable(String), domain Nullable(String), realm Nullable(String), nasipaddress FixedString(15), nasportid Nullable(String), nasporttype Nullable(String), acctstarttime DateTime, acctupdatetime Nullable(DateTime), acctstoptime Nullable(DateTime), acctinterval Nullable(Int32), acctsessiontime Nullable(Int32), acctauthentic Nullable(String), connectinfo_start Nullable(String), connectinfo_stop Nullable(String), acctinputoctets Nullable(Int64), acctoutputoctets Nullable(Int64), calledstationid String, callingstationid FixedString(17), acctterminatecause String, servicetype Nullable(String), framedprotocol Nullable(String), framedipaddress FixedString(15), acctstartdelay Nullable(Int32), acctstopdelay Nullable(Int32), xascendsessionsvrkey Nullable(String), inputpacketsdrop Nullable(Int64), outputpacketsdrop Nullable(Int64), inputbytesdrop Nullable(Int64), outputbytesdrop Nullable(Int64), outputpacketlost Nullable(Int64), acctl2interface Nullable(String), acctapdomain Nullable(String), acctapid Nullable(String), acctssid Nullable(String), security UInt8 DEFAULT 1, ssidtype UInt8 DEFAULT 0) ENGINE = MergeTree PARTITION BY toYYYYMM(acctstarttime) ORDER BY (acctstarttime) SETTINGS index_granularity = 8192
  3.  Загрузить данные во временную таблицу, запустив следующую команду в папке с архивами: 

    gzip -d -c `ls -cl . | awk '{print $9}'` | clickhouse-client -ujavauser --password=javapassword --input_format_allow_errors_num 10000 --input_format_allow_errors_ratio 0.1 --query="INSERT INTO radius.radacct_tmp FORMAT CSV";

    При необходимости указать хост, на котором расположен ClickHouse, после clickhouse-client --host 
    Если выгрузка и загрузка данных делается порционно, то необходимо удалять старые архивы, чтобы не было дублирования данных в ClickHouse

  4. Переместить данные в radius.radacct с помощью команды:

    INSERT INTO radius.radacct SELECT
     
    assumeNotNull(acctsessionid) as acctsessionid,
    assumeNotNull(acctuniqueid) as acctuniqueid,
    assumeNotNull(username) as username,
    assumeNotNull(groupname) as groupname,
    assumeNotNull(domain) as domain,
    assumeNotNull(realm) as realm,
    assumeNotNull(nasipaddress) as nasipaddress,
    assumeNotNull(nasportid) as nasportid,
    assumeNotNull(nasporttype) as nasporttype,
    assumeNotNull(acctstarttime) as acctstarttime,
    acctupdatetime,
    acctstoptime,
    toUInt32(assumeNotNull(acctinterval)) as acctinterval,
    toUInt32(assumeNotNull(acctsessiontime)) as acctsessiontime,
    assumeNotNull(acctauthentic) as acctauthentic,
    assumeNotNull(connectinfo_start) as connectinfo_start,
    assumeNotNull(connectinfo_stop) as connectinfo_stop,
    toUInt64(assumeNotNull(if(acctinputoctets < 0, 0, acctinputoctets))) as acctinputoctets,
    toUInt64(assumeNotNull(if(acctoutputoctets < 0, 0, acctoutputoctets))) as acctoutputoctets,
    calledstationid,
    callingstationid,
    acctterminatecause,
    assumeNotNull(servicetype) as servicetype,
    assumeNotNull(framedprotocol) as framedprotocol,
    framedipaddress,
    toUInt32(assumeNotNull(acctstartdelay)) as acctstartdelay,
    toUInt32(assumeNotNull(acctstopdelay)) as acctstopdelay,
    assumeNotNull(xascendsessionsvrkey) as xascendsessionsvrkey,
    toUInt64(assumeNotNull(if(inputpacketsdrop < 0, 0, inputpacketsdrop))) as inputpacketsdrop,
    toUInt64(assumeNotNull(if(outputpacketsdrop < 0, 0, outputpacketsdrop))) as outputpacketsdrop,
    toUInt64(assumeNotNull(if(inputbytesdrop < 0, 0, inputbytesdrop))) as inputbytesdrop,
    toUInt64(assumeNotNull(if(outputbytesdrop < 0, 0, outputbytesdrop))) as outputbytesdrop,
    toUInt64(assumeNotNull(if(outputpacketlost < 0, 0, outputpacketlost))) as outputpacketlost,
    assumeNotNull(acctl2interface) as acctl2interface,
    assumeNotNull(acctapdomain) as acctapdomain,
    assumeNotNull(acctapid) as acctapid,
    assumeNotNull(acctssid) as acctssid,
    security,
    ssidtype
     
    FROM radius.radacct_tmp;

    или без переносов и табуляций:

    INSERT INTO radius.radacct SELECT assumeNotNull(acctsessionid) as acctsessionid, assumeNotNull(acctuniqueid) as acctuniqueid, assumeNotNull(username) as username, assumeNotNull(groupname) as groupname, assumeNotNull(domain) as domain, assumeNotNull(realm) as realm, assumeNotNull(nasipaddress) as nasipaddress, assumeNotNull(nasportid) as nasportid, assumeNotNull(nasporttype) as nasporttype, assumeNotNull(acctstarttime) as acctstarttime, acctupdatetime, acctstoptime, toUInt32(assumeNotNull(acctinterval)) as acctinterval, toUInt32(assumeNotNull(acctsessiontime)) as acctsessiontime, assumeNotNull(acctauthentic) as acctauthentic, assumeNotNull(connectinfo_start) as connectinfo_start, assumeNotNull(connectinfo_stop) as connectinfo_stop, toUInt64(assumeNotNull(if(acctinputoctets < 0, 0, acctinputoctets))) as acctinputoctets, toUInt64(assumeNotNull(if(acctoutputoctets < 0, 0, acctoutputoctets))) as acctoutputoctets, calledstationid, callingstationid, acctterminatecause, assumeNotNull(servicetype) as servicetype, assumeNotNull(framedprotocol) as framedprotocol, framedipaddress, toUInt32(assumeNotNull(acctstartdelay)) as acctstartdelay, toUInt32(assumeNotNull(acctstopdelay)) as acctstopdelay, assumeNotNull(xascendsessionsvrkey) as xascendsessionsvrkey, toUInt64(assumeNotNull(if(inputpacketsdrop < 0, 0, inputpacketsdrop))) as inputpacketsdrop, toUInt64(assumeNotNull(if(outputpacketsdrop < 0, 0, outputpacketsdrop))) as outputpacketsdrop, toUInt64(assumeNotNull(if(inputbytesdrop < 0, 0, inputbytesdrop))) as inputbytesdrop, toUInt64(assumeNotNull(if(outputbytesdrop < 0, 0, outputbytesdrop))) as outputbytesdrop, toUInt64(assumeNotNull(if(outputpacketlost < 0, 0, outputpacketlost))) as outputpacketlost, assumeNotNull(acctl2interface) as acctl2interface, assumeNotNull(acctapdomain) as acctapdomain, assumeNotNull(acctapid) as acctapid, assumeNotNull(acctssid) as acctssid, security, ssidtype FROM radius.radacct_tmp;

    Перемещение данных в radius.radacct можно выполнять после загрузки всех данных во временную таблицу, либо после загрузки каждой порции данных.

    Если перемещать данные после каждой порции, то нужно сохранять уникальность данных.
    Это можно сделать двумя способами:

    1.  Очищать radacct_tmp после insert'а в radius.radacct

      TRUNCATE TABLE radius.radacct_tmp
    2. Добавлять условие по времени вида:

      ... FROM radius.radacct_tmp WHERE acctstarttime between '2020-01-01 00:00:00' and '2020-02-01 00:00:00'
    3. После миграции всех данных можно удалить временную таблицу:

      DROP TABLE radius.radacct_tmp

Настройка получения статистики

Для того чтобы статистика бралась из ClickHouse необходимо установить пакеты eltex-bonnie и eltex-wifi-cab версии 1.17.  Пакет eltex-bonnie можно устанавливать на тот же хост, что и остальные сервисы SoftWLC. Устанавливать пакет eltex-bonnie-db не требуется.

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

Настройка eltex-bonnie

Для eltex-bonnie требуется отредактировать /etc/eltex-bonnie/config.hocon:

serviceConfiguration = {
    ApplicationConfiguration = {
 
        GrpcPort = 9070
 
        // if this environment equals to 'production', all logs will transmit to graylog
        // else if this environment equals to 'k8s', all logs will be written to stdout
        Environment = "production"
        GelfEnabled = false // inclusion of sending logs to graylog
 
        mysqlConfiguration = {
            ConnectionString = "tcp(127.0.0.1:3306)"
            DBName = "radius"
            Login = "javauser"
            Password = "javapassword"
        }
 
        clickhouseConfiguration = {
            ConnectionString = "tcp://127.0.0.1:9003"
            DBName = "radius"
            Login = "javauser"
            Password = "javapassword"
        }
    }
}
...

Необходимо внести изменения в секцию конфигурации сервиса: указать адрес slave-ноды mysql, ноды ClickHouse.

Для использования второй ноды в качестве резерва надо в адресную строку для подключения к ClickHouse добавить:

ConnectionString = "tcp://127.0.0.1:9003?alt_hosts=host2:9003&connection_open_strategy=in_order"

Где host2 - адрес второй ноды.

После изменения конфигурации необходимо перезапустить сервис:

service eltex-bonnie restart

Настройка Личного Кабинета

В /etc/eltex-wifi-cab/system.xml надо добавить/отредактировать секцию:

...
 
<!--Bonnie or NBI-->
<entry key="data.service.type">Bonnie</entry>
<entry key="bonnie.service.host">localhost</entry>
<entry key="bonnie.service.port">9070</entry>
 
...

Указание data.service.type Bonnie или NBI позволит получать статистику из ClickHouse radius.radacct и MySQL radius.radacct соответственно.

Так же надо указать адрес хоста, на котором установлен сервис eltex-bonnie.

После изменения конфигурации необходимо перезапустить  tomcat.


Проверка работоспособности

Проверка репликации

После импорта данных в ClickHouse radius.radacct число записей на каждой ноде должно совпадать или незначительно различаться (репликация происходит немгновенно)

Для проверки можно выполнить запрос на каждой ноде и сравнить значения:

select count() from radius.radacct

Проверка записи нового аккаунтинга

Количество записей в radius.radacct должно увеличиваться при завершении сессии. Запись происходит в течение интервала batch' а (по умолчанию 5 минут) или при заполнении очереди на запись (по умолчанию 1000 записей). 

Проверка получения статистики

Если сервисы были настроены корректно, то данные статистики должны отображаться в ЛК также, как и раньше.

  • Нет меток