Архив метки: PostgreSQL

Настройка репликации PostgreSQL в контейнерах Docker

Мы рассмотрим процесс поднятия двух контейнеров с PostgreSQL и настройки репликации данных между ними. Использовать будем систему на базе Linux, однако, сам процесс настройки Docker и репликации не зависит от операционной системы.




Подготовка компьютера




На компьютере, где мы будем запускать наш кластер баз данных должен быть установлен Docker. Также мы сразу рассмотрим развертывание нужной нам инфраструктуры в docker-compose. Для установки необходимой одноименной платформы смотрим инструкцию Установка Docker на Linux.




После мы можем переходить к поднятию контейнеров.




Запуск контейнеров с СУБД




Как говорилось выше, мы будем поднимать наши контейнеры с помощью docker-compose.




Создадим каталог, в котором будем работать:




mkdir -p /opt/docker/postgresql




Переходим в него:




cd /opt/docker/postgresql




Создаем файл для docker-compose:




vi docker-compose.yml




---



services:



  postgresql_01:

    image: postgres

    container_name: postgresql_01

    restart: always

    volumes:

      - /data/postgresql_01:/var/lib/postgresql/data

    environment:

      POSTGRES_PASSWORD: postgres024



  postgresql_02:

    image: postgres

    container_name: postgresql_02

    restart: always

    volumes:

      - /data/postgresql_02/:/var/lib/postgresql/data

    environment:

      POSTGRES_PASSWORD: postgres024




* рассмотрим некоторый опции подробнее:







Запускаем наши контейнеры:




docker-compose up -d




Мы должны увидеть:




Creating postgresql_02 ... done

Creating postgresql_01 ... done




А если вывести список контейнеров:




docker ps




… мы должны увидеть наши два.




Теперь можно переходить к настройке репликации.




Настройка репликации




Условимся, что первичный сервер или master будет в контейнере с названием postgresql_01. Вторичный — postgresql_02. Мы будем настраивать потоковую (streaming) асинхронную репликацию.




Настройка на мастере




Подключаемся к контейнеру docker:




docker exec -it postgresql_01 bash




Заходим под пользователем postgres:




su - postgres




Создаем пользователя, под которым будем подключаться со стороны вторичного сервера:




createuser --replication -P repluser




* в данном примере будет создаваться учетная запись repluser с правами репликации.




Система потребует ввода пароля. Придумываем его и набираем дважды.




Выходим из-под пользователя postgres:




exit




Выходим из контейнера:




exit




Открываем конфигурационный файл postgresql.conf:




vi /data/postgresql_01/postgresql.conf




Приводим к следующием виду некоторые параметры:




wal_level = replica

max_wal_senders = 2

max_replication_slots = 2

hot_standby = on

hot_standby_feedback = on




* где







Посмотрим подсеть, которая используется для контейнеров с postgresql:




docker network inspect postgresql_default | grep Subnet




В моем случае, ответ был:




"Subnet": "172.19.0.0/16",




Теперь открываем файл:




vi /data/postgresql_01/pg_hba.conf




И добавляем строку после остальных «host    replication»:




host    replication     all             172.19.0.0/16           md5




* в данном примере мы разрешили подключение пользователю replication из подсети 172.19.0.0/16 с проверкой подлинности по паролю.




Перезапустим докер контейнер:




docker restart postgresql_01




Настройка на слейве




Выполним настройку вторичного сервера. Для начала, удалим содержимое рабочего каталога вторичной базы:




rm -r /data/postgresql_02/*




* в данном примере мы удалим все содержимое каталога /data/postgresql_02.




Мы должны быть уверены, что в базе нет ничего важного. Только после этого стоить удалять данные.




Заходим внутрь контейнера postgresql_02:




docker exec -it postgresql_02 bash




Выполняем команду:




su - postgres -c "pg_basebackup --host=postgresql_01 --username=repluser --pgdata=/var/lib/postgresql/data --wal-method=stream --write-recovery-conf"




* где postgresql_01 — наш мастер; /var/lib/postgresql/data — путь до каталога с данными слейва.




Система должна запросить пароль для пользователя repluser — вводим его. Начнется процесс репликации, продолжительность которого зависит от объема данных.




Проверка




Смотрим статус работы мастера:




docker exec -it postgresql_01 su - postgres -c "psql -c 'select * from pg_stat_replication;'"




Смотрим статус работы слейва:




docker exec -it postgresql_02 su - postgres -c "psql -c 'select * from pg_stat_wal_receiver;'"




Источник: https://www.dmosk.ru/miniinstruktions.php?mini=postgresql-replication-docker



Бэкап базы данных Zabbix

Хочу порекомендовать полезный скрипт для бэкапа базы данных Zabbix — https://github.com/npotorino/zabbix-backup. Его особенность в том, что он позволяет выбрать, какие таблицы ты будешь бэкапить со всеми данными, а для каких только структуру. Читать →

Защита PostgreSQL с помощью Fail2ban

В сегодняшней статье я расскажу как можно защитить PostgreSQL от атак перебора паролем или как его ещё называют – от Брутфорса (Brute Force).

После установки и настройки PostgreSQL Вы скорее всего задумывались о том, каким способом защитить вашу базу данных.

Один из способов это установка fail2ban, который на Ubuntu доступен в официальном репозитории. Но из коробки он работает только для SSH.

Давайте же разберемся, как включить его дня защиты postgresql. Читать →

Python: Django & PostgreSQL

Привет всем. Сегодня расскажу как подключать бд PostgreSQL(далее как постгрес) к фреймворку Джанго.

Итак, для начала установите pgAdmin. Качал я ее отсюда http://www.postgresql.org/download/ и как всегда самую последнюю версию. Процесс установки — я особо не заморачивался, кликал «далее». Теперь у меня на винде 8.1 есть такой менеджер — аналог phpmyadmin, как pgAdmin.

После этого нужно настроить общение с базой данных, для этого нужно некий драйвер, найти его можно по ссылке http://www.lfd.uci.edu/~gohlke/pythonlibs/ и найдите браузерным поиском такие два названия psycopg2-2.6.1-cp35-none-win32.whl  psycopg2-2.6.1-cp35-none-win_amd64.whl и нажмите на тот который подходит вашей системе и закиньте в папку site-packages которая находится у вас в папке проекта мой пример пути (D:djangopropyblogLibsite-packages) также можно ее закинуть в папку с таким же названием но уже в директории где установлен сам Python. Ну а теперь начнем связывать.

Для начала создайте базу данных в pgAdmin…

Далее найдите следующие строки в файле settings.py и замените их соответствующими данными вашей БД

'ENGINE': 'django.db.backends.postgresql_psycopg2', — должна быть одинакова у всех для использования постгреса.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2', 
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': '123',
        'HOST': '',
        'PORT': '',
    }
}

Следующим шагом будет создание суперпользователя админки, но после того как вы подключите адаптер для БД. Делается это так
В консоли когда у вас запущено виртуальное окружение Джанго(смотрите прошлую статью http://pythlife.blogspot.com/2016/03/django-project-folder-create.html) — запись в консоли выглядит примерно так (pyblog) D:djangoproblogblog> , перейдите в папку где хранится ваша преднастройка проекта(из прошло записи, правильно называть виртуальное окружение) у меня это путь D:djangopropyblogLibsite-packages -> пишите команду pip install psycopg2-2.6.1-cp35-none-win32.whl

В итоге строка в консоли выглядит так:
(pyblog) D:djangopropyblogLibsite-packages> pip install sycopg2-2.6.1-cp35-none-win32.whl

Установка будет удачной если вам не высыпить никаких ерроров. 
Переходим в директорию нашего проекта где лежит файл manage.py и выполняем такую команду
python manage.py migrate auth
python manage.py migrate
python manage.py createsuperuser

После запуска последней вы должны будете ввести имя пользователя, имэйл, пароль и получите сообщение о успешном создании нового пользователя.
Теперь если вы зайдете pgAdmin, вы увидите созданные новые таблицы



























Запускаем сервер в консоли в директории с файлом manage.py .
python manage.py runserver
Переходим по ссылке http://127.0.0.1:8000/admin/ вводим данные и попадаем в админку.

На этом я заканчиваю… в итоге мы подключили БД, создали суперюзера и попали в админку, дальше будет интересней — обещаю!

Автор: Няшный Человек
Дата публикации: 2016-03-27T20:33:00.000+03:00

aiopg и SQLAlchemy

Выпустил новую версию aiopg 0.2 — библиотеки для работы с PostgreSQL из asyncio.

aiopg использует асинхронные вызовы и в этом похож на txpostgres и momoko — библиотеки для работы с PostgreSQL под twisted и tornado соответственно.

В новой версии aiopg появилась опциональная поддержка SQLAlchemy Core Expressions.

Проще один раз показать.

Создаем описание структуры базы данных:

import sqlalchemy as sa

metadata = sa.MetaData()

users = sa.Table('users', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('name', sa.String(255)),
sa.Column('birthday', sa.DateTime))

emails = sa.Table('emails', metadata,
sa.Column('id', sa.Integer, primary_key=True),
sa.Column('user_id', None, sa.ForeignKey('users.id')),
sa.Column('email', sa.String(255), nullable=False),
sa.Column('private', sa.Boolean, nullable=False))

Как видите — две таблицы, связанные отношением один-ко-многим. Для тех, кто не знаком — алхимия позволяет описать любую модель данных, которая только может прийти в голову. Индексы, constraints, пользовательские типы данных такие как array и hstore — тоже.

Теперь нужно сделать engine:

from aiopg.sa import create_engine

engine = yield from create_engine(user='aiopg',
database='aiopg',
host='127.0.0.1',
password='passwd')

engine содержит внутри connection pool.

Для работы с БД нужно получить connection и что-нибудь выполнить:

with (yield from engine) as conn:
uid = yield from conn.scalar(
users.insert().values(name='Andrew', birthday=datetime(1978, 12, 9)))

Обратите внимание: диалект знает о INSERT ... RETURNING и позвращает primary key для вставляемой записи.

Работа с транзакциями:

with (yield from engine) as conn:
tr = yield from conn.begin()

# Do something

yield from tr.commit()

Получение данных:

with (yield from engine) as conn:
res = yield from conn.execute(users.select())
for row in res:
print(res)

Сложный запрос:

with (yield from engine) as conn:
join = sa.join(emails, users, users.c.id == emails.c.user_id)
query = (sa.select([users.c.name])
.select_from(join)
.where(emails.c.private == 0)
.group_by(users.c.name)
.having(sa.func.count(emails.c.private) > 0))

print("Users with public emails:")
ret = yield from conn.execute(query)
for row in ret:
print(row.name)

Вызов SQL функций:

with (yield from engine) as conn:
query = (sa.select([sa.func.avg(sa.func.age(users.c.birthday))])
.select_from(users))
ave = (yield from conn.scalar(query))
print("Average age of population is", ave,
"or ~", int(ave.days / 365), "years")

sa.func.avg и sa.func.age выполняются на стороне SQL сервера.

Полный код примера здесь, документация здесь.

Автор: Andrew Svetlov

aiopg — asyncio библиотека для PostgreSQL

Сделал библиотеку, которая может работать с PostgreSQL под asyncio.

Внутри используется psycopg2 в асинхронном режиме.

Есть connection pool.

Документация — здесь.

Автор: Andrew Svetlov