Translate

середа, 11 грудня 2013 р.

MySQL/InnoDB one file per table

Після видалення бази данних чи таблиці MySQL розмір файлу ibdata1 не змінюється, що в результаті може призвести до повного заповнення диску. Для вирішення цієї проблеми існує опція innodb_file_per_table, що дозволяє зберігати кожну таблицю в окремому файлі на відміну від стандартної поведінки зберігання таблиць. Як наслідок, при видаленні таблиці, видалиться файл, що відповідає за її вміст та звільниться простір на диску. Опція innodb_file_per_table увімкнена по замовчуванню в Mysql версії 5.6.6 і старше.

Щоб перейти до нового варіанту зберігання таблиць необхідно виконати декілька пунктів. Розглянемо варіант міграції всіх баз на новий метод їхнього зберігання. Перш за все, про всяк випадок, забекапимо всю директорію /var/lib/mysql:

# cd ~
# mkdir backup
# cd backup
# service mysql stop
# cp -ra /var/lib/mysql mysqldata_backup
# service mysql start

Зробимо дамп всіх існуючих баз:

# mysqldump --routines --events --flush-privileges --all-databases > all-db.sql

понеділок, 9 грудня 2013 р.

MySQL/Galera replication with Haproxy balancing

MySQL/Galera - синхронний мульти-майстер кластер для MySQL/InnoDB бази данних, що володіє такими перевагами:
- синхронна реплікація.
- аctive-active мульти-майстер топологія
- читання чи запис на будь-яку ноду кластеру.
- автоматичний контроль членів кластеру: проблемні члени будуть автоматично виключені з діючого кластеру.
- автоматичне (просте) додавання додаткових серверів до кластеру. Зручне масштабування.
- справжня паралельна реплікація, на рівні рядків.

Додам, що звичайна реплікація типу master-master не є синхронною. На активному майстрі всі запити спочатку будуть записані в binlog і лише потім будуть передані на інший пасивний MySQL-майстер (слейв), запити на пасивному сервері можуть виконуватись із значною затримкою. У випадку із Galera запити на кожній ноді виконуються одночасно, або майже одночасно.

MySQL/Galera кластер використовує бібліотеку Galera для реалізації реплікації, що працює через MySQL wsrep API (патчена версія MySQL)



Як я вже згадував Galera допускає запис на будь-яку ноду кластеру, навіть одночасні записи із різних нод в одну таблицю. Все це завдяки алгоритму сертифікації транзакцій:
Логіка алгоритму сертифікації приблизно така: SQL-запити приходить на різні сервери кластеру і якщо вони конфліктують між собою (наприклад, запис в той самий рядок таблиці) відбувається роллбек і послідовне виконання запитів (виправте, якщо я помиляюсь).

вівторок, 12 листопада 2013 р.

Shc: compile bash-script to binary view

Скоріш за все вам навіть це не спадало на думку, проте так, насправді, є можливість скомпілювати bash-скрипт у бінарний вигляд. Щоправда це не зовсім так, адже програма, мова про яку піде далі, спочатку транслює bash-скрипт в Cі-скрипт, а вже потім його компілює. Як наслідок, ніхто і ніколи не побачить того, що було "накостилячено" в скрипті. Проте таким чином також можна заборонити редагування коду чи приховати паролі, котрі вживаються в скрипті і мають бути недоступні всім іншим. 

Ім'я цієї програми Shc і, на щастя, вона відсутня в репозиторіях. Тому зкомпілюємо її :

# wget http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
--2013-11-12 01:40:16--  http://www.datsi.fi.upm.es/~frosal/sources/shc-3.8.9.tgz
Resolving www.datsi.fi.upm.es (www.datsi.fi.upm.es)... 138.100.9.22
Connecting to www.datsi.fi.upm.es (www.datsi.fi.upm.es)|138.100.9.22|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20536 (20K) [application/x-gzip]
Saving to: ‘shc-3.8.9.tgz’

100%[====================================================>] 20 536      --.-K/s   in 0,1s    

2013-11-12 01:40:16 (150 KB/s) - ‘shc-3.8.9.tgz’ saved [20536/20536]

# tar xvfz shc-3.8.9.tgz
shc-3.8.9/CHANGES
shc-3.8.9/Copying
shc-3.8.9/match
shc-3.8.9/pru.sh
shc-3.8.9/shc-3.8.9.c
shc-3.8.9/shc.1
shc-3.8.9/shc.README
shc-3.8.9/shc.html
shc-3.8.9/test.bash
shc-3.8.9/test.csh
shc-3.8.9/test.ksh
shc-3.8.9/makefile

# cd shc-3.8.9

понеділок, 28 жовтня 2013 р.

ZFS filesystem on Linux (configuration and performance)

ZFS (Zettabyte File System) - 128-бітна файлова система, створена в Sun Microsystems в 2004 році. Вона об'єднує концепції файлової системи, менеджера логічних дисків і фізичних носіїв, новаторську структуру даних на дисках, а також просте управління томами зберігання даних. ZFS не без підстав називають найбільш функціональною у світі файловою системою.

Подейкують, що ZFS - це розробка інженерів, котрих перекупив Sun (тепер Oracle) в NetApp, через що це ніби як копія WAFL.
Підтримка файлової системи ZFS у Лінуксі реалізована у якості модуля, адже включити його прямісінько в ядро не дозволяє конфлікт ліцензій GPL v2 та CDDL, під якою і було випущено ZFS.

Часом ZFS докоряють тим, що це не unix-way включати купу можливостей (LVM, Raid та ін) в саму файлову систему, краще щоб кожну роль виконувала окрема програма. Проте з іншої сторони таким чином досягається кращий рівень інтегрованості між собою цих можливостей в одній системі.

Починаючи з травня 2013 (версія 0.6.1) файлову систему вважають готовою для використання в  production ситемах.

Наведу приклад установки і налаштування ZFS-розділу в Ubuntu 12.04.3.  Підтримка ZFS в Debian-подібних системах реалізована через модулі dkms, пакети яких розповсюджуються через ppa-репозиторій. Тож спершу додамо репозиторій і встановимо модулі:

# add-apt-repository ppa:zfs-native/stable
# apt-get update
# apt-get upgrade
# apt-get install ubuntu-zfs

понеділок, 7 жовтня 2013 р.

Установка Redmine (Nginx у якості frontend)

Відносно нещодавно я писав як установити систему управління проектами та відстежування помилок Atlassian Jira. Проте ймовірно вона влаштовує не всіх, адже як кожна річ вона має свої недоліки та і ліцензія на цей програмний продукт коштує зовсім не дешево. Тому як альтернативу я пропоную Redmine, open source рішення на ruby, що є повністю безкоштовним і розповсюджується під ліцензією GPL v2. Варто також зауважити, що Redmine має клієнти під ОС Android та Iphone.

У цій статті піде мова про установку системи управління проектами та відстежування помилок Redmine, що працюватиме під ОС Ubuntu 13.04, у якості веб-серверу будемо використовувати Nginx та Thin (веб-сервер для Ruby).

Почнемо із установки Redmine. Сирці можна скачати багатьма способами: через Git/SVN/Mercurial репозиторій, чи просто як tar.gz чи zip-архів із RubyForge. Подробиці тут http://www.redmine.org/projects/redmine/wiki/Download.

1. Скачаємо Redmine і розпакуємо:

# wget http://rubyforge.org/frs/download.php/77138/redmine-2.3.3.tar.gz
# tar xvfz redmine-2.3.3.tar.gz
# mv redmine-2.3.3 /var/www/

2. У якості бази даних будемо користуватись MySQL. Установлюємо його та переходимо до створення користувача і самої бази:

mysql> CREATE DATABASE redmine CHARACTER SET utf8;
mysql> GRANT ALL PRIVILEGES ON redmine.* TO 'redmine'@'localhost' IDENTIFIED BY 'my_password';


четвер, 3 жовтня 2013 р.

Список контроля доступу Linux (ACL, setfacl)

Класичні права в операційній системі Linux/Unix не такі гнучкі як хотілось би: у випадку коли права на файл/директорію хочеться розподілити якомога точно між багатьма групами користувачів  - вони безсилі. Для реалізації таких складних прав було розроблено ACL (Access Control List - список контроля доступу). Вперше можливіть вести списи ACL було додано в ядрі 2.4.21.

Щоб скористатись розширеними правилами необхідно, щоб файлова система була змонтована із опцією acl. Для цього необхідно або прописати опцію в fstab і перемонтувати розділ:

# vim /etc/fstab
...
# /media/free was on /dev/sda5 during installation
UUID=b0218d9d-3d5b-4598-a8ac-5bf90a0d2090 /media/free     ext4    defaults,acl        0       2
...

Перемонтувати розділ можна таким чином (або просто перевантажити після додавання опцій в fstab):

# sudo mount -o remount /home

У випадку, якщо пакет acl відсутній - варто його встановити:

# apt-get install acl

Але, ймовірно, що він вже проінстальований у вашому дистрибутиві. Перевірити чи файлова система правильно змонтувалась можна так:

# mount | grep sda5
/dev/sda5 on /media/free type ext4 (rw,acl)

Перейдемо ближче до суті. Розглянемо роботу ACL із практичної сторони. Для цього створимо директорію lol і тестового користувача test:

понеділок, 2 вересня 2013 р.

Compile into deb-package

Не всі розробники пропонують бінарні пакети своїх програм і як результат їх необхідно зібрати. Наприклад, я полюбляю користуватись переглядачем фотографій Viewnior та простим регулятором гучності Volumeicon, але вони не розповсюджуються як deb-пакети. Звісно можна виконати установку make install скриптом, але така установка не завжди бажана, адже можуть з'явитись проблеми під час видалення програми і т.п.

Для початку розберемось як перекомпілювати deb-пакет, що наявний в репозиторію Debian/Ubuntu.

Перевіряємо доступність source-репозиторіїв. Якщо вони відсутні - необхідно їх дозволити:

$ grep deb-src /etc/apt/sources.list
deb-src http://us.archive.ubuntu.com/ubuntu/ raring main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-updates main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ raring universe
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-updates universe
deb-src http://us.archive.ubuntu.com/ubuntu/ raring multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-updates multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-backports main restricted universe multiverse
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-security main restricted
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-security universe
deb-src http://us.archive.ubuntu.com/ubuntu/ raring-security multiverse
deb-src http://archive.canonical.com/ubuntu raring partner
deb-src http://extras.ubuntu.com/ubuntu raring main