{"componentChunkName":"component---src-templates-tags-js","path":"/tags/dynamo/1","result":{"pageContext":{"tag":"dynamo","urlTag":"dynamo","chunk":[{"content":"<p class=\"f4 mb-3\">Multitenant backend server for building web and mobile apps rapidly. The backend for busy developers. (self-hosted or hosted)</p><p><a title=\"https://paraio.org\" role=\"link\" target=\"_blank\" class=\"text-bold\" rel=\"noopener noreferrer\" href=\"https://paraio.org\">paraio.org</a></p><h3 class=\"sr-only\">License</h3><p><a href=\"https://github.com/Erudika/para/blob/master/LICENSE\" class=\"Link--muted\" data-analytics-event=\"{&quot;category&quot;:&quot;Repository Overview&quot;,&quot;action&quot;:&quot;click&quot;,&quot;label&quot;:&quot;location:sidebar;file:license&quot;}\">Apache-2.0 license</a></p><p><a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/Erudika/para/stargazers\">507 stars</a> <a class=\"Link--secondary no-underline mr-3\" href=\"https://github.com/Erudika/para/forks\">141 forks</a> <a class=\"Link--secondary no-underline mr-3 d-inline-block\" href=\"https://github.com/Erudika/para/branches\">Branches</a> <a class=\"Link--secondary no-underline d-inline-block\" href=\"https://github.com/Erudika/para/tags\">Tags</a> <a class=\"Link--secondary no-underline d-inline-block\" href=\"https://github.com/Erudika/para/activity\">Activity</a></p>","id":"f4a9e01b-f3e1-5bea-8d32-5dd26fc9bcf3","title":"GitHub - Erudika/para: Multitenant backend server for building web and mobile apps rapidly. The backend for busy developers. (self-hosted or hosted)","origin_url":"https://github.com/Erudika/para","url":"https://github.com/Erudika/para","wallabag_created_at":"2024-01-26T14:53:22+00:00","published_at":null,"published_by":"['']","reading_time":null,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/2204f6ef5bbccb71656d9d43ff9116ca157ebf50d578547bbd1d8678bf3a3232/Erudika/para","tags":["mongo","rest","elasticsearch","cassandra","elastic","lucene","api","dynamo","baas"],"description":"Multitenant backend server for building web and mobile apps rapidly. The backend for busy developers. (self-hosted or hosted)paraio.orgLicenseApache-2.0 license507 stars 141 forks Branches Tags Activi..."},{"content":"<p>In the dynamic realm of contemporary applications, real-time databases are pivotal for maintaining smooth data management and immediate updates. Engineered to handle substantial data volumes, these databases offer instantaneous access to information. This article delves into the top 10 real-time databases set to make an impact in 2024.</p><div class=\"wp-block-yoast-seo-table-of-contents yoast-table-of-contents\"><ul><li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-understanding-real-time-databases\" data-level=\"2\">Understanding Real-Time Databases</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-importance-of-real-time-databases-in-modern-applications\" data-level=\"2\">Importance of Real-Time Databases in Modern Applications</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-top-10-real-time-databases\" data-level=\"2\">Top 10 Real-Time Databases</a>\n<ul><li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-1-firebase-realtime-database\" data-level=\"3\">1. Firebase Realtime Database</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-2-mongodb\" data-level=\"3\">2. MongoDB</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-3-apache-cassandra\" data-level=\"3\">3. Apache Cassandra</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-4-redis\" data-level=\"3\">4. Redis</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-5-apache-kafka\" data-level=\"3\">5. Apache Kafka</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-6-amazon-dynamodb\" data-level=\"3\">6. Amazon DynamoDB</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-7-microsoft-azure-cosmos-db\" data-level=\"3\">7. Microsoft Azure Cosmos DB</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-8-faunadb\" data-level=\"3\">8. FaunaDB</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-9-influxdb\" data-level=\"3\">9. InfluxDB</a></li>\n<li><a href=\"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/#h-10-timescaledb\" data-level=\"3\">10. TimescaleDB</a></li>\n</ul></li>\n</ul></div><p>Real-time databases are crafted to manage data needing immediate updates and access. Unlike conventional databases that may encounter synchronization delays, real-time databases guarantee swift reflection of data changes across all connected devices or applications. This makes them well-suited for applications with real-time collaboration, messaging, or monitoring needs.</p><p>The significance of real-time databases has grown in contemporary applications, driven by the demand for instant data updates and synchronization. From messaging apps to collaborative document editors and real-time analytics dashboards, these databases form the foundation for smooth data management and instantaneous communication. By removing delays in data synchronization, real-time databases not only improve user experience but also empower efficient, data-driven decision-making.</p><p>Here’s our list of the top 10 real-time databases to use in 2024.</p><p>Firebase Realtime Database stands as a cloud-hosted <a href=\"https://www.analyticsvidhya.com/blog/2022/12/everything-you-should-know-about-nosql-databases/\" target=\"_blank\" rel=\"noreferrer noopener\">NoSQL database</a>, empowering developers to store and synchronize data in real time. Its use of a JSON data model adds flexibility and ease to the development process. As an integral component of the Firebase platform, it contributes to a robust toolkit for crafting both web and mobile applications.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1796\" height=\"877\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-56.png\" alt=\"Firebase Realtime Database\" class=\"wp-image-137122\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-56.png 1796w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-56-300x146.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-56-768x375.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-56-1536x750.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-56-150x73.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>A standout feature of Firebase Realtime Database is its real-time synchronization, ensuring instantaneous updates across all connected devices whenever data changes. This guarantees users constantly have the most up-to-date information. Moreover, the database provides offline support, enabling users to access and modify data even without an internet connection. To enhance security, the Firebase Realtime Database incorporates robust security rules, safeguarding sensitive data from unauthorized access.</p><p>Firebase Realtime Database finds widespread use in applications that demand real-time updates, including chat apps, collaborative document editors, and real-time dashboards. For instance, a messaging app leveraging the Firebase Realtime Database can promptly deliver messages to all participants, creating a seamless and real-time communication experience.</p><p><strong><a href=\"https://firebase.google.com/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>MongoDB stands out as a favored document-oriented <a href=\"https://www.youtube.com/watch?v=YgNvOFSuSG4\" target=\"_blank\" rel=\"noreferrer noopener\">NoSQL database</a>, renowned for its high performance, scalability, and flexibility. Its storage of data in flexible, JSON-like documents simplifies working with and adjusting to evolving data needs. Embraced in modern applications, MongoDB excels in managing large data volumes and supports real-time updates, making it a preferred choice for developers.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1847\" height=\"867\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-57.png\" alt=\"MongoDB for data management\" class=\"wp-image-137123\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-57.png 1847w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-57-300x141.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-57-768x361.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-57-1536x721.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-57-150x70.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>MongoDB provides an array of features making it well-suited for real-time applications. Its flexible data model allows developers to effortlessly store and retrieve complex data structures. Notably, MongoDB supports horizontal scalability, enabling applications to manage growing data loads without compromising performance. The added support for automatic sharding further enhances scalability and fault tolerance by distributing data across multiple servers.</p><p>MongoDB sees diverse applications in real-time scenarios, such as content management systems, e-commerce platforms, and Internet of Things (IoT) applications. An illustrative example is an e-commerce platform leveraging MongoDB to manage real-time inventory updates, guaranteeing customers consistently accurate information on product availability.</p><p><strong><a href=\"https://www.mongodb.com/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>Apache Cassandra stands out as a highly scalable and distributed NoSQL database crafted to manage extensive data across multiple commodity servers. It excels in providing high availability and fault tolerance, making it apt for mission-critical applications. Cassandra’s data model is rooted in a distributed hash table, enabling efficient data distribution and replication for optimal performance.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1530\" height=\"680\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/apache.png\" alt=\"Apache Cassandra Database\" class=\"wp-image-135769\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/apache.png 1530w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/apache-300x133.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/apache-768x341.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/apache-150x67.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>Cassandra offers several features that make it a top choice for real-time applications. Its decentralized architecture ensures high availability and fault tolerance, as data is replicated across multiple nodes. It also provides tunable consistency, allowing developers to balance data consistency and performance according to their application’s requirements. Additionally, Cassandra supports linear scalability, enabling applications to handle massive data loads.</p><p>Cassandra finds broad usage in applications demanding high scalability and fault tolerance, including real-time analytics, time series data management, and messaging platforms. Consider a real-time analytics platform leveraging Cassandra; it adeptly processes and analyzes substantial data volumes in real-time, delivering valuable insights to users.</p><p><strong><a href=\"https://cassandra.apache.org/_/index.html\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>Redis stands as an open-source, in-memory data structure store versatile enough to serve as a database, cache, or message broker. Renowned for high performance and low latency, Redis is particularly well-suited for real-time applications. Its support for diverse data structures such as strings, lists, sets, and sorted sets enables flexible data storage and manipulation.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1708\" height=\"857\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-58.png\" alt=\"Redis Database\" class=\"wp-image-137124\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-58.png 1708w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-58-300x151.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-58-768x385.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-58-1536x771.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-58-150x75.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>Redis boasts numerous features that contribute to its popularity in real-time applications. With in-memory storage facilitating rapid data access, it proves ideal for low-latency requirements. The inclusion of built-in replication and high availability ensures data durability and fault tolerance. Moreover, Redis supports pub/sub messaging, fostering real-time communication among diverse components within an application.</p><p>Redis finds extensive application in a variety of real-time scenarios, encompassing caching, session management, and real-time leaderboards. In the realm of gaming, for example, Redis can be employed to uphold real-time leaderboards, ensuring timely updates to scores and rankings as players advance through the game.</p><p><strong><a href=\"https://redis.io/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>Apache Kafka stands as a distributed streaming platform, adept at processing and storing real-time data streams. Its strengths lie in high throughput, fault tolerance, and scalability, making it well-suited for managing substantial data volumes. At its core, Kafka operates on a publish-subscribe model, with producers disseminating data to topics and consumers subscribing to these topics to access the data.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1526\" height=\"841\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-59.png\" alt=\"Apache Kafka Database\" class=\"wp-image-137125\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-59.png 1526w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-59-300x165.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-59-768x423.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-59-150x83.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>A standout feature of Apache Kafka is its prowess in managing high-throughput, low-latency data streams. With the capability to process millions of messages per second, it excels in real-time data processing and analytics. Kafka ensures fault tolerance and high availability by replicating data across multiple brokers. Furthermore, it supports stream processing, enabling real-time data transformations and aggregations.</p><p>Applications demanding real-time data streaming and processing, like log aggregation, event sourcing, and real-time analytics, find Apache Kafka indispensable. For instance, a Kafka-powered log aggregation system excels at collecting and processing logs from various sources in real time, delivering valuable insights and robust monitoring capabilities.</p><p><strong><a href=\"https://kafka.apache.org/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>Amazon DynamoDB, an <a href=\"https://www.analyticsvidhya.com/blog/2020/09/what-is-aws-amazon-web-services-data-science/\" target=\"_blank\" rel=\"noreferrer noopener\">AWS</a> fully managed NoSQL database service, stands out with high performance, scalability, and availability, catering to real-time application needs. Built on key-value pairs, DynamoDB ensures rapid data access and retrieval.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1830\" height=\"882\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-60.png\" alt=\"Amazon DynamoDB for data management\" class=\"wp-image-137126\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-60.png 1830w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-60-300x145.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-60-768x370.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-60-1536x740.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-60-150x72.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>DynamoDB offers several features that make it a top choice for real-time applications. Its fully managed nature eliminates the need for database administration, allowing developers to focus on building their applications. DynamoDB also provides automatic scaling, ensuring that applications can handle increasing data loads without manual intervention. Additionally, it supports global replication, enabling data to be replicated across multiple regions for improved availability and disaster recovery.</p><p>Amazon DynamoDB is used in a wide range of real-time applications, including user authentication, real-time bidding, and IoT data management. For instance, a real-time bidding platform built on DynamoDB can handle high volumes of bid requests and deliver real-time ad placements to users.</p><p><strong><a href=\"https://aws.amazon.com/dynamodb/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>Microsoft Azure Cosmos DB is a globally distributed, multi-model database service provided by Microsoft Azure. It offers high scalability, low latency, and global availability, making it suitable for real-time applications. Cosmos DB supports multiple data models, including key-value, document, graph, and column family, allowing developers to choose the most appropriate model for their application.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1891\" height=\"881\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-61.png\" alt=\"Microsoft Azure Cosmos DB for data management\" class=\"wp-image-137127\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-61.png 1891w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-61-300x140.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-61-768x358.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-61-1536x716.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-61-150x70.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>Cosmos DB offers several features that make it a powerful choice for real-time applications. Its global distribution allows for low-latency access to data from anywhere in the world, ensuring a seamless user experience. Cosmos DB also provides automatic indexing and query optimization, enabling fast and efficient data retrieval. Additionally, it offers comprehensive SLAs (Service Level Agreements) for throughput, latency, and availability.</p><p>In diverse real-time applications like content management systems, social media analytics, and personalized recommendations, Microsoft Azure Cosmos DB finds utility. For instance, a Cosmos DB-based <a href=\"https://www.analyticsvidhya.com/blog/2017/02/social-media-analytics-business/\" target=\"_blank\" rel=\"noreferrer noopener\">social media analytics</a> platform can analyze real-time social media data, uncovering valuable insights into user behavior and trends.</p><p><strong><a href=\"https://azure.microsoft.com/en-in/products/cosmos-db\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>FaunaDB, a globally distributed, serverless, and transactional NoSQL database, caters to modern applications with features like strong consistency, low latency, and automatic scaling. Its data model, rooted in documents and collections, facilitates flexible data storage and retrieval, making it apt for real-time applications.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1881\" height=\"876\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-62.png\" alt=\"FaunaDB for data management\" class=\"wp-image-137128\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-62.png 1881w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-62-300x140.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-62-768x358.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-62-1536x715.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-62-150x70.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>FaunaDB offers several features that make it a compelling choice for real-time applications. Its strong consistency ensures that data is always up-to-date and reflects the latest changes. FaunaDB also provides automatic scaling, allowing applications to handle increasing data loads without manual intervention. Additionally, it supports ACID (Atomicity, Consistency, Isolation, Durability) transactions, ensuring data integrity and reliability.</p><p>FaunaDB finds applications in diverse real-time scenarios, from e-commerce platforms to financial systems and collaborative applications. For example, a collaborative document editor powered by FaunaDB enables multiple users to edit the same document simultaneously, ensuring real-time updates for all participants.</p><p><strong><a href=\"https://fauna.com/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>InfluxDB is an open-source, time series database designed for handling high volumes of time-stamped data. It provides high write and query performance, making it suitable for real-time data analytics and monitoring. InfluxDB’s data model is based on measurements, tags, and fields, allowing for efficient storage and retrieval of time series data.</p><figure class=\"wp-block-image size-full\"><img width=\"1725\" height=\"885\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-63.png\" alt=\"InfluxDB for data management\" class=\"wp-image-137129\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-63.png 1725w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-63-300x154.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-63-768x394.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-63-1536x788.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-63-150x77.png 150w\" referrerpolicy=\"no-referrer\" /></figure><p>InfluxDB offers several features that make it a top choice for real-time data analytics. Its high write and query performance enables fast ingestion and retrieval of time series data. It also provides downsampling and data retention policies, allowing for efficient storage and management of historical data. Additionally, InfluxDB supports continuous queries and real-time alerting, enabling proactive monitoring and anomaly detection.</p><p>InfluxDB is extensively utilized in applications demanding real-time monitoring and analytics, including IoT data management, system monitoring, and sensor data analysis. For instance, an IoT platform leveraging InfluxDB can gather and analyze real-time sensor data, offering valuable insights into device performance and environmental conditions.</p><p><strong><a href=\"https://www.influxdata.com/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>TimescaleDB is an open-source, time-series database built on top of PostgreSQL. It combines the scalability and performance of PostgreSQL with the flexibility and ease of use of a time-series database. TimescaleDB’s data model is based on hypertables, which allow for efficient storage and retrieval of time-series data.</p><div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img width=\"1775\" height=\"702\" src=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-64.png\" alt=\"TimescaleDB for data management\" class=\"wp-image-137130\" srcset=\"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-64.png 1775w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-64-300x119.png 300w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-64-768x304.png 768w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-64-1536x607.png 1536w, https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/image-64-150x59.png 150w\" referrerpolicy=\"no-referrer\" /></figure></div><p>TimescaleDB offers several features that make it a powerful choice for real-time data management. Its hyper table-based data model enables efficient partitioning and compression of time-series data, resulting in improved query performance and storage efficiency. It also provides automatic data retention and continuous aggregates, allowing for efficient management and analysis of historical data. Additionally, TimescaleDB supports distributed queries, enabling horizontal scalability and fault tolerance.</p><p>TimescaleDB finds application in diverse real-time scenarios, such as financial analytics, industrial monitoring, and energy management. For example, a financial analytics platform utilizing TimescaleDB can efficiently store and analyze real-time market data, offering valuable insights into market trends and investment opportunities.</p><p><strong><a href=\"https://www.timescale.com/\" target=\"_blank\" rel=\"noreferrer noopener nofollow\">Get it here</a></strong></p><p>In today’s world, we rely on real-time databases to keep our apps updated and in sync instantly. There are great options out there, like Firebase Realtime Database and TimescaleDB, each with its own special features and uses. Whether you’re aiming for real-time collaboration with Firebase or keeping an eye on things with InfluxDB for monitoring, developers have plenty of choices to match their needs. Looking ahead to 2024, these real-time databases will stay vital in fueling the new wave of applications.</p>","id":"aa480b56-1238-52d4-a8d4-0fe3f03ae8cb","title":"Top 10 Real-Time Databases to Use in 2024","origin_url":"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/","url":"https://www.analyticsvidhya.com/blog/2023/12/top-real-time-databases-to-use/","wallabag_created_at":"2024-01-05T20:38:59+00:00","published_at":"2023-12-16T02:30:00+00:00","published_by":"['K.sabreena']","reading_time":9,"domain_name":"www.analyticsvidhya.com","preview_picture":"https://cdn.analyticsvidhya.com/wp-content/uploads/2023/12/ector-database.jpg","tags":["mongo","cassandra","kafka","cosmos","dynamo","firebase","influxdb","microsoft.cosmos.db","redis"],"description":"In the dynamic realm of contemporary applications, real-time databases are pivotal for maintaining smooth data management and immediate updates. Engineered to handle substantial data volumes, these da..."},{"content":"<blockquote>\n<p>Prefer video? <a href=\"https://www.youtube.com/watch?v=nqvlDgnNhPY\">View this post on YouTube</a>!</p>\n</blockquote><p>As a programmer, it is important to know the limits of any service that you’re using. In some cases, the limits of a particular service may make it unsuitable for the task at hand, such as <a href=\"https://www.lastweekinaws.com/blog/route-53-amazons-premier-database/\">using Route53 as a database</a>. In other cases, the limit may alter how you structure your solution, such as how the 15 minute limit on Lambda execution time requires you to break down large work into smaller chunks.</p><p>In this post, we’ll talk about limits in DynamoDB. While the <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\">DynamoDB documentation has a long list of limits for the service</a>, most of these are not going to drastically change how you use DynamoDB. For example, nested attributes can only go to 32 levels of depth, I’ve never found this to be a factor in building my applications.</p><p>However, there are a few limits you must understand to model properly in DynamoDB. If you’re not aware of them, you can run into a brick wall. But if you understand them and account for them, you remove the element of surprise once your app hits production.</p><p>Those limits are:</p><ul><li><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#dynamodb-item-size-limit\">The item size limit</a>;</li>\n<li><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#page-size-limit-for-query--scan\">The page size limit for Query and Scan operations</a>; and</li>\n<li><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#partition-throughput-limits\">The partition throughput limits</a>.</li>\n</ul><p>Notice how these limits build on each other. The first is about an individual item, whereas the second is about a collection of items that are read together in a single request. Finally, the partition throughput limit is about the number and size of concurrent requests in a single DynamoDB partition.</p><p>In the sections below, we’ll walk through each limit, discuss why it exists, and undestand how it affects how you should model in DynamoDB. Finally, we will conclude with some thoughts on <a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#the-dynamodb-philosophy-of-limits\">DynamoDB’s philosophy of limits</a> and why they’re helping you.</p><p>Let’s get started.</p><h2 id=\"dynamodb-item-size-limit\"><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#dynamodb-item-size-limit\" aria-hidden=\"true\" class=\"anchor\"></a>DynamoDB item size limit</h2><p>The first important limit to know is the item size limit. An individual record in DynamoDB is called an item, and a single DynamoDB item cannot exceed 400KB.</p><p>While 400KB is large enough for most normal database operations, it is significantly lower than the other options. <a href=\"https://docs.mongodb.com/manual/reference/limits/#bson-documents\">MongoDB allows for documents to be 16MB</a>, while <a href=\"https://docs.datastax.com/en/cql-oss/3.x/cql/cql_reference/refLimits.html\">Cassandra allows blobs of up to 2GB</a>. And if you really want to get beefy, <a href=\"https://www.postgresql.org/docs/12/limits.html\">Postgres allows rows of up to 1.6TB</a> (1600 columns X 1GB max per field)!</p><p>So what accounts for this limitation? <em>DynamoDB is pointing you toward how you should model your data in an OLTP database.</em></p><p><a href=\"https://en.wikipedia.org/wiki/Online_transaction_processing\">Online transaction processing (or OLTP)</a> systems are characterized by large amounts of small operations against a database. They describe most of how you interact with various services — fetch a LinkedIn profile, show my Twitter timeline, or view my Gmail inbox. For these operations, you want to quickly and efficiently filter on specific fields to find the information you want, such as a username or a Tweet ID. OLTP databases often make use of indexes on certain fields to make lookups faster as well as holding recently-accessed data in RAM.</p><p>You should have the relevant properties in your database to find the particular record you want. And if the rest of the information for that record is small, you can include that data there as well.</p><p>But if you have a large piece of data associated with your record, such as an image file, some user-submitted prose, or just a giant blob of JSON, it might not be best to store that directly in your database. You’ll clog up the RAM and churn your disk I/O as you read and write that blob.</p><p>Put the blob in an object store instead. Amazon S3 is a cheap, reliable way to store blobs of data. Your database record can include a pointer to the object in S3, and you can load it out when it’s needed. S3 has a better pricing model for reading and writing large blobs of data, and it won’t put extra strain on your database.</p><p>In addition to making you consider the price &amp; performance implications of large blobs, the 400KB item limit also prevents you from making a data modeling mistake.</p><p>When modeling data in DynamoDB, you often denormalize your data. For example, in modeling one-to-many relationships, you may <a href=\"https://www.alexdebrie.com/posts/dynamodb-one-to-many/#denormalization-by-using-a-complex-attribute\">denormalize a collection of child records onto its parent item</a> rather than splitting each child record out into a separate item. This can work well when the number of related items is bounded.</p><p>However, if the number of related items is unbounded (think of a customer’s orders in an e-commerce store, or a user’s tweets in Twitter), then you would want to consider other approaches to model this relationship. Without the item size limit, the access patterns around fetching the parent item would get slower and slower as the size of the denormalized relation grew. By imposing this limit, it forces you to consider the nature of the relationship upfront and <a href=\"https://www.alexdebrie.com/posts/dynamodb-one-to-many/#composite-primary-key--the-query-api-action\">use a different method</a> if the relationship is unbounded.</p><p>In both of these situations, DynamoDB is saving you from reduced performance as your item size grows.</p><h2 id=\"page-size-limit-for-query--scan\"><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#page-size-limit-for-query--scan\" aria-hidden=\"true\" class=\"anchor\"></a>Page size limit for Query &amp; Scan</h2><p>While the first limit we discussed involved an individual item, the second limit involves a grouping of items.</p><p>DynamoDB has two APIs for fetching a range of items in a single request. The <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html\">Query</a> operation will fetch a range of items that have the same partition key, whereas the <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Scan.html\">Scan</a> operation will fetch a range of items from your entire table.</p><p>For both of these operations, there is a 1MB limit on the size of an individual request. If your Query parameters match more than 1MB of data or if you issue a Scan operation on a table that’s larger than 1MB, your request will return the initial matching items plus a <code class=\"language-text\">LastEvaluatedKey</code> property that can be used in the next request to read the next page.</p><p>Similar to the second reason for the item size limit, this page size limit forces you to reckon with the performance implications of your data model upfront. <a href=\"https://www.alexdebrie.com/posts/dynamodb-no-bad-queries/#pagination\">Paginated queries are one of the two areas you might see performance problems as your application grows</a>. If you have an access pattern that uses Query <em>and</em> could result in more than 1MB of data being looked at, you need to account for pagination in your application code.</p><p>Accounting for pagination (by handling the <code class=\"language-text\">LastEvaluatedKey</code> and making follow-up requests) has a great property — <strong>it’s very easy to see understand which areas might slow down as your application grows.</strong></p><p>If I’m doing a PR review and I see <code class=\"language-text\">LastEvaluatedKey</code> being used, my antenna goes up and I know I need to think about implications:</p><ul><li>How likely is it that we’ll need to page on this request?</li>\n<li>What are the maximum number of pages we’ll need?</li>\n<li>Do we want to allow multiple pages on a single request, or should we push that back to the client?</li>\n<li>Is there another way we can model to reliably reduce request size under 1MB?</li>\n</ul><p>The page size also fits in well with DynamoDB Filter Expressions (which you <a href=\"https://www.alexdebrie.com/posts/dynamodb-filter-expressions/\">probably don’t want to use</a>). The 1MB page limit applies <em>before</em> the Filter Expression is applied. DynamoDB is teaching us what the expensive parts of an operation are — finding and reading lots of data from disk.</p><p>Contrast this with other database engines. If you’re using any <a href=\"https://www.postgresql.org/docs/9.5/functions-aggregate.html\">aggregate functions in Postgres</a> or <a href=\"https://docs.mongodb.com/manual/core/aggregation-pipeline/\">MongoDB’s aggregation pipeline</a>, the code to execute the query can look deceptively simple. But that code is hiding some unknown performance implications under the hood. Aggregations require scanning all of the relevant data. This may be performant when we’re talking about hundreds of rows in your test environment, but it will crawl when you hit millions of rows at scale.</p><h2 id=\"partition-throughput-limits\"><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#partition-throughput-limits\" aria-hidden=\"true\" class=\"anchor\"></a>Partition throughput limits</h2><p>We now know how big a single item can be. We know how much data a single request can read. Let’s close our discussion of limits with the partition throughput limits, which address how much data <em>concurrent</em> requests can handle.</p><p>To begin, you need to know some basics around how DynamoDB models its data.</p><p>A DynamoDB table isn’t running on some giant supercomputer in the cloud. Rather, your data will be split across multiple <em>partitions</em>. Each partition contains roughly 10GB of data.</p><p><img src=\"https://user-images.githubusercontent.com/6509926/113156226-690bc880-91ff-11eb-89d3-54810d6808d2.png\" alt=\"DynamoDB Partitions\" referrerpolicy=\"no-referrer\" /></p><p>Each item in your DynamoDB table will contain a primary key that includes a partition key. This partition key determines the partition on which that item will live. This allows for DynamoDB to provide fast, consistent performance as your application scales.</p><p><img src=\"https://user-images.githubusercontent.com/6509926/113156304-7923a800-91ff-11eb-9418-d030679f264d.png\" alt=\"DynamoDB Partition routing\" referrerpolicy=\"no-referrer\" /></p><p>For additional background on partitions and how they help DynamoDB scale, check out <a href=\"https://www.alexdebrie.com/posts/dynamodb-no-bad-queries/#why-nosql-databases-can-scale-horizontally\">Why NoSQL databases can scale horizontally</a>.</p><p>For an individual partition, there are limits on the maximum throughput you can consume on a per-second basis. You can use up to 3,000 Read Capacity Units (RCUs) and up to 1,000 Write Capacity Units (WCUs) on a single partition per second.</p><p>Note — this is a lot of capacity! This would allow you to read 12MB of strongly-consistent data or 24MB of eventually-consistent data <em>per second</em>, as well as to write 1MB of data per second. And remember — this is per-partition! You can have significantly higher traffic across your table as a whole, and the maximum amount of capacity is effectively unbounded, assuming your credit card is good for it. For many DynamoDB users, they’ll never come close to these partitions limits on a full-table basis.</p><p>And yet, <a href=\"https://aws.amazon.com/blogs/aws/amazon-prime-day-2020-powered-by-aws/\">some users will blow past 3000 RCUs and 1000 WCUs on a table</a>. And this limit helps to guide their data modeling. As you model a high-traffic table, you consider whether you will have partitions that exceed this limit. If so, you can model for it explicitly, whether <a href=\"https://aws.amazon.com/dynamodb/dax/\">using DAX to cache hot items</a> or by <a href=\"https://www.dynamodbguide.com/leaderboard-write-sharding/\">sharding your partition key to spread the load across your table</a>.</p><p>One final note in this area: the DynamoDB team has done a lot of work in the past few years to ensure that the partition throughput limits are the only thing you need to consider when thinking about traffic across your table.</p><p>In the old days of DynamoDB (pre-2018), DynamoDB would spread your provisioned throughput equally across all partitions in your table. This could lead to issues if your workload was unbalanced. Imagine you had certain keys that took more traffic than others — think of the distribution of popular tweets or Reddit threads. Because the throughput is spread equally, you could be getting throttled in one partition while you had capacity to burn in others.</p><p>This led to DynamoDB users needing to overprovision their tables to account for their hottest partitions rather than for overall traffic. By extension, you needed to care about two things: the partition throughout limit as well as your hottest partitions.</p><p>DynamoDB changed that with <a href=\"https://aws.amazon.com/blogs/database/how-amazon-dynamodb-adaptive-capacity-accommodates-uneven-data-access-patterns-or-why-what-you-know-about-dynamodb-might-be-outdated/\">adaptive capacity</a>. Adaptive capacity works by spreading your provisioned throughput across your table according to demand rather than spreading it evenly. If you have one partition taking more traffic, it will take capacity from one of your other partitions.</p><p>Initially, adaptive capacity would take 5 - 30 minutes to spread capacity across your table. In May 2019, <a href=\"https://aws.amazon.com/about-aws/whats-new/2019/05/amazon-dynamodb-adaptive-capacity-is-now-instant/\">adaptive capacity became instant</a>, meaning you could have highly variable workloads from one second to another, and DynamoDB would spread your capacity accordingly.</p><p>There are two major implications of adaptive capacity. First, for all users, this meant less that you needed to think about. You don’t need to do the math to calculate the number of partitions in your table as well as the required throughput to give enough capacity to your hottest partition. You only need to consider overall throughput when doing capacity planning.</p><p>Second, this opened up some data modeling patterns for tables with lower traffic. Generally, <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-uniform-load.html\">you want to spread your data evenly across your partitions</a>. However, this can make it harder to do queries that look at your entire table, such as finding all entities of a particular type or finding the top N items in the dataset.</p><p>If you won’t go anywhere near the partition throughput limits, you can create large partitions that handle these access patterns. You need to be absolutely sure you won’t hit them — otherwise you’re in for a nasty surprise at some point — but it can make it easier to handle these patterns.</p><h2 id=\"the-dynamodb-philosophy-of-limits\"><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#the-dynamodb-philosophy-of-limits\" aria-hidden=\"true\" class=\"anchor\"></a>The DynamoDB philosophy of limits</h2><p>In the sections above, we’ve seen how these key limits are designed to point you in the proper direction for modeling your data. But they’re doing more than that — they’re reducing the complexity of understanding your database performance.</p><p>With traditional databases, your performance is on a spectrum. The response time for a query can vary significantly based on a number of factors — size of the dataset, the hardware running your database (including CPU, RAM, disk, and network bandwidth), and the other queries running at the same time.</p><p>This variability makes it very difficult to plan how your application will perform as it scales. Load tests that simulate actual traffic are difficult, particularly for a new service, so you may just roll something out there and pray for the best.</p><p>With DynamoDB, performance isn’t a spectrum. It’s binary — yes or no. You know the exact limits where your access patterns won’t work anymore, whether it’s due to pagination on your Query or throttling on your hot keys.</p><p>These limits surely aren’t the absolute maximum that DynamoDB can handle. We know that DynamoDB <em>could</em> handle items over 400KB — after all, they’re handling 1MB of data in Query &amp; Scan operations!</p><p>And we know that DynamoDB <em>could</em> handle more than 1MB on a Query or Scan operation, as the <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchGetItem.html\">BatchGetItem operation</a> can return up to 16MB of data.</p><p>Finally, I’m sure DynamoDB could go beyond 3000 RCUs or 1000 WCUs on a single partition if it really wanted to push it.</p><p>But the key is that DynamoDB is drawing a line and guaranteeing performance everywhere before that line.</p><p>Your database has physical limits. If you don’t know what they are, you’re flirting with danger. I’ve personally experienced issues with Elasticsearch under high load where everything is going swimingly, then the entire database falls over suddenly and without warning. In Postgres, you might <a href=\"https://buttondown.email/nelhage/archive/notes-on-some-postgresql-implementation-details/\">lock up your database with multi-transactions</a>. And don’t get me started with MongoDB’s aggregation framework.</p><p>The more I work with other databases, the more I prefer the explicit limits of DynamoDB as compared to the unstated limits of other tools.</p><h2 id=\"conclusion\"><a href=\"https://www.alexdebrie.com/posts/dynamodb-limits/#conclusion\" aria-hidden=\"true\" class=\"anchor\"></a>Conclusion</h2><p>In this post, we covered the three limits that matter in DynamoDB. First, we saw the limit of an individual item. Next, we looked at the page size limit for Query and Scan operations. Then, we saw how the partition throughput limit regulates concurrent access to certain items.</p><p>Finally, we closed with some thoughts on how the DynamoDB limits are helping you. With most databases, performance is on a spectrum with a number of often-unknowable factors combining to determine your response time. With DynamoDB, performance is binary — as long as you fit within the limits, your performance is knowable.</p><p>If you have questions or comments on this piece, feel free to leave a note below or <a href=\"mailto:alexdebrie1@gmail.com\">email me directly</a>.</p>","id":"6da8a02c-bee9-5e44-b79a-7b24d537e387","title":"The Three DynamoDB Limits You Need to Know","origin_url":"https://www.alexdebrie.com/posts/dynamodb-limits/","url":"https://www.alexdebrie.com/posts/dynamodb-limits/","wallabag_created_at":"2023-02-15T20:26:32+00:00","published_at":null,"published_by":null,"reading_time":12,"domain_name":"www.alexdebrie.com","preview_picture":"https://user-images.githubusercontent.com/6509926/53833786-0166ee80-3f4f-11e9-8edf-0fd168b04c82.png","tags":["scylladb","cassandra","dynamo"],"description":"\nPrefer video? View this post on YouTube!\nAs a programmer, it is important to know the limits of any service that you’re using. In some cases, the limits of a particular service may make it unsuitable..."},{"content":"<p>To fulfill my capstone project requirement for the Carnegie Mellon University (CMU) <a href=\"https://mcds.cs.cmu.edu/\">Master of Computational Data Science</a> (MCDS) program, I and two of my classmates, Ziyan Zhang and Xiang Yue, collaborated with <a href=\"https://datastax.com/\">DataStax</a> to develop a new module in the <a href=\"http://stargate.io/\">Stargate</a> system to bring Amazon <a href=\"https://aws.amazon.com/dynamodb/\">DynamoDB</a> compatibility to <a href=\"https://cassandra.apache.org/_/index.html\">Apache Cassandra</a>.<sup>Ⓡ</sup> I will introduce our journey in two blog posts. Here in Part 1, I will provide some background on the project and describe the overall design of our system. In <a href=\"https://stargate.io/2022/05/31/towards-dynamodb-compatibility-for-cassandra-part-2.html\">Part 2</a>, I will discuss some interesting challenges we encountered and how we solved them.</p><p><img alt=\"DynamoDB Compatibility for Cassandra\" class=\"lazyload\" src=\"https://stargate.io/assets/images/towards-dynamodb-compatibility-for-cassandra/stargate-dynamodb-compatibility.png\" referrerpolicy=\"no-referrer\" /></p><h2 id=\"cassandra-vs-dynamodb\">Cassandra vs. DynamoDB</h2><p>Cassandra and DynamoDB are two popular NoSQL databases inspired by Google’s <a href=\"https://static.googleusercontent.com/media/research.google.com/en//archive/bigtable-osdi06.pdf\">BigTable</a> and Amazon’s <a href=\"https://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf\">Dynamo</a> papers. They have many similarities but I think it is more useful to look at some of their biggest differences:</p><ol><li>Cassandra is completely free, while DynamoDB is commercial. As a free product, Cassandra can be deployed either on-premise or in the cloud (private, public, or hybrid). For enterprise users, companies like DataStax have cloud offerings and enterprise support for Cassandra. In contrast, despite having a free-tier service, DynamoDB is a commercial and proprietary product, meaning that you have a vendor lock-in problem once you decide to use it. That is, you can only use DynamoDB in AWS but not in your private cloud or any other public cloud. You don’t have much choice if you begin to feel unsatisfied with the pricing or service because the migration cost would be too high.</li>\n<li>Apache Cassandra is open-source, while Amazon DynamoDB is closed-source. The advantages of open-source products have been widely discussed so I’ll save you some time here. From my personal experience, the biggest advantage of open-source is the ability to make tailor-made changes, and the biggest disadvantage of closed-source is the black-box nature of system behavior — there are always things that are not documented.</li>\n<li>Cassandra enforces schema while DynamoDB is schemaless. Schemaless might be convenient and flexible for developers, but developers often still need to have some sort of schema on the application side for software engineering reasons.</li>\n<li>Both databases have their own query languages. Cassandra uses <a href=\"https://cassandra.apache.org/doc/latest/cassandra/cql/\">Cassandra Query Language</a> (CQL), which is a variant of SQL, while DynamoDB (low-level API) uses JSON as a request payload.</li>\n</ol><p>There are many more differences, but the first two illustrate why it might be a good idea to use Cassandra instead of DynamoDB, and the last two point to the potential difficulties in switching to Cassandra if you decide to use DynamoDB and later regret that choice. For users that are already using DynamoDB or already have expertise in using DynamoDB, switching from DynamoDB to Cassandra might be too costly.</p><h2 id=\"how-stargate-provides-dynamodb-compatibility\">How Stargate provides DynamoDB compatibility</h2><p>It is difficult for users that are already using and/or are familiar with DynamoDB to switch to Cassandra, so why don’t we make Cassandra compatible with DynamoDB? Wouldn’t it be nice for users to be able to switch from DynamoDB to Cassandra without having to change a single line of their existing codebase if they want to? Bingo! That’s what our project is for. Basically, we leverage a third framework called “Stargate” to build a middleware for Cassandra that is compatible with DynamoDB.</p><p><a href=\"https://stargate.io/\">Stargate</a> is an open source data gateway that sits between your app and your databases.</p><p>Stargate is an open-source middleware that sits on top of a database, e.g. Apache Cassandra. It abstracts Cassandra-specific concepts entirely from app developers and supports different API options, removing barriers of entry for new software developers. Right now, Stargate supports <a href=\"https://stargate.io/docs/stargate/1.0/quickstart/quick_start-rest.html\">REST API</a>, <a href=\"https://stargate.io/docs/stargate/1.0/quickstart/quick_start-document.html\">Document API</a>, <a href=\"https://stargate.io/docs/stargate/1.0/developers-guide/gRPC.html\">gRPC API</a>, and <a href=\"https://stargate.io/docs/stargate/1.0/quickstart/quick_start-graphql.html\">GraphQL API</a>. These different API options are pluggable and can be installed when needed.</p><h2 id=\"stargate-architecture\">Stargate Architecture</h2><p>The figure below shows the Stargate (v2) architecture. As described in <a href=\"https://stargate.io/2021/11/02/introducing-the-design-for-stargate-v2.html\">this</a> blog post, Stargate (v2) is highly modular. There are already many services that provide different kinds of APIs. Our goal was to create a new service that provides a DynamoDB API. We wanted this API to be able to understand DynamoDB queries and transform them into Cassandra queries and for users to be able to continue using their existing DynamoDB client code to interact seamlessly with Cassandra.</p><p><img alt=\"DynamoDB API Service in Stargate V2\" class=\"lazyload\" src=\"https://stargate.io/assets/images/towards-dynamodb-compatibility-for-cassandra/stargate-v2-dynamodb.png\" referrerpolicy=\"no-referrer\" /></p><h2 id=\"what-does-a-query-workflow-look-like\">What does a query workflow look like</h2><p>We didn’t want users to have to change a single line of code when switching to Cassandra. But wait a minute…how is that ever possible given Cassandra and DynamoDB have different client libraries? The answer is simple: DynamoDB clients talk to DynamoDB servers in HTTP protocol.</p><p>By implementing a web service on top of Cassandra that behaves in the same way as the DynamoDB server, DynamoDB clients could continue to work without knowing it is actually talking to Cassandra. We implemented such a service as a new module in Stargate - the Dynamo API Service. A typical workflow is shown in the following diagram.</p><p><img alt=\"Sequence Diagram for PutItem API\" class=\"lazyload\" src=\"https://stargate.io/assets/images/towards-dynamodb-compatibility-for-cassandra/stargate-dynamodb-query.png\" referrerpolicy=\"no-referrer\" /></p><h2 id=\"sequence-diagram-for-putitem-api\">Sequence diagram for PutItem API</h2><p>The sequence diagram above shows the workflow for DynamoDB <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_PutItem.html\">PutItem API</a>. Let’s ignore the first component <code class=\"language-plaintext highlighter-rouge\">AuthResource</code> for now — all we need to know is that it helps with authentication. By using the DynamoDB client to put an item into the database, the client would send an HTTP request to the configured DynamoDB server endpoint. To use our system, users just need to change their endpoint from AWS to our service. It’s just one line of configuration change! Then everything is handled by our service and Cassandra.</p><p>Let’s get back to the sequence diagram. After receiving an HTTP request, <code class=\"language-plaintext highlighter-rouge\">DynamoResource</code>, our REST API controller, will recognize the type of request, deserialize the parameters, and then dispatch them to an appropriate Proxy class, in this case, <code class=\"language-plaintext highlighter-rouge\">ItemProxy</code>. The <code class=\"language-plaintext highlighter-rouge\">ItemProxy</code> component takes the main responsibility of handling the request. Specifically, it needs to parse the request and transform it into a Stargate intermediate representation. You may ask, why an intermediate representation and not a Cassandra query directly? As we said earlier, Stargate is a middleware that sits on top of your database. Although the database we are using is Cassandra, it could be any other database as long as Stargate supports it.</p><p>By transforming DynamoDB request into Stargate intermediate representation, we leverage the Cassandra adapter that is already implemented by Stargate. After transforming the request to Stargate intermediate representation, <code class=\"language-plaintext highlighter-rouge\">ItemProxy</code> sends it to the Stargate coordinator via <code class=\"language-plaintext highlighter-rouge\">StargateBridgeClient</code> which is essentially a gRPC client. The Stargate coordinator then talks to Cassandra nodes and returns the results back.</p><p>Note that some requests are straightforward and only need one round-trip between Proxy — Stargate Coordinator — Cassandra cluster. Other requests are more complicated and may need multiple roundtrips. In the PutItem example shown in the sequence diagram, three round trips, at most, are needed. How come we need three round trips for a single write operation? That’s due to the schema difference between Cassandra and DynamoDB. Remember that in the beginning, we said DynamoDB is schemaless while Cassandra is not? That means you could insert an item to DynamoDB with new columns without pre-defining the schema (actually you cannot define a schema in DynamoDB), while you couldn’t do the same for Cassandra.</p><p>In Cassandra, if a write operation contains columns that are unknown, the request fails. Therefore, <code class=\"language-plaintext highlighter-rouge\">ItemProxy</code> needs to first check whether the schema needs to be updated and if so, it must update the schema first before actually persisting the data. This sounds very slow, isn’t it? Luckily, Stargate has a caching mechanism, and most of the time, the schema will be cached and the overhead is small unless new columns appear frequently. \\</p><p>Now that you understand our motivation and the basic design for our service, stay tuned for our next blog in which I will talk about some interesting challenges we encountered and how we solved them.</p><p><em>Special thanks to all the members of the Stargate community who supported this effort including Prabhat Jha, Sebastian Estevez, Tatu Saloranta, and Jeff Carpenter.</em></p>","id":"acf50459-98a8-5747-8100-7948e6cb00ad","title":"Stargate: Towards DynamoDB Compatibility for Cassandra (Part 1)","origin_url":"https://stargate.io/2022/05/23/towards-dynamodb-compatibility-for-cassandra.html","url":"https://stargate.io/2022/05/23/towards-dynamodb-compatibility-for-cassandra.html","wallabag_created_at":"2022-06-10T19:56:31+00:00","published_at":"2022-05-23T06:00:00+00:00","published_by":null,"reading_time":6,"domain_name":"stargate.io","preview_picture":"https://stargate.io/assets/images/default-stargate.png","tags":["cassandra","dynamo","stargate"],"description":"To fulfill my capstone project requirement for the Carnegie Mellon University (CMU) Master of Computational Data Science (MCDS) program, I and two of my classmates, Ziyan Zhang and Xiang Yue, collabor..."},{"content":"<p>In my <a href=\"https://stargate.io/2022/05/23/towards-dynamodb-compatibility-for-cassandra.html\">previous blog post</a>, I introduced the Dynamo API Service, which is our project to make Apache Cassandra<sup>Ⓡ</sup> compatible with Amazon DynamoDB by building a middleware. In this blog post, I will share a few interesting challenges we encountered and how we tackled them.</p><h2 id=\"how-to-authenticate\">How to authenticate?</h2><p>This is the first problem we encountered. InDynamoDB (and many other AWS products), there are multiple ways to authenticate, among which a common way is to set <code class=\"language-plaintext highlighter-rouge\">AWS_ACCESS_KEY_ID</code> and <code class=\"language-plaintext highlighter-rouge\">AWS_SECRET_ACCESS_KEY</code> environmental variables.</p><p>Usually, you don’t need to worry about authentication after you have your Dynamo DB credentials set up. Stargate, on the other hand, requires you to provide a <a href=\"https://stargate.io/docs/stargate/1.0/developers-guide/authnz.html\">token</a> in every request you make. We could let users follow the authentication guide and fetch their token either manually or programmatically, but the problem was how to make the DynamoDB client aware of this token and carry the token every time it makes an HTTP request. Of course, we could rewrite the DynamoDB client by ourselves, but we would like to avoid that if possible so that users don’t need to change their client library.</p><p>Luckily, we found a trick to tackle this problem. We found out that the DynamoDB client always puts an authorization header that contains an unencrypted <code class=\"language-plaintext highlighter-rouge\">AWS_ACCESS_KEY_ID</code> in every HTTP request it makes. This makes sense because a DynamoDB client has to use the HTTP protocol to authenticate itself with the DynamoDB server. Now, in the Dynamo API Service for Stargate, we can easily read the token from this <code class=\"language-plaintext highlighter-rouge\">AWS_ACCESS_KEY_ID</code> field. Problem solved. All the user needs to do is to put the Stargate token into their <code class=\"language-plaintext highlighter-rouge\">AWS_ACCESS_KEY_ID</code> environment variable, and then they don’t need to worry about authentication while making requests!</p><h2 id=\"the-discrepancy-in-data-types\">The discrepancy in data types</h2><p>Cassandra and DynamoDB have similar data models but they are not exactly the same. There is one-to-one mapping for basic types but not for the map, list, and set data types in DynamoDB. In DynamoDB, maps, lists, and sets can be deeply nested, meaning that you can have a list of maps of sets or even more complicated data structures. For example, you could insert an item whose <code class=\"language-plaintext highlighter-rouge\">goods</code> attribute contains:</p><div class=\"language-plaintext highlighter-rouge highlight\"><pre>[\n {\n   \"name\": \"apple\",\n   \"price\": 4,\n   \"images\": [\n     \"apple1.jpg\",\n     \"apple2.jpg\"\n   ]\n },\n {\n   \"name\": \"orange\",\n   \"price\": 1.45,\n   \"images\": \"orange.jpg\"\n }\n]\n</pre></div><p>As we can see, the above data structure is a list of maps. Furthermore, the first map in the list contains <code class=\"language-plaintext highlighter-rouge\">images</code> as a list, while the second map in the list contains <code class=\"language-plaintext highlighter-rouge\">images</code> as a string. This heterogeneity might not be common in the real world but it is undoubtedly allowed as DynamoDB is schemaless. Cassandra, despite its support for nested collections, enforces a schema. For example, if you create a column <code class=\"language-plaintext highlighter-rouge\">goods</code> with:</p><div class=\"language-plaintext highlighter-rouge highlight\"><pre>goods list&lt;frozen&lt;map&lt;text,text&gt;&gt;\n</pre></div><p>Then everything in the inner map must be of <code class=\"language-plaintext highlighter-rouge\">text</code> datatype. The Cassandra native support fails this use case.</p><p>We don’t really know how nested collections are stored in DynamoDB (recall it’s not open-sourced!). But one (good) thing we know is that you can only create indices for top-level attributes with basic data types. In the previous example, you cannot index the <code class=\"language-plaintext highlighter-rouge\">name</code> field because it’s a nested attribute under <code class=\"language-plaintext highlighter-rouge\">goods</code> which is a top-level attribute. What does this mean for us? This means we can treat the whole nested collection as a BLOB (binary format) without sacrificing the ability to index.</p><p>In all, what we do is quite simple: whenever the user writes a collection data entry, we serialize it into a sequence of bytes and store it in Cassandra. Whenever the user needs to read it, we deserialize the collection from the sequence of bytes stored in Cassandra. And it works just fine! Right now we are using the <a href=\"https://github.com/EsotericSoftware/kryo\">Kryo</a> library for serialization and deserialization, but we might write our own methods for better performance in the future.</p><h2 id=\"parser-is-all-you-need\">Parser is all you need</h2><p>If you are building a database, then you almost certainly need to write parsers to parse the queries. DynamoDB, at the first glance, seemed to be an exception because it uses JSON as a request payload — there are so many JSON libraries that can help us with the parsing (deserialization). This seems to suggest we don’t need to worry about writing parsers. Unfortunately, this is not actually the case. DynamoDB queries have fields like <a href=\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html#DDB-Query-request-FilterExpression\"><code>FilterExpression</code></a> that allow users to define certain conditions in plain text format. For example, in a query, you can have a filter expression like the following:</p><div class=\"language-plaintext highlighter-rouge highlight\"><pre>(Debt = :debt OR Deposit &lt;&gt; :deposit) AND Sex = :s\n</pre></div><p>In this example, the results are filtered out if they don’t satisfy the above expression. This <code class=\"language-plaintext highlighter-rouge\">FilterExpression</code> supports different comparison operators and can be nested. You might think about using a regular expression to match the above text, but it is not feasible because <a href=\"https://stackoverflow.com/questions/133601/can-regular-expressions-be-used-to-match-nested-patterns\">REGEX generally cannot handle nested expressions</a>. We actually tried writing regular expressions for simpler cases, but the code quickly turned obscure and we had to give up.</p><p>This is where <a href=\"https://www.antlr.org/\">ANTLR</a> comes into play. ANTLR is a popular and powerful parser generator. By simply defining grammars, ANTLR helps us generate Java code that can parse the expressions into abstract parse trees. We then write code that visits the abstract parse tree and evaluates the expression. With the help of ANTLR, we keep our code concise and easy to maintain. It might be a bit challenging at the beginning to write clean grammar if you are not familiar with compiler knowledge, but it pays off!</p><h2 id=\"conclusion\">Conclusion</h2><p>This concludes our journey toward completion of our capstone project for our Spring semester in the <a href=\"https://mcds.cs.cmu.edu/\">Master of Computational Data Science</a> (MCDS) program at Carnegie Mellon University (CMU). I would like to thank DataStax for the help and guidance throughout this journey. We will continue working on the project in the Fall semester to complete the rest of the APIs and do a thorough performance benchmark. Our hope is to deliver a complete product in the end!</p><p><em>Special thanks to all the members of the Stargate community who supported this effort including Prabhat Jha, Sebastian Estevez, Tatu Saloranta, and Jeff Carpenter.</em></p>","id":"20c49ad3-5420-53e4-bee1-a36b8e6a6103","title":"Stargate: Towards DynamoDB Compatibility for Cassandra (Part 2)","origin_url":"https://stargate.io/2022/05/31/towards-dynamodb-compatibility-for-cassandra-part-2.html","url":"https://stargate.io/2022/05/31/towards-dynamodb-compatibility-for-cassandra-part-2.html","wallabag_created_at":"2022-06-10T19:56:18+00:00","published_at":"2022-05-31T06:00:00+00:00","published_by":null,"reading_time":5,"domain_name":"stargate.io","preview_picture":"https://stargate.io/assets/images/default-stargate.png","tags":["cassandra","dynamo","stargate"],"description":"In my previous blog post, I introduced the Dynamo API Service, which is our project to make Apache CassandraⓇ compatible with Amazon DynamoDB by building a middleware. In this blog post, I will share ..."},{"content":"<p>&#13;\n\t\t\t\t&#13;\n\t\t\t\tPost Views: &#13;\n\t\t\t\t2,532&#13;</p><p><strong>Dear Readers,</strong></p>\n<p><img class=\"alignnone  wp-image-16217\" src=\"https://www.ktexperts.com/wp-content/uploads/2016/10/1600-x-400-Cassandra-&#x2013;-Types-of-NoSQL-Databases.jpg\" alt=\"\" width=\"841\" height=\"210\" /></p>\n<p>There are four general types (most common categories) of NoSQL databases. Each of these categories has its own specific attributes and limitations. There is not a single solution which is better than all others; however there are some databases that are better to solve specific problems. To clarify the NoSQL databases, let’s discuss the most common categories:</p>\n<p><strong>Wide Row Store:</strong></p>\n<p>Also known as wide-column stores, these databases store data in rows and users are able to perform some query operations via column-based access. A wide-row store offers very high performance and a highly scalable architecture.</p>\n<p>Examples: Cassandra, HBase, and Google BigTable.</p>\n<p><strong>Key-value stores:</strong></p>\n<p>These NoSQL databases are some of the least complex as all of the data consists of an indexed key and a value. Designed to handle huge amounts of data, they allow developers to store schema less data. In the key-value storage, database stores data as hash table where each key is unique and the value can be string, JSON, BLOB (basic large object) etc. and a key may be strings, hashes, lists, sets, sorted sets.</p>\n<p>Examples: Amazon DynamoDB, Riak, and Oracle NoSQL database.</p>\n<p><strong>Document oriented:</strong></p>\n<p>Expands on the basic idea of key-value stores where “documents” are more complex, in that they contain data and each document is assigned a unique key, which is used to retrieve the document. These are designed for storing, retrieving, and managing document-oriented information, also known as semi-structured data.</p>\n<p>Examples: MongoDB and CouchDB.</p>\n<p><strong>Graph:</strong></p>\n<p>Designed for data whose relationships are well represented as a graph structure and has elements that are interconnected; with an undetermined number of relationships between them.</p>\n<p>A graph database is a collection of nodes and edges. Each node represents an entity (such as a student or business) and each edge represents a connection or relationship between two nodes. Every node and edge is defined by a unique identifier. Each node knows its adjacent nodes. As the number of nodes increases, the cost of a local step (or hop) remains the same.</p>\n<p>Examples: Neo4J and TitanDB.</p>\n<p><strong>Thank you for giving your valuable time to read the above information. Please<a href=\"https://www.ktexperts.com/\"> click here</a> to subscribe for further updates</strong></p>\n<p><strong>KTEXPERTS</strong> is always active on below social media platforms.</p>\n<p>Facebook :<a href=\"https://www.facebook.com/ktexperts/\"> https://www.facebook.com/ktexperts/</a><br />LinkedIn : <a href=\"https://www.linkedin.com/company/ktexperts/\">https://www.linkedin.com/company/ktexperts/</a><br />Twitter :<a href=\"https://twitter.com/ktexpertsadmin\"> https://twitter.com/ktexpertsadmin</a><br />YouTube : <a href=\"https://www.youtube.com/c/ktexperts\">https://www.youtube.com/c/ktexperts</a></p>\n\t\t&#13;\n<p><strong>Note: Please test scripts in Non Prod before trying in Production.</strong><br /></p>","id":"22e79086-d5bf-5064-988e-da0e4dffb4da","title":"Cassandra – Types of NoSQL Databases","origin_url":"https://www.ktexperts.com/cassandra-types-of-nosql-databases/","url":"https://www.ktexperts.com/cassandra-types-of-nosql-databases/","wallabag_created_at":"2022-02-11T15:05:46+00:00","published_at":null,"published_by":"['']","reading_time":2,"domain_name":"www.ktexperts.com","preview_picture":"https://www.ktexperts.com/wp-content/uploads/2016/10/1280-X-720-Cassandra-–-Types-of-NoSQL-Databases.jpg","tags":["mongo","neo4j","cassandra","graph.database","bigtable","dynamo","hbase","nosql"],"description":"\r\n\t\t\t\t\r\n\t\t\t\tPost Views: \r\n\t\t\t\t2,532\rDear Readers,\n\nThere are four general types (most common categories) of NoSQL databases. Each of these categories has its own specific attributes and limitations. T..."},{"content":"<div class=\"image\"><img alt=\"Compare YugabyteDB with other distributed SQL and NoSQL databases\" title=\"Compare YugabyteDB with other distributed SQL and NoSQL databases\" src=\"https://docs.yugabyte.com/images/section_icons/index/comparisons.png\" /></div><p><label class=\"toggle-button\" for=\"toggle-drawer\">\nHome\n</label>\n<i> &gt; </i></p><p>See how YugabyteDB compares with other operational databases in the distributed SQL and NoSQL categories. For a detailed comparison, click the database name.</p><h2 id=\"distributed-sql-databases\">Distributed SQL databases</h2><table><thead><tr><th>Feature</th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/cockroachdb/\">CockroachDB</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/tidb/\">TiDB</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/vitess/\">Vitess</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/amazon-aurora/\">Amazon Aurora</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/google-spanner/\">Google Cloud Spanner</a></th>\n<th>YugabyteDB</th>\n</tr></thead><tbody><tr><td>Horizontal write scalability (with auto-sharding and rebalancing)</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Automated failover &amp; repair</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Distributed ACID transactions</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>SQL Foreign Keys</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>SQL Joins</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Serializable isolation level</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Global consistency across multi-DC/regions</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-exclamation\"></i></td>\n<td>\n</td><td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Follower reads</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Built-in enterprise features (such as CDC)</td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>SQL compatibility</td>\n<td>PostgreSQL</td>\n<td>MySQL</td>\n<td>MySQL</td>\n<td>MySQL, PostgreSQL</td>\n<td>Proprietary</td>\n<td>PostgreSQL</td>\n</tr><tr><td>Open Source</td>\n<td>\n</td><td>Apache 2.0</td>\n<td>Apache 2.0</td>\n<td>\n</td><td>\n</td><td>Apache 2.0</td>\n</tr></tbody></table><h2 id=\"nosql-databases\">NoSQL databases</h2><table><thead><tr><th>Feature</th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/mongodb/\">MongoDB</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/foundationdb/\">FoundationDB</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/cassandra/\">Apache Cassandra</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/amazon-dynamodb/\">Amazon DynamoDB</a></th>\n<th><a href=\"https://docs.yugabyte.com/latest/comparisons/azure-cosmos/\">MS Azure CosmosDB</a></th>\n<th>YugabyteDB</th>\n</tr></thead><tbody><tr><td>Horizontal write scalability (with auto-sharding and rebalancing)</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Automated failover &amp; repair</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Distributed ACID transactions</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Consensus-driven, strongly-consistent replication</td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td>\n</td><td>\n</td><td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Strongly-consistent secondary indexes</td>\n<td>\n</td><td><i class=\"fas fa-check\"></i></td>\n<td>\n</td><td>\n</td><td>\n</td><td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>Multiple read consistency levels</td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n<td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>High data density</td>\n<td>\n</td><td>\n</td><td>\n</td><td>\n</td><td>\n</td><td><i class=\"fas fa-check\"></i></td>\n</tr><tr><td>API</td>\n<td>MongoDB QL</td>\n<td>Proprietary KV, MongoDB QL</td>\n<td>Cassandra QL</td>\n<td>Proprietary KV, Document</td>\n<td>Cassandra QL, MongoDB QL</td>\n<td>Yugabyte Cloud QL w/ native document modeling</td>\n</tr><tr><td>Open Source</td>\n<td>\n</td><td>Apache 2.0</td>\n<td>Apache 2.0</td>\n<td>\n</td><td>\n</td><td>Apache 2.0</td>\n</tr></tbody></table><div class=\"admonition note\"><p class=\"admonition-title\">Note</p>The<i class=\"fas fa-check\">orwith respect to any particular feature of a third-party database is based on our best effort understanding from publicly available information. Readers are always recommended to perform their own independent research to understand the finer details.</i></div>","id":"31629e9a-9d7a-5b94-981c-a56314f142a5","title":"Compare YugabyteDB with other distributed SQL and NoSQL databases | YugabyteDB Docs","origin_url":"https://docs.yugabyte.com/latest/comparisons/","url":"https://docs.yugabyte.com/latest/comparisons/","wallabag_created_at":"2021-11-08T16:56:37+00:00","published_at":null,"published_by":"['']","reading_time":1,"domain_name":"docs.yugabyte.com","preview_picture":"https://docs.yugabyte.com/images/og-image.jpg","tags":["mongo","yugabyte","cassandra","tidb","cockroach","cosmos","dynamo","aurora"],"description":"\nHome\n\n > See how YugabyteDB compares with other operational databases in the distributed SQL and NoSQL categories. For a detailed comparison, click the database name.Distributed SQL databasesFeature\n..."},{"content":"<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/cortexproject/cortex/blob/master/images/logo.png\"><img src=\"https://github.com/cortexproject/cortex/raw/master/images/logo.png\" alt=\"Cortex Logo\" /></a></p><p><a href=\"https://github.com/cortexproject/cortex/actions\"><img src=\"https://github.com/cortexproject/cortex/workflows/ci/badge.svg\" alt=\"CI\" /></a>\n<a href=\"https://godoc.org/github.com/cortexproject/cortex\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/43edbd3b4cac24c318db76c7461f4240fd6bc95984909ba0a4dcf7670ece91a4/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f636f7274657870726f6a6563742f636f727465783f7374617475732e737667\" alt=\"GoDoc\" data-canonical-src=\"https://godoc.org/github.com/cortexproject/cortex?status.svg\" /></a>\n<a href=\"https://goreportcard.com/report/github.com/cortexproject/cortex\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/3da9b8399c4337ba350103b2b0243f9ce3b5264f9c8d22bd2f4a1dbf99c5daa6/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f636f7274657870726f6a6563742f636f72746578\" alt=\"Go Report Card\" data-canonical-src=\"https://goreportcard.com/badge/github.com/cortexproject/cortex\" /></a>\n<a href=\"https://cloud-native.slack.com/messages/cortex/\" rel=\"nofollow\"><img src=\"https://camo.githubusercontent.com/57641f65ba32998ad06fc186dc1f51b51a2768e87b582ddd79a135a26365d946/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6a6f696e253230736c61636b2d253233636f727465782d627269676874677265656e2e737667\" alt=\"Slack\" data-canonical-src=\"https://img.shields.io/badge/join%20slack-%23cortex-brightgreen.svg\" /></a></p><p>Cortex provides horizontally scalable, highly available, multi-tenant, long term storage for\n<a href=\"https://prometheus.io\" rel=\"nofollow\">Prometheus</a>.</p><ul><li><strong>Horizontally scalable:</strong> Cortex can run across multiple machines in a cluster, exceeding the throughput and storage of a single machine. This enables you to send the metrics from multiple Prometheus servers to a single Cortex cluster and run \"globally aggregated\" queries across all data in a single place.</li>\n<li><strong>Highly available:</strong> When run in a cluster, Cortex can replicate data between machines. This allows you to survive machine failure without gaps in your graphs.</li>\n<li><strong>Multi-tenant:</strong> Cortex can isolate data and queries from multiple different independent\nPrometheus sources in a single cluster, allowing untrusted parties to share the same cluster.</li>\n<li><strong>Long term storage:</strong> Cortex supports Amazon DynamoDB, Google Bigtable, Cassandra, S3, GCS and Microsoft Azure for long term storage of metric data.  This allows you to durably store data for longer than the lifetime of any single machine, and use this data for long term capacity planning.</li>\n</ul><p>Cortex is a <a href=\"https://cncf.io\" rel=\"nofollow\">CNCF</a> incubation project used in several production systems including <a href=\"https://cloud.weave.works\" rel=\"nofollow\">Weave Cloud</a> and <a href=\"https://grafana.com/cloud\" rel=\"nofollow\">Grafana Cloud</a>.\nCortex is primarily used as a <a href=\"https://prometheus.io/docs/operating/configuration/#remote_write\" rel=\"nofollow\">remote write</a> destination for Prometheus, with a Prometheus-compatible query API.</p><h2>Documentation</h2><p>Read the <a href=\"https://cortexmetrics.io/docs/getting-started\" rel=\"nofollow\">getting started guide</a> if you're new to the\nproject. Before deploying Cortex with a permanent storage backend you\nshould read:</p><ol><li><a href=\"https://cortexmetrics.io/docs/architecture/\" rel=\"nofollow\">An overview of Cortex's architecture</a></li>\n<li><a href=\"https://cortexmetrics.io/docs/guides/running-chunks-storage-in-production/\" rel=\"nofollow\">A guide to running Cortex</a></li>\n<li><a href=\"https://cortexmetrics.io/docs/configuration/arguments/\" rel=\"nofollow\">Information regarding configuring Cortex</a></li>\n<li><a href=\"https://cortexmetrics.io/docs/guides/running-chunks-storage-with-cassandra/\" rel=\"nofollow\">Steps to run Cortex with Cassandra</a></li>\n</ol><p>For a guide to contributing to Cortex, see the <a href=\"https://cortexmetrics.io/docs/contributing/\" rel=\"nofollow\">contributor guidelines</a>.</p><h2>Further reading</h2><p>To learn more about Cortex, consult the following talks and articles.</p><h3>Recent talks and articles</h3><ul><li>Dec 2020 blog post \"<a href=\"https://aws.amazon.com/blogs/opensource/how-aws-and-grafana-labs-are-scaling-cortex-for-the-cloud/\" rel=\"nofollow\">How AWS and Grafana Labs are scaling Cortex for the cloud</a></li>\n<li>Oct 2020 blog post \"<a href=\"https://grafana.com/blog/2020/10/19/how-to-switch-cortex-from-chunks-to-blocks-storage-and-why-you-wont-look-back/\" rel=\"nofollow\">How to switch Cortex from chunks to blocks storage (and why you won’t look back)</a>\"</li>\n<li>Oct 2020 blog post \"<a href=\"https://grafana.com/blog/2020/10/06/now-ga-cortex-blocks-storage-for-running-prometheus-at-scale-with-reduced-operational-complexity/\" rel=\"nofollow\">Now GA: Cortex blocks storage for running Prometheus at scale with reduced operational complexity</a>\"</li>\n<li>Sep 2020 blog post \"<a href=\"https://www.weave.works/blog/a-tale-of-tail-latencies\" rel=\"nofollow\">A Tale of Tail Latencies</a>\"</li>\n<li>Sep 2020 KubeCon talk \"Scaling Prometheus: How We Got Some Thanos Into Cortex\" (<a href=\"https://www.youtube.com/watch?v=Z5OJzRogAS4\" rel=\"nofollow\">video</a>, <a href=\"https://static.sched.com/hosted_files/kccnceu20/ec/2020-08%20-%20KubeCon%20EU%20-%20Cortex%20blocks%20storage.pdf\" rel=\"nofollow\">slides</a>)</li>\n<li>Aug 2020 blog post \"<a href=\"https://grafana.com/blog/2020/08/12/scaling-prometheus-how-were-pushing-cortex-blocks-storage-to-its-limit-and-beyond/\" rel=\"nofollow\">Scaling Prometheus: How we’re pushing Cortex blocks storage to its limit and beyond</a>\"</li>\n<li>Jul 2020 blog post \"<a href=\"https://grafana.com/blog/2020/07/29/how-blocks-storage-in-cortex-reduces-operational-complexity-for-running-prometheus-at-massive-scale/\" rel=\"nofollow\">How blocks storage in Cortex reduces operational complexity for running Prometheus at massive scale</a>\"</li>\n<li>Jul 2020 PromCon talk \"Sharing is Caring: Leveraging Open Source to Improve Cortex &amp; Thanos\" (<a href=\"https://www.youtube.com/watch?v=2oTLouUvsac\" rel=\"nofollow\">video</a>, <a href=\"https://docs.google.com/presentation/d/1OuKYD7-k9Grb7unppYycdmVGWN0Bo0UwdJRySOoPdpg/edit\" rel=\"nofollow\">slides</a>)</li>\n<li>Mar 2020 blog post \"<a href=\"https://kenhaines.net/cortex-zone-aware-replication/\" rel=\"nofollow\">Cortex: Zone Aware Replication</a>\"</li>\n<li>Mar 2020 blog post \"<a href=\"https://grafana.com/blog/2020/03/25/how-were-using-gossip-to-improve-cortex-and-loki-availability/\" rel=\"nofollow\">How we're using gossip to improve Cortex and Loki availability</a>\"</li>\n<li>Jan 2020 blog post \"<a href=\"https://grafana.com/blog/2020/01/21/the-future-of-cortex-into-the-next-decade/\" rel=\"nofollow\">The Future of Cortex: Into the Next Decade</a>\"</li>\n</ul><h3>Previous talks and articles</h3><ul><li>Nov 2019 KubeCon talks \"<a href=\"https://kccncna19.sched.com/event/UaiH/cortex-101-horizontally-scalable-long-term-storage-for-prometheus-chris-marchbanks-splunk\" rel=\"nofollow\">Cortex 101: Horizontally Scalable Long Term Storage for Prometheus</a>\" (<a href=\"https://www.youtube.com/watch?v=f8GmbH0U_kI\" rel=\"nofollow\">video</a>, <a href=\"https://static.sched.com/hosted_files/kccncna19/92/cortex_101.pdf\" rel=\"nofollow\">slides</a>), \"<a href=\"https://kccncna19.sched.com/event/UagC/performance-tuning-and-day-2-operations-goutham-veeramachaneni-grafana-labs\" rel=\"nofollow\">Configuring Cortex for Max\nPerformance</a>\" (<a href=\"https://www.youtube.com/watch?v=VuE5aDHDexU\" rel=\"nofollow\">video</a>, <a href=\"https://static.sched.com/hosted_files/kccncna19/87/Taming%20Cortex_%20Configuring%20for%20maximum%20performance%281%29.pdf\" rel=\"nofollow\">slides</a>, <a href=\"https://grafana.com/blog/2019/12/02/kubecon-recap-configuring-cortex-for-maximum-performance-at-scale/\" rel=\"nofollow\">write up</a>) and \"<a href=\"https://kccncna19.sched.com/event/UaWT/blazin-fast-promql-tom-wilkie-grafana-labs\" rel=\"nofollow\">Blazin’ Fast PromQL</a>\" (<a href=\"https://static.sched.com/hosted_files/kccncna19/0b/2019-11%20Blazin%27%20Fast%20PromQL.pdf\" rel=\"nofollow\">slides</a>, <a href=\"https://www.youtube.com/watch?v=yYgdZyeBOck\" rel=\"nofollow\">video</a>, <a href=\"https://grafana.com/blog/2019/09/19/how-to-get-blazin-fast-promql/\" rel=\"nofollow\">write up</a>)</li>\n<li>Nov 2019 PromCon talk \"<a href=\"https://promcon.io/2019-munich/talks/two-households-both-alike-in-dignity-cortex-and-thanos/\" rel=\"nofollow\">Two Households, Both Alike in Dignity: Cortex and Thanos</a>\" (<a href=\"https://www.youtube.com/watch?v=KmJnmd3K3Ws&amp;feature=youtu.be\" rel=\"nofollow\">video</a>, <a href=\"https://promcon.io/2019-munich/slides/two-households-both-alike-in-dignity-cortex-and-thanos.pdf\" rel=\"nofollow\">slides</a>, <a href=\"https://grafana.com/blog/2019/11/21/promcon-recap-two-households-both-alike-in-dignity-cortex-and-thanos/\" rel=\"nofollow\">write up</a>)</li>\n<li>May 2019 KubeCon talks; \"<a href=\"https://kccnceu19.sched.com/event/MPhX/intro-cortex-tom-wilkie-grafana-labs-bryan-boreham-weaveworks\" rel=\"nofollow\">Cortex: Intro</a>\" (<a href=\"https://www.youtube.com/watch?v=_7Wnta-3-W0\" rel=\"nofollow\">video</a>, <a href=\"https://static.sched.com/hosted_files/kccnceu19/af/Cortex%20Intro%20KubeCon%20EU%202019.pdf\" rel=\"nofollow\">slides</a>, <a href=\"https://grafana.com/blog/2019/05/21/grafana-labs-at-kubecon-the-latest-on-cortex/\" rel=\"nofollow\">blog post</a>) and \"<a href=\"https://kccnceu19.sched.com/event/MPjK/deep-dive-cortex-tom-wilkie-grafana-labs-bryan-boreham-weaveworks\" rel=\"nofollow\">Cortex: Deep Dive</a>\" (<a href=\"https://www.youtube.com/watch?v=mYyFT4ChHio\" rel=\"nofollow\">video</a>, <a href=\"https://static.sched.com/hosted_files/kccnceu19/52/Cortex%20Deep%20Dive%20KubeCon%20EU%202019.pdf\" rel=\"nofollow\">slides</a>)</li>\n<li>Feb 2019 blog post &amp; podcast; \"<a href=\"https://www.weave.works/blog/prometheus-scalability-with-bryan-boreham\" rel=\"nofollow\">Prometheus Scalability with Bryan Boreham</a>\" (<a href=\"https://softwareengineeringdaily.com/2019/01/21/prometheus-scalability-with-bryan-boreham/\" rel=\"nofollow\">podcast</a>)</li>\n<li>Feb 2019 blog post; \"<a href=\"https://www.weave.works/blog/how-aspen-mesh-runs-cortex-in-production\" rel=\"nofollow\">How Aspen Mesh Runs Cortex in Production</a>\"</li>\n<li>Dec 2018 KubeCon talk; \"<a href=\"https://kccna18.sched.com/event/GrXL/cortex-infinitely-scalable-prometheus-bryan-boreham-weaveworks\" rel=\"nofollow\">Cortex: Infinitely Scalable Prometheus</a>\" (<a href=\"https://www.youtube.com/watch?v=iyN40FsRQEo\" rel=\"nofollow\">video</a>, <a href=\"https://static.sched.com/hosted_files/kccna18/9b/Cortex%20CloudNativeCon%202018.pdf\" rel=\"nofollow\">slides</a>)</li>\n<li>Dec 2018 CNCF blog post; \"<a href=\"https://www.cncf.io/blog/2018/12/18/cortex-a-multi-tenant-horizontally-scalable-prometheus-as-a-service/\" rel=\"nofollow\">Cortex: a multi-tenant, horizontally scalable Prometheus-as-a-Service</a>\"</li>\n<li>Nov 2018 CloudNative London meetup talk; \"Cortex: Horizontally Scalable, Highly Available Prometheus\" (<a href=\"https://www.slideshare.net/grafana/cortex-horizontally-scalable-highly-available-prometheus\" rel=\"nofollow\">slides</a>)</li>\n<li>Nov 2018 CNCF TOC Presentation; \"Horizontally Scalable, Multi-tenant Prometheus\" (<a href=\"https://docs.google.com/presentation/d/190oIFgujktVYxWZLhLYN4q8p9dtQYoe4sxHgn4deBSI/edit#slide=id.g3b8e2d6f7e_0_6\" rel=\"nofollow\">slides</a>)</li>\n<li>Sept 2018 blog post; \"<a href=\"https://medium.com/weaveworks/what-is-cortex-2c30bcbd247d\" rel=\"nofollow\">What is Cortex?</a>\"</li>\n<li>Aug 2018 PromCon panel; \"<a href=\"https://promcon.io/2018-munich/talks/panel-discussion-prometheus-long-term-storage-approaches/\" rel=\"nofollow\">Prometheus Long-Term Storage Approaches</a>\" (<a href=\"https://www.youtube.com/watch?v=3pTG_N8yGSU\" rel=\"nofollow\">video</a>)</li>\n<li>Jul 2018 design doc; \"<a href=\"https://docs.google.com/document/d/1lsvSkv0tiAMPQv-V8vI2LZ8f4i9JuTRsuPI_i-XcAqY\" rel=\"nofollow\">Cortex Query Optimisations</a>\"</li>\n<li>Aug 2017 PromCon talk; \"<a href=\"https://promcon.io/2017-munich/talks/cortex-prometheus-as-a-service-one-year-on/\" rel=\"nofollow\">Cortex: Prometheus as a Service, One Year On</a>\" (<a href=\"https://www.youtube.com/watch?v=_8DmPW4iQBQ\" rel=\"nofollow\">videos</a>, <a href=\"https://promcon.io/2017-munich/slides/cortex-prometheus-as-a-service-one-year-on.pdf\" rel=\"nofollow\">slides</a>, write up <a href=\"https://kausal.co/blog/cortex-prometheus-aas-promcon-1/\" rel=\"nofollow\">part 1</a>, <a href=\"https://kausal.co/blog/cortex-prometheus-aas-promcon-2/\" rel=\"nofollow\">part 2</a>, <a href=\"https://kausal.co/blog/cortex-prometheus-aas-promcon-3/\" rel=\"nofollow\">part 3</a>)</li>\n<li>Jun 2017 Prometheus London meetup talk; \"Cortex: open-source, horizontally-scalable, distributed Prometheus\" (<a href=\"https://www.youtube.com/watch?v=Xi4jq2IUbLs\" rel=\"nofollow\">video</a>)</li>\n<li>Dec 2016 KubeCon talk; \"Weave Cortex: Multi-tenant, horizontally scalable Prometheus as a Service\" (<a href=\"https://www.youtube.com/watch?v=9Uctgnazfwk\" rel=\"nofollow\">video</a>, <a href=\"http://www.slideshare.net/weaveworks/weave-cortex-multitenant-horizontally-scalable-prometheus-as-a-service\" rel=\"nofollow\">slides</a>)</li>\n<li>Aug 2016 PromCon talk; \"Project Frankenstein: Multitenant, Scale-Out Prometheus\": (<a href=\"https://youtu.be/3Tb4Wc0kfCM\" rel=\"nofollow\">video</a>, <a href=\"http://www.slideshare.net/weaveworks/project-frankenstein-a-multitenant-horizontally-scalable-prometheus-as-a-service\" rel=\"nofollow\">slides</a>)</li>\n<li>Jun 2016 design document; \"<a href=\"http://goo.gl/prdUYV\" rel=\"nofollow\">Project Frankenstein: A Multi Tenant, Scale Out Prometheus</a>\"</li>\n</ul><h2>Getting Help</h2><p>If you have any questions about Cortex:</p><ul><li>Ask a question on the <a href=\"https://cloud-native.slack.com/messages/cortex/\" rel=\"nofollow\">Cortex Slack channel</a>. To invite yourself to the CNCF Slack, visit <a href=\"http://slack.cncf.io/\" rel=\"nofollow\">http://slack.cncf.io/</a>.</li>\n<li><a href=\"https://github.com/cortexproject/cortex/issues/new\">File an issue.</a></li>\n<li>Send an email to <a href=\"mailto:cortex-users@lists.cncf.io\">cortex-users@lists.cncf.io</a></li>\n</ul><p>Your feedback is always welcome.</p><p>For security issues see <a href=\"https://github.com/cortexproject/cortex/security/policy\">https://github.com/cortexproject/cortex/security/policy</a></p><h2>Community Meetings</h2><p>The Cortex community call happens every three weeks on Thursday at 03:30pm – 04:15pm UTC to get calendar invite join the <a href=\"https://groups.google.com/forum/#!forum/cortex-monitoring\" rel=\"nofollow\">google groups</a>.</p><p>Meeting notes are held <a href=\"https://docs.google.com/document/d/1shtXSAqp3t7fiC-9uZcKkq3mgwsItAJlH6YW6x1joZo/edit\" rel=\"nofollow\">here</a>.</p><h2>Hosted Cortex (Prometheus as a service)</h2><p>There are several commercial services where you can use Cortex\non-demand:</p><h3>Weave Cloud</h3><p><a href=\"https://cloud.weave.works\" rel=\"nofollow\">Weave Cloud</a> from\n<a href=\"https://weave.works\" rel=\"nofollow\">Weaveworks</a> lets you deploy, manage, and monitor\ncontainer-based applications. Sign up at <a href=\"https://cloud.weave.works\" rel=\"nofollow\">https://cloud.weave.works</a>\nand follow the instructions there. Additional help can also be found\nin the <a href=\"https://www.weave.works/docs/cloud/latest/overview/\" rel=\"nofollow\">Weave Cloud documentation</a>.</p><p><a href=\"https://www.weave.works/docs/cloud/latest/tasks/monitor/best-instrumenting/\" rel=\"nofollow\">Instrumenting Your App: Best Practices</a></p><h3>Grafana Cloud</h3><p>To use Cortex as part of Grafana Cloud, sign up for <a href=\"https://grafana.com/cloud\" rel=\"nofollow\">Grafana Cloud</a>\nby clicking \"Log In\" in the top right and then \"Sign Up Now\".  Cortex is included\nas part of the Starter and Basic Hosted Grafana plans.</p><h3>Amazon Managed Service for Prometheus (AMP)</h3><p><a href=\"https://aws.amazon.com/prometheus/\" rel=\"nofollow\">Amazon Managed Service for Prometheus (AMP)</a> is a Prometheus-compatible monitoring service that makes it easy to monitor containerized applications at scale. It is a highly available, secure, and managed monitoring for your containers. Get started <a href=\"https://console.aws.amazon.com/prometheus/home\" rel=\"nofollow\">here</a>. To learn more about the AMP, reference our <a href=\"https://docs.aws.amazon.com/prometheus/latest/userguide/what-is-Amazon-Managed-Service-Prometheus.html\" rel=\"nofollow\">documentation</a> and <a href=\"https://aws.amazon.com/blogs/mt/getting-started-amazon-managed-service-for-prometheus/\" rel=\"nofollow\">Getting Started with AMP blog</a>.</p>","id":"d4e68bc0-2b5a-53d7-a0ac-5bdf8e85e0b5","title":"cortexproject/cortex","origin_url":"https://github.com/cortexproject/cortex?spm=a2c65.11461447.0.0.748c6562AJ9SeR","url":"https://github.com/cortexproject/cortex?spm=a2c65.11461447.0.0.748c6562AJ9SeR","wallabag_created_at":"2021-02-03T22:57:13+00:00","published_at":null,"published_by":"['']","reading_time":4,"domain_name":"github.com","preview_picture":"https://opengraph.githubassets.com/98892693112b50cb330347db170b6a71c33e51f77a3fcc4751e8533b0e7e8837/cortexproject/cortex","tags":["aws.s3","bigtable","dynamo","prometheus","cassandra"],"description":"\n\n\nCortex provides horizontally scalable, highly available, multi-tenant, long term storage for\nPrometheus.Horizontally scalable: Cortex can run across multiple machines in a cluster, exceeding the th..."}],"skip":0,"limit":8,"totalCount":19,"currentPage":1,"url":"/tags/dynamo"}},"staticQueryHashes":[]}