Pgclusteradmin — это инструмент для управления кластерами PostgreSQL, разработанный на основе Go.
Основные функции:
- централизованное управление данными узлов;
- онлайн-конфигурация параметров запуска и управление несколькими версиями файлов конфигурации;
- управление шаблонами конфигурационных файлов;
- запуск, остановка, перезапуск и отображение состояния служб;
- привязка и отвязка виртуальных IP-адресов (VIP) к узлам;
- пробуждение резервных машин;
- автоматическое переключение между основным и резервным узлами;
- генерация и экспорт отчётов о проверках;
- инструменты управления процессами и блокировками таблиц;
- инструмент для сбора статистики запросов.
Система поддерживает многопользовательский режим, аутентификацию, а также SSH-аутентификацию с использованием паролей и публичных ключей. Пользователи могут удалённо управлять системой через браузер. Интерфейс пользователя реализован с помощью EasyUI.
Функциональный список:
- Добавление, редактирование и удаление данных об узлах.
- Конфигурация параметров запуска для каждого узла, управление несколькими версиями конфигурационных файлов и шаблонами конфигураций.
- Запуск, остановка, перезагрузка и отображение статуса служб на отдельных узлах.
- Привязка и отвязка VIP-адресов к конкретным машинам.
- Управление пробуждением резервных машин.
- Автоматическое переключение между основными и резервными узлами.
- Генерация и экспорт отчётов о проверках.
- Инструменты управления процессами.
- Инструменты управления блокировками таблиц.
- Инструмент для сбора статистики запросов.
Среда развёртывания:
- IP: 192.168.0.231;
- операционная система: CentOS 6.9;
- язык программирования Go: версия go1.8.3 для Linux/AMD64;
- PostgreSQL: версия 9.6.1.
Для установки и настройки среды разработки необходимо выполнить следующие шаги:
-
Установка Go.
- Скачать архив с исходным кодом Go:
wget https://storage.googleapis.com/golang/go1.8.3.linux-amd64.tar.gz
.
- Распаковать архив:
tar zxf go1.8.3.linux-amd64.tar.gz -C /usr/local
.
-
Настройка переменных окружения Go.
- Открыть файл
/etc/profile
в редакторе: vim /etc/profile
.
- Добавить строки:
GOROOT=/usr/local/go
GOBIN=$GOROOT/bin
PATH=$PATH:$GOBIN
GOPATH=/home/go
export GOROOT GOBIN GOPATH PATH
- Сохранить изменения и выйти из редактора.
- Выполнить команду для активации изменений:
source /etc/profile
.
- Проверить версию Go:
go version
.
-
Установка PostgreSQL.
- Загрузить исходный код PostgreSQL:
wget https://ftp.postgresql.org/pub/source/v9.6.1/postgresql-9.6.1.tar.gz
.
- Разархивировать файл:
tar zxf postgresql-9.6.1.tar.gz
.
- Скомпилировать и установить PostgreSQL:
- Перейти в каталог с исходниками:
cd postgresql-9.6.1
.
- Запустить скрипт настройки:
./configure --prefix=/usr/local/pgsql9.6.1 --with-perl --with-tcl --with-python --with-openssl --with-pam --without-ldap --with-libxml --with-libxslt
.
- Собрать PostgreSQL:
gmake
.
- Установить PostgreSQL:
gmake install
.
- Инициализировать базу данных:
- Войти в систему как пользователь postgres:
su postgres
.
- Создать каталог для хранения данных:
/usr/local/pgsql9.6.1/bin/initdb -D /home/postgres/data9.6.1 -E utf8 -U postgres -W
.
- Настроить файл конфигурации PostgreSQL (
postgresql.conf
):
- Включить приём подключений со всех адресов:
listen_addresses = '*'
.
- Определить место хранения логов:
log_destination = 'csvlog'
.
- Включить сборщик журналов:
logging_collector = on
.
- Настроить файл конфигурации аутентификации (
pg_hba.conf
):
- Разрешить подключения с хостов из сети 192.168.1.0/24 с использованием метода аутентификации MD5:
host all all 192.168.1.0/24 md5
.
- Перезапустить службу PostgreSQL после внесения изменений в конфигурацию.
- Создать базу данных pgcluster и настроить параметры кодировки и шаблона:
- Подключиться к PostgreSQL:
/usr/local/pgsql9.6.1/bin/psql -h 192.168.1.10 -U postgres -d postgres -p 5432
.
- Выбрать базу данных postgres:
postgres=# \c postgres
.
- Создать новую базу данных:
create database pgcluster ENCODING 'utf8' template template0;
.
- Переключиться на новую базу данных:
\c pgcluster
.
- Импортировать скрипт создания таблиц (
pgcluster.sql
).
-
Скачать необходимые пакеты Go.
- Для поддержки SSH:
- Перейти в каталог
/usr/local/go/src/github.com/
.
- Создать новый каталог
golang.org
: mkdir golang.org
.
- Перейти в этот каталог:
cd golang.org/
.
- Создать подкаталог
x
: mkdir x
.
- Перейти в него:
cd x/
.
- Клонировать репозиторий пакета поддержки SSH:
git clone https://github.com/golang/crypto.git
.
- Для работы с сессиями:
- Вернуться в каталог верхнего уровня
/usr/local/go/src
: cd /usr/local/go/src
.
- Создать каталоги
github.com
и astaxie
: mkdir github.com astaxie
.
- Перейти в
astaxie/
: cd github.com/astaxie/
.
- Клонировать пакет поддержки сессий:
git clone https://github.com/astaxie/session
.
- Для взаимодействия с PostgreSQL:
- Вернуться в каталог верхнего уровня:
cd /usr/local/go/src/github.com/
.
- Создать каталог
pkg
: mkdir pkg
.
- Перейти туда:
cd pkg
.
- Клонировать пакеты поддержки ошибок и pgx:
-
git clone https://github.com/pkg/errors
.
-
git clone https://github.com/jackc/pgx
.
Это только часть текста, переведённая без учёта контекста. Если вам нужен полный перевод, пожалуйста, уточните запрос. ### Четыре, pgclusteradmin: развёртывание конфигурации и доступ
Скачивание исходного кода pgclusteradmin
[root@ad pgclusteradmin]# cd /home/ad
[root@ad ad]# git clone https://github.com/chenaisheng/pgclusteradmin
Клонирование в 'pgclusteradmin'...
Получение объектов: 374, сделано.
Сжатие объектов: 100% (177/177), сделано.
Всего 374 (дельта 201), повторно использовано 348 (дельта 185), повторно использовано без сжатия 0
Приём объектов: 100% (374/374), 284.09 КиБ | 197.00 КиБ/с, сделано.
Обработка дельт: 100% (201/201), сделано.
[root@ad ad]#
Настройка параметров подключения к базе данных
Откройте файл pgclusteradmin.go, перейдите в конец и найдите функцию extractConfig(), код которой выглядит следующим образом:
/*
Функция: настройка параметров соединения с PostgreSQL
Параметры: нет
Возвращаемое значение: pgx.ConnConfig — структура параметров соединения pgx
*/
func extractConfig() pgx.ConnConfig {
var config pgx.ConnConfig
config.Host = "127.0.0.1" // Хост или IP-адрес главного сервера базы данных
config.User = "postgres" // Пользователь для подключения
config.Password = "pgsql" // Пароль пользователя
config.Database = "pgcluster" // Имя подключаемой базы данных
config.Port = 5432 // Номер порта
return config
}
Измените параметры в соответствии с конфигурацией PostgreSQL.
Конфигурация учётных записей пользователей для управления базой данных (пользователей операционной системы, обычно с именем пользователя postgres) и администраторов операционных систем (обычно с именем root) для удалённого входа по SSH с использованием закрытых ключей — этот шаг можно пропустить, если не используется аутентификация на основе закрытых ключей
Как настроить использование открытых и закрытых ключей для входа по SSH
1. Войдите как пользователь root и выполните следующую команду. Следуйте инструкциям на экране:
ssh-keygen -t rsa также можно использовать DSA
Генерация пары открытого и закрытого ключей RSA.
Введите файл, в котором сохранить ключ (/root/.ssh/id_rsa):
Рекомендуется просто нажать Enter, чтобы использовать путь по умолчанию
Создан каталог '/root/.ssh'
Введите парольную фразу (оставьте пустым, чтобы не вводить):
Введите ту же парольную фразу ещё раз:
Ваша идентификационная информация сохранена в файле /root/.ssh/id_rsa.
Ваш открытый ключ сохранён в файле /root/.ssh/id_rsa.pub.
Отпечаток ключа:
05:71:53:92:96:ba:53:20:55:15:7e:5d:59:85:32:e4 root@test
Изображение отпечатка ключа в формате randomart:
+--[ RSA 2048]----+
| o o .. |
| . o oo.+ . |
| o.+... = |
| ...o |
| o S |
| . |
| |
| |
| |
+--------------------+
На этом этапе в каталоге /root/.ssh создаются два файла: id_rsa — закрытый ключ, id_rsa.pub — открытый ключ.
Скопируйте открытый ключ в файл /root/.ssh/authorized_keys на компьютере, который будет использоваться для входа.
Теперь, когда вы сохранили свой закрытый ключ, ваш сервер стал намного безопаснее, чем при использовании входа с паролем от пользователя root.
2. Генерация открытых и закрытых ключей для пользователя базы данных postgres выполняется аналогично генерации ключей для пользователя root, также можно совместно использовать одну пару открытых и закрытых ключей.
3. Откройте файл pgclusteradmin.go и перейдите в конец. Найдите функции get_postgres_private_key() и get_root_private_key(). Скопируйте туда закрытые ключи, используемые пользователем базы данных и администратором операционной системы.
Запуск pgclusteradmin
[root@ad ad]# cd pgclusteradmin/
[root@ad pgclusteradmin]# go run pgclusteradmin.go
Доступ к pgclusteradmin
Запустите браузер и введите адрес http://192.168.0.231:10001, где 192.168.0.231 — это ваш IP-адрес. Вы войдёте в систему с учётными данными администратора: имя пользователя и пароль — admin.
Регистрация pgclusteradmin как службы (используется при развёртывании в рабочей среде, для тестирования можно пропустить)
1. Скомпилируйте программу pgclusteradmin.go в исполняемый файл:
[root@ad pgclusteradmin]# go build pgclusteradmin.go
2. Скопируйте программу pgclusteradmin и каталог easyui в каталог /usr/local/pgclusteradmin:
[root@ad pgclusteradmin]# mkdir /usr/local/pgclusteradmin
[root@ad pgclusteradmin]# cp pgclusteradmin easyui/ /usr/local/pgclusteradmin -rf
3. Скопируйте скрипт службы в каталог /etc/init.d/:
[root@ad pgclusteradmin]# cp ./etc/init.d/pgclusteradmin /etc/init.d/pgclusteradmin
[root@ad pgclusteradmin]# chmod +x /etc/init.d/pgclusteradmin
4. Настройте pgclusteradmin в качестве службы:
[root@ad pgclusteradmin]# chkconfig --add pgclusteradmin
[root@ad pgclusteradmin]# chkconfig --list | grep pgclusteradmin
pgclusteradmin 0:отключено 1:отключено 2:включено 3:включено 4:включено 5:включено 6:отключено
5. Протестируйте службу pgclusteradmin:
[root@ad pgclusteradmin]# service pgclusteradmin start **Запуск pgclusteradmin**
[root@ad pgclusteradmin]# service pgclusteradmin status
pgclusteradmin (pid 15686) уже запущен.
[root@ad pgclusteradmin]# service pgclusteradmin restart
Остановка pgclusteradmin...
Запуск pgclusteradmin...
[root@nfs pgclusteradmin]# service pgclusteradmin status
pgclusteradmin (pid 15717) уже запущен.
[root@ad pgclusteradmin]# service pgclusteradmin help
Использование: /etc/init.d/pgclusteradmin {start|stop|status|restart|help}
start — запуск pgclusteradmin;
stop — остановка pgclusteradmin;
status — отображение текущего статуса pgclusteradmin;
restart — перезапуск pgclusteradmin, если он работает, путём отправки SIGHUP или запуск, если не работает;
help — эта информация.
Пять. Графический интерфейс
-
Главная страница: описание.
-
Добавление узла: описание.
-
Конфигурация параметров: описание.
-
Управление службами: описание.
-
Привязка VIP: описание.
-
Пробуждение резервного сервера: описание.
-
Переключение основного и резервного серверов: описание.
-
Создание отчёта о проверке: описание.
-
Состояние отчёта о проверке: описание.
-
Отчёт о проверке табличного пространства: описание.
-
Отчёт о проверке роли: описание.
-
Отчёт о проверке базы данных: описание.
-
Отчёт о проверке таблицы: описание.
-
Отчёт о проверке внешней таблицы: описание.
-
Инструмент управления — управление процессами: описание.
-
Инструмент управления — блокировка таблицы — блокирующая блокировка: описание.
-
Инструмент управления — блокировка таблицы — двухфазная фиксация: описание.
-
Инструмент управления — статистика запросов: описание.
Шесть. Журнал обновлений
2017-08-20
- В инструмент управления — блокировку таблицы добавлен функционал мониторинга «двухфазной фиксации» блокирующей блокировки, что вместе с ранее существовавшим мониторингом текущей блокирующей блокировки обеспечивает полный мониторинг блокировок PostgreSQL.
- Исправлены проблемы с выбором флажков в инструменте управления — управлением процессами и инструментом управления — блокировкой таблицы, которые после операции оставались выбранными.
- Из инструмента управления — блокировки таблицы удалён запрос ко всем базам данных, который приводил к несоответствию при выборе соответствующего отношения.
2017-08-16
- Написан скрипт управления службой pgclusteradmin. Скрипт хранится в исходном пакете в каталоге etc/init.d и называется pgclusteradmin. Это сценарий оболочки.
- Добавлен инструмент управления — управление службами для управления соединениями пользователей PostgreSQL и поддержки функций отмены запроса в режиме онлайн и уничтожения процесса.
- Добавлен инструмент управления — блокировка таблиц для управления мониторингом блокировок PostgreSQL в различных состояниях ожидания, а также поддержки функций отмены запросов в режиме онлайн и уничтожения процессов. Благодарим «Деге» за предоставление метода мониторинга блокировок PostgreSQL до версии 9.5.
- Добавлен инструмент управления — статистика запросов для визуализации статистики данных pg_stat_statements. Требуется поддержка модуля pg_stat_statements.
- Переработана документация по инструментам, добавлена структура документации для удобства использования.
2017-08-08
- Отчёт о проверке дополнен статистическими показателями «внешней таблицы».
- Статистические показатели «табличных данных» дополнены «оценкой количества записей (reltuples)», «отклонением количества записей» (количество записей — reltuples), оценкой занимаемого дискового пространства (relpages), количеством строк на запись, либо pg_table_size()/количеством записей или reltuples.
- Объединена статистика объектов «материализованного представления» в существующую статистику «табличные данные».
- Соответствующие изменения внесены в экспорт отчётов о проверках.
- Исправлено количество записей в функции inspection_report_table_rownum_update_run для разных баз данных, одного режима и одной таблицы.
- Устранена проблема с нулевыми значениями в функции inspection_report_state_make при подсчёте занимаемого узлами пространства.
2017-06-19
- Исправлена ошибка ssh: must specify HostKeyCallback в функции ssh_connect.
- Исправлена ошибка в функции str_is_ip, связанная с определением IP-адреса.
- Решена проблема выполнения на некоторых компьютерах CentOS в функции get_node_ip_bind_status.
2017-05-23
- Оптимизирован способ создания отчётов о проверках, добавлены параметры для учёта баз данных и рассмотрения системных объектов, ограничения максимального числа процессов при подсчёте количества строк в таблице и решения проблемы высокой нагрузки на систему при подсчёте количества записей в больших таблицах. Подсчёт количества записей в таблице стал асинхронным, поэтому после успешного создания отчёта о проверке количество записей в таблице может быть ещё не подсчитано, особенно в больших таблицах. Только когда вы увидите, что значение «завершён ли подсчёт» в списке отчётов о проверке равно «да», все подсчёты будут завершены.
- 2017-05-05
- Добавлена основная функция отчёта о проверках.
2017-04-16
- Исправлен существующий баг в интерфейсе getnode_type_and_status.
2017-04-12
- Во всех интерфейсах или функциях, связанных с SSH-подключением, добавлен метод аутентификации с использованием открытого и закрытого ключей.
2017-04-04
- Добавлены управление несколькими версиями параметров и управление шаблонами файлов параметров.
2017-03-28
- Устранена утечка памяти из-за невозможности освободить ресурсы при подключении по SSH.
2017-03-23
- Исправлена ошибка, связанная с неправильным присвоением значения переменной modlename в обработчике parameter_saveHandler.
2017-03-22
- Добавлен новый функциональный модуль «пробуждение резервных серверов», поддерживающий пробуждение одним нажатием и привязку VIP. После успешного пробуждения система автоматически проверяет, находится ли узел в «режиме синхронной репликации» и есть ли «синхронизация с резервным сервером». Если это «режим синхронной репликации», а «синхронизации с резервным сервером» нет, программа автоматически переводит узел в режим «асинхронной репликации».
- Переписан интерфейс «управление службами», решена проблема извлечения ошибочных журналов после перенаправления журналов.
- Некоторые интерфейсы оптимизированы, выполнение кода в асинхронном режиме повысило эффективность выполнения.
2017-03-14
- Добавлен новый функциональный модуль «конфигурация параметров», поддерживающий сохранение и перезагрузку одним нажатием или сохранение и перезапуск одним нажатием, а также просто сохранение текущей конфигурации.
2017-03-13
- Добавлен новый функциональный модуль «управление VIP», чтобы обеспечить лучшую совместимость приложений при переключении между основным и резервным серверами, мы привяжем IP-адрес к службе PostgreSQL узлов.
2017-03-12
- Функция getnode_type_and_status изменена для передачи и возврата значений по каналам без указания адреса.
- Функция get_node_ip_bind_status возвращает данные по каналу в виде структуры, а не сериализованных значений структуры, что упрощает вызов в других местах.
- Функция master_slave_relation_check изменена для передачи аргументов по каналам без указания адресов.
2017-03-11
- При добавлении и редактировании узлов ограничено повторение «имени хоста + пути к данным».
- Index.html оптимизирован для операций.
2017-03-09
- Функция ssh_run_chan изменена для возврата данных по каналу с более простым типом данных.
- Интерфейс promoteHandler исправлен, ранее в главном резервном узле при передаче переменных в функцию master_slave_relation_check аргументы были перепутаны.
2017-03-08
2017–3–4
-
- Исправить все ошибки в проекте, связанные с тем, что не найдены команды ip и ifconfig.
2017–3–3
-
- Исправить интерфейс «promote_get_ip_bind_statusHandler» (интерфейс для получения информации о привязке IP к основному и резервному узлам), чтобы он асинхронно получал информацию об IP обоих узлов одновременно, что улучшит скорость отклика программы.
-
- Исправить ошибку в интерфейсе «insertnodeHandler» (добавление данных узла), связанную с преждевременным выполнением rows.Close().
-
- Внести изменения в интерфейсы «insertnodeHandler» и «updatenodeHandler» (изменение данных узла) и запретить повторение host + pg_port.
-
- Исправить проблему в index.html, из-за которой после удаления данных узла на стороне клиента невозможно выполнить переключение между основным и резервным узлами без обновления страницы.
-
- Исправить баг в index.html, связанный с некорректной оценкой типа основного и резервного узлов при переключении между ними на стороне клиента.
-
- Исправить ошибку при выполнении команды ip a в интерфейсе get_node_ip_bind_status, связанную с невозможностью найти IP.
План разработки
-
- Оптимизировать код на стороне сервера и клиента, чтобы разделить модули и сделать их независимыми друг от друга, что облегчит совместную работу нескольких разработчиков в будущем.
Свяжитесь с нами

Опубликовать ( 0 )