<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at
    
        http://www.apache.org/licenses/LICENSE-2.0
    
    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.

-->

# What is IoTDB

Apache IoTDB is a low-cost, high-performance native temporal database for the Internet of Things. It can solve various problems encountered by enterprises when building IoT big data platforms to manage time-series data, such as complex application scenarios, large data volumes, high sampling frequencies, high amount of unaligned data, long data processing time, diverse analysis requirements, and high storage and operation costs.

- Github repository link: https://github.com/apache/iotdb

- Open source installation package download: https://iotdb.apache.org/zh/Download/

- Installation, deployment, and usage documentation: [QuickStart](../QuickStart/QuickStart_apache.md)


## Product Components

IoTDB products consist of several components that help users efficiently manage and analyze the massive amount of time-series data generated by the IoT.

<div style="text-align: center;">        		
    <img src="/img/Introduction-en-apache.png" alt="Introduction-en-apache.png" style="width: 90%;"/>

</div>

1. Time-series Database (Apache IoTDB): The core component for time-series data storage, it provides users with high-compression storage capabilities, rich time-series querying capabilities, real-time stream processing capabilities, and ensures high availability of data and high scalability of clusters. It also offers comprehensive security protection. Additionally, IoTDB provides users with a variety of application tools for easy configuration and management of the system; multi-language APIs and external system application integration capabilities, making it convenient for users to build business applications based on IoTDB.

2. Time-series Data Standard File Format (Apache TsFile): This file format is specifically designed for time-series data and can efficiently store and query massive amounts of time-series data. Currently, the underlying storage files for modules such as IoTDB and AINode are supported by Apache TsFile. With TsFile, users can uniformly use the same file format for data management during the collection, management, application, and analysis phases, greatly simplifying the entire process from data collection to analysis, and improving the efficiency and convenience of time-series data management.

3. Time-series Model Training and Inference Integrated Engine (IoTDB AINode): For intelligent analysis scenarios, IoTDB provides the AINode time-series model training and inference integrated engine, which offers a complete set of time-series data analysis tools. The underlying engine supports model training tasks and data management, including machine learning and deep learning. With these tools, users can conduct in-depth analysis of the data stored in IoTDB and extract its value.


##  Product Features

Apache IoTDB has the following advantages and characteristics:

- Flexible deployment methods: Support for one-click cloud deployment, out-of-the-box use after unzipping at the terminal, and seamless connection between terminal and cloud (data cloud synchronization tool).

- Low hardware cost storage solution: Supports high compression ratio disk storage, no need to distinguish between historical and real-time databases, unified data management.

- Hierarchical sensor organization and management: Supports modeling in the system according to the actual hierarchical relationship of devices to achieve alignment with the industrial sensor management structure, and supports directory viewing, search, and other capabilities for hierarchical structures.

- High throughput data reading and writing: supports access to millions of devices, high-speed data reading and writing, out of unaligned/multi frequency acquisition, and other complex industrial reading and writing scenarios.

- Rich time series query semantics: Supports a native computation engine for time series data, supports timestamp alignment during queries, provides nearly a hundred built-in aggregation and time series calculation functions, and supports time series feature analysis and AI capabilities.

- Highly available distributed system: Supports HA distributed architecture, the system provides 7*24 hours uninterrupted real-time database services, the failure of a physical node or network fault will not affect the normal operation of the system; supports the addition, deletion, or overheating of physical nodes, the system will automatically perform load balancing of computing/storage resources; supports heterogeneous environments, servers of different types and different performance can form a cluster, and the system will automatically load balance according to the configuration of the physical machine.

- Extremely low usage and operation threshold: supports SQL like language, provides multi language native secondary development interface, and has a complete tool system such as console.

- Rich ecological environment docking: Supports docking with big data ecosystem components such as Hadoop, Spark, and supports equipment management and visualization tools such as Grafana, Thingsboard, DataEase.

