DevOps by REBRAIN
Открытые практикумы по DevOps, Linux, Golang, Networks, Security Мы на связи: info@rebrainme.com +7 (499) 116-34-68 https://rebrainme.com/ Зарегистрированы в РКН: https://knd.gov.ru/license?id=674db558d793bc0b0b8845ff®istryType=bloggersPermission
Show more📈 Analytical overview of Telegram channel DevOps by REBRAIN
Channel DevOps by REBRAIN (@rebrain_devops) in the Russian language segment is an active participant. Currently, the community unites 28 759 subscribers, ranking 4 611 in the Technologies & Applications category and 22 418 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 28 759 subscribers.
According to the latest data from 29 October, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -102 over the last 30 days and by -4 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 7.79%. Within the first 24 hours after publication, content typically collects 6.50% reactions from the total number of subscribers.
- Post reach: On average, each post receives 2 241 views. Within the first day, a publication typically gains 1 870 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 10.
- Thematic interests: Content is focused on key topics such as dovecot, linux, скрипт, postfix, yandex.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Открытые практикумы по DevOps, Linux, Golang, Networks, Security
Мы на связи:
info@rebrainme.com
+7 (499) 116-34-68
https://rebrainme.com/
Зарегистрированы в РКН: https://knd.gov.ru/license?id=674db558d793bc0b0b8845ff®istryType=bloggersPermiss...”
Thanks to the high frequency of updates (latest data received on 30 October, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
Программа живых классов: 29.09 - Алгоритм траблшутинга 06.10 - Сеть в Linux: путь пакета и размер пакета 13.10 - Процесс внутри cgroup: лимиты, рантайм и пул 20.10 - Kubernetes: трафик и жизненный цикл пода 27.10 - Путь версии: от коммита до продакшена 03.11 - Путь метрики: почему прибор не видит происходящего🟡 Старт — 29 сентября 🎁 Сейчас действует скидка 3 000 ₽, а если вчера ты был на эфире с Васей, у тебя уже есть промокод на 7 000 ₽ ↘️ Узнать подробности и занять место
package main
import (
"fmt"
"log"
"github.com/IBM/sarama"
)
func main() {
config := sarama.NewConfig()
config.Producer.RequiredAcks = sarama.WaitForAll // Ждём подтверждения от всех синхронных реплик (ISR)
config.Producer.Retry.Max = 5
config.Producer.Return.Successes = true
// Инициализируем синхронного продюсера
producer, err := sarama.NewSyncProducer([]string{"localhost:9092"}, config)
if err != nil {
log.Fatal(err)
}
defer producer.Close()
msg := &sarama.ProducerMessage{
Topic: "user-events",
Value: sarama.StringEncoder(`{"event": "login", "user_id": 123}`),
}
partition, offset, err := producer.SendMessage(msg)
if err != nil {
log.Fatal(err)
}
fmt.Printf("[x] Sent to partition %d at offset %d\n", partition, offset)
}
📌 Ключевой момент: WaitForAll ждёт ответа от всех синхронных реплик (ISR). Настройте min.insync.replicas (например, 2 при `replication.factor=3`), чтобы избежать потери данных при отказе одной из реплик.
⚖️ Архитектурный выбор: Что выбрать?
🔹 RabbitMQ — для сложной маршрутизации и точечных задач (обработка заказов, фоновые задачи, отправка писем).
🔹 Kafka — для высокой пропускной способности, логов, аналитики, потоковой обработки и сценариев, где необходимо повторное чтение истории.
🛠 Чек-лист по внедрению асинхронности:
1. Найдите синхронные узлы: Цепочки из 3+ HTTP-вызовов — первые кандидаты на перенос в очередь.
2. Защитите данные (RabbitMQ): Используйте *quorum queues*, *persistent*-сообщения и *publisher confirms*.
3. Обрабатывайте ошибки: Используйте ретраи с экспоненциальной задержкой (джиттером) и уводите неисправимые сообщения в DLQ. Избегайте бесконечных немедленных requeue.
4. Обеспечьте идёмпотентность: Из-за дублирования сетевых пакетов передавайте UUID события и проверяйте по БД/Redis, обрабатывалось ли оно ранее.
5. Мониторьте метрики: Для RabbitMQ отслеживайте *ready/unacked messages*; для Kafka — *consumer lag* и состояние ISR.
🎓 Хотите освоить брокеры сообщений на практике? Открывайте 🔥бесплатный демодоступ🔥:
• RabbitMQ — маршрутизация, кластеризация, DLQ и мониторинг.
• Kafka — партиционирование, consumer groups и тюнинг брокеров.
• Docker — деплой брокеров через docker-compose.
В демодоступе развёрнута полноценная боевая среда. Приходите!
package main
import (
"context"
"log"
"time"
"github.com/rabbitmq/amqp091-go"
)
func main() {
// Подключаемся к RabbitMQ
conn, err := amqp091.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatal(err)
}
defer ch.Close()
// Для критичных данных в продакшене используйте реплицируемую quorum queue.
// Этот сокращённый пример объявляет обычную durable-очередь.
q, err := ch.QueueDeclare(
"order_queue", // name
true, // durable
false, // delete when unused
false, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
log.Fatal(err)
}
body := `{"order_id": 12345, "user_id": 678, "amount": 5000}`
// Создаём контекст для отправки
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
// Включаем publisher confirms: persistent-флага и durable-очереди недостаточно,
// чтобы продюсер узнал, принял ли брокер сообщение.
if err := ch.Confirm(false); err != nil {
log.Fatal(err)
}
confirmation, err := ch.PublishWithDeferredConfirmWithContext(ctx,
"", // exchange
q.Name, // routing key
false, // маршрут - заранее объявленная очередь
false, // immediate
amqp091.Publishing{
ContentType: "application/json",
Body: []byte(body),
DeliveryMode: amqp091.Persistent,
})
if err != nil {
log.Fatal(err)
}
acked, err := confirmation.WaitContext(ctx)
if err != nil {
log.Fatal(err)
}
if !acked {
log.Fatal("broker rejected the message")
}
log.Printf("[x] Confirmed: %s", body)
}
Пример консьюмера (Go, ручное подтверждение):
package main
import (
"log"
"github.com/rabbitmq/amqp091-go"
)
func main() {
conn, err := amqp091.Dial("amqp://guest:guest@localhost:5672/")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
ch, err := conn.Channel()
if err != nil {
log.Fatal(err)
}
defer ch.Close()
q, err := ch.QueueDeclare(
"order_queue",
true,
false,
false,
false,
nil,
)
if err != nil {
log.Fatal(err)
}
msgs, err := ch.Consume(
q.Name,
"", // consumer tag
false, // auto-ack (false - включаем ручное подтверждение)
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
if err != nil {
log.Fatal(err)
}
forever := make(chan struct{})
go func() {
for d := range msgs {
log.Printf("[x] Received: %s", d.Body)
// Обработка сообщения
if err := processOrder(d.Body); err == nil {
d.Ack(false) // Подтверждаем успешную обработку
} else {
log.Printf("[!] Error processing order: %v", err)
// Не делайте бесконечный немедленный requeue: это создаёт горячий цикл.
// В продакшене направляйте сообщение в retry-очередь с задержкой,
// лимитом попыток и последующим переводом в DLQ.
d.Nack(false, false)
}
}
}()
log.Printf("[*] Waiting for messages. To exit press CTRL+C")
<-forever
}
// Заглушка для демонстрации бизнес-логики обработки заказа
func processOrder(body []byte) error {
return nil
}
partprobe # или kpartx — сообщить ядру об изменении таблицы разделов
resize2fs /dev/vdb3 # для ext4
xfs_growfs /mnt/point # для XFS
2. Архитектура LVM
PV (Physical Volume) — диск или раздел, инициализированный под LVM
VG (Volume Group) — пул из одного или нескольких PV
LV (Logical Volume) — раздел внутри VG, на нём создаётся ФС
Пространство делится на экстенты (PE) по 4 МБ — это минимальная единица выделения места.
pvs / pvdisplay
vgs / vgdisplay
lvs / lvdisplay
3. Создание LVM
pvcreate /dev/vde
vgcreate vgnew /dev/vde
lvcreate -n lv01 -L 100M vgnew
lvcreate -n lv02 -L 100M vgnew
lvcreate -n lv03 -L 100M vgnew
mkfs.ext4 /dev/mapper/vgnew-lv01
mount /dev/mapper/vgnew-lv01 /mnt/01
4. Изменение размера LV
Свободное место из VG можно добавить в любой LV независимо от порядка создания.
# в два шага
lvextend -L 200M /dev/vgnew/lv01
resize2fs /dev/mapper/vgnew-lv01
# в один шаг
lvextend -r -L 200M /dev/vgnew/lv02
Увеличивать ФС можно онлайн без проблем. А вот уменьшение почти нигде не поддерживается на лету: ext4 требует размонтирования, XFS не поддерживает вообще.
5. Перенос на RAID-1 без остановки сервисов
Задача: перенести данные с диска /dev/vde (в VG vgnew`) на зеркало RAID-1 из `/dev/vdb1 и /dev/vde.
# 1. деградированный RAID-1 на одном диске
mdadm --create /dev/md127 --level=1 --raid-devices=2 missing /dev/vdb1
# 2. добавляем массив в VG
vgextend vgnew /dev/md127
# 3. переносим данные онлайн — ФС остаётся доступна на чтение и запись
pvmove /dev/vde
# 4. убираем старый диск из VG
vgreduce vgnew /dev/vde
pvremove /dev/vde
# 5. добавляем освободившийся диск в массив — начнётся синхронизация
mdadm --manage /dev/md127 --add /dev/vde
При сбое питания pvmove просто начнётся заново — данные не теряются.
6. Тонкие тома и альтернативы
Thin-тома дают overcommit места: физически занимается только то, что реально записано. Удобно для образов ВМ и снапшотов. Но из VG с thin pool почти невозможно безопасно вывести PV — теряется главное преимущество LVM: гибкая миграция дисков.
ZFS и Btrfs сами совмещают RAID, менеджер томов и ФС — LVM поверх них смысла не имеет.
Ключевые выводы
LVM — стандарт де-факто для серверов на Linux: снимает жёсткие границы классических разделов
lvextend -r расширяет том и ФС одной командой без остановки сервисов; уменьшение — почти всегда офлайн-операция
pvmove переносит данные между дисками онлайн — так можно менять диски или переезжать на RAID без простоя
связка mdadm + LVM — стандартное решение для отказоустойчивости в production
Если хочешь узнать больше, начни с бесплатного демодоступа к практикумам:
🔥Начать Linux Basics
🔥Начать Linux: Анализ производительности и тюнинг
🔥Начать Повышение привилегий в Linux