
Продолжим серию постов об Apache Druid. В первой части разобрались с Друидом – его архитектурой и мониторингом, во второй части – развернули кластер PostgreSQL и настроили его мониторинг.
Следующие задачи:
- переключить Druid на использование PostgreSQL в роли metadata storage вместо Apache Derby
- и убрать из схемы Apache ZooKeeper , а вместо него подключить
druid-kubernetes-extensions
Начнём с PostgreSQL.
Содержание
Настройки Apache Druid с PostgreSQL
См. раздел PostgreSQL Metadata Store и Metadata Storage .
PostgreSQL users
Возвращаемся к файлу manifests/minimal-master-replica-svcmonitor.yaml, из которого создавали PostgreSQL кластер – добавляем пользователя druidи базу druid:
...
users:
zalando: # database owner
- superuser
- createdb
foo_user: [] # role for application foo
druid:
- createdb
databases:
foo: zalando # dbname: owner
druid: druid
...
Обновляем кластер:
[simterm]
$ kubectl apply -f maniapplyminimal-master-replica-svcmonitor.yaml
[/simterm]
Получаем пароль пользователя druid:
[simterm]
$ kubectl -n test-pg get secret druid.acid-minimal-cluster.credentials.postgresql.acid.zalan.do -o 'jsonpath={.data.password}' | base64 -d
Zfqeb0oJnW3fcBCZvEz1zyAn3TMijIvdv5D8WYOz0Y168ym6fXahta05zJjnd3tY
[/simterm]
Открываем порт к PostgreSQL-мастеру:
[simterm]
$ kubectl -n test-pg port-forward acid-minimal-cluster-0 6432:5432 Forwarding from 127.0.0.1:6432 -> 5432 Forwarding from [::1]:6432 -> 5432
[/simterm]
Подключаемся:
[simterm]
$ psql -U druid -h localhost -p 6432 Password for user druid: psql (14.5, server 13.7 (Ubuntu 13.7-1.pgdg18.04+1)) SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off) Type "help" for help. druid=>
[/simterm]
Проверяем содержимое базы – пока пусто:
[simterm]
druid-> \dt Did not find any relations.
[/simterm]
Apache Druid metadata.storage config
Используем тот же файл druid-operator/examples/tiny-cluster.yaml, из которого разворачивали кластер Apache Druid (см. Запуск Druid Cluster ).
Сейчас есть в нем конфиг для DerbyDB, которая хранит данные на локальном диске:
...
druid.metadata.storage.type=derby
druid.metadata.storage.connector.connectURI=jdbc:derby://localhost:1527/druid/data/derbydb/metadata.db;create=true
druid.metadata.storage.connector.host=localhost
druid.metadata.storage.connector.port=1527
druid.metadata.storage.connector.createTables=true
...
Для PostgreSQL нам тоже нужно указать connectURI, так что находим его Kubernetes Service:
[simterm]
$ kubectl -n test-pg get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE acid-minimal-cluster ClusterIP 10.97.188.225 <none> 5432/TCP 14h
[/simterm]
И редактируем манифест – удаляем или комментируем сроки из Derbi и добавляем новый конфиг:
...
# Extensions
#
druid.extensions.loadList=["druid-kafka-indexing-service", "postgresql-metadata-storage", "druid-kubernetes-extensions"]
...
# Metadata Store
#druid.metadata.storage.type=derby
#druid.metadata.storage.connector.connectURI=jdbc:derby://localhost:1527/druid/data/derbydb/metadata.db;create=true
#druid.metadata.storage.connector.host=localhost
#druid.metadata.storage.connector.port=1527
#druid.metadata.storage.connector.createTables=true
druid.metadata.storage.type=postgresql
druid.metadata.storage.connector.connectURI=jdbc:postgresql://acid-minimal-cluster.test-pg.svc.cluster.local/druid
druid.metadata.storage.connector.user=druid
druid.metadata.storage.connector.password=Zfqeb0oJnW3fcBCZvEz1zyAn3TMijIvdv5D8WYOz0Y168ym6fXahta05zJjnd3tY
druid.metadata.storage.connector.createTables=true
...
Обновляем кластер Druid:
[simterm]
$ kubectl -n druid apply -f examples/tiny-cluster.yaml
[/simterm]
Проверим данные в базе Постгре:
[simterm]
druid-> \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+-------
public | druid_audit | table | druid
public | druid_config | table | druid
public | druid_datasource | table | druid
public | druid_pendingsegments | table | druid
public | druid_rules | table | druid
public | druid_segments | table | druid
public | druid_supervisors | table | druid
[/simterm]
Найс!
Если нужно мигрировать данные из Derby на Postgre – см. Metadata Migration .
Далее – избавимся от необходимости в ZooKeeper.
Настройка Druid Kubernetes Service Discovery
Документация по модулю – тут>>> .
Возвращаемся к druid-operator/examples/tiny-cluster.yaml, и обновляем конфиг – отключаем ZooKeeper, добавляем новый экстешен druid-kubernetes-extensionsи дополнительные параметры:
...
druid.extensions.loadList=["druid-kafka-indexing-service", "postgresql-metadata-storage", "druid-kubernetes-extensions"]
...
druid.zk.service.enabled=false
druid.serverview.type=http
druid.coordinator.loadqueuepeon.type=http
druid.indexer.runner.type=httpRemote
druid.discovery.type=k8s
# Zookeeper
#druid.zk.service.host=tiny-cluster-zk-0.tiny-cluster-zk
#druid.zk.paths.base=/druid
#druid.zk.service.compress=false
...
Обновляем:
[simterm]
$ kubectl -n druid apply -f examples/tiny-cluster.yam
[/simterm]
Druid RBAC Role
Добавляем RBAC Role и RoleBinding, иначе будем ошибки авторизации по типу такой:
ERROR [org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcherbroker] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher — Error while watching node type [BROKER]
org.apache.druid.java.util.common.RE: Expection in watching pods, code[403] and error[{«kind»:»Status»,»apiVersion»:»v1″,»metadata»:{},»status»:»Failure»,»message»:»pods is forbidden: User \»system:serviceaccount:druid:default\» cannot watch resource
\»pods\» in API group \»\» in the namespace \»druid\»»,»reason»:»Forbidden»,»details»:{«kind»:»pods»},»code»:403}
Создаем манифест из документации :
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: druid-cluster rules: - apiGroups: - "" resources: - pods - configmaps verbs: - '*' --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: druid-cluster subjects: - kind: ServiceAccount name: default roleRef: kind: Role name: druid-cluster apiGroup: rbac.authorization.k8s.io
Создаем новые ресурсы в неймспейсе Друида:
[simterm]
$ kubectl -n druid apply -f druid-serviceaccout.yaml role.rbac.authorization.k8s.io/druid-cluster created rolebinding.rbac.authorization.k8s.io/druid-cluster created
[/simterm]
И через минуту проверяем логи:
[simterm]
... 2022-09-21T17:01:15,916 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Starting NodeRoleWatcher for [HISTORICAL]... 2022-09-21T17:01:15,916 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Started NodeRoleWatcher for [HISTORICAL]. 2022-09-21T17:01:15,916 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Created NodeRoleWatcher for nodeRole [HISTORICAL]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Creating NodeRoleWatcher for nodeRole [PEON]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Starting NodeRoleWatcher for [PEON]... 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Started NodeRoleWatcher for [PEON]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Created NodeRoleWatcher for nodeRole [PEON]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Creating NodeRoleWatcher for nodeRole [INDEXER]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Starting NodeRoleWatcher for [INDEXER]... 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Started NodeRoleWatcher for [INDEXER]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Created NodeRoleWatcher for nodeRole [INDEXER]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Creating NodeRoleWatcher for nodeRole [BROKER]. 2022-09-21T17:01:15,917 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Starting NodeRoleWatcher for [BROKER]... 2022-09-21T17:01:15,918 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider$NodeRoleWatcher - Started NodeRoleWatcher for [BROKER]. 2022-09-21T17:01:15,918 INFO [main] org.apache.druid.k8s.discovery.K8sDruidNodeDiscoveryProvider - Created NodeRoleWatcher for nodeRole [BROKER]. ...
[/simterm]
Готово.