Amazon Timestream ile Zaman Serisi Verisi Yönetimi: Sensör Verilerini Depolama ve Sorgulama

Amazeng Teknik Ekip
9 dakika okuma
AWS TimestreamTime SeriesSensor DataDatabaseAnalytics

Giriş

Endüstriyel IoT uygulamalarında sensör verileri zaman serisi (time-series) formatındadır: Her veri noktası bir zaman damgası ile eşleşir. ZMA ve GDT cihazlarımızdan gelen milyonlarca veri noktasını depolamak için geleneksel veritabanları (MySQL, PostgreSQL) yetersiz kalır.

Amazon Timestream, özel olarak time-series data için optimize edilmiş, serverless bir veritabanı servisidir. Bu yazımızda, Cloud & IoT Veri Toplama Çözümlerimiz kapsamında Timestream'in nasıl kullanılacağını inceliyoruz.

Neden Timestream?

Geleneksel Veritabanı Sorunları

MySQL ile sensör verisi:

CREATE TABLE sensor_data (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  device_id VARCHAR(50),
  timestamp DATETIME,
  value FLOAT,
  INDEX idx_time (timestamp)
);

Sorunlar:

  • Yavaş sorgular: Milyonlarca satırda aggregation
  • Disk kullanımı: Her kayıt 20-30 byte
  • Bakım: Index optimization, partitioning
  • Ölçeklendirme: Vertical scaling (pahalı)

Timestream Avantajları

1000x hızlı: Özel time-series query engine
%90 daha ucuz: Otomatik data tiering (memory → magnetic)
Serverless: Otomatik ölçeklendirme
Built-in functions: AVG(), INTERPOLATE_LINEAR(), FILL()
SQL uyumlu: Standart SQL sorguları

Timestream Mimarisi

Database ve Table Yapısı

AmazengFactory (Database)
├── SensorData (Table)
│   ├── Memory Store: 7 gün (hızlı erişim)
│   └── Magnetic Store: 2 yıl (arşiv)
├── Alarms (Table)
└── ProductionMetrics (Table)

Memory vs Magnetic Store

ÖzellikMemory StoreMagnetic Store
RetentionSaat-günlerAy-yıllar
Maliyet$0.036 / GB-saat$0.03 / GB-ay
Sorgu HızıÇok hızlıHızlı
Use CaseReal-time dashboardGeçmiş analiz

Data Lifecycle:

Write → Memory Store (7 gün) → Magnetic Store (2 yıl) → Silme

AWS CLI ile Kurulum

1. Database Oluşturma

aws timestream-write create-database \
  --database-name AmazengFactory \
  --region eu-west-1

2. Table Oluşturma

aws timestream-write create-table \
  --database-name AmazengFactory \
  --table-name SensorData \
  --retention-properties '{
    "MemoryStoreRetentionPeriodInHours": 168,
    "MagneticStoreRetentionPeriodInDays": 730
  }'

IoT Core → Timestream Rule

AWS IoT Core'dan gelen MQTT verilerini otomatik Timestream'e yazma:

-- IoT Rule SQL
SELECT
  device_name as device,
  timestamp() as time,
  values.channel_1 as ch1,
  values.channel_2 as ch2,
  values.channel_3 as ch3,
  values.channel_4 as ch4
FROM 'amazeng/factory/+/data'

Action: Timestream'e yaz

{
  "roleArn": "arn:aws:iam::123456789:role/IoTTimestreamRole",
  "databaseName": "AmazengFactory",
  "tableName": "SensorData",
  "dimensions": [{ "name": "device", "value": "${device}" }],
  "timestamp": {
    "value": "${time}",
    "unit": "MILLISECONDS"
  }
}

Python ile Veri Yazma

Gateway'den manuel veri yazma:

import boto3
from datetime import datetime

timestream_write = boto3.client('timestream-write', region_name='eu-west-1')

def write_sensor_data(device_name, channel_values):
    records = []
    current_time = str(int(datetime.now().timestamp() * 1000))

    for ch_num, value in enumerate(channel_values, 1):
        records.append({
            'Time': current_time,
            'TimeUnit': 'MILLISECONDS',
            'Dimensions': [
                {'Name': 'device', 'Value': device_name},
                {'Name': 'channel', 'Value': f'ch{ch_num}'}
            ],
            'MeasureName': 'sensor_value',
            'MeasureValue': str(value),
            'MeasureValueType': 'DOUBLE'
        })

    timestream_write.write_records(
        DatabaseName='AmazengFactory',
        TableName='SensorData',
        Records=records
    )

    print(f"✓ {len(records)} records yazıldı")

# Kullanım
write_sensor_data('ZMA-Tank1', [45.2, 46.1, 44.8, 45.5])

Timestream SQL Sorguları

1. Son 1 Saatin Verileri

SELECT
  device,
  channel,
  time,
  measure_value::double as value
FROM "AmazengFactory"."SensorData"
WHERE time > ago(1h)
ORDER BY time DESC
LIMIT 100

2. 1 Dakikalık Ortalamalar

SELECT
  device,
  channel,
  BIN(time, 1m) as minute,
  AVG(measure_value::double) as avg_value,
  MAX(measure_value::double) as max_value,
  MIN(measure_value::double) as min_value
FROM "AmazengFactory"."SensorData"
WHERE time > ago(1h)
GROUP BY device, channel, BIN(time, 1m)
ORDER BY minute DESC

3. Interpolation (Eksik Veri Doldurma)

SELECT
  device,
  INTERPOLATE_LINEAR(
    CREATE_TIME_SERIES(time, measure_value::double),
    SEQUENCE(ago(1h), now(), 1m)
  ) as interpolated_values
FROM "AmazengFactory"."SensorData"
WHERE time > ago(1h)
  AND device = 'ZMA-Tank1'

4. Anomaly Detection

WITH stats AS (
  SELECT
    AVG(measure_value::double) as mean,
    STDDEV(measure_value::double) as stddev
  FROM "AmazengFactory"."SensorData"
  WHERE time > ago(7d)
)
SELECT
  time,
  device,
  measure_value::double as value,
  (measure_value::double - stats.mean) / stats.stddev as z_score
FROM "AmazengFactory"."SensorData", stats
WHERE time > ago(1h)
  AND ABS((measure_value::double - stats.mean) / stats.stddev) > 3

Grafana ile Görselleştirme

Grafana Timestream Plugin

grafana-cli plugins install grafana-timestream-datasource

Data Source Konfigürasyonu:

{
  "type": "grafana-timestream-datasource",
  "name": "AWS Timestream",
  "jsonData": {
    "authType": "keys",
    "defaultRegion": "eu-west-1",
    "defaultDatabase": "AmazengFactory",
    "defaultTable": "SensorData"
  },
  "secureJsonData": {
    "accessKey": "AKIA...",
    "secretKey": "..."
  }
}

Grafana Query:

SELECT
  BIN(time, $__interval) as time,
  AVG(measure_value::double) as value
FROM $__database.$__table
WHERE $__timeFilter
  AND device = 'ZMA-Tank1'
GROUP BY BIN(time, $__interval)
ORDER BY time

Maliyet Optimizasyonu

Yazma Batch'leme

# Kötü: Her veri ayrı request
for data in sensor_readings:
    timestream_write.write_records(...)  # 1000 request

# İyi: Batch write (100 kayıt/request)
batch = []
for data in sensor_readings:
    batch.append(record)
    if len(batch) == 100:
        timestream_write.write_records(Records=batch)
        batch = []

Maliyet farkı: $1.00/milyon yazma → $0.01/milyon yazma (100x ucuz)

Retention Policy

# Memory: 1 gün (sık erişilen)
# Magnetic: 90 gün (nadiren)
timestream_write.update_table(
    DatabaseName='AmazengFactory',
    TableName='SensorData',
    RetentionProperties={
        'MemoryStoreRetentionPeriodInHours': 24,
        'MagneticStoreRetentionPeriodInDays': 90
    }
)

Gerçek Dünya Örneği

Senaryo: 10 Cihaz, 1s Polling

10 cihaz × 4 kanal × 1 veri/saniye = 40 write/saniye
= 2,400 write/dakika
= 144,000 write/saat
= 3.5M write/ay

Maliyet Hesabı:

Writes: 3.5M × $0.50/million = $1.75/ay
Memory Store: ~500MB × $0.036/GB-saat = $12.96/ay
Magnetic Store: ~15GB × $0.03/GB-ay = $0.45/ay

TOPLAM: ~$15/ay

Sonuç

Amazon Timestream, endüstriyel IoT projelerinde sensör verisi yönetimi için ideal çözümdür. Cloud & IoT Veri Toplama Çözümlerimiz ile tam entegrasyon sağlanır.

İlgili Kaynaklar