Хочу предоставить публике пищу для размышлений. Это децентрализованное авторитетное хранилище имен и адресов Интернет. Это не только ценный мех распределенная авторитетная DNS, но вообще глобальная база ключ/значение со стрероидами с неймспейсами. Сюда влезут и айпихи =)
Это DIANNA. Decentralized Internet Assigned Names and Numbers Authority.
Проектируется с замашкой на всю базу данных ICANN, IANA и всех RIR’ов и LIR’ов. Мы порвем ICANN =)
Первичная цель – дать авторитетную DNS систему анонимным сетям, заодно дать отсосать копирастам =)
В текущем виде существует в виде дизайн-концепции, вынесенной на публичное обсуждение.
Кто хочет продемонстрировать извилины, welcome on board!
Тут надо было в два часа ночи продержаться не засыпая еще два часика до четырех. После этого следовало обработать кое какое событие и дальше спать. Но спички в глазах уже ломались и я стал нервно шарить вокруг в поисках мобильника, дабы включить будильник. Мобильника я не нашел. Задумался… «Есть ли будильник в линуксе?» – спросило само себя тухнущее сознание сисадмина. Уже автоматически стал открывать вкладку хрома, как вдруг нашло озарение. Открываю терминал, пишу…
#!/bin/bashwhile/bin/true ; do/usr/bin/mplayer"/home/user/music/cf/Cradle Of Filth - Nymphetamine.mp3"sleep5done
Сохраняю, ставлю в крон на нужное время и спаааааать. mplayer в списке процессов я смогу покилять точно когда проснусь.
В общем нужно было проверять Nagios’ом не только порт фтп на удаленном хосте, но и работоспособность определенного аккаунтa FTP. Т.е. чтобы check_ftp заходил на FTP сервер и логинился под определенным юзером.
Существующая утилитка check_ftp из набора Nagios Plugins на момент написания статьи не умела делать логин. Точнее утилитки как таковой там и нет, там просто стоит симлинк check_ftp -> check_tcp.
По сему утилитка была написана на Perl с использованием и .
Может так же использоваться как пример написания Nagios Plugins на Perl в виду простоты кода.
Сырец:
Пользоваться так.
1. Скопировать в диру с плагинами Nagios
2. Поставить чмод 755
3. Убедиться что стоят перловые модули Net::FTP и Nagios::Plugin (т.е. запустить утилитку и если все ок, она выдаст USAGE)
Имеем: высоконагруженый MySQL сервер с таблицами объёмом более 20 Гб.
Требуется: ежедневное резервное копирование на удавленный хост с шифрованием данных
Условия: процедура бекапа не должна ни коим образом сказаться на производительности MySQL во время проведения оной.
Итак, mysqldump отпадает автоматически, ибо локи таблиц там испортят нам весь аптайм. Выбор пал на технологию LVM снэпшотов, доступную в любом линуксе, утилитку шифрования gpg, а так же IO scheduler CFQ.
Итак, подготовка.
1. Подготовка LVM.
Нам нужна LVM группа с необходимым свободным местом для:
Баз MySQL
LVM снэпшота
Т.е. объема свободного пространства в группе LVM должно быть под базы + где-то 10-20% (в зависимости от тяжести IO записи работы с базами).
Создаем LVM Physical Volume на девайсе /dev/sda2 (у меня /dev/sda это RAID5 из 6 SAS дисков, sda2 можете заменить на свой девайс):
pvcreate /dev/sda2
Создаем Volume Group с именем vg0 на /dev/sda2:
vgcreate vg0 /dev/sda2
Теперь надо создать в группе vg0 логический том (Logical Volume) под партицию MySQL таблиц с именем mysql. У меня эта партиция занимает 500 Гб. При этом важно оставить в группе vg0 10-20% свободного места, не занятого логическими томами, дабы было возможно делать снэпшоты.
lvcreate -L 500G -n mysql vg0
Теперь наш девайс будет виден в:
/dev/mapper/vg0-mysql
/dev/vg0/mysql (symlink)
2. Подготовка ФС
Это, думаю, умеют делать все. Но на всякий напишу.
Дальше любимым путем переносим на этот раздел (/mysql/myisam) свои базы.
3. Подготовка MySQL
Надо пропатчить RC-скрипт MySQL для выделения высокого приоритета IO, дабы наша мышца не сдулась в ходе интенсивного бекапа.
Так же следует заметить, что я использую IO scheduler CFQ. Если у вас не CFQ, то можно забыть про приоритеты IO. Узнать/Выставить IO scheduler на девайсе можно в файле:
/sys/block/sda/queue/scheduler
(sda заменить на ваш девайс)
Смысл патча в том, чтобы после старта MySQL отдавать ему высокий приоритет IO в CFQ. Патч на CentOS 5 RC скрипт /etc/init.d/mysqld . Думаю, народ разберется.
4. Подготовка авторизации
Я буду делать бекап через кучу пайпов. Причин две:
Так проще
tar накидывается на дисковое IO с меньшим энтузиазмом когда пишет в пайп | gpg | ssh, чем когда пишет на диск.
Конечно, это увеличивает продолжительность бекапа. Но и уменьшает вероятность затыка MySQL на время бекапа.
А по сему, мы создаем с хоста MySQL (юзер root) на ваш некий бекап-хост user@backup.remotehost.com.
5. Скрипт бэкапа
Собственно скрипт состоит из двух частей. Я их сложил оба в /root/scripts/. И в скрипте backup.shиспользуется этот путь.
1.
Этот скрипт делает сброс таблиц MySQL на диск с READ LOCK. После лока он создает снэпшот тома /dev/vg0/mysql и после этого отпускает лок MySQL.
Скриптик это служебный, используется он из скрипта backup.sh.
В нем нужно поменять в строке коннекта к MySQL данные для коннекта рутового юзера к локальному серверу:
А именно на 30G – это размер LVM снапшота. Нам он нужен на время бекапа, и размер снапшота должен превышать тот максимальный объем данных, которые MySQL сможет записать за это время на диск. Ну и конечно, в группе LVM vg0 должно быть именно столько или больше свободного места. 30G в общем за глаза.
2.
А это именно тот скрипт, который будет запускаться из крона.
Он запускает backup.php для снятия снапшота, монтирует снапшот в указанную директорию, тарит раздел с таблицами, кидает это все в пайп к gpg для шифрования по алгоритму AES256 с симметричным ключом и кидает дальше в пайп ssh, который уже на удаленной стороне складывает с помощью dd все это хозяйство в файл бекапа с временной меткой. Фух.
Далее он размонтирует снапшот и удаляет его.
Если кто успел заметить, используется утилита gpg для шифрования симметричным ключом, который расположен в файле $keyfile. Данный файл должен содержать около 20 случайных ASCII символов одной строкой. Стоит заметить что нужно создать этот файл раз и навсегда и сохранить где то у себя его копию, поскольку расшифровать бекап можно будет только с его помощью. А сделать это можно будет сделать командой:
gpgpath – путь к gpg, с завершающим слешем vgname – имя группы LVM, содержащей том с таблицами MySQL lvname – имя тома создаваемого снапшота partitionlvname – имя тома с таблицами MySQL в группе $vgname mntpoint – директория для монтирования снапшота remotehost – юзер и хост для удаленного бекапа (см. пункт 4) f — имя файла, в который на удаленной стороне будет складываться шифрованный бекап
Собственно, все. Удачного дебага всего этого хаоса что выше ))
Потребовалось мне вытянуть сообщения из базы ICQ Lite. К моему удивлению это оказалось довольно просто, ибо база имеет формат SQLite3.
База лежит в C:\Documents and Settings\Username\Application Data\ICQ\UIN\Messages.qdb
Где Username – имя пользователя винды, UIN – числовой ICQ идентификатор.
и копируем его в C:\Windows
Пуск -> Выполнить: cmd.exe
Делаем CD в директорию базы, выполняем «sqlite3 Messages.qdb». Смотрим «.schema». Все месаги содержатся в таблице Messages. Поле «fromUser» пустое если сообщение от вас и содержит идентификатор корреспондента, если сообщение шло к вам, то это поле содержит кто писал сообщение. Поле participantsHash это Foreighn Key на таблицу Participants, откуда джойном можно вытянуть к кому было направлено сообщение.
Поскольку сообщение может быть отправлено к нескольким людям, тут связь бесконечность-к-одному.
По этому следующий запрос вытянет все сообщения из БД
sqlite> select p.userId,m.* from Messages m inner join Participants p on m.participantsHash=p.participantsHash;
Можно вытянуть конкретную свою переписку с идентификатором 11111:
sqlite> select p.userId,m.* from Messages m inner join Participants p on m.participantsHash=p.participantsHash WHERE m.fromUser=111111 OR p.UserId=111111;
Однако база вообще в UTF-8 формате, по этому в командной строке вы увидите кучу говна. Советую экспортировать это в файл, а потом уже его читать редактором, понимающим UTF:
C:\blah> sqlite3 -html Messages.qdb «select p.userId,m.* from Messages m inner join Participants p on m.pa
rticipantsHash=p.participantsHash WHERE m.fromUser=111111 OR p.UserId=111111″ > perepiska.html
В основном это касается Virtual Dedicated Server (VDS/VPS), т.к. дефолтная установка MySQL на CeontOS/Fedora/RHEL с дефолтным my.cnf делает malloc на сотню с лишним мегабайт.
Конечно на потребляемую память MySQL влияют такие параметры как key_buffer, query_cache_size и т.п. Но они по дефолту идут минимальные, а кеш запросов вообще по моему отключен по дефолту.
Так вот все очень просто. Добавляем в my.cnf:
skip-innodb
skip-bdb
Это выключит хандлеры InnoDB и BerkeleyDB и всю потребляемую ими память. Ну конечно делать это нужно если вы не используете вышеприведенные типы таблиц.
Далее рестартуем мускуль и видим в топе что он занимает десяток-другой мегабайт.
PS: в большинстве случаев не помешает опция и skip-networking. А вот thread_cache_size я советую поставить в значение 5-15 (в зависимости от нагрузки)