Сообществу доброго времени!
Пару недель назад позвонил мне давний мой клиент и стал жаловаться на низкую производительность 1С и постоянные простои в работе. Жалоба была на то, что SQL перевел базу в режим восстановления и магазин не может продавать (винда, скул, форева!).
Вопрос стоял просто: что делать? В логах сервера были написаны проценты, которые остались до окончания восстановления базы, поэтому спрогнозировать, сколько ждать, было не сложно - часа полтора (неожиданно для базы всего-то в 20 Гиб).
ИСТОРИЧЕСКАЯ СПРАВКА
Где-то в 12-м году мои клиенты решили что-то поменять. До этого система работала на обычных стационарных компьютерах на 1С 7.7 и ТиС 9.2, к которой было прикручено красивое АРМ, штрихкоды и все прочие плюшки.
Я на тот момент уже переехал в стольный град и не мог посвятить клиенту много времени, поэтому было принято решение переходить на УТ 11 с помощью франчей и с моим эпизодическим участием. У 1С как-раз появился прекрасный продукт - мини-сервер на 5 клиентов. В итоге был куплен сервер DELL с Xeon 12XX (3,1GHz в стоке), на борту которого было 4 SAS -диска 2,5" по 320 Гиб и 8 Гиб ОЗУ. Из дисков был собран массив RAID 0+1, была поставлена 2008-я серверная винда (для начала Evolution), был развернут сервер 1С и произведен перенос данных с ТиС 9.2 в УТ 11. Долго франчи ломали головы об 11-ю УТ, но в конце концов все запустилось. Была куплена винда 2012 для малого бизнеса. Потом был куплен сервер SQL 2016 (да, это было после, а по-началу система куртилась на Express'е).
Проблемы начались почти сразу же, т.к. памяти было маловато. Местные продавцы компьютерного железа не смогли подобрать для этого DELL'а памяти, чтобы увеличить ее количество. Сам DELL вообще на вопросы о том, "как бы сделать из г-на конфетку", не отвечал, поэтому (особенно последние пару лет, когда УТ стала толстой и прожорливой, а 1С 8.3 еще толще и прожорливей, не говоря уже об MS SQL 2016, который тоже был толст и прожорлив, а уж какая толстая и прожорливая была венда - вообще молчу) производительность системы оставляла желать лучшего (хотя, если сравнивать с некоторыми моими клиентами по текущему месту работы, у которых на 100 ядрах и невменяемом количестве памяти системы тормозят просто из-за того, что все на виртуалках, а хосты как следует настроить никто не может, то вполне себе ничего).
В общем и целом возникла "революционная ситуация". т.к. при начале тормозов бравые ребятишки просто жамкали кнопку "рестарт" на серваке, а MS SQL после перезагрузки уходил в востановление. Через какое-то время rphost сжирал под 4 гига оператосика, и система снова вставала колом, т.к. скулу оставалось всего 300 метров, и он начинал активно эксплуатировать жесткие диски при каждом запросе из 1С. Остальное, полагаю, держала для себя вечноголодная серверная венда.
ПОЧЕМУ РЕШИЛ ПОСТАВИТЬ UBUNTU И POSTGRES?
Я давно уже дома сижу на Linux'е - с 2008-го года примерно. До того пару-тройку раз знакомство со свободными системами не зашло. Сейчас я весьма уверено пользуюсь Linux: могу без проблем пересобрать ядро, любой софт, примерно понимаю, где какие параметры в ядре и софте крутятся, на что влияют и т.д. До последнего времени я клиентам старался ставить Windows, скул от мелкомягких и прочий софт, с которым, как мне казалось, геморроя будет меньше и специалисты всегда найдутся, которые смогут разрулить проблемы. Но, как оказалось, специалистов сейчас куда больше тех, кто телефоны умеет перепрошивать, а на телефонах винды почти нет - последний виндофн уже, сдается мне, давно продан. Также админы и программеры в последнее время активно начали осваивать Linux, под ту же 10-ю винду появились пакеты с дистрибутивами Linux, мелкософт зашла в СПО в качестве платинового партнера, выпустила свой скул для него, запилила аналогичное винде по функциональности ПО (vs code, skype, ...) - в общем развернулась к Linux'у.
Также участие в конференции PgConf2019 показало, что постгрес - отличное продуктовое решение. Немаловажным было для меня и то, что подготовить новый сервер я мог без дополнительных затрат на софт (да и разучился я винду ставить за последнее время - нет надобности).
ЖЕЛЕЗО
Мы подумали и я решил купить добротный современный компьютер на базе Ryzen 5 2600X (была мысль 2700Х купить, но трезво оценив, что 10-ти пользователям достаточно 4-х ядер, я пошел на компромис - 6-ядерный высокочастотный процессор будет не хуже топового, но при этом на 10к дешевле). В итоге взял достаточно простой (если можно так считать) корпус со стеклянными стенками (фронтальная и боковушка), блок питания с сертификатом 80 PLUS не ниже GOLD и не меньше 500 Вт, мать на базе AMD B450, хороший SSD для системы и базы, и 2 потоковых диска в RAID1 для бэкапов (отлично подошли диски для медиасерверов). Также система была укомплектована 2-мя планками памяти по 8 Гиб (общей емкостью в 16 Гиб) из списка совместимых.
Общий бюджет - 65 килорублей + 620 рублей доставка до соседнего подъезда, в котором находится отделение транспортной компании.
Заказал я все это 1-го апреля, 2-го получил счет, через пару дней его оплатили, а еще через день он уже стоял в соседнем подьезде криво собранный специалистами поставщика (им, видимо, никто не сказал, что память нужно в B1/B2 ставить, а не в A1/B1 - но это мелочи).
СОФТ
В качестве софта установил на систему UBUNTU 18.04 (она отлично ставится с флешки). В ходе установки понял, что память как-то странно работает, после чего запустил memtest и первый баг увидел уже через минуту. Уменьшил частоту памяти и запустил на ночь, после чего уже на низкой частоте поставил систему, установил 1С, установил postgres pro 1C 9.6.11, создал софтовый RAID, заставил его автоматически монтироваться, написал скрипты для бэкапа базы и ее обратного разворота в тестовый контур.
А теперь давайте по-порядку.
УСТАНОВКА ОС UBUNTU 18.04.
Систему я ставил на 970 про - это один из лучших и сравнительно недорогих (12к за 512 МиБ) дисков на рынке (на мой взгляд). Они и быстрый, и холодный, если не нагружать его (в полном тесте Гилева температура контроллера достигала 86оС, но при этом события critical в S.M.A.R.T не отразилось - это видно на картинке, из чего я сделал вывод, что система вполне жизнеспособна).
Не думаю, что стоит останавливаться подробно на том, как ставиться Убунту - куда проще на мой взгляд, чем винда. При установке мой WiFi-свисток был отлично определен и обновления и языковые модули скачались сами собой.
В принципе вся установка сводится к вставке флешки (я ставил с внешнего HDD, который мой отец как-то нашел в зимнем лесу, гуляя там с собачкой), выбору языка, созданию раздела (можно просто "Далее" нажать, отметив "Установить Убунту на этот диск", но я выбрал "nvme0n1p1", указал фаловую систему EXT4 и точку мотирования "/"), ожиданию копирования файлов (если в ходе установки подоткнуться к вайфаю, то вас просят про точку доступа и пароль и помимо копирования файлов еще будут загружены файлы обновления и языковые пакеты), в конце установки нужно указать пользователя, имя компьютера и пароль. Вот и весь квест.
RAID
Как организовать RAID в Linux - об этом можно, полагаю, книги писать, ибо способов неимоверно много. Но я решил пойти самым простым - с помощью пакета mdadm, который отлично подошел для моих нужд.
Как это работает? Очень просто - устанавливаете пакет, инициализируете массив и делаете так, чтобы он автоматически подключался. Давайте пошагово разберемся, что надо сделать.
1. Установим пакет mdadm:
sudo apt install mdadm
Немножко об этой команде и консоли. В Linux очень много вещей можно сделать как через графический интерфейс, так и через консоль. Для запуска консоли достатончо нажать Ctrl+Alt+T - и ее окно появится поверх остальных. В консоли Linux, как в CMD в винде, можно запускать программы, но функциональность консоли Linux по сравнению с виндовой просто на порядки выше. Софт в Linux обычно упорядочен в репозитариях, в которых разные программы и библиотеки связаны отношениями. Устанавливая какую-то программу система самостаятельно установит нужные ей библиотеки и предложит пакеты, которые могли бы быть полезны.
Пакетами программ управляет пакетный менеджер. В разных дистрибутивах используется множетсво разных пакетных менеджеров, управляющих связями и зависимостями пакетов, качающих, устанавливающих и удаляющих программы на компьютер под управлением Linux. В Ubuntu используется менеджер пакетов apt, который состоит из различных утилит, но я пользуюсь в основном командой apt, которая позволяет установить, удалить и обновить программы.
После установки программы обычно она готова к применению. Давайте разберемся, как создать RAID 1 (зеркало) из двух дисков. Если перейти по ссылке выше, то там показан пример создания софтового массива 5-го уровня, а нам нужно 1-го, т.к. у нас всего два диска.
2. Создадим наш RAID-массив:
mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
Понятно, что данную команду нужно запускать под суперюзером (как и установку программы), поэтому или перед командой надо писать "sudo", или нужно написать "sudo -i", что приведет к переходу в терминале к сессии суперпользователя. Вообще, в терминале строка приглашения обычного пользователя заканыичается на "$", а суперпользоватетя на "#", так что имейте ввиду.
3. Глянем состояние массива.
cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
1953364992 blocks super 1.2 [2/2] [UU]
bitmap: 0/15 pages [0KB], 65536KB chunkunused devices: <none>
Состояние у нас "active raid1", т.е. массив активный, состоит из sda1/sdb1.
4. Настроим подключение диска в автоматическом режиме. Для этого я, лично, юзаю графический интерфейс программы управления дисками, которая из коробки идет в Ubuntu. Для этого я клацаю на кнопке меню (9 точек снизу панели программ) и пишу там "диски":
Дальше выбираю раздел, нажимаю кнопку "Расширенные переметры раздела" и выбираю пункт меню "Изменить параметры подключения":
УСТАНОВКА POSTGRES PRO 9.6.11
В принципе тут особо писать нечего - все на сайте Postgres PRO есть. Скопипащу:
apt-get update -y
apt-get install -y wget gnupg2
wget -O - http://1c.postgrespro.ru/keys/GPG-KEY-POSTGRESPRO-1C | apt-key add -
echo deb http://1c.postgrespro.ru/archive/2018_12_06/deb bionic main > /etc/apt/sources.list.d/postgrespro-1c.list
apt-get update -y
if dpkg -s libpq5 2>/dev/null; then apt-get remove -y libpq5; fi
apt-get install -y libpq5=9.6.*.1C.bionic
apt-get install -y postgresql-pro-1c-9.6
Единственное, на что не обращают внимание товарищи с Постгрес.ПРО - это на то, что при попытке поставить тот же "pgadmin3" может внезапно оказаться так, что библиотека "libpq5" будет обновлена, что вызовет удаление постгреса к чертовой бабушке. Для того, чтобы пофиксить это, нужно запретить обновление данной библиотеки таким вот простым способом:
sudo apt-mark hold libpq5
Дальше нужно подкрутить настройки постгреса. Лично я всем советую пользоваться сайтом с pgtune (гуглится по этому слову). На сайте выбираете свой постгрес 9.6, указываете количество памяти и все такое прочее, а в качестве типа базы выбираете что-то типа "online transaction processing system" (по крайней мере я всегда выбираю это).
Дальше я для постгреса создаю нового суперюзера через createuser -s, запуская данную команду из-под пользователя postgres. Как это делается я писал давным-давно - читайте.
УСТАНОВКА 1С
Качаем с клиентского раздела 1С-ного сайта дистриб для debian (64-битный, полагаю, ибо 32 бита - прошлый век). Дальше распаковываем его в какую-нить директорию и пишем волшебные слова:
sudo dpkg -i *.deb
dpkg - это программа, которая устанавливает пакет, проверяя его связи но при этом если связи нарушены, то никакой доустановки не будет. А связи нарушены, ибо части пакетов у нас нет, ибо мы их не поставили.
Я, лично, делаю так (после того, как dpkg сказал мне об ошибке установки):
sudo apt install -f
Данная команда доустановит нужные системе пакеты. Ну и дальше снова звпускаю dpkg (лайфхак: предыдущие команды доступны по стрелке вверх в консоли, а если нажмете ctrl+R, то сможете поискать в истории команд нужную вам).
С 1С-кой все.
БЭКАП
Для бэкапа я создал два скрипта и засунул их выполнение в cron. Фактически, cron - это демон (фоновая программа), который запускает в соответствии с настройками те или иные программы, прописанные в crontab для каждого пользователя. Т.к. скрипты будут запускаться от пользоватяля системы, то под этим пользователем и нужно создать настройку для cron. Делается это так:
crontab -e
Если это произошло первый раз, то система спросит, какой текстовый редактор вы будете использовать, после чего откроет в нем конфигурационный файл cron'а.
В этом файле все просто - указываете минуты, часы, дни и т.д., а в конце - команду. Если нужно выполнять что-то каждый час или день, то вместо дня и часа указываете "*".
Я сделал так:
0 20 * * * /home/jim/bkscript.sh
20 20 * * * /home/jim/rstscript.sh
Т.е. в 20 часов 0 минут у меня запускается bkscript.sh, а через 20 минут - rstscript.sh. Вот содержимое файлов:
bkscript.sh
#!/bin/bash
pg_dump -h localhost -U pguser --format custom -b --section pre-data --section data --section post-data --verbose --file /mnt/backdisk/backup/backup$(date +%Y-%m-%d).bkp ut11
rstscript.sh
#!/bin/bash
pg_restore -d ut11test --clean -h localhost -U pguser --section pre-data --section data --section post-data /mnt/backdisk/backup/backup$(date +%Y-%m-%d).bkp
Да, забыл сказать, что для того, чтобы не морочиться с вводом пароля (кто ж будет вводить его в два часа ночи, да?) нужно создать файл ".pgpass" в домашнем каталоге.
Дальше файлы нужно сделать исполняемыми так:
chmod +x filename
Также я сделал перезугрузку сервисов 1С и Postgres'а в 19:50 так:
sudo crontab -e
Этой командой я редактирую файл настройки cron'а для суперпользователя. В нем что-то типа:
50 19 * * * systemctl restart srv1c83.service
51 19 * * * systemctl restart postgres.service
Но это не точно, так что сами попробуйте найти правильные названия соответствующих сервисов. Если написать что-то типа:
sudo systemctl status srv1c83.service
то есть шанс увидеть, работает ли сервер 1С.
ЗАКЛЮЧЕНИЕ
Скорость работы нового сервера и софта оказалась отличной, надежность, как мне кажется, тоже хорошая. Проблема только в том, что сервер сейчас один и он не особо надежный, но мониторинг показывает, что средняя нагрукза на систему не превышает 2-х процентов, при этом старый сервер был нагружен на винде в среднем на 40%.