Оглавление | ||
---|---|---|
|
Общие сведения
Резервирование контроллеров SoftWLC выполняется по схеме master-slave. Синхронизируются критичные для работы системы файлы необходимо для синхронизации критичных для работы системы файлов (настройки, файлы прошивок, выгрузки данных), баз данных MySQL (в режиме master-master), баз данных MongoDB, а также работа DHCP серверов. Такая схема обеспечивает доступность услуги услуг и и актуальные данные на обоих контроллерах при выходе одного из строя, недоступности сети, проблем с электропитанием.
Настройка резервирования контроллеров SoftWLC состоит из следующих этапов:
- установка и настройка keepalived (выполняется по схеме master-slave)
- настройка rsync
- настройка репликации MySQL (осуществляется путём встречной репликации по принципу master-master)
- настройка replicaSet MongoDB (репликация осуществляется объединением 3 узлов в Replica Set)
- настройка работы Eltex-PCRF в режиме кластера
- изменение конфигурации модулей системы для работы с виртуальным IP
В примерах конфигурации в данном разделе для простоты ip-адреса будут указываться как <ip_server1>, <ip_server2> и <virtual_ip>, где:
- <ip_server1> - реальный ip-адрес первого серверсервера
- <ip_server2> - реальный ip-адрес второго сервера
- <virtual_ip> - виртуальный ip-адрес
Настройка резервирования контроллеров SoftWLC состоит из следующих этапов:
- установка и настройка keepalived
- настройка rsync
- настройка репликации MySQL
- настройка replicaSet MongoDB
- настройка работы Eltex-PCRF в режиме кластера
- изменение конфигурации модулей системы для работы с виртуальным IP
Для корректной работы требуется обеспечить L2 связность между двумя удаленными серверами.
Установка и настройка keepalived
Описание пакета
Пакет keepalived - это open source программное обеспечение, предназначенное для обеспечения функций высокой надежности (high availabilitty) и балансировки нагрузки (load-balancing). За первую функцию отвечает реализация протокола VRRP, а вторая основывается на модуле ядра Linux Vitrual Server (IPVS). Keepalived не разрабатывается сотрудниками Eltex и не включает доработок, за исключением конфигурации. Keepalived используется для организации резервирования контроллеров SoftWLC, при этом используется только функционал VRRP.
Установка keepalived
Для установки пакета, необходимо загрузить его на сервер и выполнить следующую команду (установка должна производиться от имени суперпользователя root на обоих серверах):
Блок кода | ||
---|---|---|
| ||
admin@ubuntu:/# sudo apt update root@masteradmin@ubuntu:/# sudo apt install keepalived |
После установки, необходимо добавить демона Keepalived в автозагрузку и запустить его:
Блок кода | ||
---|---|---|
| ||
admin@ubuntu:/# sudo systemctl enable keepalived root@masteradmin@ubuntu:/# sudo systemctl start keepalived |
Конфигурация keepalived
Конфигурация keepalived состоит из следующих файлов:
...
Основной файл конфигурации
На обоих серверах в файле /etc/keepalived/keepalived.conf
...
главный файл конфигурации сервиса
...
Основной файл конфигурации
Листинг основного файла конфигурации по умолчанию
...
меняем следующие параметры:
<interface> - наименование сетевого интерфейса (свой для каждого сервера) аналогично записи (eth1);
<virtual_ip> - виртуальный ip-адрес (с указанием префикса) аналогично записи (100.111.195.202 /24);
<ip_адрес другого сервера> - ip-адрес другого сервера аналогично записи (100.111.195.200);
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
! Configuration File for keepalived global_defs { script_user root enable_script_security } vrrp_script check_network { script "/etc/keepalived/check_ping.sh" interval 5 weight 50 fall 3 rise 3 init_fail user root } vrrp_instance VI_SWLC { state BACKUP interface <interface> virtual_router_id 1 track_script { check_network } track_interface { <interface> weight 50 } priority 150 advert_int 1 nopreempt # Uncomment and comment "nopreempt" if preemption needed #preempt_delay 180 authentication { auth_type PASS auth_pass eltex } virtual_ipaddress { <virtual_ip> dev eth0<interface> label <interface>:1 } notify_master "/etc/keepalived/keep_notify.sh master" notify_backup "/etc/keepalived/keep_notify.sh backup" notify_fault "/etc/keepalived/keep_notify.sh fault" unicast_peer { <ip_server1>адрес_другого_сервера> } } |
где
- <interface> - наименование сетевого интерфейса;
- <virtual_ip> - виртуальный ip-адрес (с указанием префикса);
- <ip_server1> - ip-адрес другого сервера;
Тест-скрипт
Скрипт пингует шлюз по умолчанию и возвращает код результата. Таким образом, при успешном выполнении скрипта, гарантируется, что SoftWLC достижим для внешних клиентов.
В текущей реализации на обоих серверах, в качестве тестового скрипта, предлагается использовать следующий:
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#!/bin/bash # host to ping # there - default gw HOST=<default_gw_ip> # -q quiet # -c nb of pings to perform ping -q -c5 $HOST > /dev/null # $? var keeping result of execution # previous command if [ $? -eq 0 ] then echo `date +"%T %F"` "OK gw reachable" EXIT_CODE=0 else echo `date +"%T %F"` "ERROR gw unreacheble!" EXIT_CODE=1 fi exit $EXIT_CODE |
где <default_gw_ip> - шлюз по умолчанию для этого сервера .Скрипт пингует шлюз по умолчанию и возвращает код результата. Таким образом, при успешном выполнении скрипта гарантируется, что SoftWLC достижим для внешних клиентов.аналогично записи (100.10.194.1);.
Конфигурация смены роли
При смене состояния сервера, выполняется скрипт keep_notify.sh, где <mysql_user> и <mysql_password> - логин и пароль от БД MySQL (по умолчанию root/root).
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#!/bin/bash MYSQL_USER="<mysql_user>" MYSQL_PASSWORD="<mysql_password>" mongo_set_role() { local role="$1" if [[ "$(which mongo)" ]]; then mongo --quiet --eval "var role=\"$role\"" admin /etc/keepalived/mongo_switch.js # Uncomment if using mongodb auth #mongo -u<username> -p<password> --quiet --eval "var role=\"$role\"" admin /etc/keepalived/mongo_switch.js fi } if ! lockfile-create --use-pid -r 5 /tmp/keep.mode.lock; then echo "Unable to lock" echo "Unable to lock" > /tmp/keep.mode.lock.fail exit 0 fi case "$1" in master) # ems_reload_all echo "MASTER" > /tmp/keep.mode mongo_set_role master service eltex-ems restart service tomcat8 restart service eltex-ngw restart # рестарт слейва MySQL чтобы при восстановлении связи - сразу получить изменения, # а не ждать периодического heartbeat от второго сервера mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave" mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave" ;; backup) echo "BACKUP" > /tmp/keep.mode mongo_set_role slave service mongod restart service eltex-ems stop service tomcat8 stop service eltex-ngw stop mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "stop slave" mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "start slave" ;; fault) echo "FAULT" > /tmp/keep.mode mongo_set_role slave service mongod restart ;; *) echo "Usage: $0 {master|backup|fault}" exit 1 esac lockfile-remove /tmp/keep.mode.lock; exit 0 |
где <mysql_user> и <mysql_password> - логин и пароль от БД MySQL.
Скрипт смены мастера replicaSet MongoDB.
...
Для того, чтобы скрипты работали корректно, необходимо назначить права на их исполнение:
Блок кода | ||
---|---|---|
| ||
admin@swlc01-server:/# sudo chmod +x /etc/keepalived/check_ping.sh root@swlc01admin@swlc01-server:/# sudo chmod +x /etc/keepalived/keep_notify.sh root@swlc01admin@swlc01-server:/# sudo chmod +x /etc/keepalived/mongo_switch.js |
Выделение лога в отдельный файл
По умолчанию keepalived записывает лог в файл /var/log/syslog . Для удобства отладки, мониторинга и контроля работы keepalived, можно настроить ведение собственного, отдельного лог-файла.
Ниже приведен пример настройки rsyslog:
Блок кода | ||
---|---|---|
| ||
nano -w /etc/rsyslog.d/10-keepalived.conf if $programname contains 'Keepalived' then /var/log/keepalived.log if $programname contains 'Keepalived' then ~ |
Затем, нужно перезапустить rsyslog командой:
Блок кода | ||
---|---|---|
| ||
admin@swlc01-server:/##sudo service rsyslog restart |
Теперь сообщения от демона keepalived попадут только в лог-файл /var/log/keepalived.log и не попадут в /var/log/syslog .
Способ запуска/остановки keepalived
Для запуска сервиса воспользуйтесь командой:
Без форматирования |
---|
admin@master:/#sudo service keepalived start |
Ответ об успешном запуске будет такой:
Без форматирования |
---|
keepalived start/running, process 2471
|
Остановка сервиса:
Без форматирования |
---|
root@masteradmin@master:/##sudo service keepalived stop |
Ответ системы:
Без форматирования |
---|
keepalived stop/waiting |
Проверить состояние сервиса можно командой:
Без форматирования |
---|
root@masteradmin@master:/##sudo service keepalived status |
Ответ:
Без форматирования |
---|
Информация |
На одном из серверов, при корректной настройке, должен отображаться интерфейс с виртуальным ip. Для проверки работы сервиса keepalived, отключите сервер, у которого в интерфейсах присутствует virtual_ip. Virtual_ip должен появиться на втором сервере. |
Настройка rsync
Rsync в схеме резервирования отвечает за синхронизацию служебных служебных файлов, сервисов Eltex-EMS и Eltex-APB, а также файлов прошивок, шаблонов конфигурации, выгрузок конфигураций точек. Rsync представляет собой клиент серверное ПО. В данной схеме master-сервер выступает в роли клиента и синхронизирует каталоги slave-сервера с локальными.
Конфигурация сервера rsync
Для активации сервера rsync, необходимо на каждом сервере в файле /etc/default/rsync установить значение:
RSYNC_ENABLE=true
В Создать файл /etc/ нужно создать конфигурационный файл rsyncd.conf. Листинг файла приведен ниже.
hosts allow = <ip_другого_сервера> <virtual ip>
Информация |
---|
Запись hosts allow = <ip_другого_сервера> <virtual ip> в конфигурации встречается в 3 местах, не забудьте исправить все значения! |
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
[ems-conf] path = /usr/lib/eltex-ems/conf/ use chroot = no max connections = 2 lock file = /var/lock/rsyncd read only = no list = no uid = root auth users = backup secrets file = /etc/rsyncd.secrets strict modes = yes # IP-адрес сервера, который будет иметь доступ к ресурсу, т.е. адрес второго сервера в паре hosts allow = <ip_server1>адрес_другого_сервера> <virtual_ip> ignore errors = no ignore nonreadable = yes transfer logging = no timeout = 60 refuse options = checksum dry-run dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz [ems-tftp] path = /tftpboot use chroot = no max connections = 2 lock file = /var/lock/rsyncd.tftp read only = no list = no uid = root auth users = backup secrets file = /etc/rsyncd.secrets strict modes = yes hosts allow = <ip_server1>адрес_другого_сервера> <virtual_ip> ignore errors = no ignore nonreadable = yes transfer logging = no timeout = 60 refuse options = checksum dry-run dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz [ems-wp] path = /var/ems-data/WP use chroot = no max connections = 2 lock file = /var/lock/rsyncd.ems-wp read only = no list = no uid = root auth users = backup secrets file = /etc/rsyncd.secrets strict modes = yes hosts allow = <ip_server1>адрес_другого_сервера> <virtual_ip> ignore errors = no ignore nonreadable = yes transfer logging = no timeout = 60 refuse options = checksum dry-run dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz |
Параметры hosts allow
указаны для master сервера. Рекомендуется указать в виде:
hosts allow = <ip_другого_сервера> <virtual ip>
Для аутентификации, необходимо настроить пользователя пользователя rsync на обоих серверах, для этого, на каждом сервере создайте файлы /etc/rsyncd.secrets, в которых необходимо указать логин и пароль.
Блок кода | ||||
---|---|---|---|---|
| ||||
backup:rspasswd |
Назначить права доступа к файлам, выполнив на обоих серверах:
Блок кода | |||||
---|---|---|---|---|---|
| root@swlc01
| ||||
admin@swlc01-server:/##sudo chmod 600 /etc/rsyncd.secrets |
Настройка запуска синхронизации
Создайте файлы /etc/rsync_client.secrets, в в которых укажите пароль:
Блок кода | |||||
---|---|---|---|---|---|
| root@swlc01
| ||||
admin@swlc01-server:/# echo "rspasswd" > /etc/rsync_client.secrets && chmod 600 /etc/rsync_client.secrets |
Операцию синхронизации файлов осуществляет задача cronзадача cron, в которой выполняется скрипт скрипт /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh. Скрипт запускает rsync клиент и синхронизирует локальные директории с директориями на втором (backup) сервере. Синхронизация запускается только в случае, если сервер в состоянии master.
В 6 строке заменить HOST на ip-адрес другого сервера (Пример: HOST=100.111.195.201)
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
#!/bin/bash LOCKFILE="/run/lock/rsync_ems_backup" # IP address backup server HOST=<ip_server2>адрес_другого_сервера> # Check if we're root if [ `whoami` != "root" ] then echo "This script should be run by root." exit 1 fi # Check and create lock file if ! lockfile-create --use-pid -r 0 $LOCKFILE &> /dev/null ; then echo "Backup is already running" exit 0 fi # Check - if we're master - try to perform backup to slave SRVMODE=`cat /tmp/keep.mode` if [ "$SRVMODE" == "MASTER" ] then rsync -urlogtp --delete-after --password-file=/etc/rsync_client.secrets /usr/lib/eltex-ems/conf/ backup@$HOST::ems-conf > /tmp/rsync_ems_conf.log 2>&1 echo $? >> /tmp/rsync_ems_conf_result.log rsync -urlogtp --delete-after --password-file=/etc/rsync_client.secrets /tftpboot/ backup@$HOST::ems-tftp > /tmp/rsync_ems_tftpboot.log 2>&1 echo $? >> /tmp/rsync_ems_tftpboot_result.log rsync -urlogtp --delete-after --password-file=/etc/rsync_client.secrets /var/ems-data/WP/ backup@$HOST::ems-wp > /tmp/rsync_ems_wp.log 2>&1 echo $? >> /tmp/rsync_ems_wp_result.log else echo "Not master. No action will be performed." fi lockfile-remove $LOCKFILE |
где
backup
– логин, указанный в файле /etc/rsyncd.secretsHOST -
ip-адрес другого сервера
Cоздать задачу в в cron на на обоих серверах, для запуска синхронизации раз в минуту:
Блок кода | ||||
---|---|---|---|---|
| ||||
root@swlc01-server:/# crontab -l | { cat; echo "*/1 * * * * /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh"; } | crontab |
Проверяем список задач:
Блок кода | ||||
---|---|---|---|---|
| ||||
root@swlc01-server:/# crontab -l root@swlc01-server:/# */1 * * * * /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh |
Если задача не добавилась или случайно добавилась несколько раз - редактируем список вручную:
Блок кода | ||||
---|---|---|---|---|
| ||||
root@swlc01-server:/# crontab -e Select an editor. To change later, run 'select-editor'. 1. /bin/nano <---- easiest 2. /usr/bin/vim.tiny 3. /usr/bin/code 4. /bin/ed Choose 1-4 [1]: 1 # выбираем в каком редакторе открыть |
Способ запуска/остановки
Для запуска сервиса используется команда:
Без форматирования |
---|
root@swlc01admin@swlc01-server:/# sudo service rsync start |
Для остановки сервиса используется команда:
Без форматирования |
---|
root@swlc01admin@swlc01-server:/# sudo service rsync stop |
Для проверки — запущен ли сервис в данный момент, используется команда:
Без форматирования |
---|
root@swlc01admin@swlc01-server:/# sudo service rsync status |
В ответ последует сообщениеПроверить работу rsync можно в EMS. Во вкладке "Информация"-Состояние системы резервирования-Rsync service.
На обоих серверах должна быть запись такого типа:
Без форматирования |
---|
OK. Успешная синхронизация файлов из директории: /usr/lib/eltex-ems/conf/* rsync isOK. running |
в случае если сервис запущен, или
Без форматирования |
---|
* rsync is not running |
в случае если сервис не запущен.
Успешная синхронизация файлов из директории: /tftpboot/*
OK. Успешная синхронизация файлов из директории: /var/ems-data/WP/* |
Настройка репликации MySQL
Резервирование данных, хранящихся СУБД MySQL, осуществляется путём встречной репликации по принципу master-master (ведущий-ведущий). То есть, каждый из серверов одновременно является и master и slave. При такой схеме работы, все изменения в БД на одном сервере записываются в специальный бинарный лог, который в реальном времени вычитывает второй сервер и применяет изменения. Второй сервер реплицирует данные с первого, а первый со второго. (https://dev.mysql.com/doc/refman/5.7/en/replication.html). Это позволяет получить актуальную копию БД на двух хостах одновременно. При разрыве связи, изменения накапливаются, после восстановления происходит синхронизация.
Перенос дампа данных и перенос на второй сервер
При настройке резервирования в процессе эксплуатации (то есть если в MySQL на действующем сервере уже имеются данные), необходимо перенести эти данные на второй сервер. Это можно сделать при помощи утилиты mysqldump.
Для для этого, необходимо на первом сервере заблокировать таблицы, снять дамп, разблокировать таблицы и скопировать получившийся файл на второй сервер:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# mysql -uroot -proot -e "FLUSH TABLES WITH READ LOCK;" root@swlc01-server:/# mysqldump -uroot -proot --databases ELTEX_PORTAL eltex_alert eltex_auth_service eltex_ems radius wireless > mysqldump_master.sql root@swlc01-server:/# mysql -uroot -proot -e "UNLOCK TABLES;" root@swlc01-server:/# scp mysqldump_master.sql <username>@<ip_server2>:/home/<username>/ |
Затем, развернуть dump на втором сервере:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# mysql -uroot -proot < /home/<username>/mysqldump_master.sql |
Конфигурация MySQL
Конфигурация самого демона mysqld заключается в настройке параметров ведения бинарных логов. Обозначения первый сервер и второй сервер далее условны, и применяются лишь для обозначения различий в конфигурации сереровсерверов.
В секции [mysqld] файла конфигурации /etc/mysql/mysql.conf.d/mysqld.cnf произвести следующие изменения:
Примечание |
---|
В файл /etc/mysql/my.cnf добавить путь к файлу /etc/mysql/mysql.conf.d/ |
Закомментировать либо удалить строку на обоих серверах:
Блок кода | ||
---|---|---|
| ||
bind-address = 127.0.0.1 |
Указать server-id. Для серверов необходимо задать уникальные идентификаторы, к примеру, для первого:
Блок кода | ||
---|---|---|
| ||
server-id = 1 |
для второго:
Блок кода | ||
---|---|---|
| ||
server-id = 2 |
Включить бинарные логи на обоих серверах:
Блок кода | ||
---|---|---|
| ||
log_bin = /var/log/mysql/mysql-bin.log |
указать параметры auto_increment_increment (шаг приращения) и auto_increment_offset (стартовую точку).
Для первого сервера:
Блок кода | ||
---|---|---|
| ||
auto_increment_increment= 2 auto_increment_offset = 1 |
Для второго сервера:
Блок кода | ||
---|---|---|
| ||
auto_increment_increment= 2 auto_increment_offset = 2 |
На обоих серверах:
...
указать базы, для которых будут вестись логи:
Блок кода | ||||
---|---|---|---|---|
| ||||
binlog-do-db = eltex_alert binlog-do-db = eltex_ems binlog-do-db = wireless binlog-do-db = radius binlog-do-db = eltex_auth_service binlog-do-db = ELTEX_PORTAL binlog-do-db = eltex_doors binlog-do-db = eltex_ngw |
yказать базы, для которых не будут вестись логи:
Блок кода | ||
---|---|---|
| ||
binlog-ignore-db = mysql binlog-ignore-db = Syslog binlog-ignore-db = performance_schema binlog-ignore-db = information_schema |
...
Перезапустить сервис mysql на каждом сервер и создать БД для репликации
...
:
Блок кода | ||
---|---|---|
| ||
root@swlc01admin@swlc01-server:/# sudo service mysql restart |
Создание учетных записей
Для работы репликации необходима служебная учетная запись на каждом из серверов. Под этой учетной записью, сервер будет подключаться к master-серверу и получать изменения в данных.
Создать в консоли MySQL учетную запись для репликации на первом сервере:
Блок кода | ||||
---|---|---|---|---|
| ||||
GRANT SELECT, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication'@'<ip_server2>' IDENTIFIED BY 'password'; GRANT SELECT, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication'@'<ip_server1>' IDENTIFIED BY 'password'; #необходимо для проверки состояния репликации из EMS FLUSH PRIVILEGES; |
...
Создать в консоли MySQL учетную запись для репликации на втором сервере:
Блок кода | ||||
---|---|---|---|---|
| ||||
GRANT SELECT, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication'@'<ip_server1>' IDENTIFIED BY 'password'; GRANT SELECT, SUPER, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'replication'@'<ip_server2>' IDENTIFIED BY 'password'; #необходимо для проверки состояния репликации из EMS FLUSH PRIVILEGES; |
...
Информация |
---|
Привилегия SELECT необходима для работы проверки репликации из GUI EMS |
Выдача прав сервисным
...
пользователям
Открыть /usr/lib/eltex-ems/conf/config.txt, посмотреть какие username / password используются (по умолчанию - javauser / javapassword)
Выдаем им права на внешний доступ на обоих серверах:
Блок кода | ||||
---|---|---|---|---|
| ||||
GRANT ALL PRIVILEGES ON *.* TO 'usernamejavauser'@'%' IDENTIFIED BY 'password'; javapassword'; GRANT ALL PRIVILEGES ON eltex_auth_service.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `radius`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `wireless`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `Syslog`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `eltex_doors`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `eltex_ngw`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `ELTEX_PORTAL`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `eltex_ems`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `eltex_alert`.* TO 'javauser'@'%'; GRANT ALL PRIVILEGES ON `eltex_auth_service`.* TO 'javauser'@'%'; FLUSH PRIVILEGES; |
Включение репликации
Запуск репликации на втором сервере
На первом сервере, в консоли MySQL, выполнить команду show master status и проанализировать полученные значения:
Блок кода | ||
---|---|---|
| ||
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000001 Position: 00000107 Binlog_Do_DB: eltex_alert,eltex_ems,wireless,radius,eltex_auth_service,ELTEX_PORTAL,eltex_doors,eltex_ngw Binlog_Ignore_DB: mysql,Syslog,performance_schema,information_schema 1 row in set (0.00 sec) |
Запомнить параметры File и Position.
Информация |
---|
Рекомендуется устанавливать Position равным 107. Это позиция с которой начинается запись лог-файла. |
Настроить и запустить репликацию второго сервера с первого (выполнить действия на втором сервере):
Блок кода | ||||
---|---|---|---|---|
| ||||
STOP SLAVE; CHANGE MASTER TO MASTER_HOST='<ip_server1>', MASTER_USER='replication', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107; START SLAVE; |
где,
MASTER_LOG_FILE='mysql-bin.000001' – указать значение File, полученное на первом сервере
...
;
MASTER_LOG_POS=107 – указать значение Position, полученное
...
на первом сервере.
Проверить состояние репликации на втором сервере:
Блок кода | ||
---|---|---|
| ||
mysql> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: <ip_server1> Master_User: replication Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: mysqld-relay-bin.000001 Relay_Log_Pos: 107 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 107 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 2 1 row in set (0.00 sec) |
Если параметры Slave_IO_Running и Slave_SQL_Running имеют значение «Yes», репликация успешно запустилась.
Запуск репликации на первом сервере
На втором сервере выполнить:
Блок кода | ||||
---|---|---|---|---|
| show master status \G
| |||
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000001 Position: 00000107 Binlog_Do_DB: eltex_alert,eltex_ems,eltex_ont,radius,wireless,eltex_auth_service,payments,ELTEX_PORTAL Binlog_Ignore_DB: mysql,Syslog,performance_schema,information_schema 1 row in set (0.00 sec) |
Настроить и запустить репликацию первого сервера со второго (выполнять действия на первом сервере):
Блок кода | ||||
---|---|---|---|---|
| ||||
STOP SLAVE; CHANGE MASTER TO MASTER_HOST='<ip_server2>', MASTER_USER='replication', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=107; START SLAVE; |
Проверить состояние репликации на первом севере:
Блок кода | ||
---|---|---|
| ||
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: <ip_server2>
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 107
Relay_Log_File: mysqld-relay-bin.000001
Relay_Log_Pos: 107
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
... |
пример вывода сознащен ввиду того, что остальные данные не так важны
Если параметры Slave_IO_Running и Slave_SQL_Running имеют значение «Yes», значения Master_Log_File и Read_Master_Log_Pos репликация выполняется в обе стороны.
Проверка репликации из EMS-GUI
Состояние репликации MySQL можно контролировать из GUI EMS. Для этого, необходимо отредактировать конфигурационный файл /etc/eltex-ems/check-ems-replication.conf. Изменения необходимо внести на обоих серверах.
Блок кода | ||||||
---|---|---|---|---|---|---|
| ||||||
# Включить("Yes") / Выключить("No") проверку репликации ENABLE_REPLICATION="Yes" # Адрес первого хоста репликации HOST1=<ip_server1> # Адрес второго хоста репликации HOST2=<ip_server2> # параметры доступа к mysql серверу # mysql пользователь USER="replication" # mysql пароль PASSWORD="password" |
где,
ENABLE_REPLICATION - включена ли проверка репликации (установить в "Yes");
HOST1, HOST2 - ip-адреса серверов;
USER, PASSWORD - логин/пароль учетной записи, для работы репликации.
Информация |
---|
После сохранения изменений, состояние репликации можно отслеживать в GUI EMS в разделе Информация → Состояние системы резервирования → MySQL. |
Здесь представлены результаты проверки состояния репликации на обоих серверах и краткое резюме по результатам проверки.
Настройка MongoDB
В MongoDB репликация осуществляется объединением нескольких (в типовой конфигурации - 3) узлов в Replica Set. Replica Set состоит из одного primary узла и нескольких secondary (подробнее https://docs. mongodb.com/v4.0/administration/replica-set-deployment/). Для упрощения предлагаем схему:
- Primary — основной сервер mongoDB.
- Secondary — точные копии баз(ы) данных с real-time синхронизацией.
- Arbiter — сервер отвечает только за выборы преемника, сам стать преемником он не может, поэтому рекомендуется отдавать под арбитра минимальные ресурсы, SoftWLC на аrbiter устанавливать не требуется.
Минимальные характеристики для mongo-db arbiter:
- vCore: 1, 64-bit x86 CPUs
- vRAM: 2 ГБ
- vHDD: 20Гб
Предупреждение | ||
---|---|---|
| ||
Для корректной работы репликации необходимо, чтобы версии MongoDB совпадали на всех хостах (в текущей версии SoftWLC используется версия 4.0.26). |
Все Все операции по изменению данных выполняются только на primary. При этом MongoDB автоматически выполняет failover и смену primary на живой узел, если текущий primary выйдет из строя. Но это требует 3+ узлов в replica set.
Предупреждение |
---|
При конфигурации по умолчанию Replica Set из двух узлов полностью выходит из строя при отказе одного из них (даже secondary). |
Установка mongodb на arbiter
При настройке репликации, необходимо, чтобы версии MongoDB совпадали на всех хостах, при обычной установке mongo , устанавливается версия 3.6.3, в нашем случае требуется актуальный патч 4 версии mongodb.
Для установки нужной версии mongodb, выполните следующие действия:
Создайте файл /etc/apt/sources.list.d/mongodb-org-4.0.list и пропишите в него репо mongo
Блок кода | ||
---|---|---|
| ||
deb [ arch=amd64 ] http://mirror.yandex.ru/mirrors/repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse |
Выполните на сервере команду
Блок кода | ||
---|---|---|
| ||
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4 |
Скачайте mongodb-org
Блок кода | ||
---|---|---|
| ||
sudo apt-get update
sudo apt install mongodb-org |
Проверьте, что на сервер установлена mongodb версии не ниже 4.0.28
Блок кода | ||
---|---|---|
| ||
mongo --version или dpkg -l | grep mongo |
Выполните следующие команды:
Блок кода | ||
---|---|---|
| ||
sudo systemctl enable mongod.service
sudo systemctl start mongod.service |
Настройка replicaSet
В /etc/mongod.conf на всех узлах:
Добавить/раскомментировать блок:
Блок кода | ||
---|---|---|
| ||
replication: replSetName: "<replica_set_name>" |
где <replica_set_name> - имя replica set, выбирается произвольно, но должно быть одинаково на всех серверах.
Разрешить внешние подключения, прописав в параметре bindIp параметре bindIp (bind_ip в старой версии mongo) адрес 0.0.0.0 (0.0.0.0 - разрешает подключения с любых ip адресов):
Блок кода | ||||
---|---|---|---|---|
| ||||
bindIp: 0.0.0.0 |
Перезапустить MongoDB:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# service mongod restart |
На первом узле зайти в консоль MongoDB:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# mongo |
Создать конфигурацию replica set:
Информация |
---|
Если хотите использовать в конфигурации hostname вместо ip-адреса, то на всех узлах в /etc/hostname нужно указать названия нод и в /etc/hosts на всех узлах необходимо добавить все ноды по типу <IP_address> <hostname> |
Блок кода | ||
---|---|---|
| ||
> rs.initiate(
{
_id: "replica_set_name",
version: 1,
members: [
{ _id: 0, host : "ip_mongo_primary:27017" },
{ _id: 1, host : "ip_mongo_secondary:27017" }
]
}
) |
Добавить в Replica Set узел Arbiterузел Arbiter (на PRIMARY):
Блок кода | ||||||
---|---|---|---|---|---|---|
| replica_set_name:PRIMARY>
| |||||
rs.add("<ip_server>:27017",true) { "ok" : 1 } |
Через некоторое время, приглашение shell должно смениться на такое:
Блок кода | ||
---|---|---|
| ||
replica_set_name:PRIMARY> |
Посмотреть конфигурацию Replica Set можно командой:
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> rs.config() |
Проверить состояние Для проверки состояния Replica Set можно выполнив , выполните в консоли MongoDB команду rs.statusrs.status().
Добавление/удаление/изменение узлов в Replica Set
Настройку узлов в Replica Set можно выполнять только на PRIMARY.
Добавить в Replica Set узел Secondary (на PRIMARY):
Блок кода | ||||||
---|---|---|---|---|---|---|
| replica_set_name:PRIMARY>
| |||||
rs.add("<ip_server>:27017")
{ "ok" : 1 } |
Если MongoDB отвечает на эту команду ошибкой, возможно, нет связи со вторым узлом (или там прописан bindIp: 127.0.0.1), или там не настроен блок replication. Правильный ответ должен быть таким.
На втором узле приглашение консоли управления MongoDB должно смениться на:
Блок кода | ||
---|---|---|
| ||
root@swlc01-server:/# mongo replica_set_name:SECONDARY> |
Добавить в Replica Set узел Arbiterузел Arbiter:
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> rs.add("<ip_server>:27017",true)
{ "ok" : 1 } |
Удалить узел из Replica Set (выполнять на PRIMARY):
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> rs.remove("<ip_server>:27017")
{ "ok" : 1 } |
Для корректировки адреса сервера выполнить следующее:
Блок кода | ||||
---|---|---|---|---|
| ||||
replica_set_name:PRIMARY> cfg = rs.conf() replica_set_name:PRIMARY> cfg.members[<индекс>].host = "<ip_server>:27017" replica_set_name:PRIMARY> rs.reconfig(cfg) |
Информация |
---|
Для проверки работоспособности репликации, отключите PRIMARY сервер, сервер, который был SECONDARY, перейдет в статус PRIMARY |
Работа Eltex-PCRF в режиме кластера
Настройка кластера PCRF
Между серверами PCRF нужно открыть порты 5701 tcp, 5801 tcp
На серверах в файлах конфигурации /etc/eltex-pcrf/hazelcast-cluster-network.xml
нужно указать адреса сетевых интерфейсов (в строках 5 и 22 в примере - адрес самого сервера, строки 14-15 - список всех членов кластера)
пример, часть конфигурации:
...
Блок кода |
---|
...
|
...
|
...
|
...
| |
<network> <!-- Write here public address of the node --> <!-- здесь нужно указать собственный адрес сервера --> <public-address>ip_server1</public-address> <port auto-increment="false" |
...
port-count="100">5701</ |
...
port> <outbound-ports> <ports>0</ports> </outbound-ports> <join> <multicast enabled="false"/> |
...
<tcp-ip |
...
enabled="true"> |
...
<!-- Перечислить IP-адреса всех членов кластера (включая этот) --> |
...
<member>ip_server1</member> <member>ip_server2</member> </tcp-ip> <discovery-strategies> </discovery-strategies> </join> <interfaces enabled="true"> |
...
<!-- здесь нужно указать собственный адрес сервера --> |
...
<interface>ip_server1</interface>
</interfaces> |
В конфигурации /etc/eltex-pcrf/eltex-pcrf.json
нужно разрешить запуск кластера:
Блок кода | ||
---|---|---|
| ||
"cluster.enable" : true, |
Перезапустить Eltex-PCRF командой
...
Блок кода | ||
---|---|---|
| ||
admin@swlc01-server:/# sudo service eltex-pcrf restart |
Проверка состояния кластера
...
Блок кода | ||
---|---|---|
| ||
{ "data" : |
...
{ "enabled" : true, |
...
"state" : "ACTIVE", |
...
"members" : [ |
...
{ "address" : "ip_server1", |
...
"local" : true, |
...
"active" : |
...
true }, |
...
{ "address" : "ip_server2", |
...
"local" : false, |
...
"active" : |
...
true } ], "messagesStats" : |
...
{ "received" : 45157, |
...
"sent" : |
...
45144 }, "mongo" : |
...
{ "available" : false, |
...
"error" : "not running with --replSet" |
...
} }, "key" : "PcrfErrorCode.success", |
...
"message" : "Success", |
...
"code" : 0, |
...
"args" : [ ] |
...
} |
Особенности настройки ESR для взаимодействия с кластером PCRF
При использовании кластера PCRF на ESR настроить взаимодействие со всеми нодами кластера используя их реальный адрес.
Настройка модулей SoftWLC
Необходимо настроить модули SoftWLC на работу с контроллером по virtual ip на обоих серверах. Изменения необходимо внести в приведенные ниже конфигурационные файлы.
...
Примечание |
---|
В случае использования однохостовой системы на каждом из серверов SoftWLC, в конфигурационных файлах сервисов, обращающихся к БД MySQL заменять |
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
# maximum number of outgoing messages in queue for each session sessionMessageQueueSize = 100 # cache config file path cacheConfigFile = /etc/eltex-apb/ehcache.xml # path to the file with permitted hosts hostsFile = /etc/eltex-apb/hosts.json pingJob { # ping job interval interval = 60s # timeout waiting for subscribe-request after connecting the access point to the server subscribeIdleTimeout = 60s # timeout during that the session will stay opened without receiving any message messageIdleTimeout = 90s # interval of ping to be sent to the websocket session pingIdleTimeout = 30s } # eltex-mercury connection properties mercury { host = localhost port = 6565 poolSize = 50 } nbi.client.login=admin nbi.client.password=password |
- Изменить
localhost
на<virtual_ip>
в строке 24.
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
{ "auth.address" : "0.0.0.0", "auth.port" : 31812, "auth.mac.open.timeout.s" : 3600, "auth.mac.welcome.service" : "WELCOME", "acct.address" : "0.0.0.0", "acct.ports" : [1813, 31813], "lease.saver.address" : "0.0.0.0", "lease.saver.port" : 4381, "aaa.instances" : 5, "aaa.host" : "127.0.0.1", "aaa.secret" : "testing123", "aaa.auth.port" : 1812, "aaa.acct.port" : 1813, "aaa.rest.port" : 7080, "aaa.timeout" : 10, "aaa.attempts" : 1, "web.monitoring.port" : 7070, "cluster.enable" : false, "cluster.eventBusPort" : 5801, "radius" : { "url": "jdbc:mysql://localhost/radius?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false", "user": "javauser", "password": "javapassword", "max_pool_size": 16 }, "mongo.pcrf" : { "connection_string": "mongodb://localhost:27017/pcrf?replicaSet=<YourClasterName>&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred", "db_name": "pcrf" }, "mongo.ott" : { "connection_string": "mongodb://localhost:27017/ott?replicaSet=<YourClasterName>&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred", "db_name": "ott" }, "session.storage" : { "session.check.period.s" : 300, "unauth.store.time.s" : 600, "interval.number.expired" : 3, "min.interval.s" : 45, "default.interval.s" : 600 }, "bras.coa" : { "coa.timeout" : 10, "coa.attempts" : 1, "remote.coa.port" : 3799, "executor.size" : 100, "log.clean.period.s" : 600, "log.store.period" : { "period" : 14, "unit" : "D" } }, "sql.ems" : { "url": "jdbc:mysql://localhost/eltex_ems?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false", "user": "javauser", "password": "javapassword", "max_pool_size": 16 }, "sql.wireless" : { "url": "jdbc:mysql://localhost/wireless?useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&autoReconnect=true&useSSL=false", "user": "javauser", "password": "javapassword", "max_pool_size": 16 }, "sql.auth.service" : { "url": "jdbc:mysql://localhost/eltex_auth_service?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&connectTimeout=5000&socketTimeout=5000&useSSL=false", "user": "javauser", "password": "javapassword", "max_pool_size": 4 }, "language" : "en", "radius.nbi" : { "wdsl.url" : "http://localhost:8080/axis2/services/RadiusNbiService?wsdl", "username" : "softwlc_service", "password" : "softwlc", "connection.timeout.ms" : 30000, "request.timeout.ms" : 120000 }, "tariffs.update.interval" : { "interval" : 1, "unit" : "hours" }, "bras.cron.update.interval": { "interval" : 1, "unit": "hours" }, "filters.cache.dir" : "/var/lib/eltex-pcrf/filters/", "clickhouse": { "url": "jdbc:clickhouse://localhost:8123/radius", "user_name": "javauser", "user_password": "javapassword" }, "accounting.options": { "use_clickhouse": false, "use_mysql": true, "batch_interval_ms": 300000, "max_queue_load": 100 } } |
- Изменить
mongodb://localhost
наmongodb://ip_mongo_primary,ip_mongo_secondary
во всех строках иуказать replicaSet
, который вы настроили в /etc/mongod.conf. Таким образом строка будет выглядеть примерно следующим образом
Блок кода | ||
---|---|---|
| ||
mongodb://192.168.10.3:27017,192.168.10.4:27017/pcrf?replicaSet=Cluster&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred mongodb://192.168.10.3:27017,192.168.10.4:27017/ott?replicaSet=Cluster&waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0&readPreference=secondaryPreferred |
- Изменить
localhost
на<virtualip>
во всех строках, кроме 14-ой строки.
- Изменить
127.0.0.1
на<virtualip>
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
login { # Количество попыток входа в панель администратора до наступления блокировки maxAttemptsLogin = 3 maxAttemptsIP = 5 # Количество минут блокировки после достижения максимального числа попыток входа в панель администратора blockTime = 5m } access { // Временно задаём plaintext-secret прямо здесь (HMAC256), потом будем использовать путь в FS до PEM-файла (RSA256) secret = "secret" } database { host = localhost port = 3306 name = ELTEX_PORTAL user = javauser password = javapassword pool { # Time to wait for a connection connectionTimeout = 10s # Time to wait for connection validation validationTimeout = 3s min = 1 max = 10 } cache { # Limit of cached simple entries count (for each query type) maxEntries = 1000 # Limit of total cached portal resources size maxResourceBytes = 32m # Maximum time to retain items in the cache expireTime = 30s } } sso { enabled = false # Must be in double quotes version = "1.0" rest { scheme = http host = localhost port = 80 sso_api_path = /apiman-gateway/b2b_test } auth { scheme = http host = localhost port = 80 authentication_path = /auth/realms/b2b/protocol/openid-connect/auth logout_path = /auth/realms/b2b/protocol/openid-connect/logout } params { client_id = id # URL of epadmin, URL must be in double quotes (!!!) redirect_uri = "http://localhost:8080/epadmin/sso" client_secret = secret } } jetty { http.port = 9001 https { port = 9444 keystorePass = 12345 keystoreFile = /etc/eltex-portal-constructor/localhost.pfx keystoreType = PKCS12 keyAlias = 1 ciphers = [ TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA ] } multipart { maxFileSize = 100MB maxRequestSize = 100MB } } validation { public_key = /etc/eltex-doors/keys/public.pem } logging { host = localhost port = 9099 } |
- Изменить
localhost
на<virtualip>
в строках 15, 48, 54, 64, 95.
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
portal { defaultRedirectUrl = "http://eltex-co.ru" scheduler { tariffCheckerPeriod = 1d paymentsCleanerPeriod = "0 0 * * * ?" } } jetty { https { port = 9443 keystorePass = 12345 keystoreFile = /etc/eltex-portal/localhost.pfx keystoreType = PKCS12 keyAlias = 1 ciphers = [ TLS_RSA_WITH_AES_128_CBC_SHA256 TLS_RSA_WITH_AES_128_CBC_SHA TLS_RSA_WITH_AES_256_CBC_SHA256 TLS_RSA_WITH_AES_256_CBC_SHA ] } } database { host = localhost port = 3306 name = ELTEX_PORTAL user = javauser password = javapassword pool { # Time to wait for a connection connectionTimeout = 10s # Time to wait for connection validation validationTimeout = 3s min = 1 max = 10 } cache { # Limit of cached simple entries count (for each query type) maxEntries = 1000 # Limit of total cached portal resources size maxResourceBytes = 32m # Maximum time to retain items in the cache expireTime = 2m } } // JWT validation. You need a key from Eltex Doors. // Or you could generate it yourself. validation { public_key = "etc/eltex-doors/keys/public.pem" |
- Изменить
localhost
на<virtualip>
в строке 27.
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
# DB radius(alias=radius) radius.jdbc.driver=org.gjt.mm.mysql.Driver radius.jdbc.dbUrl=jdbc:mysql://localhost/radius?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 radius.jdbc.username=javauser radius.jdbc.password=javapassword radius.jdbc.maxPoolSize=48 radius.jdbc.inUse=yes # DB radius replica(alias=radiusReplicaPool) #TODO: Change it to replica url radius.jdbc.replica.driver=org.gjt.mm.mysql.Driver radius.jdbc.replica.dbUrl=jdbc:mysql://localhost/radius?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 radius.jdbc.replica.username=javauser radius.jdbc.replica.password=javapassword radius.jdbc.replica.maxPoolSize=48 radius.jdbc.replica.inUse=yes # DB ems(alias=ems) ems.jdbc.driver=org.gjt.mm.mysql.Driver ems.jdbc.dbUrl=jdbc:mysql://localhost/eltex_ems?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&noAccessToProcedureBodies=true ems.jdbc.username=javauser ems.jdbc.password=javapassword ems.jdbc.maxPoolSize=48 ems.jdbc.inUse=yes # DB wireless (alias=wireless) wireless.jdbc.driver=org.gjt.mm.mysql.Driver wireless.jdbc.dbUrl=jdbc:mysql://localhost/wireless?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 wireless.jdbc.username=javauser wireless.jdbc.password=javapassword wireless.jdbc.maxPoolSize=48 wireless.jdbc.inUse=yes # DB logs (alias=logs) logs.jdbc.driver=org.gjt.mm.mysql.Driver logs.jdbc.dbUrl=jdbc:mysql://localhost/eltex_alert?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 logs.jdbc.username=javauser logs.jdbc.password=javapassword logs.jdbc.maxPoolSize=48 logs.jdbc.inUse=yes # DB logs (alias=eltex_auth_service) eltex_auth_service.jdbc.driver=org.gjt.mm.mysql.Driver eltex_auth_service.jdbc.dbUrl=jdbc:mysql://localhost/eltex_auth_service?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 eltex_auth_service.jdbc.username=javauser eltex_auth_service.jdbc.password=javapassword eltex_auth_service.jdbc.maxPoolSize=48 eltex_auth_service.jdbc.inUse=no # адрес ems-northbound ems.nbi.host=127.0.0.1 ems.nbi.port=8080 ems.nbi.path=northbound ems.nbi.protocol=http # eltex_auth_service auth.port=22 auth.host=127.0.0.1 auth.username=username auth.password=password # freeradius-domain-1 freeradius-domain-1.port=22 freeradius-domain-1.host=192.168.0.1 freeradius-domain-1.username=username freeradius-domain-1.password=password # freeradius-domain-2 freeradius-domain-2.port=22 freeradius-domain-2.host=192.168.0.2 freeradius-domain-2.username=username freeradius-domain-2.password=password # tomcat url tomcat.host=127.0.0.1 tomcat.port=8080 # pcrf stuff pcrf.enabled=true pcrf.url=http://localhost:7070 pcrf.username=admin pcrf.password=password # pcrf mongodb connector pcrf.mongodb.enabled=true pcrf.mongodb.uri=mongodb://localhost:27017/pcrf?replicaSet=<YourClusterName> # wifi-customer-cab mongodb connector wificab.mongodb.enabled=true wificab.mongodb.uri=mongodb://localhost:27017/wifi-customer-cab?replicaSet=<YourClusterName> # Eltex.SORM2.replicator MongoDB 'sorm2' connect sorm2.mongodb.enabled=false sorm2.mongodb.uri=mongodb://localhost:27017/sorm2?replicaSet=<YourClusterName> # wifi-customer-cab request settings wificab.timeout=90000 # Eltex.SORM2.replicator host to use API sorm2.enabled=false sorm2.url=http://localhost:7071 sorm2.username=admin sorm2.password=password #It enables records export to SORM3 while editing wifi users sorm3.enabled=false # ott mongodb connector ott.mongodb.enabled=true ott.mongodb.uri=mongodb://localhost:27017/ott?replicaSet=<YourClusterName> # metrics metric.interval.s=900 ########################################################################### ##########################DB ELTEX_PORTAL settings######################### ########################################################################### portal.db.driver=com.mysql.jdbc.Driver portal.db.url=jdbc:mysql://localhost:3306/ELTEX_PORTAL?max_allowed_packet=32362048&useUnicode=true&characterEncoding=utf8 portal.db.username=javauser portal.db.password=javapass |
- Изменить
mongodb://localhost
наmongodb://ip_mongo_primary,ip_mongo_secondary
во всех строках иуказать replicaSet
, который вы настроили в - в /etc/mongod.conf. Таким образом строка будет выглядить
- выглядеть примерно следующим образом
Блок кода | |
---|---|
|
...
| |
pcrf.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/pcrf?replicaSet=Cluster
wificab.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/wifi-customer-cab?replicaSet=Cluster
sorm2.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/sorm2?replicaSet=Cluster
ott.mongodb.uri=mongodb://192.168.10.3:27017,192.168.10.4:27017/ott?replicaSet=Cluster |
- Изменить
localhost
на<virtualip>
- Изменить
127.0.0.1
на<virtualip>
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
// Server configuration server { // server port port = 8040 // number of threads in executor that executes handlers and different gateways threads = 50 } http { // Timeout of http connection to the end gateway connectionTimeout = 30s // Number of maximum simultaneous http connections maxConnections = 50 // Time that connection will be kept alive keepAliveTimeout = 5s // Whether to check SSL certificate checkCert = true // HTTP User Agent userAgent = eltex-ngw } sms { // Incoming (user to service) sms config incoming.config = "smsc.conf" // Outgoing (service to user) sms config outgoing.config = "smsc.conf" } call { // Incoming (user to service) call config incoming.config = "" // Outgoing (service to user) call config outgoing.config = "" } email { // Outgoing (service to user) email config outgoing.config = "" } database { host = localhost port = 3306 name = eltex_ngw user = javauser password = javapassword pool { // Time to wait for a connection connectionTimeout = 10s // Time to wait for connection validation validationTimeout = 3s min = 1 max = 10 } |
- Изменить
localhost
наvirtual_ip
в строке 44.
Блок кода | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
# Ports on which the server will listen auth_port=1812 #acct_port=1813 inner_tunnel_port=18121 # MySQL database db_host="localhost" db_port=3306 db_login="radius" db_password="radpass" db_name="radius" # MySQL 'wireless' database wireless_db_host="localhost" wireless_db_port=3306 wireless_db_login="javauser" wireless_db_password="javapassword" wireless_db_name="wireless" # PCRF # If you setting pcrf_enabled=0, then you also should enable accounting port listening in "default" server pcrf_host="127.0.0.1" pcrf_port=7080 pcrf_enabled=1 # EAP ca_cert_name="local.pem" tls_key_password="1234" # Proxying proxy_auth=0 proxy_domain_regex="^(.+\.)?enterprise\.root$" proxy_host="127.0.0.1" proxy_port=18121 proxy_secret="eltex" # Ubiquity vendor detection ubi_vendor_regex="Apple|Ubiquiti" vendor_group_enabled=1 # Settings of runtime NAS discovery dynamic_clients=false dynamic_client_subnet=192.168.0.0/16 dynamic_client_lifetime=3600 dynamic_client_rate_limit=false # Proxy SSID (for example to eltex-eap-tls) #139679 proxy_ssid_enabled=0 proxy_ssid_value="EAP_TLS" proxy_ssid_host="127.0.0.1" proxy_ssid_port=18122 proxy_ssid_secret="eltex" |
...
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="mongoaddress">mongodb://localhost:27017/wifi-customer-cab?replicaSet=<YourClusterName></entry> <entry key="nbiaddress">http://localhost:8080/axis2/services/RadiusNbiService?wsdl</entry> <entry key="nbi.serviceLogin.user">softwlc_service</entry> <entry key="nbi.serviceLogin.password">password</entry> <entry key="nbi.serviceLogin.requestTimeout.sec">120</entry> <!--Bonnie or NBI--> <entry key="data.service.type">NBI</entry> <entry key="bonnie.service.host">localhost</entry> <entry key="bonnie.service.port">9070</entry> <!--Bruce--> <entry key="bruce.service.host">localhost</entry> <entry key="bruce.service.port">8008</entry> <!-- Support link --> <entry key="support.page.enabled">false</entry> <entry key="support.page.url">http://eltex-co.ru</entry> <!-- DPI link --> <entry key="dpi.page.enabled">false</entry> <entry key="dpi.page.url">https://filter.wifi.example.org/</entry> <!-- SSO Settings --> <entry key="sso.enabled">false</entry> <entry key="sso.redirectUri">http://localhost:8080/wifi-cab/sso</entry> <entry key="sso.clientSecret"></entry> <entry key="sso.clientId"></entry> <!-- SSO Auth --> <entry key="sso.auth.server.protocol">http</entry> <entry key="sso.auth.server.address"></entry> <entry key="sso.auth.server.port">80</entry> <entry key="sso.auth.auth.path">/auth/realms/b2b/protocol/openid-connect/auth</entry> <entry key="sso.auth.logout.path">/auth/realms/b2b/protocol/openid-connect/logout</entry> <!-- SSO REST --> <entry key="sso.rest.server.protocol">http</entry> <entry key="sso.rest.server.address"></entry> <entry key="sso.rest.server.port">80</entry> <entry key="sso.rest.server.timeout.sec">10</entry> <entry key="sso.rest.protocol.version">2.0</entry> <entry key="sso.rest.username"></entry> <entry key="sso.rest.password"></entry> <entry key="sso.rest.getToken.path">/apiman-gateway/b2b_test/getToken</entry> <entry key="sso.rest.getUserInfo.path">/apiman-gateway/b2b_test/getUserInfo</entry> <entry key="sso.rest.addUser.path">/apiman-gateway/b2b_test/addUser</entry> <entry key="sso.rest.updateUser.path">/apiman-gateway/b2b_test/updateUser</entry> <entry key="sso.rest.delUser.path">/apiman-gateway/b2b_test/delUser</entry> <entry key="sso.rest.addUserParam.path">/apiman-gateway/b2b_test/addUserParam</entry> <entry key="sso.rest.delUserParam.path">/apiman-gateway/b2b_test/delUserParam</entry> <entry key="sso.rest.getUserByName.path">/apiman-gateway/b2b_test/getUserByName</entry> <entry key="sso.rest.resetPassword.path">/apiman-gateway/b2b_test/resetPassword</entry> <entry key="sso.rest.getUserByParam.path">/apiman-gateway/b2b_test/getUserByParam</entry> <entry key="sso.rest.getUserByEmail.path">/apiman-gateway/b2b_test/getUserByEmail</entry </properties> |
- Изменить
mongodb://localhost
наmongodb://ip_mongo_primary,ip_mongo_secondary
указать replicaSet
, который вы настроили в в /etc/mongod.conf. Таким образом строка будет выглядить выглядеть примерно следующим образом:
Блок кода | ||
---|---|---|
| ||
<entry key="mongoaddress">mongodb://192.168.10.3:27017,192.168.10.4:27017/wifi-customer-cab?replicaSet=Cluster</entry> |
- Изменить
localhost
на<virtualip>
Блок кода | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
# DB Event poolName1=event event.jdbc.driver=org.gjt.mm.mysql.Driver event.jdbc.dbUrl=jdbc:mysql://localhost/eltex_alert?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 event.jdbc.username=javauser event.jdbc.password=javapassword event.jdbc.maxPoolSize=32 event.jdbc.inUse=yes # remote db host access with su privileges # event.ssh.login= # event.ssh.password= # event.ssh.port= # DB Tree poolName2=tree tree.jdbc.driver=org.gjt.mm.mysql.Driver tree.jdbc.dbUrl=jdbc:mysql://localhost/eltex_ems?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000&noAccessToProcedureBodies=true tree.jdbc.username=javauser tree.jdbc.password=javapassword tree.jdbc.maxPoolSize=20 tree.jdbc.inUse=yes # DB Ont poolName3=ont ont.jdbc.driver=org.gjt.mm.mysql.Driver ont.jdbc.dbUrl=jdbc:mysql://localhost/eltex_ont?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 ont.jdbc.username=javauser ont.jdbc.password=javapassword ont.jdbc.maxPoolSize=40 ont.jdbc.inUse=yes # DB Syslog poolName4=syslog syslog.jdbc.driver=org.gjt.mm.mysql.Driver syslog.jdbc.dbUrl=jdbc:mysql://localhost/Syslog?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 syslog.jdbc.username=javauser syslog.jdbc.password=javapassword syslog.jdbc.maxPoolSize=4 syslog.jdbc.inUse=yes # remote db host access with su privileges # syslog.ssh.login= # syslog.ssh.password= # syslog.ssh.port= # DB acsmain (alias=cpe) poolName5=cpe cpe.jdbc.driver=org.gjt.mm.mysql.Driver cpe.jdbc.dbUrl=jdbc:mysql://localhost/acsmain?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 cpe.jdbc.username=javauser cpe.jdbc.password=javapassword cpe.jdbc.maxPoolSize=2 cpe.jdbc.inUse=yes # DB acscmds(alias=cmds) poolName6=cmds cmds.jdbc.driver=org.gjt.mm.mysql.Driver cmds.jdbc.dbUrl=jdbc:mysql://localhost/acscmds?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 cmds.jdbc.username=javauser cmds.jdbc.password=javapassword cmds.jdbc.maxPoolSize=2 cmds.jdbc.inUse=yes # DB acsinf(alias=inf) poolName7=inf inf.jdbc.driver=org.gjt.mm.mysql.Driver inf.jdbc.dbUrl=jdbc:mysql://localhost/acsinf?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 inf.jdbc.username=javauser inf.jdbc.password=javapassword inf.jdbc.maxPoolSize=2 inf.jdbc.inUse=yes # DB acscache(alias=cache) poolName8=cache cache.jdbc.driver=org.gjt.mm.mysql.Driver cache.jdbc.dbUrl=jdbc:mysql://localhost/acscache?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 cache.jdbc.username=javauser cache.jdbc.password=javapassword cache.jdbc.maxPoolSize=2 cache.jdbc.inUse=yes # DB radius(alias=radius) poolName9=radius radius.jdbc.driver=org.gjt.mm.mysql.Driver radius.jdbc.dbUrl=jdbc:mysql://localhost/radius?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 radius.jdbc.username=javauser radius.jdbc.password=javapassword radius.jdbc.maxPoolSize=40 radius.jdbc.inUse=yes # remote db host access with su privileges # radius.ssh.login= # radius.ssh.password= # radius.ssh.port= # ------------------------------------------- SSID --------------------------------------------- # DB wireless (alias=wireless) poolName10=wireless wireless.jdbc.driver=org.gjt.mm.mysql.Driver wireless.jdbc.dbUrl=jdbc:mysql://localhost/wireless?useUnicode=true&characterEncoding=utf8&relaxAutoCommit=true&connectTimeout=5000 wireless.jdbc.username=javauser wireless.jdbc.password=javapassword wireless.jdbc.maxPoolSize=30 wireless.jdbc.inUse=yes # memcached server address #memcached_server_ip_port=127.0.0.1:11211 |
Изменить localhost
на <virtualip>
в строках 4, 17, 26, 35, 48, 57, 66, 75, 84, 98.
Добавление пользователя в таблицу NAS
Для доступа в Личный кабинет необходимо добавить соответствующие записи в таблицу NAS.
Данная таблица находится в БД eltex_auth_service и содержит адреса клиентов, имеющих право отправлять запросы на проведение авторизации пользователей. Если клиент не включен в эту таблицу, то запросы авторизации будут игнорироваться.
Для этого следующие команды из консоли MySQL на любом из серверов:
...
language | sql |
---|---|
theme | RDark |
...
в личном кабинете в разделе Настройки → Серверные адреса добавить :
- <ip_server_1>
...
- -
...
- IP
...
где:
- <ip_server_1> - IP-адрес сервера-1
- <ip_server_2> - IP-адрес сервера-2
<virtual_ip> - Виртуальный IP-адрес
...
Примечание |
---|
Ключ RADIUS -eltex |
Смена настроек в GUI
Также нужно настроить модули SoftWLC при помощи графического интерфейса.
Личный кабинет Wi-Fi
В разделе Настройки → Интеграция в параметрах PCRF URL, URL NGW-клиента и URL конструктора порталов изменить localhost на виртуальный ip-адрес:
Конструктор порталов
Изменить localhost на виртуальный ip-адрес в разделах настроек:
Системные настройки → Конструктор порталов
Системные настройки → Доступ к NBI
Системные настройки → Доступ к NGW
Системные настройки → Доступ к PCRF
Системные настройки → Доступ к Mercury
EMS-GUI
В графическом интерфейсе сервера EMS изменить localhost (либо 127.0.0.1) на виртуальный ip-адрес в следующих разделах:
Администрирование → Настройка сервера → Системные модули → pcrf
Администрирование → Настройка сервера → Системные модули → radius
Администрирование → Настройка сервера → Системные модули → softwlc.nbi
Администрирование → Настройка сервера → Системные модули → system
Администрирование → Настройка сервера → Системные модули → tftpserver
Администрирование → Настройка сервера → Системные модули →wifelessCommon
Данный ключ должен совпадать с файлом /etc/eltex-wifi-cab/local_secret на каждом хосте, где установлен eltex-wifi-cab .
Если вы используете модуль netconf, то там так же необходимо актуализировать информацию
Администрирование → Настройка сервера → Системные модули → netconf