Как анализировать статистику управляемой базы данных PostgreSQL с помощью Elastic Stack в Ubuntu 18.04

Автор выбралFree and Open Source Fund для получения пожертвования в рамках программыWrite for DOnations.

Вступление

Мониторинг базы данных - это непрерывный процесс систематического отслеживания различных показателей, которые показывают, как работает база данных. Наблюдая за данными о производительности, вы можете получить ценную информацию и выявить возможные узкие места, а также найти дополнительные способы повышения производительности базы данных. Такие системы часто реализуют предупреждения, которые уведомляют администраторов, когда что-то идет не так. Собранную статистику можно использовать не только для улучшения конфигурации и рабочего процесса базы данных, но и для клиентских приложений.

Преимущество использованияElastic Stack (стек ELK) для мониторинга управляемой базы данных заключается в его отличной поддержке поиска и возможности очень быстро получать новые данные. Он не преуспевает в обновлении данных, но этот компромисс приемлем для мониторинга и регистрации, где прошлые данные почти никогда не изменяются. Elasticsearch предлагает мощные средства запроса данных, которые вы можете использовать черезKibana, чтобы лучше понять, как база данных работает в разные периоды времени. Это позволит вам соотнести загрузку базы данных с реальными событиями, чтобы получить представление о том, как база данных используется.

В этом руководстве вы импортируете метрики базы данных, созданныеPostgreSQL statistics collector, в Elasticsearch черезLogstash. Это влечет за собой настройку Logstash для извлечения данных из базы данных с использованиемPostgreSQL JDBC connector, чтобы сразу же после этого отправить их в Elasticsearch для индексирования. Импортированные данные могут быть позже проанализированы и визуализированы в Кибане. Затем, если ваша база данных новая, вы воспользуетесьpgbench, инструментом тестирования PostgreSQL, чтобы создать более интересные визуализации. В конце концов, у вас будет автоматизированная система сбора статистики PostgreSQL для последующего анализа.

Предпосылки

  • Сервер Ubuntu 18.04 с ОЗУ не менее 4 ГБ, привилегиями root и вторичной учетной записью без полномочий root. Вы можете настроить это, выполнивthis initial server setup guide. В этом руководстве пользователь без полномочий root -sammy.

  • Java 8 установлена ​​на вашем сервере. Для получения инструкций по установке посетитеHow To Install Java with apt on Ubuntu 18.04.

  • Nginx установлен на вашем сервере. Чтобы узнать, как это сделать, см.How To Install Nginx on Ubuntu 18.04.

  • Elasticsearch и Kibana установлены на вашем сервере. Выполните первые два шага руководстваHow To Install Elasticsearch, Logstash, and Kibana (Elastic Stack) on Ubuntu 18.04.

  • Управляемая база данных PostgreSQL, предоставленная DigitalOcean, с доступной информацией о соединении. Убедитесь, что IP-адрес вашего сервера находится в белом списке. Чтобы узнать больше об управляемых базах данных DigitalOcean, посетитеproduct docs.

[[step-1 -—- setting-up-logstash-and-the-postgresql-jdbc-driver]] == Шаг 1. Настройка Logstash и драйвера PostgreSQL JDBC

В этом разделе вы установите Logstash и загрузитеPostgreSQL JDBC driver, чтобы Logstash мог подключиться к вашей управляемой базе данных.

Начните с установки Logstash с помощью следующей команды:

sudo apt install logstash -y

После установки Logstash включите службу для автоматического запуска при загрузке:

sudo systemctl enable logstash

Logstash написан на Java, поэтому для подключения к PostgreSQL требуется, чтобы библиотека PostgreSQL JDBC (Java Database Connectivity) была доступна в системе, в которой он работает. Из-за внутреннего ограничения Logstash будет правильно загружать библиотеку, только если она находится в каталоге/usr/share/logstash/logstash-core/lib/jars, где хранятся сторонние библиотеки, которые он использует.

Перейдите вdownload page библиотеки JDBC и скопируйте ссылку на последнюю версию. Затем загрузите его с помощьюcurl, выполнив следующую команду:

sudo curl https://jdbc.postgresql.org/download/postgresql-42.2.6.jar -o /usr/share/logstash/logstash-core/lib/jars/postgresql-jdbc.jar

На момент написания последней версией библиотеки была42.2.6 с Java 8 в качестве поддерживаемой версии среды выполнения. Убедитесь, что вы загрузили последнюю версию; сопряжение с верной версией Java, которую поддерживают JDBC и Logstash.

Logstash хранит свои файлы конфигурации в/etc/logstash/conf.d, а сам хранится в/usr/share/logstash/bin. Перед созданием конфигурации, которая будет извлекать статистику из вашей базы данных, вам нужно включить плагин JDBC в Logstash, выполнив следующую команду:

sudo /usr/share/logstash/bin/logstash-plugin install logstash-input-jdbc

Вы установили Logstash с помощьюapt и загрузили библиотеку PostgreSQL JDBC, чтобы Logstash мог использовать ее для подключения к управляемой базе данных. На следующем шаге вы настроите Logstash на получение статистических данных из него.

[[step-2 -—- configuring-logstash-to-pull-statistics]] == Шаг 2 - Настройка Logstash для получения статистики

В этом разделе вы настроите Logstash для извлечения метрик из управляемой базы данных PostgreSQL.

Вы настроите Logstash для наблюдения за тремя системными базами данных в PostgreSQL, а именно:

  • pg_stat_database: предоставляет статистику по каждой базе данных, включая ее имя, количество подключений, транзакций, откатов, строк, возвращаемых при запросе к базе данных, взаимоблокировок и т. д. В нем есть полеstats_reset, в котором указывается, когда статистика была в последний раз сброшена.

  • pg_stat_user_tables: предоставляет статистику по каждой таблице, созданной пользователем, например количество вставленных, удаленных и обновленных строк.

  • pg_stat_user_indexes: собирает данные обо всех индексах в таблицах, созданных пользователем, например, о количестве сканирований определенного индекса.

Вы сохраните конфигурацию для индексации статистики PostgreSQL в Elasticsearch в файле с именемpostgresql.conf в каталоге/etc/logstash/conf.d, где Logstash хранит файлы конфигурации. При запуске в качестве службы он будет автоматически запускаться в фоновом режиме.

Создайтеpostgresql.conf с помощью вашего любимого редактора (например, nano):

sudo nano /etc/logstash/conf.d/postgresql.conf

Добавьте следующие строки:

/etc/logstash/conf.d/postgresql.conf

input {
        # pg_stat_database
        jdbc {
                jdbc_driver_library => ""
                jdbc_driver_class => "org.postgresql.Driver"
                jdbc_connection_string => "jdbc:postgresql://host:port/defaultdb"
                jdbc_user => "username"
                jdbc_password => "password"
                statement => "SELECT * FROM pg_stat_database"
                schedule => "* * * * *"
                type => "pg_stat_database"
        }

        # pg_stat_user_tables
        jdbc {
                jdbc_driver_library => ""
                jdbc_driver_class => "org.postgresql.Driver"
                jdbc_connection_string => "jdbc:postgresql://host:port/defaultdb"
                jdbc_user => "username"
                jdbc_password => "password"
                statement => "SELECT * FROM pg_stat_user_tables"
                schedule => "* * * * *"
                type => "pg_stat_user_tables"
        }

        # pg_stat_user_indexes
        jdbc {
                jdbc_driver_library => ""
                jdbc_driver_class => "org.postgresql.Driver"
                jdbc_connection_string => "jdbc:postgresql://host:port/defaultdb"
                jdbc_user => "username"
                jdbc_password => "password"
                statement => "SELECT * FROM pg_stat_user_indexes"
                schedule => "* * * * *"
                type => "pg_stat_user_indexes"
        }
}

output {
        elasticsearch {
                hosts => "http://localhost:9200"
                index => "%{type}"
        }
}

Не забудьте заменитьhost на адрес вашего хоста,port на порт, к которому вы можете подключиться к своей базе данных,username на имя пользователя базы данных иpassword на его пароль . Все эти значения можно найти в панели управления вашей управляемой базы данных.

В этой конфигурации вы определяете три входа JDBC и один выход Elasticsearch. Три входа извлекают данные из баз данныхpg_stat_database,pg_stat_user_tables иpg_stat_user_indexes соответственно. Все они устанавливают для параметраjdbc_driver_library пустую строку, потому что библиотека PostgreSQL JDBC находится в папке, которую Logstash загружает автоматически.

Затем они устанавливаютjdbc_driver_class, значение которого зависит от библиотеки JDBC, и предоставляютjdbc_connection_string, в котором подробно описано, как подключиться к базе данных. Частьjdbc: означает, что это соединение JDBC, аpostgres:// указывает, что целевая база данных - PostgreSQL. Затем следует хост и порт базы данных, и после косой черты вы также указываете базу данных для подключения; это потому, что PostgreSQL требует, чтобы вы были подключены к базе данных, чтобы иметь возможность выдавать любые запросы. Здесь установлена ​​база данных по умолчанию, которая всегда существует и не может быть удалена, с метким названиемdefaultdb.

Затем они устанавливают имя пользователя и пароль пользователя, через который будет осуществляться доступ к базе данных. Параметрstatement содержит SQL-запрос, который должен возвращать данные, которые вы хотите обработать - в этой конфигурации он выбирает все строки из соответствующей базы данных.

Параметрschedule принимает строку в синтаксисеcron, которая определяет, когда Logstash должен запускать этот ввод; полное его исключение приведет к тому, что Logstash запустит его только один раз. Если указать* * * * *, как вы это сделали здесь, Logstash будет запускать его каждую минуту. Вы можете указать свою собственную строку cron, если вы хотите собирать данные с разными интервалами.

Существует только один выход, который принимает данные от трех входов. Все они отправляют данные в Elasticsearch, который выполняется локально и доступен вhttp://localhost:9200. Параметрindex определяет, в какой индекс Elasticsearch он будет отправлять данные, и его значение передается из поляtype ввода.

Когда вы закончите редактирование, сохраните и закройте файл.

Вы сконфигурировали Logstash для сбора данных из различных статистических таблиц PostgreSQL и отправки их в Elasticsearch для хранения и индексации. Далее вы запустите Logstash для проверки конфигурации.

[[step-3 -—- testing-the-logstash-configuration]] == Шаг 3 - Тестирование конфигурации Logstash

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

Logstash поддерживает запуск определенной конфигурации, передавая путь к файлу в параметр-f. Выполните следующую команду, чтобы протестировать новую конфигурацию с последнего шага:

sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/postgresql.conf

Может потребоваться некоторое время, прежде чем он покажет какой-либо вывод, который будет выглядеть примерно так:

OutputThread.exclusive is deprecated, use Thread::Mutex
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs errors to the console
[WARN ] 2019-08-02 18:29:15.123 [LogStash::Runner] multilocal - Ignoring the 'pipelines.yml' file because modules or command line options are specified
[INFO ] 2019-08-02 18:29:15.154 [LogStash::Runner] runner - Starting Logstash {"logstash.version"=>"7.3.0"}
[INFO ] 2019-08-02 18:29:18.209 [Converge PipelineAction::Create
] Reflections - Reflections took 77 ms to scan 1 urls, producing 19 keys and 39 values [INFO ] 2019-08-02 18:29:20.195 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [WARN ] 2019-08-02 18:29:20.667 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"} [INFO ] 2019-08-02 18:29:21.221 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>7} [WARN ] 2019-08-02 18:29:21.230 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7} [INFO ] 2019-08-02 18:29:21.274 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]} [INFO ] 2019-08-02 18:29:21.337 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [WARN ] 2019-08-02 18:29:21.369 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"} [INFO ] 2019-08-02 18:29:21.386 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>7} [WARN ] 2019-08-02 18:29:21.386 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7} [INFO ] 2019-08-02 18:29:21.409 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]} [INFO ] 2019-08-02 18:29:21.430 [[main]-pipeline-manager] elasticsearch - Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://localhost:9200/]}} [WARN ] 2019-08-02 18:29:21.444 [[main]-pipeline-manager] elasticsearch - Restored connection to ES instance {:url=>"http://localhost:9200/"} [INFO ] 2019-08-02 18:29:21.465 [[main]-pipeline-manager] elasticsearch - ES Output version determined {:es_version=>7} [WARN ] 2019-08-02 18:29:21.466 [[main]-pipeline-manager] elasticsearch - Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7} [INFO ] 2019-08-02 18:29:21.468 [Ruby-0-Thread-7: :1] elasticsearch - Using default mapping template [INFO ] 2019-08-02 18:29:21.538 [Ruby-0-Thread-5: :1] elasticsearch - Using default mapping template [INFO ] 2019-08-02 18:29:21.545 [[main]-pipeline-manager] elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["http://localhost:9200"]} [INFO ] 2019-08-02 18:29:21.589 [Ruby-0-Thread-9: :1] elasticsearch - Using default mapping template [INFO ] 2019-08-02 18:29:21.696 [Ruby-0-Thread-5: :1] elasticsearch - Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}} [INFO ] 2019-08-02 18:29:21.769 [Ruby-0-Thread-7: :1] elasticsearch - Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}} [INFO ] 2019-08-02 18:29:21.771 [Ruby-0-Thread-9: :1] elasticsearch - Attempting to install template {:manage_template=>{"index_patterns"=>"logstash-*", "version"=>60001, "settings"=>{"index.refresh_interval"=>"5s", "number_of_shards"=>1}, "mappings"=>{"dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date"}, "@version"=>{"type"=>"keyword"}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}} [WARN ] 2019-08-02 18:29:21.871 [[main]-pipeline-manager] LazyDelegatingGauge - A gauge metric of an unknown type (org.jruby.specialized.RubyArrayOneObject) has been create for key: cluster_uuids. This may result in invalid serialization. It is recommended to log an issue to the responsible developer/development team. [INFO ] 2019-08-02 18:29:21.878 [[main]-pipeline-manager] javapipeline - Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>1, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>125, :thread=>"#"} [INFO ] 2019-08-02 18:29:22.351 [[main]-pipeline-manager] javapipeline - Pipeline started {"pipeline.id"=>"main"} [INFO ] 2019-08-02 18:29:22.721 [Ruby-0-Thread-1: /usr/share/logstash/lib/bootstrap/environment.rb:6] agent - Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]} [INFO ] 2019-08-02 18:29:23.798 [Api Webserver] agent - Successfully started Logstash API endpoint {:port=>9600} /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/cronline.rb:77: warning: constant ::Fixnum is deprecated /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/cronline.rb:77: warning: constant ::Fixnum is deprecated /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/cronline.rb:77: warning: constant ::Fixnum is deprecated [INFO ] 2019-08-02 18:30:02.333 [Ruby-0-Thread-22: /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/jobs.rb:284] jdbc - (0.042932s) SELECT * FROM pg_stat_user_indexes [INFO ] 2019-08-02 18:30:02.340 [Ruby-0-Thread-23: /usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/rufus-scheduler-3.0.9/lib/rufus/scheduler/jobs.rb:331] jdbc - (0.043178s) SELECT * FROM pg_stat_user_tables [INFO ] 2019-08-02 18:30:02.340 [Ruby-0-Thread-24: :1] jdbc - (0.036469s) SELECT * FROM pg_stat_database ...

Если Logstash не показывает никаких ошибок и регистрирует, что он успешно "SELECT" выбранные строки из трех баз данных, ваши метрики базы данных будут отправлены в Elasticsearch. Если вы получили сообщение об ошибке, дважды проверьте все значения в файле конфигурации, чтобы убедиться, что компьютер, на котором вы запускаете Logstash, может подключиться к управляемой базе данных.

Logstash продолжит импортировать данные в указанное время. Вы можете безопасно остановить его, нажавCTRL+C.

Как упоминалось ранее, при запуске в качестве службы Logstash автоматически запускает все файлы конфигурации, которые он находит в/etc/logstash/conf.d, в фоновом режиме. Запустите следующую команду, чтобы запустить ее как службу:

sudo systemctl start logstash

На этом этапе вы запустили Logstash, чтобы проверить, может ли он подключиться к вашей базе данных и собрать данные. Далее вы визуализируете и исследуете некоторые статистические данные в Кибане.

[[шаг-4 -—- исследование-импортированные-данные-в-кибане]] == Шаг 4. Изучение импортированных данных в кибане

В этом разделе вы увидите, как вы можете изучить статистические данные, описывающие производительность вашей базы данных в Кибане.

В вашем браузере перейдите к установке Kibana, которую вы настроили в качестве предварительного условия. Вы увидите страницу приветствия по умолчанию.

Kibana - Default Welcome Page

Чтобы взаимодействовать с индексами Elasticsearch в Kibana, вам нужно создать шаблон индекса. Index patterns указывает, на какие индексы должна работать Kibana. Чтобы создать его, нажмите последний значок (гаечный ключ) на левой вертикальной боковой панели, чтобы открыть страницуManagement. Затем в левом меню нажмитеIndex Patterns подKibana. Вы увидите диалоговое окно для создания шаблона индекса.

Kibana - Add Index Pattern

Перечислены три индекса, куда Logstash отправлял статистику. Введитеpg_stat_database в поле вводаIndex Pattern и затем нажмитеNext step. Вам будет предложено выбрать поле, в котором хранится время, чтобы позже вы могли сузить данные по временному диапазону. В раскрывающемся списке выберите@timestamp.

Kibana - Index Pattern Timestamp Field

Нажмите наCreate index pattern, чтобы завершить создание индексного шаблона. Теперь вы сможете исследовать его с помощью Kibana. Чтобы создать визуализацию, нажмите на второй значок на боковой панели, а затем наCreate new visualization. Выберите визуализациюLine, когда форма появится, а затем выберите шаблон индекса, который вы только что создали (pg_stat_database). Вы увидите пустую визуализацию.

Kibana - Empty Visualisation

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

Теперь вы визуализируете среднее количество кортежей данныхINSERT+`ed on minutes in the given interval. Press on *Y-Axis* under *Metrics* in the panel on the left to unfold it. Select _Average_ as the *Aggregation* and select `+tup_inserted какField. Это заполнит ось Y графика средними значениями.

Затем нажмитеX-Axis подBuckets. ДляAggregation выберитеDate Histogram. @timestamp должен автоматически выбираться какField. Затем нажмите синюю кнопку воспроизведения в верхней части панели, чтобы сгенерировать график. Если ваша база данных совершенно новая и не используется, вы еще ничего не увидите. Однако во всех случаях вы увидите точное представление об использовании базы данных.

Kibana поддерживает множество других форм визуализации - вы можете изучить другие формы вKibana documentation. Вы также можете добавить два оставшихся индекса, упомянутых в шаге 2, в Kibana, чтобы иметь возможность их визуализировать.

На этом этапе вы узнали, как визуализировать некоторые статистические данные PostgreSQL, используя Kibana.

[[step-5 -—- optional-benchmarking-using-pgbench]] == Шаг 5 - (Необязательно) Сравнительный анализ с использованием pgbench

Если вы еще не работали в своей базе данных за пределами этого учебного пособия, вы можете выполнить этот шаг, чтобы создать более интересные визуализации с помощью pgbench для сравнения вашей базы данных. pgbench будет снова и снова запускать одни и те же команды SQL, имитируя реальное использование базы данных реальным клиентом.

Сначала вам нужно установить pgbench, выполнив следующую команду:

sudo apt install postgresql-contrib -y

Поскольку pgbench будет вставлять и обновлять тестовые данные, вам нужно будет создать для них отдельную базу данных. Для этого перейдите на вкладкуUsers & Databases на панели управления вашей управляемой базы данных и прокрутите вниз до разделаDatabases. Введитеpgbench в качестве имени новой базы данных, а затем нажмитеSave. Вы передадите это имя, а также информацию о хосте, порте и имени пользователя в pgbench.

Accessing Databases section in DO control panel

Перед фактическим запускомpgbench вам нужно будет запустить его с флагом-i для инициализации его базы данных:

pgbench -h host -p port -U username -i pgbench

Вам нужно будет заменитьhost на адрес вашего хоста,port на порт, к которому вы можете подключиться к своей базе данных, иusername на имя пользователя базы данных. Вы можете найти все эти значения в Панели управления вашей управляемой базы данных.

Обратите внимание, чтоpgbench не имеет аргумента пароля; вместо этого вам будет предлагаться его каждый раз при запуске.

Вывод будет выглядеть следующим образом:

OutputNOTICE:  table "pgbench_history" does not exist, skipping
NOTICE:  table "pgbench_tellers" does not exist, skipping
NOTICE:  table "pgbench_accounts" does not exist, skipping
NOTICE:  table "pgbench_branches" does not exist, skipping
creating tables...
100000 of 100000 tuples (100%) done (elapsed 0.16 s, remaining 0.00 s)
vacuum...
set primary keys...
done.

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

Двумя наиболее важными аргументами, ограничивающими продолжительность выполнения теста, являются-t, указывающее количество завершаемых транзакций, и-T, определяющее, сколько секунд должен выполняться тест. Эти два варианта являются взаимоисключающими. В конце каждого теста вы получите статистику, например количество транзакций в секунду (tps).

Теперь запустите тест, который будет длиться 30 секунд, выполнив следующую команду:

pgbench -h host -p port -U username pgbench -T 30

Вывод будет выглядеть так:

Outputstarting vacuum...end.
transaction type: 
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 30 s
number of transactions actually processed: 7602
latency average = 3.947 ms
tps = 253.382298 (including connections establishing)
tps = 253.535257 (excluding connections establishing)

В этом выводе вы видите общую информацию о бенчмарке, такую ​​как общее количество выполненных транзакций. Результатом этих тестов является то, что статистика, которую Logstash отправляет в Elasticsearch, будет отражать это число, что, в свою очередь, сделает визуализации в Kibana более интересными и приближенными к графам реального мира. Вы можете выполнить предыдущую команду еще несколько раз и, возможно, изменить продолжительность.

Когда вы закончите, направляйтесь в Кибана и нажмитеRefresh в правом верхнем углу. Теперь вы увидите другую строку, чем раньше, которая показывает количество `INSERT`s. Не стесняйтесь изменять временной диапазон отображаемых данных, изменяя значения в средстве выбора, расположенном над кнопкой обновления. Вот как может выглядеть график после нескольких тестов различной продолжительности:

Kibana - Visualization After Benchmarks

Вы использовали pgbench для сравнения вашей базы данных и оценили полученные графики в Kibana.

Заключение

Теперь на вашем сервере установлен стек Elastic, настроенный на регулярное получение статистических данных из управляемой базы данных PostgreSQL. Вы можете анализировать и визуализировать данные с помощью Kibana или другого подходящего программного обеспечения, которое поможет вам собрать ценные сведения и реальные корреляции в том, как работает ваша база данных.

Для получения дополнительной информации о том, что вы можете делать с управляемой базой данных PostgreSQL, посетитеproduct docs.

Related