Aktarıcı ve bölgeler
Ajanlarınızın yanında bir collector; bölgeler arasındaki bağlantı ise yeniden denemelerle aşılır.
Aktarıcı nedir
mcpd relay, aynı ikili dosyayı kendisi hiçbir şey saklamayan
bir collector olarak çalıştırır. Bir daemon'un kabul ettiği her HTTP alım
isteğini kabul eder, isteği diskteki bir biriktirme alanına yazar,
göndericiye yanıt verir ve ardından isteği --upstream ile adı
verilen daemon'lara gönderir. Hiçbir depo açmaz.
Ajanlarınızın çalıştığı her bölgede bir tane çalıştırın. Böylece bir gönderici birkaç milisaniye uzaklıktaki bir collector ile konuşur; bölgeler arasındaki bağlantıyı da her ajan kendi başına değil, aktarıcı yeniden denemelerle aşar.
iki üst sunuculu bir kenar aktarıcısı
mcpd relay \
--ingest-key $INGEST_KEY \
--upstream http://mcpd.eu.internal:4317 \
--upstream http://mcpd.us.internal:4317 $ MCPD_UPSTREAMS=http://mcpd.eu.internal:4317,http://mcpd.us.internal:4317 mcpd --data /data/mcpd.db config | grep ^relayrelay 2 upstream(s) in order, http://mcpd.eu.internal:4317, http://mcpd.us.internal:4317; each sender's key passed on; spool at /data/mcpd.spool/relay, 1024 MiB$ curl -s -D - -o /dev/null localhost:4317/v1/ingest -H "content-type: application/json" -d @batch.json | grep -e ^HTTP -e mcpd-relayHTTP/1.1 202 Acceptedmcpd-relay: spooled$ curl -s localhost:4317/v1/ingest -H "content-type: application/json" -d @batch.json{"accepted":0,"duplicate":0,"rejected":0} Ne yanıt verir
Yoklama yolları dışındaki her yola gelen her POST kabul edilir. OTLP
yolları /v1/traces, /v1/logs ve
/v1/metrics, bir OpenTelemetry exporter'ının beklediği gibi,
OTLP partialSuccess ile 200 döner. Diğer her yol
mcpd-relay: spooled başlığı ve
{"accepted":0,"duplicate":0,"rejected":0} gövdesiyle
202 döner: istek tutulmuştur ve teslim edilecektir; gerçek sayılar ise onu
henüz görmemiş olan üst sunucuya aittir. Her SDK herhangi bir 2xx yanıtını
başarı sayar.
Aktarıcı --ingest-key değerini herhangi bir şey yazmadan önce
kendisi denetler ve --max-body-bytes ile
--request-timeout-seconds ayarlarını bir daemon gibi uygular.
Yanıt gönderilmeden önce istek biriktirme alanındadır:
<spool-dir>/relay.
Teslim ve yedeğe geçiş
Biriktirme alanını dört işçi gönderir. Her istek, --upstream
sırasında soğuma süresinde olmayan ilk üst sunucuya gider. Yeniden
denenebilir bir hata o üst sunucuyu geri çekilme ve rastgele sapmayla ya da
Retry-After ne kadar diyorsa o kadar süre soğumaya alır ve
istek hemen sonraki üst sunucuya gider. Soğuma bittiğinde önce yine birincil
denenir; böylece trafik kendiliğinden ona döner.
400 gibi kesin bir ret sonraki üst sunucuya gönderilmez: sonraki de aynı
baytları reddederdi. İstek biriktirme dizinindeki dead/ içine
taşınır ve sayılır.
Çift sayım yok
Teslim en az bir kezdir ve yeniden gönderilen bir istek bir kez saklanır.
Her istek bir Idempotency-Key başlığı taşır: gönderici bir
tane gönderdiyse onunkini, yoksa relay- ve ardından yolun,
içerik kodlamasının ve gövdenin özetini. Daemon'daki her alım kapısı bu
başlığı dikkate alır; yerel bir yığın gövdesindeki anahtar ise ondan
üstündür. Aktarıcının bir zaman aşımından sonra yeniden gönderdiği ya da
birincil isteği alıp yanıt kaybolduktan sonra ikincile gönderdiği bir istek
tanınır ve yinelenen olarak bildirilir.
Anahtarlar
--upstream-key verildiğinde aktarıcı bu anahtarı her üst
sunucuya Bearer belirteci olarak sunar. Verilmediğinde göndericinin
Authorization veya x-mcpd-key başlığı, biriktirilen
istekle birlikte yalnızca aktarıcının kullanıcısının okuyabildiği bir
dosyada tutulur ve iletilir. İkinci biçim, her göndericinin projesini ve
kapsamını üst sunucunun gördüğü hâliyle korur.
Geri basınç ve hazır olma
Biriktirme alanı --spool-max-bytes ile sınırlıdır; siz
ayarlamadıkça aktarıcı için 1 GiB. Dolduğunda bir istek 503 ve
Retry-After: 5 ile reddedilir. Her SDK ve OpenTelemetry
exporter'ı bunu yeniden dener; böylece aktarıcı veriyi düşürmez, veriyi
gönderici tutar.
/healthz her zaman 200 döner. /readyz şunları
döner:
- bir üst sunucuya erişilebildiği sürece 200
ok; -
son 30 saniyede hiçbir üst sunucu
/readyzyoklamasına yanıt vermediğinde ya da bir teslim almadığında, birdetailile 200degraded. Üst sunucular 5 saniyede bir yoklanır; - biriktirme alanı dolduğunda ya da hiçbir üst sunucuya erişilemiyor ve biriktirme alanı en az %80 doluyken 503.
Bu yüzden bir yük dengeleyici, tamponlama yapan bir aktarıcıya göndermeyi sürdürür ve artık alamayan bir aktarıcıdan trafiği uzaklaştırır.
Aktarıcı metrikleri
| Metrik | Tür | Anlamı |
|---|---|---|
mcpd_relay_accepted_total | counter | Biriktirme alanına yazılan istekler |
mcpd_relay_refused_full_total | counter | Biriktirme alanı dolu olduğu için 503 ile reddedilen istekler |
mcpd_relay_failovers_total | counter | İlki dışında bir üst sunucuya teslim edilen istekler |
mcpd_relay_dead_letter_total | counter | Bir üst sunucunun kesin olarak reddettiği ve dead/ içine taşınan istekler |
mcpd_relay_spool_entries | gauge | Biriktirme alanında bekleyen istekler |
mcpd_relay_spool_bytes | gauge | Biriktirme alanının tuttuğu bayt |
mcpd_relay_spool_oldest_seconds | gauge | Bekleyen en eski isteğin yaşı ya da 0 |
mcpd_relay_delivered_total | counter | Bir üst sunucunun kabul ettiği istekler; upstream ve order etiketleriyle |
mcpd_relay_failed_attempts_total | counter | Bir üst sunucunun kabul etmediği girişimler; aynı etiketlerle |
mcpd_relay_upstream_up | gauge | Üst sunucu son 30 saniyede yanıt verdiyse 1, aksi hâlde 0 |
mcpd_uptime_seconds | gauge | Bu süreç başladığından beri geçen saniye |
Artan bir mcpd_relay_failovers_total, birincilin başarısız
olduğunu ve trafiğini ikincilin taşıdığını gösterir.
mcpd_relay_spool_oldest_seconds, teslimin ne kadar geride
olduğunu gösterir.
Birden çok bölge
Bir veya daha fazla bölgede, tek bir Postgres ya da ClickHouse deposuna
bağlı birkaç daemon kopyası çalıştırın; çalıştırmalar Postgres'te
(--runs-data postgres://...) olsun ya da kapalı olsun: gömülü
bir çalıştırma deposu tek bir sürece aittir. Her
kopyanın /readyz yanıtı depoya erişip erişemediğini zaten
yansıtır. Her bölgede bunların önüne bir aktarıcı koyun;
--upstream listesinde önce en yakın daemon'u, ikinci olarak da
başka bir bölgedeki bir daemon'u verin.
Birden fazla kopya olduğunda dört ayar farklı davranır:
- Idempotency anahtarları ortak depoda tutulur; bu yüzden başka bir kopyaya düşen yeniden gönderim de tanınır. Postgres anahtarı yığınla aynı işlemde kaydeder.
- Dakika başına kota tavanları kopya başına sayılır. İstediğiniz tavanı kopya sayısına bölün.
- Canlı puanlama, kuyruk örneklemesi ve izleyici uyarıları aynı anda tek bir kopyada çalışır. Kopyalar paylaşılan depodaki bir lease ile sırayla iş alır: lease sahibi onu her geçişte yeniler, kapanırken bırakır ve durursa üç geçiş içinde başka bir kopya devralır. Her kopya kendi izleyicilerini ve SLO hedeflerini değerlendirir, bu yüzden her biri izleyici API'sine yanıt verir; webhook'u yalnızca lease sahibi gönderir. Onları her kopyada aynı şekilde yapılandırın.
- Yön analizi, yapılandırıldığı her kopyada çalışır. Onu tek bir kopyada yapılandırın.
Örnek kurulumlar
deploy/docker/docker-compose.multi-region.yml tek bir makinede
Postgres, iki daemon ve bir aktarıcı başlatır; bu, topolojinin tamamını
deneyebileceğiniz bir biçimde sunar.
Helm chart'ı mode: relay değerini alır.
deploy/helm/examples/ altındaki üç değer dosyası her biri bir
bölgeyi tanımlar: region-core.yaml,
region-standby.yaml ve region-edge-relay.yaml;
sonuncusu yalnızca bir aktarıcı çalıştıran bir bölge içindir.
Sonraki
- Veriyi başka sağlayıcılara kopyalamak: İletme.
- Yoklamalar, metrikler ve depolar: İşletme.
- Her seçenek: Yapılandırma.