Биллинговая система Nodeny

Главная категория => Общий раздел => Тема начата: k291 от 22 Апреля 2018, 03:38:07



Название: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 22 Апреля 2018, 03:38:07
Имеется резервный сервер Ubuntu+radius+Mikrotik. БР реплицируется по Master-Slave(резервный сервер).
Настраивают радиус по инструкции. При запросе с Mikrotik`a, ответ:
Цитировать
rad_recv: Access-Request packet from host 217.10.55.66 port 55867, id=216, length=129
Threads: total/active/spare threads = 5/0/5
Waking up in 0.9 seconds.
Thread 4 got semaphore
Thread 4 handling request 0, (1 handled so far)
        NAS-Port-Type = Ethernet
        NAS-Port = 2206959593
        Calling-Station-Id = "1:e4:8d:8c:b8:c6:83"
        Framed-IP-Address = 10.0.1.82
        Called-Station-Id = "dhcp_1_24"
        User-Name = "E4:8D:8C:B8:C6:83"
        User-Password = ""
        NAS-Identifier = "Sap"
        NAS-IP-Address = 217.10.55.66
# Executing section authorize from file /etc/freeradius/sites-enabled/nodeny
+group authorize {
rlm_sql (sql): Reserving sql socket id: 4
[sql]   expand: call radcheck('%{User-Name}') -> call radcheck('E4:8D:8C:B8:C6:83')
rlm_sql_mysql: MYSQL check_error: 1305 received
rlm_sql_getvpdata: database query error
[sql] SQL query error; rejecting user
rlm_sql (sql): Released sql socket id: 4
++[sql] = fail
+} # group authorize = fail
Using Post-Auth-Type Reject
  WARNING: Unknown value specified for Post-Auth-Type.  Cannot perform requested action.
# Executing group from file /etc/freeradius/sites-enabled/nodeny
Delaying reject of request 0 for 1 seconds
Going to the next request
Thread 4 waiting to be assigned a request

Все делаю правильно, повторял действия по инструкции несколько раз. Ответ один и тотже. Сервер MASTER, настроен по аналогии, но все работает как надо.
Подскажите, что не так?


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Cell от 22 Апреля 2018, 16:47:16
ну проверьте mysql клиентом с этого таза вызов
call radcheck('E4:8D:8C:B8:C6:83');
Пишет же что в нем ошибка sql


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 23 Апреля 2018, 03:20:55
Пробовал.
Вот ответ:
Код:
mysql> CALL radreply('E4:8D:8C:B8:C6:83', 'dhcp_1_24');
+------+-------------------+-------------------+-----------+---+
| NULL | login             | Framed-IP-Address | usr_ip    | = |
+------+-------------------+-------------------+-----------+---+
| NULL | E4:8D:8C:B8:C6:83 | Framed-IP-Address | 10.0.1.82 | = |
+------+-------------------+-------------------+-----------+---+
1 row in set (0,01 sec)

+------+-------------------+-----------------+-----+---+
| NULL | login             | Session-Timeout | 600 | = |
+------+-------------------+-----------------+-----+---+
| NULL | E4:8D:8C:B8:C6:83 | Session-Timeout | 600 | = |
+------+-------------------+-----------------+-----+---+
1 row in set (0,01 sec)

Query OK, 0 rows affected (0,01 sec)
И выдает новый адрес:
Код:
mysql> SELECT get_ip_by_tag('1', 'dhcp_1_saperka24');
+----------------------------------------+
| get_ip_by_tag('1', 'dhcp_1_saperka24') |
+----------------------------------------+
| 10.0.1.201                             |
+----------------------------------------+
1 row in set (0,01 sec)
Радиус запущен. И перезагружал:
Код:
ps aux | grep radi
freerad  25362  0.0  0.1 479884  6184 ?        Ssl  04:15   0:00 /usr/sbin/freeradius
root     25441  0.0  0.0  15476  1024 pts/8    S+   04:16   0:00 grep --color=auto radi

При при таком запросе с консоли, Radius не выдает ошибок:
Код:
root@vps:~# radtest E4:8D:8C:B8:C6:83 '' 127.0.0.1 0 hardpass5
Sending Access-Request of id 243 to 127.0.0.1 port 1812
        User-Name = "E4:8D:8C:B8:C6:83"
        User-Password = ""
        NAS-IP-Address = 127.0.1.1
        NAS-Port = 0
        Message-Authenticator = 0x00000000000000000000000000000000
rad_recv: Access-Reject packet from host 127.0.0.1 port 1812, id=243, length=20
А при дебаге, ошибка sql.


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 23 Апреля 2018, 04:00:26
Пробовал перезалить базу вручную через консоль, взяв с рабочего сервера. Результат тот же.
Пере создавал процедуру, проблема осталась.
У человека с форума была подобная проблема, причина в кодировке. Менял кодировку, вручную писал правила. Не помогло.


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: ser970 от 23 Апреля 2018, 08:00:01
из радиуса
call radcheck('%{User-Name}') -> call radcheck('E4:8D:8C:B8:C6:83')
и из консоли
CALL radreply('E4:8D:8C:B8:C6:83', 'dhcp_1_24');

вам не кажется то разные ?

попробуйте из консоли мускула
call radcheck('E4:8D:8C:B8:C6:83');


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 24 Апреля 2018, 21:22:21
Вот вывод с резервного сервера, на котором ошибка:
Код:
mysql> call radcheck('E4:8D:8C:B8:C6:83');
ERROR 1305 (42000): PROCEDURE nodeny.radcheck does not exist
А это с центрального:
Код:
mysql> call radcheck('E4:8D:8C:B8:C6:83');
+------+-------------------+--------------------+-------+----+
| NULL | login             | Attribute          | Value | := |
+------+-------------------+--------------------+-------+----+
| NULL | E4:8D:8C:B8:C6:83 | Cleartext-Password |       | := |
+------+-------------------+--------------------+-------+----+
1 row in set (0,01 sec)

Query OK, 0 rows affected (0,01 sec)

Дело в том, что между центральным и резервным серверном, настроина репликация Master-Slave. + делал перенос дампа базы. А в ответ "PROCEDURE nodeny.radcheck does not exist"

Пересоздал процедуру, теперь есть ответ на резервном.


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: ser970 от 24 Апреля 2018, 21:31:51
все зависит от тогда как настраивали и делали и зарворачивали бекап....

з.ы.ну так создайте процедуру ...


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 24 Апреля 2018, 21:43:05
если делал бекап скриптом из поставки с нодени, то он дампит только таблицы и въюхи!
вот инструкция : https://ruhighload.com/Как+настроить+mysql+master-slave+репликацию%3f (https://ruhighload.com/Как+настроить+mysql+master-slave+репликацию%3f)

только перед 4. шагом слей дамп с мастера на слейв, я использую scp
Код:
scp /directory1/filename1 usern@destination_host:/directory2/filename2


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 24 Апреля 2018, 21:47:26
или на мастеере сделай експорт всех функций и процедур, и импортируй их на слейве
перед импортом  на слейве нужно выполнить
Код:
ALTER DATABASE nodeny CHARACTER SET utf8 COLLATE utf8_general_ci;


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: ser970 от 24 Апреля 2018, 21:48:57
может проще было делать дамп с -R


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 24 Апреля 2018, 22:10:09
тоже не мог сначала понять в чеп трабла, потом увидел отсутствие процедур - сделал.
затем ошибки мускула типа несовместимые кодировки для сравнения
сейчас работает следущая схема:

db1<=>db2->db3
master1<=>master2->slave3(delay 12h)
1 и 2 мастер мастер (основной сервер 1, второй на горячую замену)
3 - слейв  с задержкой в 12 часов

+ ко всему мониторинг

если упал 1, на его место стает 2, когда подняли первый,  он бегом с восстанавливается, и лишь за тем он становится обратно 1;
если мастера не упали  а посыпались кретические таблицы но мускул работает, тут приходит на помощь слейв с задержкой =
мониторинг трубит проблему и остонавливает репликацию на мастерах, и у вас есть 11.5 часов на поднятие мастеров с слейва (для быстроты слейв 3 стает мастером а мастер 1 стает слейвом)

минус такой схемы = слейв пишет с мастер2, а что если он упадет ( но мастер2 резервный и не нагружений, поетому риск его падения минимален)

успехов


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 25 Апреля 2018, 23:08:44
Всем спасибо!
Действительно, при переносе БД не перенес процедуры.
Помогло:
Код:
mysqldump --routines -R -u root -p nodeny > nodeny.sql
А именно "--routines -R"
Если надо перенести только процедуры и тригеры(Полезно когда таблица уже созданы):
Код:
mysqldump --routines -R --no-create-info --no-data --no-create-db --skip-opt -u root -p nodeny > nodeny_procedury.sql

Импортируется дамп как обычная БД:
Цитировать
mysql -u root --password='hardpass' nodeny < nodeny.sql


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: ser970 от 25 Апреля 2018, 23:56:19
только 


Цитировать
mysqldump --routines -R -u root -p nodeny > nodeny.sql

-R, --routines      Dump stored routines (functions and procedures). это одно и тоже

зачем два раза указывать ?

и если куда то переносить надо то сразу и в архив

где то так
mysqldump  -R -u root -p nodeny  | gzip > nodeny.sql.gz 


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 26 Апреля 2018, 08:53:42
Код:
-R, --routines      Dump stored routines (functions and procedures).
не знал, спасибо


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: ser970 от 26 Апреля 2018, 10:27:56
можно сделать чуть красивее...

в my.cnf
в секцию
[mysqldump]
routines=TRUE


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 26 Апреля 2018, 22:14:46
А что Вы делаете, когда появляется ошибка:
Цитировать
                   Last_Errno: 1032
                   Last_Error: Could not execute Update_rows event on table nodeny.auth_now; Can't find record in 'auth_now', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000228, end_log_pos 37949
Можно пропустит ошибку:
Код:
mysql> SET GLOBAL SQL_SLAVE_SKIP_COUNTER=37949; START SLAVE;
Где 37949 номер ошибки. Команда выше, пропускает ошибку 37949
Но пропускать не хорошо, можно что-то важное не реплицировать.

На мастер и на свейв, auth_now одинаковые: Но разные id, start, last у IP и некоторое отсутствие данных в properties
Цитировать
mysql> DESCRIBE auth_now;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | bigint(20)       | NO   | PRI | NULL    | auto_increment |
| ip         | varchar(15)      | NO   | UNI | NULL    |                |
| start      | int(10) unsigned | NO   | MUL | 0       |                |
| last       | int(10) unsigned | NO   | MUL | 0       |                |
| properties | text             | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 26 Апреля 2018, 22:41:44
для правильной репликации желательно полностью  остановить мастер или лок бд.
1) на настроеном мастере: ресет мастер; лок таблес; шов мастер статус;
2) дамп бд, перенос на слейв, развертивание, запуск слейва
3) на мастере анлок бд

это нужно для того что бы от мастер ресет и до анлок дб не производилось никаких записей в мастер,
иначе ошибок не избежать, особенно с auth_now и auth_log т.к. в этих таблицах большая текучка данных (молчу про таблицы трафика)

у нас при переносе бд (за 8 минут) на 15 тышь абонов, ошибок связаных с auth_now и auth_log (других ошибок не было) около 3 000,
а так помог скриптик который скипал эти ошибки если они связаны были с auth_now или auth_log


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 26 Апреля 2018, 22:45:56
На мастер и на свейв, auth_now одинаковые: Но разные id, start, last у IP и некоторое отсутствие данных в properties

если разные id то это уже другая запись


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 28 Апреля 2018, 01:47:56
Большое спасибо! Помогло.
Ниже напиши инструкцию. Надо бы ее в wiki добавить.
________________________________________________________________________________________
Репликация Master-Slave с учетом постоянно активных таблиц auth_now и auth_log. -"это нужно для того что бы от reset master; и до UNLOCK TABLES; не производилось никаких записей в мастер":

ДЕЛАЕМ на МАСТЕР:
Шаг 1: Включаем репликацию на центральном сервере(Master):
Код:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Рас комментируем:
Цитировать
server-id = 1 - цифра должна быть уникальной. На мастере 1, на слейве 2 и т.д.
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = nodeny - указываем БД резерва.можно за комментировать, чтобы резервировать все базы
binlog_do_db = example1 - указываем БД1 резерва.можно за комментировать, чтобы резервировать все базы
bind-address = 217.10.20.1- надо указывать адрес внешнего интерфейса, инача не откроется порт наружу(в интернет)

Код:
/etc/init.d/mysql restart


Шаг 2: Права на репликацию
Далее необходимо создать профиль пользователя, из под которого будет происходить репликация. Для этого запускаем консоль:
Код:
mysql -u root --password='hardpass'

Далее создаем и назначаем права пользователю для реплики:
Код:
GRANT REPLICATION SLAVE ON *.* TO 'slave_user'@'%' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;
# даем права пользователю slave_user с паролем password

Перезагружаем Мастер БД:
Код:
reset master;

Блокируем изменения в БД:
Код:
USE nodeny;
FLUSH TABLES WITH READ LOCK;

Смотрим статус Мастера:
Код:
SHOW MASTER STATUS;

Шаг 3: Дамп базы
Заходим через другую консоль, делаем дамп БД архивируем:
По умолчанию переносится только таблица и структура, для переноса процедур и тригеров надо добавить -R
Код:
cd /var/backups &&
mysqldump -R -u root --password='hardpass' nodeny > nodeny.sql &&
tar -czvf nodenyBD_280418.tar.gz nodeny.sql &&
cp nodenyBD_280418.tar.gz /usr/local/nodeny/htdocs/



ДЕЛАЕМ на СЛЕЙВ:

Шаг 4. Настройка Слейва
Код:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
Раскоментируем:
Цитировать
server-id = 2 - цыфра должна быть уникальной. На местере 1, на слейве 2 и т.д.
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = nodeny - указываем БД резерва.можно за комментировать, чтобы резервировать все базы
binlog_do_db = example1 - указываем БД1 резерва.можно за комментировать, чтобы резервировать все базы

Шаг 5:
Качаем БД с мастера на слейв и разархивируем:
Код:
wget my-sayt.net/htdocs/nodenyBD_280418.tar.gz &&
tar -xvf nodenyBD_280418.tar.gz -C /path/to/folder


Шаг 5.1: Создание базы на слейве
В консоли mysql на Слейве создаем базу с таким же именем, как и на Мастере:
Код:
mysql -u root --password='hardpass'
CREATE DATABASE nodeny;
quit;

После этого загружаем дамп (из bash):
Код:
mysql -u root --password='hardpass' nodeny < nodeny.sql



Шаг 6. Запуск Слейва
Код:
mysql -u root --password='hardpass'

Включаем репликацию на Слейв, указать параметры подключения к мастеру. В консоли mysql на Слейве необходимо выполнить запрос:
Код:
CHANGE MASTER TO MASTER_HOST='217.10.20.1',MASTER_USER='slave_user', MASTER_PASSWORD='password';

После этого запускаем репликацию на Слейве:
Код:
START SLAVE;

Осталось:
Возвращаемся в консоль mysql на Мастер:
Разблокируем БД:
Код:
UNLOCK TABLES;


______________________________________________________________________
Пометки:
START SLAVE; - запуск слейва
STOP SLAVE; - если надо остановить
SHOW SLAVE STATUS\G - статус репликации
# Должны быть значения Yes в:
#      Slave_IO_Running: Yes
#   Slave_SQL_Running: Yes
        иначе смотри какая ошибка.
Ошибку можно пропустить, но лучше этого не делать:
mysql> STOP SLAVE; SET GLOBAL SQL_SLAVE_SKIP_COUNTER=25037950; START SLAVE;
Где 25037950 номер ошибки.


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 28 Апреля 2018, 14:02:24
bind-address = 217.10.20.1- надо указывать адрес внешнего интерфейса, иначе не откроется порт наружу(в интернет)

кроме того нужно проверить параметр skip-networking и закоментировать при наличии
bind-address =  0.0.0.0 // так откроются для любого внешнего адреса
а сам доступ к базе ограничить правами юзеров, тогда можно организовать схему мастер - мульти-слейв(мастер)

а так инструкция хорошая





Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 01 Мая 2018, 11:29:00
ради теста, выключил mysql на слейве на 20минут. При запуске получил ошибки:
Цитировать
Last_SQL_Error: Could not execute Write_rows event on table nodeny.pays; Duplicate entry '25089' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000008, end_log_pos 78911415
Цитировать
Last_SQL_Error: Could not execute Update_rows event on table nodeny.auth_now; Can't find record in 'auth_now', Error_code: 1032; handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.000001, end_log_pos 11512

Я предполагаю, что будут вечные проблемы с таблицами подобной auth_now.
Как вы решили данную проблему?


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: Redmen от 04 Мая 2018, 08:12:44
у нас нет такой проблемы.


Название: Re: Ubuntu(БД репликация Master-Slave)+radius+Mikrotik - database query error
Отправлено: k291 от 05 Июня 2018, 10:30:47
Периодически выскакивает ошибка:
Цитировать
Last_Errno: 1051
                   Last_Error: Error 'Unknown table 'nodeny.X2018_3_22'' on query. Default database: 'nodeny'. Query: 'DROP TABLE `X2018_3_22` /* generated by server */'
Из за этого, останавливается репликация.
Решение:
Чтобы автоматически пропускать ошибки, делаем:
nano /etc/mysql/mysql.conf.d/mysqld.cnf
в секцию
[mysqldump]
slave-skip-errors=1062,1032,1051
1032 -
1051 - отсутствует таблица
1062 - Такая ошибка в Mysql происходит по причине того, что на реплике уже существует запись, которая пришла с мастера.

Перезагружаем mysql