
æç³»åDBã«å ¥éãã€ã€ãããã©ãŒãã³ã¹ãèšæž¬ããŠã¿ã(InfluxDB v2 vs PostgreSQL v15)
â»ãã®èšäºã¯èªåãæå±ããçµç¹ã§æžãã以äžã®èšäºã®ã³ããŒã§ããæçš¿ããèšäºã¯å人ã®èäœç©ãšããŠèªããã°ã«ã³ããŒããŠè¯ãã«ãŒã«ãšããŠããŸãã
å èšäº: https://tech-blog.mitsucari.com/entry/2025/05/19/135934
ããã«ã¡ã¯ãããã«ãªCTOã®å¡æ¬ããšãã€ãã³ãŒ(@tsukaby0) ã§ãã
ITã·ã¹ãã ã«ãããããŒã¿ããŒã¹(DB)ã«ã¯æ§ã ãªçš®é¡ãååšããŸããäžè¬çã«ãã䜿ãããã®ã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹(RDB, RDBMS)ã§ãããPostgreSQLãMySQLãæåã§ããããããšã¯å¥ã®çš®é¡ã«æç³»åDB(Time Series Database, TSDB)ãšãããã®ããããŸããçšéãšããŠã¯æç³»åããŒã¿(ã¿ã€ã ã¹ã¿ã³ããæã€ããŒã¿)ã®ä¿åããã³ååŸããªã¢ã«ã¿ã€ã éèšã§ããä»åã¯ãã®æç³»åDBã«å ¥éãã€ã€ããã©ãŒãã³ã¹ã枬å®ããŠã¿ããšããèšäºã§ãã
æç³»åDBãšã¯
æç³»åDBã¯æç³»åããŒã¿ãæ±ãããã®ããŒã¿ããŒã¹ã§ãããäžè¬çãªRDBã§ãã¿ã€ã ã¹ã¿ã³ãåã¯ããã®ã§ããã¡ãã§ã代æ¿å¯èœã§ãããã ããæç³»åDBã®æ¹ãããäžéšã®çšéã«ç¹åããŠããã®ã§ããŠãŒã¹ã±ãŒã¹æ¬¡ç¬¬ã§ã¯RDBãããè¯ãéžæè¢ã«ãªãããŸãã(â»ç§ã¯æç³»åDBã«å¯ŸããŠæ·±ãçµéšãããããã§ã¯ãªãã§ã)
æç³»åDBã䜿ãã¹ããã©ããã¯ãŠãŒã¹ã±ãŒã¹æ¬¡ç¬¬ã§ãã倧æµã®ãŠãŒã¹ã±ãŒã¹(å°éã®ããŒã¿)ã§ã¯RDBã§ååã§ãããšèšãããã§ããäŸãã°toB SaaSã®ãã°ã€ã³ãŠãŒã¶ãŒã®è¡åãã°ãååŸãåæãããããªãŠãŒã¹ã±ãŒã¹ã§ã¯RDBã§ååããã«æããŸãããå®éã«ããŒã¿ãçšæããŠã¯ãšãªãããŠãããŒã¿éãšã¯ãšãªæ¬¡ç¬¬ã§ã¯ãããŸããã倧æµã¯1sec以äžã§å¿çã§ããã®ã§ã¯ãšæããŸãã
æç³»åDBã®ãŠãŒã¹ã±ãŒã¹
ã§ã¯ã©ãããæã«äœ¿ãããšãããšãIoTãªã©ã®ã·ãŒã³ã§å€§éã«ããŒã¿ã®ãããªãã·ã£ãŒïŒéä¿¡è ïŒãããå ŽåããããŒã¿ãé«é »åºŠã§çºçãããããªå Žåãããã«ããããªã¢ã«ã¿ã€ã ã§ã¯ãšãªãããå ŽåããšæããŸãã
å ·äœçãªãŠãŒã¹ã±ãŒã¹ã¯ä»¥äžã®InfluxDataã®å ¬åŒãµã€ããåèã«ãªããŸãã

以äžã®ãããªãŠãŒã¹ã±ãŒã¹ãæããããŠããŸããã
- IoT
- ãããã¯ãŒã¯ãã°
- SaaSç£èŠ
å®éã«æã Webã®ãšã³ãžãã¢ã«ãšã£ãŠæã銎æã¿æ·±ãæç³»åDBã®çšéãšããŠã¯ããããã¯åçš®ãµãŒããŒçã®ã¡ããªã¯ã¹ããã³ç£èŠã§ãããããã«ãªç€Ÿã§ã¯Datadogã䜿ã£ãŠãããDatadogã®å éšæ§é ãŸã§ã¯åãããŸããããããããæç³»åDBãæ¡çšãããŠãããã§ã¯ãããŸããã¯ãŠãªç€Ÿã®Mackerelã ã£ããOSSã®Prometheusãç£èŠãµãŒãã¹ããœãããŠã§ã¢ãšããŠã¯æåã§ãããããããæç³»åDBã䜿ã£ãŠããŸãã(â»Prometheusã¯ç£èŠãœãããŠã§ã¢ã§ããåæã«æç³»åDBã§ããã)
æç³»åDBã䜿ããªããŠãè¯ããŠãŒã¹ã±ãŒã¹
æç³»åDBã®çšéã¯ããªãéå®çã§ããäŸãã°ã¿ã€ã ã¹ã¿ã³ããæã£ãŠããã ãã®ããŒã¿ã«ã¯å€§æµã®ã±ãŒã¹ã§ã¯äžåãã§ããäŸãã°usersããŒãã«ã«birthdayåããããããšãã£ãŠæç³»åDBãæé©ãšãªãã±ãŒã¹ã¯ã»ãŒãªãã¯ãã§ãã
SaaSã®ãŠãŒã¶ãŒã®è¡åãã°ã¯ã©ãã§ããããããŒã¿éã¯ãããªãã«ããããã§ããã倧éãšãŸã§ã¯èšããªãã§ããããªã¢ã«ã¿ã€ã ã§ã¯ãšãªããããŠãŒã¹ã±ãŒã¹ã¯ããŸãç¡ãããã«æããŸããçšé次第ã§ãã倧æµã®ã±ãŒã¹ã§ã¯éåæçã«éèšããããã£ãã·ã¥ãããã§ãªã¢ã«ã¿ã€ã æ§ã¯äžèŠãªã®ã§ã¯ãšæããŸãã
ãŠãŒã¹ã±ãŒã¹ããšã®æžã蟌ã¿é »åºŠãªã©ã®è©Šç®
ã§ã¯ã©ã®çšåºŠã®ããŒã¿éãçšéã§ããã°æç³»åDBãé©ããŠãããšèšããã®ã§ãããããããã«ã€ããŠã¯è¯ãè³æãèŠã€ãããŸããã§ãããç°¡åã«è©Šç®ããŠã¿ãããšæããŸãã
Case1. toB SaaSã®è¡åãã°
ãšããtoB SaaSã¯ä»¥äžã®æ¡ä»¶ã§éçšãããŠãããšããŸãã
- ããŒã¯æéã¯èããªããã®ãšãã
- 10,000 DAU (Daily Active User) ãšä»®å®
- 1Userããã1æ¥1æéå©çšãããšä»®å®ã1æéã®ãã¡ã«180åç»é¢ãéãããããã¿ã³ãæŒããªã©ã®æäœãè¡ã
- 1æäœããã1ãã°çºçãããããDBã«æ ŒçŽãããã®ãšãã
toB SaaSã§10000 DAUã¯ããªãã®èŠæš¡ã§ããããã®æ¡ä»¶ã ãš10000DAUã§ãããå®éã«ã¯1æéããæäœããªãã®ã§ã1æéãããã®æäœãŠãŒã¶ãŒã¯ 10000 / 24 = 417 人ã§ãã417人ã180åæäœããã®ã§1æéã®ãã°çºçæ°ã¯ 417 * 180 = 75060 ã§ããç§éã«ãããš 75060 / 60(min) / 60(sec) = 20.85 rpsãšãªããŸããã
20.85 rpsãããã¯éåžžã«å°ãªãã§ããã
RDBãã©ã®çšåºŠã®ããã©ãŒãã³ã¹ãåºãããã¯ããŒããŠã§ã¢æ§èœæ¬¡ç¬¬ãªã®ã§ãªããšãèšããªãéšåã¯ãããŸãããç§é1000ã10000TPSã»ã©ã¯æããŸããã€ãŸã20.85rpsçšåºŠãªãã°åé¡ãªãRDBã§ãåããããŸãã
ã¯ãšãªã¯ã©ãã§ããããïŒãããæ¡ä»¶æ¬¡ç¬¬ã§ã¯RDBã§åé¡ãªããããšèšããŸããçŽè¿1æéã®ãã°ã«å¯Ÿããåæããããå Žåã75060ã¬ã³ãŒãã§ãããŸãããã³ãããŠãŒã¶ãŒIDã§çµã蟌ãã°ãã£ãšä»¶æ°ã¯æžããŸãããã®çšåºŠã§ããã°æç³»åDBã§ãªããŠãããããOLAPçšã®DBã§ãªããŠãè¯ãããã§ãã
Case2. IoTããã€ã¹ã®ãã°
ãšããè»èŒIoTããã€ã¹ãããããã©ã€ãæ å ±ãDBã«æ ŒçŽããããšã§ãããè»äž¡ã®ãªã¢ã«ã¿ã€ã ã®èšºæã«æŽ»ãããããªã±ãŒã¹ãèããŠã¿ãŸãã
- æ¥æ¬ã«ååšããè»äž¡ã80,000,000å°ãšä»®å®
- èªç€Ÿã¡ãŒã«ãŒã®è»äž¡ãã€IoTããã€ã¹ãæèŒãããŠããè»äž¡ã10%ãšä»®å®
- èµ°è¡äžã®è»äž¡ã20%ãšä»®å®
- èµ°è¡äžã®è»äž¡ã¯1åããšã«1床IoTããã€ã¹ãããµãŒããŒã«ãã°ãéä¿¡ãããµãŒããŒã§ã¯éå»10åã®ããŒã¿ãã¯ãšãªããããšã§ããçã®ãªã¢ã«ã¿ã€ã ãªæ å ±æŽæ°ã«æŽ»çšããããšãšãã
äžèšã®æ¡ä»¶ã ãš 80000000 * 0.1 * 0.2 = 1600000 ãšããèšç®ã«ãã£ãŠãIoTããã€ã¹ã®åæçšŒåæ°ãæ±ããããŸãããããã¯1åããšã«1床éä¿¡ãããããç§éã«çŽããš 1600000 / 60(sec) = 26667 rpsã§ãã
26667 rpsãããã¯ããªãå€ãã§ãããBulk insertãæŽ»çšããããRDBã®ãã¥ãŒãã³ã°ããã·ã³ã®ã¹ã±ãŒã«ã¢ããã§æããªãããšããªãããã§ãããã ããäºæ¥ãæ¡å€§ããŠIoTããã€ã¹ã®æ°ãå¢ãããããã°ã®çš®é¡ãå¢ããå Žåã«ããªãå°ãããã§ãã
ãŸããéå»10åã®ã¬ã³ãŒããã¯ãšãªããŠå©çšããä»®å®ã®ããã 1600000 * 10 = 16000000 ã§ãã1600äžã¬ã³ãŒãã§ããããããOLTPã®DBã§éèšããã®ã¯çŸå®çã§ã¯ãªãããã§ããã¯ãšãªã«ããããŸããã5åã2æéããããã¯çµãããªãã»ã©é·ãããšãããããªã¯ãšãªã«ãªãããã§ããããã§ã¯ãªã¢ã«ã¿ã€ã ã«äœãåŠçããã倿ãããšããç®çã«ã¯äœ¿ããªãããã§ãã
æç³»åDBã®çš®é¡
ãŠãŒã¹ã±ãŒã¹ãŸã§ã¯åãããŸãããããŠãŒã¹ã±ãŒã¹ã«ããããããšããŠãã©ã®ãããªæç³»åDBãéžæããããèããå¿ èŠãããããã§ããå ·äœçã«ã¯æåã©ããã ãšä»¥äžã®ãããªãœãããŠã§ã¢ããããŸãã
- InfluxDB
- Prometheus
- Graphite
- TimescaleDB
- OpenTSDB
InfluxDB
InfluxDBã¯ããããæãç¥å床ãé«ãã§ããã¡ãªã¿ã«ä»¥äžã®ãããªäººæ°åºŠãèšæž¬ããŠãããµã€ãããããããããã§åãããŸããTSDBã®äžã§ã¯InfluxDBãå§åçã«äººæ°ã§ããã

2024幎3æã«ã¯Amazon TimestreamãšããŠããªãªãŒã¹ãããã®ã§ããããŒãžãã§äœ¿ããŸãã管çé¢ã¯ã ãã¶æ¥œãã§ãããã§ããã
Prometheus
Prometheusã¯æç³»åDBãšããããã¯ç£èŠãœãããŠã§ã¢ãšããŠã®åŽé¢ã匷ãã§ããåºæ¬çã«æç³»åDBãšããŠåªããŠãããšããå°è±¡ã¯ãªãã§ãããããååã§äœ¿ã£ãŠãããšãã話ã¯èããªããããç£èŠåæã§äœ¿ãããã®ãã®ã§ãããã以äžã®moff-bearããã®èšäºãåèã«ãªããŸãã

Graphite
Graphiteã¯ã»ãŒPrometheusã¿ãããªãã®ãšèããŠæ§ããŸããããããæç³»åDBã§ããã€ã€ç£èŠãœããã§ããããŸããéãã«ã€ããŠã¯å ¬åŒãµã€ãã«æ¯èŒè¡šãèŒã£ãŠããã®ã§ããããèªããšå€å°çè§£ã§ãããããããŸããã

TimescaleDB
TimescaleDBã¯Postgresæ¡åŒµãšããç¹ãç¹åŸŽã§ããå ·äœçã«ã¯ä»¥äžã®voluntasããã®ã¬ããŒããåèãªããšæããŸãã

OpenTSDB
OpenTSDBã¯HBaseäžã«æ§ç¯ããæç³»åDBã§ãããšããç¹ãç¹åŸŽã§ãããã€ãŸãã¯Hadoopãã¡ããªãŒã®äžå¡ã§ãããHadoopãšã³ã·ã¹ãã ãæ§ç¯ããŠããçµç¹ã«ãšã£ãŠã¯è¯ãéžæè¢ã«ãªãã®ã§ã¯ãªãã§ãããããåæãããã°ããŒã¿ã®åŠçã¯Hadoopã§ãã£ãŠãŸãããããŸãããšãããããªèŠæãæææ±ºå®ãªãã ãšå°å ¥ãã¥ãããã§ã¯ãããŸãããã ãã¹ã±ãŒã«ã¯ããããã®ã§ããããã
è¿å¹Žã§ã¯å°ãæŽæ°ããŒã¹ãèœã¡ãŠããŠããç¹ã¯æ°ã«ãªããŸãã
InfluxDBã®ããã©ãŒãã³ã¹èšæž¬ (vs PostgreSQL)
åè¿°ã®éããæç³»åDBååã§èããå Žåã¯InfluxDBã第äžåè£ã«ãªã£ãŠããããšæããŸããããã§ãããã«å ¥éããŠã¿ãããšã«ããŸããã
InfluxDBã¯çŸæç¹ã§v3ãåºãŠããŸããããŸã åºãã°ããã§ãããAmazon Timestreamãv3ã«ã¯å¯Ÿå¿ããŠããªãã®ã§ãv2ã䜿ãããšã«ããŸãããPostgresã¯çŸæç¹ã§ã®ææ°çã¯v17ã§ããããã¡ãã ãææ°ã䜿ããšäžå©ããªãšæã£ãã®ã§å°ãå€ã15ã䜿ãããšã«ããŸããã
ç°å¢ã»DBã€ã³ã¹ã¿ã³ã¹
Dockerã䜿ãããšã«ããŸããã
ç°¡åã«èµ·åã§ããŸãããåæã®PostgreSQL DB, Tableã»ããã¢ãããInfluxDBã®ãã±ããäœæãã¢ã¯ã»ã¹ããŒã¯ã³äœæãªã©ãèªååã§ããŸãã
枬å®ã³ãŒã
Postgresã®å Žå㯠pgbench ãšããæåãªããŒã«(æšæºããŒã«)ããããŸããããã䜿ããšCLIã§ç°¡åã«ãã³ãããŒã¯ãåããŸãããããã¯InfluxDBã«ã¯äœ¿ããŸããããæ¡ä»¶ãæãã¥ãããšæããŸããããã®ãããç°¡åãªæž¬å®çšã®Rubyã³ãŒããçšæããŠãå®è¡ããããšã«ããŸããã
äºåã«ä»¥äžã®ãããªtableãçšæããŠãããŸããæ°æž©ãåéããIoTããã€ã¹ãšããæ³å®ã§ãã
CREATE TABLE IF NOT EXISTS temperature_logs (
created_at TIMESTAMP NOT NULL,
device_id VARCHAR(255) NOT NULL,
location VARCHAR(255) NOT NULL,
temperature FLOAT NOT NULL,
unit VARCHAR(1) NOT NULL DEFAULT 'C'
);
-- Create composite indexes
CREATE INDEX IF NOT EXISTS idx_temperature_logs_created_at_device_id
ON temperature_logs (created_at, device_id);
CREATE INDEX IF NOT EXISTS idx_temperature_logs_created_at_location
ON temperature_logs (created_at, location);
以äžã®ãããªã³ãŒããçšæããŠå®è¡ããŸãã
module DB
class Postgres
def initialize
@conn = PG.connect(
host: ENV.fetch('POSTGRES_HOST', 'localhost'),
port: ENV.fetch('POSTGRES_PORT', '5432'),
dbname: ENV.fetch('POSTGRES_DB', 'benchmark'),
user: ENV.fetch('POSTGRES_USER', 'postgres'),
password: ENV.fetch('POSTGRES_PASSWORD', 'postgres')
)
end
def insert_actions(count)
time = Benchmark.realtime do
count.times do |i|
log = BenchmarkUtils.generate_temperature_log(i)
@conn.exec_params(
'INSERT INTO temperature_logs (created_at, device_id, location, temperature, unit) VALUES ($1, $2, $3, $4, $5)',
[log[:created_at], log[:device_id], log[:location], log[:temperature], log[:unit]]
)
end
end
time.round(4)
end
end
end
â»æççãªã®ã§çç¥ããŠããéšåããããŸããå®éã«ã¯Bulk insertãreadã®ã³ãŒãããããŸãããèšäºãé·ããªãã®ã§çç¥ããŸãã
InfluxDBåŽã䌌ããããªæãã§çšæããŸãã
module DB
class InfluxDB
def initialize
host = ENV.fetch('INFLUXDB_HOST', 'localhost')
port = ENV.fetch('INFLUXDB_PORT', '8086')
@client = InfluxDB2::Client.new(
"http://#{host}:#{port}",
ENV.fetch('INFLUXDB_TOKEN', 'benchmark-token'),
org: ENV.fetch('INFLUXDB_ORG', 'benchmark'),
bucket: ENV.fetch('INFLUXDB_BUCKET', 'temperature_logs'),
precision: InfluxDB2::WritePrecision::SECOND,
use_ssl: ENV.fetch('INFLUXDB_USE_SSL', 'false') == 'true'
)
@write_api = @client.create_write_api
end
def insert_actions(count)
time = Benchmark.realtime do
count.times do |i|
log = BenchmarkUtils.generate_temperature_log(i)
point = InfluxDB2::Point.new(name: 'temperature')
.add_tag('device_id', log[:device_id])
.add_tag('location', log[:location])
.add_tag('unit', log[:unit])
.add_field('temperature', log[:temperature])
.time(log[:created_at], InfluxDB2::WritePrecision::SECOND)
@write_api.write(data: point)
end
end
time.round(4)
end
end
end
InfluxDBã®å Žåãäºåã«ããŒãã«ãäœæããå¿ èŠã¯ãªãã§ãããDBçžåœã®ãã±ããã®ã¿äœã£ãŠããå¿ èŠããããŸãã
枬å®çµæ
ãŸãã¯äžä»¶ã ãã®insertãç¹°ãè¿ããã³ãããŒã¯ãè¡ã£ãŠã¿ãŸããã
Running single insert benchmark...
PostgreSQL single insert total execution time: 0.528 seconds
InfluxDB single insert total execution time: 2.0106 seconds
çµæã¯ãã®éãã§PostgreSQLã®æ¹ãæ©ãã§ãã
次ã«è€æ°ã®ã¬ã³ãŒããåæã«insertããããšãç¹°ãè¿ãBulk insertã®ãã³ãããŒã¯ãåã£ãŠã¿ãŸããã
Running bulk insert benchmark...
PostgreSQL bulk insert total execution time: 0.0147 seconds
InfluxDB bulk insert total execution time: 0.1322 seconds
ãããPostgreSQLã®æ¹ãã ãã¶æ©ãã§ããã
æåŸã«ä»¥äžã®ã¡ãã£ãšããéèšã¯ãšãªãå®è¡ããselectã®ãã³ãããŒã¯ãåã£ãŠã¿ãŸããã
'SELECT * FROM temperature_logs WHERE created_at BETWEEN $1 AND $2 ORDER BY created_at DESC'
"from(bucket: \"temperature_logs\")
|> range(start: #{start_time.iso8601}, stop: #{end_time.iso8601})
|> filter(fn: (r) => r[\"_measurement\"] == \"temperature\")"
çµæã¯ä»¥äžã®éãã§ãã
PostgreSQL read execution time: 0.004 seconds
InfluxDB read execution time: 0.0818 seconds
ãããPostgreSQLã®æ¹ãæ©ãã§ãã
èå¯
å°ãæå€ãªçµæã«ãªããŸãããç§ã¯ãŠã£ããInfluxDBã®æ¹ãæ©ããšæã£ãŠããŸããã
ç§ã¯DBã®ã¹ãã¬ãŒãžãšã³ãžã³çã«è©³ããã¯ãªãã§ãããPostgresã®æ¹ãæŽå²ãããåãããã©ã«ãã§ååãã¥ãŒãã³ã°ãããŠãããšããããšã¯ããããã§ãããŸããã¢ã«ãŽãªãºã ãããŒã¿æ§é ãåªããŠãããšããå¯èœæ§ããããããããŸãããæç³»åDBã¯OLAPãšèšãããšæãã®ã§ãæžã蟌ã¿ã«ã¯æé©åãããŠããªããšããå¯èœæ§ã¯ããããã§ãã
ãã ãèªã¿èŸŒã¿ã®ã¯ãšãªãPostgreSQLã®æ¹ãåã£ãŠããŸãããã ãããã¯ä»åã®ãã³ãããŒã¯ããããªããšæã£ãŠããŸããå ·äœçã«ã¯ä»¥äžã®ãããªåé¡ããããšæããŸãã
- æ°åçšåºŠã®éåžžã«å°éã®ããŒã¿ããçšæããŠããªãã®ã§ãéèšåŠçã«è² è·ãããã£ãŠããªã
- è² è·ããããããã«ååã«ã¯ãšãªãèšèšã§ããŠããªã
ä»åŸã¯æ°åäžãååäœã®ã¬ã³ãŒããçšæããŠãã³ãããŒã¯ãããŠã¿ãããšæããŸãã
èå¯(æ°Žå¹³ã¹ã±ãŒãªã³ã°)
RDBã®é£ããç¹ãšããŠæ°Žå¹³ã¹ã±ãŒãªã³ã°ãã¥ãããšãããã®ããããŸããã¢ããªã±ãŒã·ã§ã³ãµãŒããŒçã¯ããŒããã©ã³ãµãŒé äžã®ã€ã³ã¹ã¿ã³ã¹ãã³ã³ãããå¢ããã°ç°¡åã«æ°Žå¹³ã¹ã±ãŒãªã³ã°ã§ããŸãããRDBã¯ããã»ã©ç°¡åã§ã¯ãããŸããããã®ããã倧æµã®ã±ãŒã¹ã§ã¯åçŽã¹ã±ãŒãªã³ã°ãçšããããŸãããããã ãšéçã«å°éããããã§ãã
æç³»åDBã®ã¡ãªãããšããŠã¯æ°Žå¹³ã¹ã±ãŒãªã³ã°ãåæã«èšèšãããŠããããšãïŒã€ãããšæããŸããPublisheråŽãå¢ããããã®åã ãæç³»åDBã®ã¯ã©ã¹ã¿å ã®ã€ã³ã¹ã¿ã³ã¹ãå¢ããã°ã¹ã«ãŒãããã¯å¢ãããã§ãã
ããå ·äœçã«ã¯InfluxDBã¯æ°Žå¹³ã¹ã±ãŒãªã³ã°ãèæ ®ããŠäœãããŠããCluster modeããããããããã䜿ããšè¯ãããã§ãããã ãããã®Cluster modeã¯ææã§ãããOSSçã§ã¯ãªãã®ã§ãä»åã®ããã«æ°è»œã«Dockerã§è©Šããªããšããåé¡ã¯ãããŸãã


ãŸããAWS Timestream for Influxã§ã¯Clusterã¯äœããªãããã§ããRead replicaã¯äœããããã§ãããMulti AZã察å¿ããŠããããã§ãããClusterã§ã¯ãªãããïŒãã詊ããŠã¿ãå Žåã¯Enterpriseç(Cluster mode)ãå¥çŽããå¿ èŠãããããã§ãããæ¥æ¬èªã®èšäºãã»ãšãã©ãªãã§ãããå©çšå®çžŸãå®éã®éçšäŸãæ°ã«ãªããšããã§ãã
ãã®ä»
InfluxDBã®ruby clientã«å¯Ÿããäžæº
ä»åInfluxDBã®2ç³»ã®ruby clientã䜿ããŸããã
䜿ã£ãŠããæäžã«ä»¥äžã®ãããªããåãããªãåé¡ã«æ©ãŸãããŸãããå質ã«å°ãäžå®ããããŸããã
InfluxDB2::Point#timeã§ã¯èšé²ããã¬ã³ãŒãã®æ¥æãèšå®ã§ãããã第äºåŒæ°ãšããŠæå®ããInfluxDB2::WritePrecisionãæ©èœããŠããªãããã«æãããSECONDãNANOSECONDãªã©äœãæå®ããŠãããŒã¿ã®æ¥æãæå³ãããšããã«ãªããªããInfluxDB2::Client#newãããšãã®precisionã¯æ©èœããŠãããããªã®ã§ããããSECONDã«ãã€ã€ã#timeã«äžããæ¥ææ å ±ãSECONDã®ç²ŸåºŠã«ããããšã§åé¡ãåé¿deleteã¡ãœããã§ããŒã¿ãæ¶ããã¯ãã ããããŒã¿éãå€ããªãã«ãé¢ãããTimeoutããŠããŸããèŽåœçãªãã°ãããããã
ã¡ãã£ãšäžéå端ãªããã©ãŒãã³ã¹èšæž¬ã«ãªã£ãŠããŸããŸããããè²ã 調æ»ãã€ã€å ¥éããŠã¿ãŠæç³»åDBã®ç解床ãé«ãŸããŸãããããã«ãªç€Ÿã®éçºã·ãŒã³(HR Tech補åéçºã·ãŒã³)ã§ã¯ãŠãŒã¹ã±ãŒã¹çã«å©çšããããšã¯ç¡ãããã§ãããä»åŸã®ããããã·ãŒã³ã§å©çšãã¹ããã©ããã®å€æåºæºãïŒã€èªåã®äžã«ã§ããã®ã¯è¯ãã£ãããªãšæããŸãã
çŸåšãããã«ãªã§ã¯ITãšã³ãžãã¢ãåéããŠããŸããèå³ã®ããæ¹ã¯ãã²ãæ°è»œã«ãé£çµ¡ãã ããïŒ