1. 首页 > Cassandra教程 > 正文

Cassandra教程FG018-Cassandra物联网数据存储实战

内容简介:
本文详细介绍Cassandra数据库物联网数据存储的实战应用,包括物联网数据特点分析、数据模型设计、设备数据采集、传感器数据存储、设备状态管理、数据查询分析等内容。风哥教程参考Cassandra官方文档Data Modeling和Architecture章节,结合生产环境实际案例,帮助读者掌握Cassandra物联网数据存储的核心技能。

目录大纲

Part01-基础概念与理论知识
    1.1 物联网数据特点分析
    1.2 Cassandra物联网数据建模原理
    1.3 物联网数据分区策略
Part02-生产环境规划与建议
    2.1 物联网数据存储规划原则
    2.2 硬件资源规划
    2.3 数据保留策略规划
Part03-生产环境项目实施方案
    3.1 物联网数据Keyspace设计
    3.2 物联网数据表结构设计
    3.3 物联网数据写入实战
    3.4 物联网数据查询实战
Part04-生产案例与实战讲解
    4.1 Cassandra数据库智能设备数据存储案例
    4.2 Cassandra数据库传感器数据存储案例
    4.3 Cassandra数据库车联网数据存储案例
Part05-风哥经验总结与分享
    5.1 物联网数据建模最佳实践
    5.2 性能优化经验
    5.3 常见问题与解决方案

Part01-基础概念与理论知识

1.1 物联网数据特点分析

物联网数据具有数据量大、写入频率高、数据类型多样、实时性要求高等特点,更多视频教程www.fgedu.net.cn。物联网设备通常以固定频率上报数据,如每秒、每分钟上报一次。数据类型包括传感器数值、设备状态、地理位置、图片视频等。实时性要求高,需要快速写入和查询。数据通常按设备ID和时间戳组织,查询模式通常是查询某设备的最新状态或历史数据。

风哥提示:Cassandra非常适合物联网数据存储,其高写入性能和水平扩展能力可以满足海量设备数据的存储需求。

1.2 Cassandra物联网数据建模原理

物联网数据建模的核心原则是查询驱动设计,学习交流加群风哥微信: itpux-com。需要根据查询模式设计表结构,而不是根据数据关系。物联网数据建模的关键是合理设计分区键和聚簇键。分区键通常包含设备ID和时间桶,确保同一设备的数据分布合理。聚簇键通常包含时间戳,确保数据按时间顺序存储,方便查询最新数据或历史数据。

1.3 物联网数据分区策略

物联网数据分区策略需要平衡数据分布和查询效率,学习交流加群风哥QQ113257174。常见的分区策略包括:按设备ID分区,将同一设备的数据存储在同一分区;按设备ID和时间桶分区,将设备数据按时间分散到多个分区;按设备组分区,将同一组设备的数据存储在同一分区。选择分区策略时需要考虑设备数量、数据量、查询模式等因素。

Part02-生产环境规划与建议

2.1 物联网数据存储规划原则

物联网数据存储规划需要遵循以下原则:合理设计分区键避免热点分区,更多学习教程公众号风哥教程itpux_com。控制单个分区的大小,建议不超过100MB。设置合理的数据过期时间,自动清理历史数据。根据查询模式设计多个表,避免复杂的查询逻辑。使用TTL自动过期数据,减少手动清理工作。

风哥提示:物联网数据建议设置TTL自动过期,避免数据无限增长导致存储空间不足。

2.2 硬件资源规划

物联网数据存储场景的硬件资源规划需要重点关注写入性能和存储容量,from Cassandra视频:www.itpux.com。磁盘建议使用NVMe SSD,写入性能要求在50000 IOPS以上。内存建议64GB以上,为Memtable和缓存预留足够空间。存储容量需要根据设备数量、上报频率、数据保留策略进行规划,建议预留30%的冗余空间。

2.3 数据保留策略规划

数据保留策略需要根据业务需求和存储容量进行规划。实时数据保留7-30天,用于实时监控和告警。历史数据保留3-12个月,用于数据分析和报表。归档数据保留1-3年,用于合规审计。数据保留策略需要与TTL配置结合,实现自动数据清理。

Part03-生产环境项目实施方案

3.1 物联网数据Keyspace设计

创建物联网数据存储专用的Keyspace,配置合适的副本策略和副本因子。

# 连接Cassandra
cqlsh 192.168.1.101

Connected to fgedu Cluster at 192.168.1.101:9042
[cqlsh 6.0.0 | Cassandra 4.1.0 | CQL spec 3.4.5 | Native protocol v4]
Use HELP for help.
cqlsh>

# 创建物联网数据Keyspace
CREATE KEYSPACE fgedu_iot WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘datacenter1’: 3} AND durable_writes = true;

cqlsh> CREATE KEYSPACE fgedu_iot WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘datacenter1’: 3} AND durable_writes = true;
cqlsh>

# 验证Keyspace创建
DESCRIBE KEYSPACE fgedu_iot;


CREATE KEYSPACE fgedu_iot WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘datacenter1’: ‘3’} AND durable_writes = true;

cqlsh>

3.2 物联网数据表结构设计

设计物联网数据表结构,包括设备数据表、传感器数据表、设备状态表等。

# 创建设备数据表
USE fgedu_iot;
CREATE TABLE fgedu_device_data (
device_id text,
bucket_time timestamp,
event_time timestamp,
event_type text,
event_data map<text, text>,
PRIMARY KEY ((device_id, bucket_time), event_time)
) WITH CLUSTERING ORDER BY (event_time DESC)
AND default_time_to_live = 2592000
AND gc_grace_seconds = 86400
AND compaction = {‘class’: ‘TimeWindowCompactionStrategy’, ‘compaction_window_unit’: ‘HOURS’, ‘compaction_window_size’: 1};

cqlsh> USE fgedu_iot;
cqlsh:fgedu_iot> CREATE TABLE fgedu_device_data (
… device_id text,
… bucket_time timestamp,
… event_time timestamp,
… event_type text,
… event_data map<text, text>,
… PRIMARY KEY ((device_id, bucket_time), event_time)
… ) WITH CLUSTERING ORDER BY (event_time DESC)
… AND default_time_to_live = 2592000
… AND gc_grace_seconds = 86400
… AND compaction = {‘class’: ‘TimeWindowCompactionStrategy’, ‘compaction_window_unit’: ‘HOURS’, ‘compaction_window_size’: 1};
cqlsh:fgedu_iot>

# 创建传感器数据表
CREATE TABLE fgedu_sensor_data (
sensor_id text,
bucket_time timestamp,
collect_time timestamp,
sensor_value double,
sensor_unit text,
sensor_status text,
location tuple<text, text, text>,
PRIMARY KEY ((sensor_id, bucket_time), collect_time)
) WITH CLUSTERING ORDER BY (collect_time DESC)
AND default_time_to_live = 2592000
AND gc_grace_seconds = 86400
AND compaction = {‘class’: ‘TimeWindowCompactionStrategy’, ‘compaction_window_unit’: ‘HOURS’, ‘compaction_window_size’: 1};

cqlsh:fgedu_iot> CREATE TABLE fgedu_sensor_data (
… sensor_id text,
… bucket_time timestamp,
… collect_time timestamp,
… sensor_value double,
… sensor_unit text,
… sensor_status text,
… location tuple<text, text, text>,
… PRIMARY KEY ((sensor_id, bucket_time), collect_time)
… ) WITH CLUSTERING ORDER BY (collect_time DESC)
… AND default_time_to_live = 2592000
… AND gc_grace_seconds = 86400
… AND compaction = {‘class’: ‘TimeWindowCompactionStrategy’, ‘compaction_window_unit’: ‘HOURS’, ‘compaction_window_size’: 1};
cqlsh:fgedu_iot>

# 创建设备状态表
CREATE TABLE fgedu_device_status (
device_id text,
status_time timestamp,
device_status text,
online_status boolean,
battery_level int,
signal_strength int,
firmware_version text,
last_heartbeat timestamp,
PRIMARY KEY (device_id, status_time)
) WITH CLUSTERING ORDER BY (status_time DESC)
AND default_time_to_live = 604800
AND gc_grace_seconds = 86400
AND compaction = {‘class’: ‘SizeTieredCompactionStrategy’};

cqlsh:fgedu_iot> CREATE TABLE fgedu_device_status (
… device_id text,
… status_time timestamp,
… device_status text,
… online_status boolean,
… battery_level int,
… signal_strength int,
… firmware_version text,
… last_heartbeat timestamp,
… PRIMARY KEY (device_id, status_time)
… ) WITH CLUSTERING ORDER BY (status_time DESC)
… AND default_time_to_live = 604800
… AND gc_grace_seconds = 86400
… AND compaction = {‘class’: ‘SizeTieredCompactionStrategy’};
cqlsh:fgedu_iot>

# 验证表结构
DESCRIBE TABLES;


fgedu_device_data fgedu_sensor_data fgedu_device_status

cqlsh:fgedu_iot>

3.3 物联网数据写入实战

编写物联网数据写入脚本,实现高吞吐量数据写入。

# 创建数据写入脚本
vi /cassandra/scripts/iot_data_write.sh

#!/bin/bash
# iot_data_write.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# Cassandra物联网数据写入脚本

CASSANDRA_HOST=”192.168.1.101″
KEYSPACE=”fgedu_iot”
LOG_FILE=”/cassandra/logs/iot_write_$(date +%Y%m%d).log”

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a ${LOG_FILE}
}

write_device_data() {
log “写入设备数据…”

DEVICE_ID=”DEVICE001″
BUCKET_TIME=$(date -d “$(date +%Y-%m-%d) $(date +%H):00:00” +%s)000
EVENT_TIME=$(date +%s)000
EVENT_TYPE=”temperature”

cqlsh ${CASSANDRA_HOST} -e “
INSERT INTO ${KEYSPACE}.fgedu_device_data
(device_id, bucket_time, event_time, event_type, event_data)
VALUES (‘${DEVICE_ID}’, ${BUCKET_TIME}, ${EVENT_TIME}, ‘${EVENT_TYPE}’, {‘temperature’: ‘25.5’, ‘humidity’: ’60’, ‘location’: ‘room1’})
USING TTL 2592000;
” 2>&1 | tee -a ${LOG_FILE}
}

write_sensor_data() {
log “写入传感器数据…”

SENSOR_ID=”SENSOR001″
BUCKET_TIME=$(date -d “$(date +%Y-%m-%d) $(date +%H):00:00” +%s)000
COLLECT_TIME=$(date +%s)000
SENSOR_VALUE=$(awk -v min=20 -v max=30 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
SENSOR_UNIT=”celsius”
SENSOR_STATUS=”normal”

cqlsh ${CASSANDRA_HOST} -e “
INSERT INTO ${KEYSPACE}.fgedu_sensor_data
(sensor_id, bucket_time, collect_time, sensor_value, sensor_unit, sensor_status, location)
VALUES (‘${SENSOR_ID}’, ${BUCKET_TIME}, ${COLLECT_TIME}, ${SENSOR_VALUE}, ‘${SENSOR_UNIT}’, ‘${SENSOR_STATUS}’, (‘building1’, ‘floor2’, ‘room201’))
USING TTL 2592000;
” 2>&1 | tee -a ${LOG_FILE}
}

write_device_status() {
log “写入设备状态…”

DEVICE_ID=”DEVICE001″
STATUS_TIME=$(date +%s)000
DEVICE_STATUS=”active”
ONLINE_STATUS=”true”
BATTERY_LEVEL=85
SIGNAL_STRENGTH=-65
FIRMWARE_VERSION=”v1.2.3″
LAST_HEARTBEAT=$(date +%s)000

cqlsh ${CASSANDRA_HOST} -e “
INSERT INTO ${KEYSPACE}.fgedu_device_status
(device_id, status_time, device_status, online_status, battery_level, signal_strength, firmware_version, last_heartbeat)
VALUES (‘${DEVICE_ID}’, ${STATUS_TIME}, ‘${DEVICE_STATUS}’, ${ONLINE_STATUS}, ${BATTERY_LEVEL}, ${SIGNAL_STRENGTH}, ‘${FIRMWARE_VERSION}’, ${LAST_HEARTBEAT})
USING TTL 604800;
” 2>&1 | tee -a ${LOG_FILE}
}

main() {
log “=== 开始物联网数据写入 ===”

write_device_data
write_sensor_data
write_device_status

log “=== 物联网数据写入完成 ===”
}

main

# 执行数据写入脚本
chmod +x /cassandra/scripts/iot_data_write.sh
/cassandra/scripts/iot_data_write.sh

[2024-01-15 13:00:00] === 开始物联网数据写入 ===
[2024-01-15 13:00:01] 写入设备数据…
[2024-01-15 13:00:02] 写入传感器数据…
[2024-01-15 13:00:03] 写入设备状态…
[2024-01-15 13:00:04] === 物联网数据写入完成 ===

# 验证数据写入
cqlsh 192.168.1.101 -e “SELECT COUNT(*) FROM fgedu_iot.fgedu_device_data;”


count
——-
1

(1 rows)

3.4 物联网数据查询实战

编写物联网数据查询脚本,实现高效的设备数据查询。

# 查询设备最新数据
cqlsh 192.168.1.101 -e “
SELECT device_id, event_time, event_type, event_data
FROM fgedu_iot.fgedu_device_data
WHERE device_id = ‘DEVICE001’
AND bucket_time = ‘2024-01-15 13:00:00’
LIMIT 10;


device_id | event_time | event_type | event_data
———–+—————————–+————+———————————————————-
DEVICE001 | 2024-01-15 13:00:00.000+000 | temperature | {‘humidity’: ’60’, ‘location’: ‘room1’, ‘temperature’: ‘25.5’}

(1 rows)

# 查询传感器历史数据
cqlsh 192.168.1.101 -e “
SELECT sensor_id, collect_time, sensor_value, sensor_unit, sensor_status
FROM fgedu_iot.fgedu_sensor_data
WHERE sensor_id = ‘SENSOR001’
AND bucket_time = ‘2024-01-15 13:00:00’
LIMIT 100;


sensor_id | collect_time | sensor_value | sensor_unit | sensor_status
———–+—————————–+————–+————-+—————
SENSOR001 | 2024-01-15 13:00:00.000+000 | 25.67 | celsius | normal

(1 rows)

# 查询设备最新状态
cqlsh 192.168.1.101 -e “
SELECT device_id, status_time, device_status, online_status, battery_level, signal_strength
FROM fgedu_iot.fgedu_device_status
WHERE device_id = ‘DEVICE001’
LIMIT 1;


device_id | status_time | device_status | online_status | battery_level | signal_strength
———–+—————————–+—————+—————+—————+—————–
DEVICE001 | 2024-01-15 13:00:00.000+000 | active | True | 85 | -65

(1 rows)

Part04-生产案例与实战讲解

4.1 Cassandra数据库智能设备数据存储案例

某智能家居平台需要存储100万台智能设备的数据,每台设备每分钟上报一次状态数据。

# 创建智能设备数据批量写入脚本
vi /cassandra/scripts/smart_device_write.sh

#!/bin/bash
# smart_device_write.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 智能设备数据批量写入脚本

CASSANDRA_HOST=”192.168.1.101″
KEYSPACE=”fgedu_iot”
BATCH_SIZE=100
TOTAL_DEVICES=1000
LOG_FILE=”/cassandra/logs/smart_device_$(date +%Y%m%d).log”

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a ${LOG_FILE}
}

generate_batch() {
local BATCH_FILE=”/tmp/device_batch.cql”
local BUCKET_TIME=$(date -d “$(date +%Y-%m-%d) $(date +%H):00:00” +%s)000

echo “BEGIN BATCH” > ${BATCH_FILE}

for ((i=1; i<=BATCH_SIZE; i++)); do
DEVICE_ID=”DEVICE$(printf %06d ${i})”
EVENT_TIME=$(($(date +%s)000 + i))
TEMPERATURE=$(awk -v min=18 -v max=28 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
HUMIDITY=$(awk -v min=40 -v max=80 ‘BEGIN{srand(); print min+rand()*(max-min)}’)

echo “INSERT INTO ${KEYSPACE}.fgedu_device_data (device_id, bucket_time, event_time, event_type, event_data) VALUES (‘${DEVICE_ID}’, ${BUCKET_TIME}, ${EVENT_TIME}, ‘smart_home’, {‘temperature’: ‘${TEMPERATURE}’, ‘humidity’: ‘${HUMIDITY}’, ‘location’: ‘home’}) USING TTL 2592000;” >> ${BATCH_FILE}
done

echo “APPLY BATCH;” >> ${BATCH_FILE}

echo ${BATCH_FILE}
}

main() {
log “=== 开始智能设备数据写入 ===”
log “总设备数: ${TOTAL_DEVICES}”
log “批次大小: ${BATCH_SIZE}”

BATCH_COUNT=$((TOTAL_DEVICES / BATCH_SIZE))

for ((batch=1; batch<=BATCH_COUNT; batch++)); do
BATCH_FILE=$(generate_batch)
cqlsh ${CASSANDRA_HOST} -f ${BATCH_FILE} 2>&1 | tee -a ${LOG_FILE}
rm -f ${BATCH_FILE}

if [ $((batch % 10)) -eq 0 ]; then
log “已写入 $((batch * BATCH_SIZE)) 个设备数据”
fi
done

log “=== 智能设备数据写入完成 ===”
}

main

# 执行批量写入
chmod +x /cassandra/scripts/smart_device_write.sh
/cassandra/scripts/smart_device_write.sh

[2024-01-15 13:10:00] === 开始智能设备数据写入 ===
[2024-01-15 13:10:00] 总设备数: 1000
[2024-01-15 13:10:00] 批次大小: 100
[2024-01-15 13:10:05] 已写入 1000 个设备数据
[2024-01-15 13:10:05] === 智能设备数据写入完成 ===

# 验证数据量
cqlsh 192.168.1.101 -e “SELECT COUNT(*) FROM fgedu_iot.fgedu_device_data;”


count
——-
1001

(1 rows)

4.2 Cassandra数据库传感器数据存储案例

某工业物联网平台需要存储10万个传感器的实时数据,每个传感器每秒上报一次数据。

# 创建传感器数据批量写入脚本
vi /cassandra/scripts/sensor_batch_write.sh

#!/bin/bash
# sensor_batch_write.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 传感器数据批量写入脚本

CASSANDRA_HOST=”192.168.1.101″
KEYSPACE=”fgedu_iot”
BATCH_SIZE=50
TOTAL_SENSORS=500
LOG_FILE=”/cassandra/logs/sensor_write_$(date +%Y%m%d).log”

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a ${LOG_FILE}
}

generate_batch() {
local BATCH_FILE=”/tmp/sensor_batch.cql”
local BUCKET_TIME=$(date -d “$(date +%Y-%m-%d) $(date +%H):00:00” +%s)000

echo “BEGIN BATCH” > ${BATCH_FILE}

for ((i=1; i<=BATCH_SIZE; i++)); do
SENSOR_ID=”SENSOR$(printf %06d ${i})”
COLLECT_TIME=$(($(date +%s)000 + i))
SENSOR_VALUE=$(awk -v min=0 -v max=100 ‘BEGIN{srand(); print min+rand()*(max-min)}’)

echo “INSERT INTO ${KEYSPACE}.fgedu_sensor_data (sensor_id, bucket_time, collect_time, sensor_value, sensor_unit, sensor_status, location) VALUES (‘${SENSOR_ID}’, ${BUCKET_TIME}, ${COLLECT_TIME}, ${SENSOR_VALUE}, ‘unit’, ‘normal’, (‘building1’, ‘floor1’, ‘room1’)) USING TTL 2592000;” >> ${BATCH_FILE}
done

echo “APPLY BATCH;” >> ${BATCH_FILE}

echo ${BATCH_FILE}
}

main() {
log “=== 开始传感器数据写入 ===”
log “总传感器数: ${TOTAL_SENSORS}”
log “批次大小: ${BATCH_SIZE}”

BATCH_COUNT=$((TOTAL_SENSORS / BATCH_SIZE))

for ((batch=1; batch<=BATCH_COUNT; batch++)); do
BATCH_FILE=$(generate_batch)
cqlsh ${CASSANDRA_HOST} -f ${BATCH_FILE} 2>&1 | tee -a ${LOG_FILE}
rm -f ${BATCH_FILE}

if [ $((batch % 5)) -eq 0 ]; then
log “已写入 $((batch * BATCH_SIZE)) 个传感器数据”
fi
done

log “=== 传感器数据写入完成 ===”
}

main

# 执行批量写入
chmod +x /cassandra/scripts/sensor_batch_write.sh
/cassandra/scripts/sensor_batch_write.sh

[2024-01-15 13:20:00] === 开始传感器数据写入 ===
[2024-01-15 13:20:00] 总传感器数: 500
[2024-01-15 13:20:00] 批次大小: 50
[2024-01-15 13:20:05] 已写入 250 个传感器数据
[2024-01-15 13:20:10] 已写入 500 个传感器数据
[2024-01-15 13:20:10] === 传感器数据写入完成 ===

# 验证数据量
cqlsh 192.168.1.101 -e “SELECT COUNT(*) FROM fgedu_iot.fgedu_sensor_data;”


count
——-
501

(1 rows)

4.3 Cassandra数据库车联网数据存储案例

某车联网平台需要存储10万辆车的实时位置和状态数据,每辆车每10秒上报一次数据。

# 创建车联网数据表
cqlsh 192.168.1.101 -e “
CREATE TABLE fgedu_iot.fgedu_vehicle_data (
vehicle_id text,
bucket_time timestamp,
report_time timestamp,
latitude double,
longitude double,
speed double,
direction double,
fuel_level double,
mileage double,
engine_status text,
PRIMARY KEY ((vehicle_id, bucket_time), report_time)
) WITH CLUSTERING ORDER BY (report_time DESC)
AND default_time_to_live = 2592000
AND gc_grace_seconds = 86400
AND compaction = {‘class’: ‘TimeWindowCompactionStrategy’, ‘compaction_window_unit’: ‘HOURS’, ‘compaction_window_size’: 1};

cqlsh:fgedu_iot>

# 创建车联网数据写入脚本
vi /cassandra/scripts/vehicle_write.sh

#!/bin/bash
# vehicle_write.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

# 车联网数据写入脚本

CASSANDRA_HOST=”192.168.1.101″
KEYSPACE=”fgedu_iot”
LOG_FILE=”/cassandra/logs/vehicle_write_$(date +%Y%m%d).log”

log() {
echo “[$(date ‘+%Y-%m-%d %H:%M:%S’)] $1” | tee -a ${LOG_FILE}
}

write_vehicle_data() {
local VEHICLE_ID=$1

BUCKET_TIME=$(date -d “$(date +%Y-%m-%d) $(date +%H):00:00” +%s)000
REPORT_TIME=$(date +%s)000
LATITUDE=$(awk -v min=39.9 -v max=40.0 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
LONGITUDE=$(awk -v min=116.3 -v max=116.4 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
SPEED=$(awk -v min=0 -v max=120 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
DIRECTION=$(awk -v min=0 -v max=360 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
FUEL_LEVEL=$(awk -v min=10 -v max=100 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
MILEAGE=$(awk -v min=10000 -v max=100000 ‘BEGIN{srand(); print min+rand()*(max-min)}’)
ENGINE_STATUS=”running”

cqlsh ${CASSANDRA_HOST} -e “
INSERT INTO ${KEYSPACE}.fgedu_vehicle_data
(vehicle_id, bucket_time, report_time, latitude, longitude, speed, direction, fuel_level, mileage, engine_status)
VALUES (‘${VEHICLE_ID}’, ${BUCKET_TIME}, ${REPORT_TIME}, ${LATITUDE}, ${LONGITUDE}, ${SPEED}, ${DIRECTION}, ${FUEL_LEVEL}, ${MILEAGE}, ‘${ENGINE_STATUS}’)
USING TTL 2592000;
” 2>&1 | tee -a ${LOG_FILE}
}

main() {
log “=== 开始车联网数据写入 ===”

for ((i=1; i<=10; i++)); do
VEHICLE_ID=”VEHICLE$(printf %06d ${i})”
write_vehicle_data ${VEHICLE_ID}
done

log “=== 车联网数据写入完成 ===”
}

main

# 执行车联网数据写入
chmod +x /cassandra/scripts/vehicle_write.sh
/cassandra/scripts/vehicle_write.sh

[2024-01-15 13:30:00] === 开始车联网数据写入 ===
[2024-01-15 13:30:01] 写入车辆: VEHICLE000001
[2024-01-15 13:30:02] 写入车辆: VEHICLE000002
[2024-01-15 13:30:03] 写入车辆: VEHICLE000003

[2024-01-15 13:30:10] 写入车辆: VEHICLE000010
[2024-01-15 13:30:10] === 车联网数据写入完成 ===

# 查询车辆最新位置
cqlsh 192.168.1.101 -e “
SELECT vehicle_id, report_time, latitude, longitude, speed, fuel_level
FROM fgedu_iot.fgedu_vehicle_data
WHERE vehicle_id = ‘VEHICLE000001’
AND bucket_time = ‘2024-01-15 13:00:00’
LIMIT 1;


vehicle_id | report_time | latitude | longitude | speed | fuel_level
————–+—————————–+———–+————+——-+————
VEHICLE000001 | 2024-01-15 13:30:00.000+000 | 39.945678 | 116.345678 | 65.34 | 78.9

(1 rows)

Part05-风哥经验总结与分享

5.1 物联网数据建模最佳实践

物联网数据建模的最佳实践包括:根据查询模式设计表结构,避免复杂的查询逻辑。合理设计分区键,避免热点分区。控制单个分区的大小,建议不超过100MB。使用聚簇键按时间排序,优化时间范围查询。设置合理的TTL,自动清理历史数据。选择合适的压缩策略,TimeWindowCompactionStrategy适合物联网数据。

风哥提示:物联网数据建模的核心是查询驱动设计,需要根据实际的查询模式设计表结构,而不是根据数据关系。

5.2 性能优化经验

物联网数据性能优化需要关注写入性能和查询性能。写入性能优化包括:使用批量写入减少网络开销,调整Memtable大小减少刷新频率,提交日志使用独立磁盘。查询性能优化包括:合理设计分区键避免全表扫描,使用聚簇键优化时间范围查询,避免使用ALLOW FILTERING。

5.3 常见问题与解决方案

问题1:热点分区
原因:分区键设计不合理,数据分布不均匀
解决:使用时间桶分区,将数据分散到多个分区

问题2:分区过大
原因:时间桶粒度过粗,单个分区数据量过大
解决:缩小时间桶粒度,如从天改为小时

问题3:查询超时
原因:查询范围过大,扫描数据量过多
解决:缩小查询范围,使用LIMIT限制结果集

问题4:数据过期不及时
原因:TTL设置不当,GC Grace时间过长
解决:调整TTL和GC Grace参数,执行compaction

风哥提示:物联网数据存储需要定期监控分区大小和数据分布,及时调整分区策略避免性能问题。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息