mirror of https://github.com/grafana/loki
Add docker-compose cluster deployment file (#2740)
- To help beginners learning how to launch a cluster of loki on a local machine - Use single loki config for both front-end and other nodes - Fix query lookback and add /ring to gateway Signed-off-by: Hui Kang <kangh@us.ibm.com>pull/2888/head
parent
3b8962403b
commit
d38377a2d6
@ -0,0 +1,37 @@ |
|||||||
|
# Loki cluster using docker-compose |
||||||
|
|
||||||
|
To deploy a cluster of loki nodes on a local machine (as shown below), you could use the `docker-compose-ha-member.yaml` file. |
||||||
|
|
||||||
|
<img src="./docker-compose-ha-diagram.png" width="850"> |
||||||
|
|
||||||
|
Some features of the deployment: |
||||||
|
|
||||||
|
- Backend: 3 Loki servers enabled with distributor, ingester, querier module |
||||||
|
- Together they form a cluster ring based on memberlist mechanism (if using consul/etcd, modules can be separate for further separate read/write workloads) |
||||||
|
- Index data are stored and replicated through botldb-shipper |
||||||
|
- Replication_factor=2: the receiving distributor sends log data to 2 ingesters based on consistent hashing |
||||||
|
- Chunk storage is a shared directory mounted from the same host directory (to simulate S3 or gcs) |
||||||
|
- Query are performed through the two query frontend servers |
||||||
|
- An nginx gateway to route the write and read workloads from clients (Grafana, promtail) |
||||||
|
|
||||||
|
1. Ensure you have the most up-to-date Docker container images: |
||||||
|
|
||||||
|
```bash |
||||||
|
docker-compose pull |
||||||
|
``` |
||||||
|
|
||||||
|
1. Run the stack on your local Docker: |
||||||
|
|
||||||
|
```bash |
||||||
|
docker-compose -f ./docker-compose-ha-memberlist.yaml up |
||||||
|
``` |
||||||
|
|
||||||
|
1. When adding data source in the grafana dashboar, using `http://loki-gateway:3100` for the URL field. |
||||||
|
|
||||||
|
1. To clean up |
||||||
|
|
||||||
|
```bash |
||||||
|
docker-compose -f ./docker-compose-ha-memberlist.yaml down |
||||||
|
``` |
||||||
|
|
||||||
|
Remove the chunk data under `./chunks/`. |
@ -0,0 +1 @@ |
|||||||
|
* |
@ -0,0 +1,108 @@ |
|||||||
|
auth_enabled: false |
||||||
|
|
||||||
|
http_prefix: |
||||||
|
|
||||||
|
server: |
||||||
|
http_listen_address: 0.0.0.0 |
||||||
|
grpc_listen_address: 0.0.0.0 |
||||||
|
http_listen_port: 3100 |
||||||
|
grpc_listen_port: 9095 |
||||||
|
log_level: debug |
||||||
|
|
||||||
|
memberlist: |
||||||
|
join_members: ["loki-1", "loki_2", "loki_3"] |
||||||
|
dead_node_reclaim_time: 30s |
||||||
|
gossip_to_dead_nodes_time: 15s |
||||||
|
left_ingesters_timeout: 30s |
||||||
|
bind_addr: ['0.0.0.0'] |
||||||
|
bind_port: 7946 |
||||||
|
|
||||||
|
ingester: |
||||||
|
lifecycler: |
||||||
|
join_after: 60s |
||||||
|
observe_period: 5s |
||||||
|
ring: |
||||||
|
replication_factor: 2 |
||||||
|
kvstore: |
||||||
|
store: memberlist |
||||||
|
final_sleep: 0s |
||||||
|
chunk_idle_period: 1h |
||||||
|
max_chunk_age: 1h |
||||||
|
chunk_retain_period: 30s |
||||||
|
chunk_encoding: snappy |
||||||
|
chunk_target_size: 0 |
||||||
|
chunk_block_size: 262144 |
||||||
|
# chunk_target_size: 1.572864e+06 |
||||||
|
|
||||||
|
# Only needed for global rate strategy |
||||||
|
# distributor: |
||||||
|
# ring: |
||||||
|
# kvstore: |
||||||
|
# store: memberlist |
||||||
|
|
||||||
|
schema_config: |
||||||
|
configs: |
||||||
|
- from: 2020-08-01 |
||||||
|
store: boltdb-shipper |
||||||
|
object_store: filesystem |
||||||
|
schema: v11 |
||||||
|
index: |
||||||
|
prefix: index_ |
||||||
|
period: 24h |
||||||
|
|
||||||
|
storage_config: |
||||||
|
boltdb_shipper: |
||||||
|
# shared_store: s3 |
||||||
|
shared_store: filesystem |
||||||
|
active_index_directory: /tmp/loki/index |
||||||
|
cache_location: /tmp/loki/boltdb-cache |
||||||
|
|
||||||
|
#aws: |
||||||
|
# s3: s3://us-east-1/mybucket |
||||||
|
# sse_encryption: true |
||||||
|
# insecure: false |
||||||
|
# s3forcepathstyle: true |
||||||
|
filesystem: |
||||||
|
directory: /loki/chunks |
||||||
|
|
||||||
|
|
||||||
|
limits_config: |
||||||
|
max_cache_freshness_per_query: '10m' |
||||||
|
enforce_metric_name: false |
||||||
|
reject_old_samples: true |
||||||
|
reject_old_samples_max_age: 30m |
||||||
|
ingestion_rate_mb: 10 |
||||||
|
ingestion_burst_size_mb: 20 |
||||||
|
|
||||||
|
chunk_store_config: |
||||||
|
max_look_back_period: 336h |
||||||
|
|
||||||
|
table_manager: |
||||||
|
retention_deletes_enabled: true |
||||||
|
retention_period: 336h |
||||||
|
|
||||||
|
query_range: |
||||||
|
# make queries more cache-able by aligning them with their step intervals |
||||||
|
align_queries_with_step: true |
||||||
|
max_retries: 5 |
||||||
|
# parallelize queries in 15min intervals |
||||||
|
split_queries_by_interval: 15m |
||||||
|
parallelise_shardable_queries: true |
||||||
|
cache_results: true |
||||||
|
|
||||||
|
results_cache: |
||||||
|
cache: |
||||||
|
# We're going to use the in-process "FIFO" cache |
||||||
|
enable_fifocache: true |
||||||
|
fifocache: |
||||||
|
size: 1024 |
||||||
|
validity: 24h |
||||||
|
|
||||||
|
frontend: |
||||||
|
log_queries_longer_than: 5s |
||||||
|
# downstream_url: http://loki-1:3100 |
||||||
|
downstream_url: http://loki-gateway:3100 |
||||||
|
compress_responses: true |
||||||
|
|
||||||
|
querier: |
||||||
|
query_ingesters_within: 2h |
@ -0,0 +1,67 @@ |
|||||||
|
error_log /dev/stderr; |
||||||
|
pid /tmp/nginx.pid; |
||||||
|
worker_rlimit_nofile 8192; |
||||||
|
|
||||||
|
events { |
||||||
|
worker_connections 4096; ## Default: 1024 |
||||||
|
} |
||||||
|
|
||||||
|
http { |
||||||
|
|
||||||
|
default_type application/octet-stream; |
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] $status ' |
||||||
|
'"$request" $body_bytes_sent "$http_referer" ' |
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"'; |
||||||
|
access_log /dev/stderr main; |
||||||
|
sendfile on; |
||||||
|
tcp_nopush on; |
||||||
|
|
||||||
|
upstream distributor { |
||||||
|
server loki-1:3100; |
||||||
|
server loki-2:3100; |
||||||
|
server loki-3:3100; |
||||||
|
} |
||||||
|
|
||||||
|
upstream querier { |
||||||
|
server loki-1:3100; |
||||||
|
server loki-2:3100; |
||||||
|
server loki-3:3100; |
||||||
|
} |
||||||
|
|
||||||
|
upstream query-frontend { |
||||||
|
server loki-frontend:3100; |
||||||
|
} |
||||||
|
|
||||||
|
server { |
||||||
|
listen 80; |
||||||
|
proxy_set_header X-Scope-OrgID docker-ha; |
||||||
|
|
||||||
|
location = /loki/api/v1/push { |
||||||
|
proxy_pass http://distributor$request_uri; |
||||||
|
} |
||||||
|
|
||||||
|
location = /ring { |
||||||
|
proxy_pass http://distributor$request_uri; |
||||||
|
} |
||||||
|
|
||||||
|
location = /loki/api/v1/tail { |
||||||
|
proxy_pass http://querier$request_uri; |
||||||
|
proxy_set_header Upgrade $http_upgrade; |
||||||
|
proxy_set_header Connection "upgrade"; |
||||||
|
} |
||||||
|
|
||||||
|
location ~ /loki/api/.* { |
||||||
|
proxy_pass http://query-frontend$request_uri; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
server { |
||||||
|
listen 3100; |
||||||
|
proxy_set_header X-Scope-OrgID docker-ha; |
||||||
|
|
||||||
|
location ~ /loki/api/.* { |
||||||
|
proxy_pass http://querier$request_uri; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
server: |
||||||
|
http_listen_port: 9080 |
||||||
|
grpc_listen_port: 0 |
||||||
|
log_level: "debug" |
||||||
|
|
||||||
|
positions: |
||||||
|
filename: /tmp/positions.yaml |
||||||
|
|
||||||
|
clients: |
||||||
|
- url: http://loki-gateway:80/loki/api/v1/push |
||||||
|
|
||||||
|
scrape_configs: |
||||||
|
- job_name: system |
||||||
|
static_configs: |
||||||
|
- targets: |
||||||
|
- localhost |
||||||
|
labels: |
||||||
|
job: varlogs |
||||||
|
__path__: /var/log/*log |
After Width: | Height: | Size: 121 KiB |
@ -0,0 +1,88 @@ |
|||||||
|
version: "3.8" |
||||||
|
|
||||||
|
networks: |
||||||
|
loki: |
||||||
|
|
||||||
|
services: |
||||||
|
|
||||||
|
grafana: |
||||||
|
image: grafana/grafana:7.2.0 |
||||||
|
ports: |
||||||
|
- "3000:3000" |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
|
||||||
|
promtail: |
||||||
|
image: grafana/promtail:2.0.0 |
||||||
|
volumes: |
||||||
|
- /var/log:/var/log |
||||||
|
- ./config:/etc/promtail/ |
||||||
|
ports: |
||||||
|
- "9080:9080" |
||||||
|
command: -config.file=/etc/promtail/promtail-gateway.yaml |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
|
||||||
|
loki-gateway: |
||||||
|
image: nginx:1.19 |
||||||
|
volumes: |
||||||
|
- ./config/nginx-loki-gateway.conf:/etc/nginx/nginx.conf |
||||||
|
ports: |
||||||
|
- "80" |
||||||
|
- "3100" |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
|
||||||
|
loki-frontend: |
||||||
|
image: grafana/loki:2.0.0 |
||||||
|
volumes: |
||||||
|
- ./config:/etc/loki/ |
||||||
|
ports: |
||||||
|
- "3100" |
||||||
|
command: "-config.file=/etc/loki/loki-docker-memberlist-boltdb-shipper.yaml -target=query-frontend" |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
deploy: |
||||||
|
mode: replicated |
||||||
|
replicas: 2 |
||||||
|
|
||||||
|
loki-1: |
||||||
|
image: grafana/loki:1.6.1 |
||||||
|
volumes: |
||||||
|
- ./config:/etc/loki/ |
||||||
|
- ./chunks:/loki/chunks/ |
||||||
|
ports: |
||||||
|
- "3100" |
||||||
|
- "7946" |
||||||
|
command: "-config.file=/etc/loki/loki-docker-memberlist-boltdb-shipper.yaml -target=all" |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
restart: on-failure |
||||||
|
|
||||||
|
loki-2: |
||||||
|
image: grafana/loki:1.6.1 |
||||||
|
volumes: |
||||||
|
- ./config:/etc/loki/ |
||||||
|
- ./chunks:/loki/chunks/ |
||||||
|
ports: |
||||||
|
- "3100" |
||||||
|
- "7946" |
||||||
|
command: "-config.file=/etc/loki/loki-docker-memberlist-boltdb-shipper.yaml -target=all" |
||||||
|
# command: "-config.file=/etc/loki/loki-config.yaml" |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
restart: on-failure |
||||||
|
|
||||||
|
loki-3: |
||||||
|
image: grafana/loki:1.6.1 |
||||||
|
volumes: |
||||||
|
- ./config:/etc/loki/ |
||||||
|
- ./chunks:/loki/chunks/ |
||||||
|
ports: |
||||||
|
- "3100" |
||||||
|
- "7946" |
||||||
|
command: "-config.file=/etc/loki/loki-docker-memberlist-boltdb-shipper.yaml -target=all" |
||||||
|
# command: "-config.file=/etc/loki/loki-config.yaml" |
||||||
|
networks: |
||||||
|
- loki |
||||||
|
restart: on-failure |
Loading…
Reference in new issue