Резервирование контроллеров SoftWLC выполняется по схеме master-slave. Синхронизируются критичные для работы системы файлы (настройки, файлы прошивок, выгрузки данных), баз данных MySQL (в режиме master-master), баз дынных MongoDB, а также работа DHCP серверов. Такая схема обеспечивает доступность услуги и актуальные данные на обоих контроллерах при выходе одного из строя, недоступности сети, проблем с электропитанием.
В примерах конфигурации в данном разделе для простоты ip-адреса будут указываться как <ip_server1>, <ip_server2> и <virtual_ip>, где:
Настройка резервирования контроллеров SoftWLC состоит из следующих этапов:
Основной компонент резервирования контроллеров. Определяет за переход мастерства и обнаружение проблем в работе сети. Для установки keepalived необходимо обратиться в Сервисный центр Wi-Fi за актуальным дистрибутивом.
См. документацию keepalived_1.4.2.
Rsync в схеме резервирования отвечает за синхронизацию служебных служебных файлов сервисов Eltex-EMS и Eltex-APB, а также файлов прошивок, шаблонов конфигурации, выгрузок конфигураций точек. Rsync представляет собой клиент серверное ПО. В данной схеме master-сервер выступает в роли клиента и синхронизирует каталоги slave-сервера с локальными.
Для активации сервера rsync необходимо в файле /etc/default/rsync
установить значение:
RSYNC_ENABLE=true
В /etc/ нужно создать конфигурационный файл rsyncd.conf
Листинг файла приведен ниже.
[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 = 10.62.8.121 10.62.8.122 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-server:/# chmod 600 /etc/rsyncd.secrets |
Создайте файлы /etc/rsync_client.secrets
, в которых укажите пароль:
root@swlc01-server:/# echo "rspasswd" > /etc/rsync_client.secrets && chmod 600 /etc/rsync_client.secrets |
Операцию синхронизации файлов осуществляет задача cron, в которой выполняется скрипт /usr/lib/eltex-ems/scripts/rsync_ems_backup.sh
. Скрипт запускает rsync клиент и синхронизирует локальные директории с директориями на втором (backup) сервере. Синхронизация запускается только в случае, если сервер в состоянии master.
#!/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@swlc01-server:/# service rsync start |
Для остановки сервиса используется команда:
root@swlc01-server:/# service rsync stop |
Для проверки — запущен ли сервис в данный момент, используется команда:
root@swlc01-server:/# service rsync status |
В ответ последует сообщение:
* rsync is running |
в случае если сервис запущен,или
* rsync is not running |
в случае если сервис не запущен.
Резервирование данных, хранящихся СУБД 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 payments 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 |
Конфигурация самого демона mysqld заключается в настройке параметров ведения бинарных логов. Обозначения первый сервер и второй сервер далее условны, и применяются лишь для обозначения различий в конфигурации сереров.
В секции [mysqld]
файла конфигурации /etc/mysql/mysql.conf.d/mysqld.cnf произвести следующие изменения:
Закомментировать либо удалить строку на обоих серерах:
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 = payments |
binlog-ignore-db = mysql binlog-ignore-db = Syslog binlog-ignore-db = performance_schema binlog-ignore-db = information_schema |
Перезапустить сервис mysql
на каждом сервер и создать БД для репликации.
root@swlc01-server:/# 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 используются (по умолчанию - javauser)
Выдаем им права на внешний доступ на обоих серверах
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password'; |
На первом сервере в консоли MySQL выполнить команду show master status и проанализировать полученные значения:
mysql> show master status \G *************************** 1. row *************************** File: mysql-bin.000001 Position: 00000107 Binlog_Do_DB: eltex_alert,eltex_ems,radius,wireless,eltex_auth_service,payments,ELTEX_PORTAL 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; |
где,
Проверить состояние репликации на втором сервере:
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
репликация выполняется в обе стороны.
Состояние репликации 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" |
где,
HOST1, HOST2
- ip-адреса серверовUSER, PASSWORD
- логин/пароль учетной записи, для работы репликации.После сохранения изменений, состояние репликации можно отслеживать в GUI EMS в разделе Информация → Состояние системы резервирования → MySQL.
Здесь представлены результаты проверки состояния репликации на обоих серверах и краткое резюме по результатам проверки.
В MongoDB репликация осуществляется объединением нескольких (в типовой конфигурации - 3) узлов в Replica Set. Replica Set состоит из одного primary узла и нескольких secondary (подробнее https://docs.mongodb.com/v4.0/administration/replica-set-deployment/). Для упрощения предлагаем схему:
Primary — основной сервер mongoDB.
Secondary — точные копии баз(ы) данных с real-time синхронизацией.
Arbiter — сервер отвечает только за выборы преемника, сам стать преемником он не может, поэтому рекомендуется отдавать под арбитра минимальные ресурсы.
Минимальные характеристики для mongo-db arbiter:
vCore: 1, 64-bit x86 CPUs
vRAM: 2 ГБ
vHDD: 20Гб
Все операции по изменению данных выполняются только на primary. При этом MongoDB автоматически выполняет failover и смену primary на живой узел, если текущий primary выйдет из строя. Но это требует 3+ узлов в replica set.
При конфигурации по умолчанию Replica Set из двух узлов полностью выходит из строя при отказе одного из них (даже secondary). |
В /etc/mongod.conf
на всех узлах:
Добавить/раскомментировать блок
replication: replSetName: "<replica_set_name>" |
где <replica_set_name>
имя replica set, выбирается произвольно, но должно быть одинаково на всех серверах.
Разрешить внешние подключения, прописав в параметре 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" }, { _id: 2, host : "ip_mongo_arbiter:27017,true" } ] } ) |
Через некоторое время, приглашение shell должно смениться на такое:
replica_set_name:PRIMARY> |
Посмотреть конфиг можно командой:
replica_set_name:PRIMARY> rs.config() |
Проверить состояние Replica Set можно выполнив в консоли MongoDB команду rs.status()
Настройку узлов в Replica Set можно выполнять только на PRIMARY
Добавить в Replica Set узел Secondary:
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:
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) |
Между серверами 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 командой
root@swlc01-server:/# 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" : [ ] } |
При использовании кластера PCRF на ESR настройть взаимодействие со всеми нодами кластера используя их реальный адрес.
Необходимо настроить модули SoftWLC на работу с контроллером по virtual ip на обоих серверах. Изменения необходимо внести в приведенные ниже конфигурационные файлы. В целях
mercury.host=localhost mercury.port=6565 mercury.pool.size=100 # Config filePath to cache cache.config=/etc/eltex-apb/ehcache.xml # list of permitted files to hosts.file=/etc/eltex-apb/hosts.json # Timeout waiting for subscribe-request after connecting the access point to the server, in seconds subscribe.idle.timeout=60 # Maximum count of outgoing messages to queue for each session session.outgoingQueue=100 nbi.client.login=admin nbi.client.password=password |
localhost
на <virtual_ip>
в строке 1.
{ "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?waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0", "db_name": "pcrf" }, "mongo.ott" : { "connection_string": "mongodb://localhost:27017/ott?waitQueueMultiple=500&connectTimeoutMS=10000&socketTimeoutMS=0", "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
во всех строках.localhost
на <virtualip>
во всех строках.127.0.0.1
на <virtualip>
во всех строках.auth-service { host = localhost port = 21812 timeout = 10s retries = 3 secret = eltex # pap, chap, mschapv2 protocol = pap } 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 { https { port = 9444 keystorePass = 12345 keystoreFile = /etc/eltex-portal-constructor/localhost.pfx keystoreType = PKCS12 keyAlias = 1 ciphers = [ TLS_RSA_WITH_AES_128_CBC_SHA2 |
localhost
на <virtualip>
в строках 2, 25, 58, 64, 74.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 # wifi-customer-cab mongodb connector wificab.mongodb.enabled=true wificab.mongodb.uri=mongodb://localhost:27017/wifi-customer-cab # Eltex.SORM2.replicator MongoDB 'sorm2' connect sorm2.mongodb.enabled=false sorm2.mongodb.uri=mongodb://localhost:27017/sorm2 # 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 # 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
во всех строках.localhost
на <virtualip>
во всех строках.127.0.0.1
на <virtualip>
во всех строках.#Common gates settings #Current gate used for each type (config name, for example smpp_gate.conf) sms.gate.outgoing.sms.config=smsc_gate.conf #For incoming sms/calls fields for numbers in configs should be set sms.gate.incoming.sms.config= sms.gate.incoming.call.config= #Gate pool settings sms.gate.pool.size=50 sms.gate.pool.wait.millis=5000 #Port to listen for requests server.port=8040 #============================= #=======database settings===== #============================= #mongodb.uri=mongodb://192.168.1.1,192.168.1.2:27017/notification-gw mongodb.host=localhost mongodb.port=27017 #mongodb.user=user #mongodb.password=password mongodb.name=notification-gw #============================= #=======email settings======== #============================= mail.smtp.submitter=test@email.com mail.smtp.password= mail.smtp.auth=true mail.smtp.host=email.com mail.smtp.port=587 mail.smtp.sendpartial=true mail.smtp.starttls.enable=false mail.smtp.connectiontimeout=5000 mail.gate.pool.size=20 mail.pool.wait.millis=10000 |
localhost
на ip_mongo_primary,ip_mongo_secondary
в строке 19.# 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" |
localhost
на <virtualip>
во всех строках.127.0.0.1
на <virtualip>
во всех строках.<?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</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">softwlc</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> <!-- параметры, применяемые при авторизации через eltex-auth-service --> <entry key="radius.auth.address">localhost</entry> <entry key="radius.auth.shareSecret">eltex</entry> <entry key="radius.auth.authPort">21812</entry> <entry key="radius.auth.acctPort">21813</entry> <entry key="radius.auth.timeout.sec">10</entry> <entry key="radius.auth.retries">5</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.rt.ru/</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-g |
mongodb://localhost
на mongodb://ip_mongo_primary,ip_mongo_secondary
в строке 4.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.
Также нужно настроить модули SoftWLC при помощи графического интерфейса.
В разделе Настройки → Интеграция в параметрах PCRF URL, URL NGW-клиента и URL конструктора порталов изменить localhost на виртуальный ip-адрес:
Изменить localhost на виртуальный ip-адрес в разделах настроек:
Системные настройки → Конструктор порталов
Системные настройки → Доступ к NBI
Системные настройки → Доступ к NGW
Системные настройки → Доступ к PCRF
В графическом интерфейсе сервера EMS изменить localhost (либо 127.0.0.1) на виртуальный ip-адрес в следующих разделах:
Администрирование → Настройка сервера → Системные модули → pcrf
Администрирование → Настройка сервера → Системные модули → radius
Администрирование → Настройка сервера → Системные модули → softwlc.nbi
Администрирование → Настройка сервера → Системные модули → system
Администрирование → Настройка сервера → Системные модули → tftpserver