LINUX.ORG.RU

Сообщения Goganchic

 

Восстановление данных PostgreSQL

Форум — Admin

Бывает проблема когда кто-то по ошибке или умышленно удаляет WAL-файлы и после этого PostgreSQL не стартует. Понимаю, что без WAL состояние базы неконсистентное. Понимаю, что можно принудительно заставить PostgreSQL стартануть без WAL и попытаться что-то вытащить из базы. Но это все не панацея. Поэтому решил рассмотреть другой путь: чаще всего на моих серверах в качестве файловой системы используется ext4 и xfs.

Решил провести эксперимент:

  1. Поднимаю виртуалку на Rocky 9 (отдельный раздел под /var/lib/pgsql).
  2. Устанавливаю PostgreSQL 16 из стандартных репозиториев.
  3. Создаю пустую базу, в ней таблица с 2 полями, в таблицу помещаю тестовую запись.
  4. Останавливаю PostgreSQL.
  5. Удаляю WAL-файл из /var/lib/pgsql/16/data/pg_wal.
  6. Отмонтирую /var/lib/pgsql.
  7. Пытаюсь восстановиться.

Итог:

  • extundelete не видит удаленный файл (искал по имени и размеру)
  • xfs_undelete не видит удаленный файл (искал по имени и размеру)
  • R-Studio не видит удаленный файл (искал по имени и размеру)

При этом, если создать какой-нибудь текстовый файл и удалить его, то все средства восстановления видят и восстанавливают файл.

Имхо, условия максимально комфортные для восстановления. Что я делаю не так?

 , ,

Goganchic
()

Есть ли альтернативы Netscaler aaa

Форум — General

Хочу открыть в Интернет один внутренний сервис, но сделать это более-менее безопасно. Видел кейсы, где подобное делалось с помощью Netscaler. При этом алогоритм следующий:

  • пользователь хочет зайти на GitLab-инстанс компании;
  • пользователь вводит в браузере gitlab.my-super-mega-corp.com;
  • его перекидывает на Netscaler;
  • Netscaler проверяет наличие какой-то куки и если её нет - предлагает пользователю авторизоваться с помощью логина/пароля/второго фактора (LDAP);
  • В случае успешного логина Netscaler проставляет куку и дальнейшие запросы пробрасывает в целевой сервис (GitLab).

В таком случае мы получаем защиту от перебора паролей, DDOS-атак и т.п. При этом никаких доработок на стороне целевого сервиса (GitLab) делать не требуется.

Замечу, что GitLab - это просто пример, вместо него может быть любая другая система, так что не хочется привязываться к решениям, которые подходят только для GitLab.

Есть ли похожее решение на базе Open Source технологий, например Nginx + что-нибудь? Пытался гуглить, но всё что попадалось имело мало общего с моими хотелками.

 ,

Goganchic
()

Почему браузеры в Linux игнорируют глобальное хранилище сертификатов

Форум — Desktop

Недавно заметил, что браузеры в Linux (Chrome, Firefox) не подхватывают CA, добавленные в /etc/ssl/certs. Погуглил, везде пишут, что браузеры имеют свое собственное хранилище сертификатов. Как добавлять сертификаты в эти хранилища — понятно, но вот почему так сделано — нет. Типичный кейс в средних и больших организациях - добавить свой внутренний CA и выпускать сертификаты внутренних ресурсов, подписанные этим CA. Централизованное хранилище сертификатов Linux в этом случае подходит как нельзя лучше. Почему все браузеры его игнорируют?

 , ,

Goganchic
()

Вспомогательные задачи в Spring-приложении

Форум — Development

Пишу Spring-приложение: обычный Web-сервер, получает данные из базы — рисует HTML-странички. Возникла необходимость реализации нескольких вспомогательных задач, таких как загрузка данных из дампа базы. Раньше в основном разрабатывал на Ruby on Rails и там для задач использовался rake, например, для миграции базы данных нужно было зайти в проект с приложением и набрать rake db:migrate.

Как нечто похожее принято реализовывать в типовом Java-приложении на Spring? На мой взгляд логично было бы передавать параметры при запуске jar-ки, например, если я запускаю приложение без параметров (java -jar myapp.jar), то поднимается Web-сервер, а если с каким-то параметром (java -jar myapp.jar import-dump db.dump), то запускается вспомогательная задача, отрабатывает и завершает проецсс. Или в Spring-приложениях принято делать как-то по-другому?

 ,

Goganchic
()

Что использовать для разработки на Java вместо Idea Ultimate

Форум — Development

Сейчас достаточно сложно с легальной покупкой Idea Ultimate на территории России, поэтому возникает справедливый вопрос: что использовать вместо Idea для разработки типового ынтырпрайз-приложения на Spring? Рассматривал разные варианты, начиная от Idea Community и заканчивая VS Code. Все они имеют свои плюсы и минусы. Хотелось бы услышать у опытных ЛОР-овцев что выбирают они.

 , ,

Goganchic
()

Как связаны колонки shared и cache в выводе free

Форум — Admin

Смотрю состояние памяти на виртуалке:

[user@server ~]$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:          7,5Gi       385Mi       138Mi       4,1Gi       0,0Ki       7,0Gi       2,8Gi
Swap:         1,0Gi       140Mi       883Mi

На виртуалке запущен PostgreSQL, который использует 4Гб shared_buffers. Пытаюсь интерпретировать вывод free.

  • total — объем физической памяти;
  • used — память, выделенная через malloc (used = total - free - shared - buffers - cache);
  • free — свободная память;
  • shared — память под tmpfs и shmget/mmap; buffers — память, используемая для буферизации ввода/вывода;
  • cache — файловый кеш;
  • available — сколько памяти можно получить с учетом free и освобождения части cache.

Возникает вопрос: как связаны колонки shared и cache в выводе? Изначально я думал, что shared никак не пересекается с cache и used + free + shared + buffers + cache должны давать в сумме total. Но в представленном выше листинге видно, что это не так.

 , ,

Goganchic
()

Странности с восстановлением PostgreSQL из бекапа

Форум — Admin

Есть кластер PostgreSQL 15. ОС хоста Rocky 8. Конфигурация кластера: master + реплика. Репликацию настраивал через repmgr. В кластере настроены бекапы с помощью PgBackRest на внешнее S3 хранилище. WAL льется с мастера, файлы данных — с реплики. Все как здесь написано: https://habr.com/ru/articles/518232/.

Если грохнуть базу и восстановить последнее состояние с помощью sudo -u postgres pgbackrest --stanza=cluster restore, то всё отрабатывает как положено.

Хочу протестировать кейс с Point in Time Recovery.

  1. Создаю базу данных.
  2. Наполняю её тестовыми данными.
  3. Делаю полный бекап sudo -u postgres pgbackrest --stanza=cluster --log-level-console=info --type=full backup. Запоминаю время окончания бекапа.
  4. Дропаю таблицу. PostgreSQL делает чекпоинт и отправляет WAL в S3. Хочу восстановиться на момент, когда таблица не была удалена (т.е. WAL, который после бекапа из п.3 восстанавливать не надо).
  5. Останавливаю master и replica systemctl stop postgresql-15.
  6. Удаляю все файлы с master и replica sudo -u postgres find /var/lib/pgsql/15/data -mindepth 1 -delete.
  7. Смотрю в какое время завершился бекап с помощью sudo -u postgres pgbackrest --stanza=cluster info.
  8. Запускаю команду вида sudo -u postgres pgbackrest --stanza=cluster --type=time --target="время-завершения-бекапа" restore.
  9. Запускаю master.
  10. Вижу, что master находится в recovery, поэтому выполняю на select pg_wal_replay_resume();.
  11. С помощью repmgr standby clone наливаю реплику.
  12. Запускаю реплику и повторно регистрирую ее в master: repmgr standby register -F.

Вижу предупреждение вида

WARNING: following issues were detected
  - WAL replay is paused on node "192.168.1.126" (ID: 2) with WAL replay pending; this node cannot be manually promoted until WAL replay is resumed

Вопросы:

  1. Что я делаю не так?
  2. Как поднять реплику после восстановления из бекапа?

 pgbackrest, , repmgr

Goganchic
()

Зависает Redis Sentinel, куда копать?

Форум — Admin

Внезапно обнаружил, что на виртуалке с Rocky 8 завис Redis Sentinel (ставил пакет @redis:6). Выглядит это так:

$ ps ax | grep redis-sentinel
   1209 ?        Dsl   14:09 /usr/bin/redis-sentinel 192.168.1.2:26379 [sentinel]

Статус D — Uninterruptible sleep (usually IO).

Решил посмотреть с помощью lsof что происходит. Теперь у меня есть еще несколько процессов lsof в состоянии D:

sudo ps ax | grep lsof
  51819 ?        D      0:00 lsof
  51820 ?        Z      0:00 [lsof] <defunct>
  51864 ?        D      0:00 lsof
  51865 ?        Z      0:00 [lsof] <defunct>
  51957 ?        D      0:00 lsof -b
  52971 ?        D      0:00 lsof
  52972 ?        Z      0:00 [lsof] <defunct>

Вопрос: как понять на каком именно IO подвис Redis Sentinel и что бы это могло быть?

 ,

Goganchic
()

Почему journalctl потребляет так много места

Форум — Admin

Хочу посмотреть сколько места занимает Systemd лог:

$ sudo journalctl --disk-usage
Archived and active journals take up 9.7G in the file system.

Дамплю все логи в файл и смотрю его размер:

sudo journalctl > logs.txt
ls -lh logs.txt
-rw-rw-r--. 1 user user 679M Dec  4 16:34 logs.txt

Почему так?

 ,

Goganchic
()

В чем фишка Qt Quick

Форум — Development

Изучаю Qt. Вижу, что есть два подхода к разработке приложения: Qt Widgets и Qt Quick. Судя по всему за Qt Quick активно топят. На официальной странице нашел сравнение этих технологий. И вроде как пишут, что Qt Quick для стильных модных молодежных, а Qt Widgets если не Deprecated, то для старперов. На всяких Reddit-ах тоже активно нахваливают QML.

Интуитивно кажется, что Quick потянет за собой либо какой-то встроенный интерпретатор JavaScript, либо какой-то хитрый компилятор, но в любом случае добавит накладные расходы на взаимодействие между JavaScript и C++ кодом. Кажется, что это будет работать медленнее, чем если всё написано сразу на C++.

С другой стороны, если хочется быстрой разработки, чтобы раз-два и в продакшен - это же точно не про C++. Для этого есть Electron или Web в браузере. C++ для GUI, на мой взгляд, имеет смысл выбирать только если хочется максимальной производительности и минимального расхода ресурсов, а сроки разработки не особо важны.

Вижу что Qt пытается запрыгнуть в мобильную разработку, но это тоже как-то странно, когда есть нативные библиотеки, дающие максимальную производительность или Flutter, дающий кроссплатформу.

Поэтому возникает вопрос: какой практический смысл в Qt Quick?

 , ,

Goganchic
()

HAProxy балансировка PostgreSQL не работает external-check

Форум — Admin

Хочу настроить High Available кластер PostgreSQL. Использую repmgr и логическую репликацию. Перед кластером ставлю HAProxy, чтобы клиент цеплялся всегда к одному адресу, а дальше его уже перебрасывало на текущий Master. Использую такой скрипт для определения кто сейчас Master:

#!/bin/bash

PG_MONITOR_USER=haproxy
PG_MONITOR_PASS=qwerty123
PG_MONITOR_DB=haproxy

PG_PSQL=/usr/bin/psql

VIP=$1
VPT=$2
RIP=$3

echo "We are here" >> /tmp/logs.txt

if [ "$4" == "" ]; then
  RPT=$VPT
else
  RPT=$4
fi

STATUS=$(PGPASSWORD="$PG_MONITOR_PASS" $PG_PSQL -qtAX -c "select pg_is_in_recovery()" -h "$RIP" -p "$RPT" --dbname="$PG_MONITOR_DB" --username="$PG_MONITOR_USER")

if [ "$STATUS" == "f" ]; then
  # Master
  exit 0
else
  exit 1
fi

Пользователя в базе создал, при запуске скрипта вручную всё работает.

HAProxy сконфигурировал следующим образом:

global
    log         /var/lib/haproxy/dev/log local0

    chroot      /var/lib/haproxy
    pidfile     /var/run/haproxy.pid
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

    # utilize system-wide crypto-policies
    ssl-default-bind-ciphers PROFILE=SYSTEM
    ssl-default-server-ciphers PROFILE=SYSTEM
    external-check

defaults
    log                     global
    option                  dontlognull
    retries                 3
    timeout queue           1m
    timeout connect         10s
    timeout check           10s
    timeout client          5000s
    timeout server          5000s
    maxconn                 3000

frontend pg_frontend
        log global
        mode tcp
        bind *:5432
        default_backend pg_backend

backend pg_backend
        log global
        mode tcp
        option tcplog
        option external-check
        external-check command /tmp/check_postgresql_master.sh
        server pg1 192.168.56.2:5432 check inter 30s fall 3 rise 3
        server pg2 192.168.56.3:5432 backup check inter 30s fall 3 rise 3

Если попытаться подключиться на адрес HAProxy, то сервер сразу закрывает соединение и ничего не пишет в логи. Если закомментировать external-check, то все работает.

Почему такое может быть? Дистрибутив Rocky 8, PostgreSQL 14, HAProxy из репозиториев. SELinux отключал - не помогло.

 ,

Goganchic
()

Зачем нужен метод roleNames в Qt

Форум — Development

Изучаю Qt по книге Mastering Qt 5 за авторством Guillaume Lazar. Дошел до третьей главы. Автор предлагает реализовать класс AlbumModel для отображения списка альбомов с помощью QListView. Для этого необходимо реализовать два метода rowsCount и data. С помощью этих методов QListView может получить общее количество строк в списке и для каждой строки получить данные для отображения на экране. Абстракция понятна и логична, но возникает вопрос: зачем в модели нужен метод QHash<int, QByteArray> roleNames() const override? Для отображения данных метод судя по всему не используется. Возможно он нужен для какой-то интроспеции, но какой? В документации Qt есть короткий комментарий, который не добавляет ясности:

Returns the model’s role names.

 ,

Goganchic
()

Как правильно устанавливать Qt и QtCreator в Linux?

Форум — Development

Долгое время разрабатывал на JavaScript. Несмотря на то, что во многих дистрибутивах Linux есть какие-то версии Node.JS в репозиториях, обычно разработчики ставят инструменты через специализированные утилиты, типа asdf. Это позволяет установить именно ту версию, что будет в продакшене, а также установить одновременно несколько версий, чтобы иметь возможность использовать разные версии в разных проектах.

Недавно начал посматривать на C++ и Qt. Подскажите, как правильно устанавливать Qt и QtCreator в Linux (Ubuntu 22.04)? Достаточно ли сделать что-то вроде sudo apt install -y qtcreator qtbase5-dev qt5-qmake cmake или есть какой-то более правильный способ?

 ,

Goganchic
()

Почему Redis ест память

Форум — Admin

Есть Redis 6 (Oracle Linux 8). В нем 1.5Гб данных (проверил по размеру дампа и с помощью суммирования значений serializedlength в DEBUG OBJECT по каждому ключу в каждой базе). При этом в памяти он занимает 15Гб. maxmemory и maxmemory-policy в конфиге не указаны. Почему такое может быть и как с этим бороться?

 

Goganchic
()

btrfs на десктопе

Форум — Desktop

Кто пользуется btrfs на десктопе? Подскажите, насколько оно стабильно?

 

Goganchic
()

Что случилось с Amarok?

Форум — Desktop

На днях смотрел какая ситуация с аудиоплеерами в Linux и внезапно обнаружил, что куда-то пропал Amarok: в свежих версиях Ubuntu его нет, на сайте проекта последний релиз датируется 2021 годом. Вроде одно время был самый популярный плеер в KDE. Что с ним стало?

 ,

Goganchic
()

Docker Registry health check

Форум — Admin

Разбираюсь с настройками self-hosted Docker registry. Вижу, что есть опция health для периодических проверок различных подсистем. Результат проверок можно получить по пути /debug/health.

Вопрос: есть ли какой-то смысл во включении этих проверок, если внешнего мониторинга на путь /debug/health нет? Быть может в случае обнаружения проблем Registry как-то пытается их исправить или переходит в какой-нибудь read-only режим, чтобы уменьшить возможные последствия? Или же health check имеет смысл использовать только с внешним мониторингом?

 ,

Goganchic
()

Linux и доменные машины

Форум — General

Часто сталкиваюсь с Linux-доменом, реализованным с помощью OpenLDAP или FreeIPA из некоторого количества Linux-серверов. Это позволяет централизовано создать пользователей и политики доступа. Сервера чаще всего статичны, т.е. имеют фиксированное место в корпоративной сети, а есть ли у кого-то опыт объединения набора пользовательских машин в единый домен, как это делают в коропрациях с Windows-машинами? В отличие от серверов пользовательские машины могут быть мобильны (например, ноутбук, который может забрать домой) и периодически могут не иметь подключения к контроллеру домена. Как в этом случае осуществляется логин на машину?

В общем, тема достаточно обширная. Был ли у кого-нибудь опыт реализации такого? Какие статьи почитать? На какой софт обратить внимание?

 , ,

Goganchic
()

Настройка внешнего Docker Registry в GitLab

Форум — Admin

Пытаюсь разобраться как настроить внешнее Docker Registry в GitLab. Судя по докам Docker Registry можно использовать GitLab как Auth-провайдер. Для этого нужно сгенерировать закрытый ключ и сертификат. При этом GitLab будет подписывать закрытым ключом токены, а Docker Registry с помощью сертификата сможет проверить, что токен действительно сгенерирован GitLab-ом. В доке GitLab-а пишут про пару ключ-сертификат как данное:

A certificate-key pair is required for GitLab and the external container registry to communicate securely. You need to create a certificate-key pair, configuring the external container registry with the public certificate (rootcertbundle) and configuring GitLab with the private key.

При этом не говорят как именно эту пару сгенерировать.

У меня уже есть настроенный предыдущим админом GitLab, в котором уже сгенерированы приватный ключ и сертификат, но я нигде не могу найти ответы на следующие вопросы:

  • как сгенерировать ключ и сертификат?
  • как посмотреть какую-нибудь инфу про ключ и сертификат (возможно с помощью openssl, все мои наивные команды типа openssl x509 -text -noout -in /etc/gitlab/registry-auth.key говорят, что я что-то делаю не так)?
  • как проверить, что сертификат действительно от этого ключа? быть может можно как-то сгенерировать новый сертификат по ключу?
  • есть ли у сертификата и ключа какой-то срок действия? нужно ли мне будет через какое-то время перегенерировать пару заново?

Буду признателен за наводки и полезные ссылки.

 ,

Goganchic
()

Стоит ли ставить Lingeage OS

Форум — Mobile

Недавно узнал о существовании Lineage OS — открытом дистрибутиве Android без Google-сервисов. В интернетах пишут, что Lineage OS дает возможность пользоваться более новой версией Android на телефонах, которым вендор не выпускает обновлений, а также предоставляет ванильную версию системы, без всяких рекламных приложений, которые нельзя удалить (привет Xiaomi). Вот думаю, ставить ли ее на свой 3-летний Xiaomi или нет? Какие могут быть подводные камни кроме отсутствия Google-сервисов? Что там с безопасностью? Не получится ли так, что теперь вместо Google мои данные сливаются какому-нибудь васяну?

Перемещено hobbit из general

 ,

Goganchic
()

RSS подписка на новые темы