Amazon Timestream ile Zaman Serisi Verisi Yönetimi: Sensör Verilerini Depolama ve Sorgulama
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
| Özellik | Memory Store | Magnetic Store |
|---|---|---|
| Retention | Saat-günler | Ay-yıllar |
| Maliyet | $0.036 / GB-saat | $0.03 / GB-ay |
| Sorgu Hızı | Çok hızlı | Hızlı |
| Use Case | Real-time dashboard | Geç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.