Продовжимо серію постів про 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]
Готово.