{"id":9931,"date":"2020-09-22T08:00:55","date_gmt":"2020-09-22T15:00:55","guid":{"rendered":"http:\/\/softwareengineeringdaily.com\/?p=9931"},"modified":"2020-09-21T20:49:17","modified_gmt":"2020-09-22T03:49:17","slug":"what-makes-a-database-a-good-fit-to-run-in-kubernetes","status":"publish","type":"post","link":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/","title":{"rendered":"What Makes a Database a Good Fit to Run in Kubernetes?"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">As more organizations shift operations to the cloud, the benefits of cloud-native software and infrastructure <\/span><a href=\"https:\/\/www.weave.works\/technologies\/going-cloud-native-6-essential-things-you-need-to-know\/\"><span style=\"font-weight: 400;\">continue to accrue.<\/span><\/a><span style=\"font-weight: 400;\"> One critical task in managing a cloud-based microservices architecture is container orchestration. Kubernetes is the container orchestrator of choice for 78% of IT Leaders identified in Red Hat\u2019s <\/span><a href=\"https:\/\/enterprisersproject.com\/article\/2020\/6\/kubernetes-statistics-2020\"><span style=\"font-weight: 400;\">\u201cState of Open Source 2020\u201d report.<\/span><\/a><span style=\"font-weight: 400;\"> It\u2019s a powerful and flexible tool, but certain issues remain that can make <\/span><a href=\"https:\/\/softwareengineeringdaily.com\/2019\/01\/11\/why-is-storage-on-kubernetes-is-so-hard\/\"><span style=\"font-weight: 400;\">managing storage difficult.<\/span><\/a> <span style=\"font-weight: 400;\">To meet this challenge, NewSQL and, more recently,<\/span><a href=\"https:\/\/www.cockroachlabs.com\/blog\/what-is-distributed-sql\"><span style=\"font-weight: 400;\"> Distributed SQL databases<\/span><\/a><span style=\"font-weight: 400;\"> like CockroachDB have sought to reimagine how databases work from the ground up. NewSQL aims to merge the best features of both RDBMS systems and NoSQL systems to create a truly \u201ccloud-native\u201d database. Distributed SQL databases take that a step further for usability, by seamlessly integrating with microservices like Kubernetes while still speaking the language of data: SQL.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">By definition, databases are considered stateful applications, while Kubernetes was intended to facilitate the management of stateless applications that are connected to external services to store state if necessary. The guarantees which Kubernetes offered- for example, high availability of services- were premised on the idea that the underlying pods were effectively ephemeral and interchangeable. In the early days of Kubernetes, it was an <\/span><a href=\"https:\/\/www.cockroachlabs.com\/blog\/running-cockroachdb-on-kubernetes\/\"><span style=\"font-weight: 400;\">open question <\/span><\/a><span style=\"font-weight: 400;\">whether it would be convenient, or even possible, to run a database in a cluster.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Kubernetes manages containers dynamically, meaning that individual containers may be brought up or taken down at any time to match the needs of the application as a whole. This works fine for stateless services, but a stateful, persistent service like a database cannot afford to be restarted arbitrarily. In the past, developers often chose to run databases outside Kubernetes, which was problematic because it required redundant infrastructure management tools for the external database, such as monitoring and service discovery. Several<\/span><a href=\"https:\/\/resources.cockroachlabs.com\/cloud-native-kubernetes\/oreilly-kubernetes-best-practices\"><span style=\"font-weight: 400;\"> methods<\/span><\/a><span style=\"font-weight: 400;\"> have been added to Kubernetes, which can help manage storage, such as Persistent Volumes and Storage Class objects. Since the 1.5 release, Kubernetes has offered <\/span><a href=\"https:\/\/kubernetes.io\/docs\/concepts\/workloads\/controllers\/statefulset\/\"><span style=\"font-weight: 400;\">StatefulSets<\/span><\/a><span style=\"font-weight: 400;\"> (<\/span><a href=\"https:\/\/medium.com\/stakater\/k8s-deployments-vs-statefulsets-vs-daemonsets-60582f0c62d4\"><span style=\"font-weight: 400;\">and the related, but more complex DaemonSets<\/span><\/a><span style=\"font-weight: 400;\">), ensuring that pods retain the same unique ID even if they are rescheduled to another machine. Connecting these pods to a remote \u201c<\/span><a href=\"https:\/\/medium.com\/better-programming\/kubernetes-a-detailed-example-of-deployment-of-a-stateful-application-de3de33c8632\"><span style=\"font-weight: 400;\">Persistent Volume<\/span><\/a><span style=\"font-weight: 400;\">\u201d via their unique ID allows the application to maintain state, even when pods are being created and destroyed. Since version 1.14, Kubernetes has supported \u201c<\/span><a href=\"https:\/\/kubernetes.io\/blog\/2019\/04\/04\/kubernetes-1.14-local-persistent-volumes-ga\/\"><span style=\"font-weight: 400;\">Local Persistent Volumes<\/span><\/a><span style=\"font-weight: 400;\">\u201d as well, allowing developers to use the same PersistentVolume APIs to connect to either Remote or Local storage.<\/span><\/p>\n<p><a href=\"https:\/\/itnext.io\/introduction-to-stateful-services-kubernetes-6018fd99338d\"><img fetchpriority=\"high\" decoding=\"async\" data-attachment-id=\"9939\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/headlesssevice\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?fit=938%2C996&amp;ssl=1\" data-orig-size=\"938,996\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"HeadlessSevice\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?fit=283%2C300&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?fit=938%2C996&amp;ssl=1\" class=\"aligncenter wp-image-9939\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?resize=500%2C531\" alt=\"\" width=\"500\" height=\"531\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?resize=283%2C300&amp;ssl=1 283w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?resize=768%2C815&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/HeadlessSevice.png?w=938&amp;ssl=1 938w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">The addition of StatefulSets and the ability to connect pods to persistent storage should definitively answer whether it was <\/span><i><span style=\"font-weight: 400;\">possible<\/span><\/i><span style=\"font-weight: 400;\"> to run a database alongside a cluster. But simply adapting technology designed with bare-metal in mind to a cloud environment is a suboptimal solution, and inevitably some of the benefits of the cloud will be compromised. Legacy RDBMS systems still lack certain features that would make them <\/span><i><span style=\"font-weight: 400;\">ideal<\/span><\/i><span style=\"font-weight: 400;\"> for running in Kubernetes. On the other side of the aisle, the trade-offs made by many NoSQL databases to make them more cloud-friendly mean they have lost a degree of usability power that developers may depend on in cloud-native applications (in particular, many have their own querying language). In order to understand why some NoSQL databases made this trade-off, it\u2019s important to align on a single definition of \u201ccloud-native.\u201d Here\u2019s the official one from the CNCF (Cloud Native Computing Foundation)<\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">\u201cCloud-native technologies empower organizations to build and run scalable applications in modern, dynamic environments such as public, private, and hybrid clouds. Containers, service meshes, microservices, immutable infrastructure, and declarative APIs exemplify this approach. These techniques enable loosely coupled systems that are resilient, manageable, and observable. Combined with robust automation, they allow engineers to make high-impact changes frequently and predictably with minimal toil.\u201d<\/span><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/github.com\/cncf\/foundation\/blob\/master\/charter.md\"><span style=\"font-weight: 400;\">Source<\/span><\/a><span style=\"font-weight: 400;\">\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Or, more simply, a cloud-native application is \u201c<\/span><a href=\"https:\/\/developers.redhat.com\/blog\/2020\/04\/08\/why-kubernetes-native-instead-of-cloud-native\/\"><span style=\"font-weight: 400;\">architected to take full advantage of cloud platforms.\u201d<\/span><\/a><span style=\"font-weight: 400;\"> A cloud-native<\/span> <span style=\"font-weight: 400;\">database should make the most of these advantages <\/span><i><span style=\"font-weight: 400;\">without <\/span><\/i><span style=\"font-weight: 400;\">sacrificing the features which made RDBMS systems dominant for decades. The only databases that do that well are Distributed SQL databases, which bring together the benefits of NoSQL and the features that make RDBMS systems powerful. Now that we know we can run a database in Kubernetes, what criteria can we use to choose <\/span><i><span style=\"font-weight: 400;\">which<\/span><\/i><span style=\"font-weight: 400;\"> database to run? As exemplified below, most databases make you choose a trade-off between ease of use and horizontal scalability.\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/docs.google.com\/presentation\/d\/1ovHHGT-H-wfGlRqYB1V-1aydSz3O4W9xR7kMQEIJ7CI\/edit?usp=sharing\"><img decoding=\"async\" data-attachment-id=\"9940\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/chooseyouradventure\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?fit=1999%2C1042&amp;ssl=1\" data-orig-size=\"1999,1042\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ChooseYourAdventure\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?fit=300%2C156&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?fit=1024%2C534&amp;ssl=1\" class=\"aligncenter wp-image-9940\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?resize=501%2C261\" alt=\"\" width=\"501\" height=\"261\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?resize=300%2C156&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?resize=1024%2C534&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?resize=768%2C400&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?resize=1536%2C801&amp;ssl=1 1536w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ChooseYourAdventure.png?w=1999&amp;ssl=1 1999w\" sizes=\"(max-width: 501px) 100vw, 501px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Nate Stewart, the Chief Product Officer at Cockroach Labs, describes \u201cDASH\u201d factors that help align databases with the goals and function of Kubernetes. Quoting at length <\/span><a href=\"https:\/\/thenewstack.io\/dash-four-properties-of-kubernetes-native-databases\/\"><span style=\"font-weight: 400;\">from his article on DASH:<\/span><\/a><\/p>\n<ul>\n<li style=\"font-weight: 400;\"><b>Disposability<\/b><span style=\"font-weight: 400;\"> ensures your stateful systems can survive when ephemeral cloud resources cease to exist.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>API Symmetry<\/b><span style=\"font-weight: 400;\"> allows distributed databases to always provide the up-to-date answer, no matter which process is handling the client request.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Shared-Nothing Properties<\/b><span style=\"font-weight: 400;\"> enable your database to make forward progress without any centralized master or coordinator.<\/span><\/li>\n<li style=\"font-weight: 400;\"><b>Horizontal scalability <\/b><span style=\"font-weight: 400;\">allows the relational database to take advantage of the unlimited and on-demand resources available in the cloud.<\/span><\/li>\n<\/ul>\n<p><a href=\"https:\/\/thenewstack.io\/dash-four-properties-of-kubernetes-native-databases\/\"><img decoding=\"async\" data-attachment-id=\"9941\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/disruptionshidden\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?fit=1999%2C1112&amp;ssl=1\" data-orig-size=\"1999,1112\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"DisruptionsHidden\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?fit=300%2C167&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?fit=1024%2C570&amp;ssl=1\" class=\"aligncenter wp-image-9941\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?resize=500%2C278\" alt=\"\" width=\"500\" height=\"278\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?resize=300%2C167&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?resize=1024%2C570&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?resize=768%2C427&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?resize=1536%2C854&amp;ssl=1 1536w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?resize=269%2C151&amp;ssl=1 269w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DisruptionsHidden.png?w=1999&amp;ssl=1 1999w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">The first factor, <\/span><b>Disposability<\/b><span style=\"font-weight: 400;\">, is a central consideration for databases deploying to a Kubernetes cluster for reasons already discussed above. One of the significant value propositions for Kubernetes is the ability to handle outages and failures dynamically, and it is critical that a database running on Kubernetes be robust to unexpected issues.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Traditional RDBMS\/SQL systems were designed with a single machine in mind. Databases might \u201cfailover\u201d to a backup device, but such processes <\/span><a href=\"https:\/\/dbvisit.com\/blog\/difference-between-failover-vs-switchover\"><span style=\"font-weight: 400;\">came with a risk of data loss.<\/span><\/a><span style=\"font-weight: 400;\"> A significant advantage of NoSQL databases was that they were designed to be highly available by contrast, and most NewSQL databases derive their availability strategies from the NoSQL world. As a Distributed SQL database, CockroachDB makes the best of both these worlds.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">CockroachDB\u2019s name was inspired by the popular image of the cockroach as the ultimate \u201csurvivor.\u201d Disposability and high availability are integral to its design. Its Multi-Active Availability model is based on the <\/span><a href=\"http:\/\/cockroachlabs.com\/docs\/stable\/architecture\/replication-layer.html#raft\"><span style=\"font-weight: 400;\">Raft consensus algorithm,<\/span><\/a><span style=\"font-weight: 400;\"> which requires three nodes to agree on a write\u2019s contents to establish consistency (more on that later). As long as a majority of nodes agree, the data can be written- meaning that if any nodes are down, the request can still proceed as long as a quorum can be established. This makes the system robust to service outages while maintaining consistent data between nodes.<\/span><\/p>\n<p><a href=\"https:\/\/www.cockroachlabs.com\/guides\/high-availability-architecture\/\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9942\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/raft\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?fit=1999%2C1235&amp;ssl=1\" data-orig-size=\"1999,1235\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Raft\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?fit=300%2C185&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?fit=1024%2C633&amp;ssl=1\" class=\"aligncenter wp-image-9942\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?resize=500%2C309\" alt=\"\" width=\"500\" height=\"309\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?resize=300%2C185&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?resize=1024%2C633&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?resize=768%2C474&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?resize=1536%2C949&amp;ssl=1 1536w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Raft.png?w=1999&amp;ssl=1 1999w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">The second factor of DASH, <\/span><b>API Symmetry<\/b><span style=\"font-weight: 400;\">, refers to the guarantee of consistent responses regardless of which node receives a request. There is an obvious parallel with the ACID concept of \u2018Consistency.\u2019 Consistency requires all database nodes in a cluster to have consistent data. Traditional RDBMS systems maintained Consistency when partitioned by ensuring that a write would be propagated to all replicas of the database before a response was returned to the client, which can cause transaction time to scale up with the number of partitions. To avoid this, NoSQL systems adopted an \u201ceventually consistent\u201d model where a response could be returned to the user before the propagation of data was complete, relaxing the Consistency guarantee. This <\/span><a href=\"https:\/\/softwareengineering.stackexchange.com\/questions\/194340\/why-are-nosql-databases-more-scalable-than-sql\"><span style=\"font-weight: 400;\">allowed for scaling with less work<\/span><\/a><span style=\"font-weight: 400;\"> \u201cbehind the scenes,\u201d but breaks API Symmetry since there will be some lag time where the master and replicas are out of sync.<\/span><\/p>\n<p><a href=\"https:\/\/www.cohesity.com\/blog\/strict-vs-eventual-consistency\/\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9943\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/consistency-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?fit=800%2C404&amp;ssl=1\" data-orig-size=\"800,404\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"Consistency\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?fit=300%2C152&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?fit=800%2C404&amp;ssl=1\" class=\"aligncenter wp-image-9943\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?resize=501%2C253\" alt=\"\" width=\"501\" height=\"253\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?resize=300%2C152&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?resize=768%2C388&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/Consistency.jpg?w=800&amp;ssl=1 800w\" sizes=\"(max-width: 501px) 100vw, 501px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Distributed SQL systems such as CockroachDB aim to achieve Consistency by <\/span><a href=\"https:\/\/www.cockroachlabs.com\/blog\/consistency-model\/\"><span style=\"font-weight: 400;\">increasing the flexibility<\/span><\/a><span style=\"font-weight: 400;\"> of database nodes in responding to client requests. If a CockroachDB node receives a request, it will either respond (if it has the necessary data) or forward the request to another node behind the scenes, and the next node will handle communication with the client.<\/span><\/p>\n<p><a href=\"https:\/\/www.cockroachlabs.com\/docs\/stable\/architecture\/reads-and-writes-overview.html\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9944\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/readrequest\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ReadRequest.png?fit=669%2C339&amp;ssl=1\" data-orig-size=\"669,339\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"ReadRequest\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ReadRequest.png?fit=300%2C152&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ReadRequest.png?fit=669%2C339&amp;ssl=1\" class=\"aligncenter wp-image-9944\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ReadRequest.png?resize=499%2C253\" alt=\"\" width=\"499\" height=\"253\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ReadRequest.png?resize=300%2C152&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/ReadRequest.png?w=669&amp;ssl=1 669w\" sizes=\"(max-width: 499px) 100vw, 499px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\"><em>A read request in CockroachDB from the client forwarded from Node 2 to Node 3 to ensure Consistency.<\/em>\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">The third factor, <\/span><b>Shared-Nothing Properties<\/b><span style=\"font-weight: 400;\">, dovetails nicely with the high-availability and disposability factors mentioned above. Survivability was built into CockroachDB from the start. CockroachDB nodes do not have a \u201cmaster\u201d process vulnerable to failure- any node can take any request and communicate with other nodes to solve a problem if necessary. Nodes can even work on processes in parallel by breaking up complex queries. The lack of a centralized coordinator means that there is no centralized \u201cfailure point\u201d which the other nodes depend on.\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/thenewstack.io\/dash-four-properties-of-kubernetes-native-databases\/\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9945\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/pointsoffailure\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?fit=1999%2C1112&amp;ssl=1\" data-orig-size=\"1999,1112\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"PointsofFailure\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?fit=300%2C167&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?fit=1024%2C570&amp;ssl=1\" class=\"aligncenter wp-image-9945\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?resize=500%2C278\" alt=\"\" width=\"500\" height=\"278\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?resize=300%2C167&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?resize=1024%2C570&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?resize=768%2C427&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?resize=1536%2C854&amp;ssl=1 1536w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?resize=269%2C151&amp;ssl=1 269w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/PointsofFailure.png?w=1999&amp;ssl=1 1999w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><span style=\"font-weight: 400;\">The final DASH factor, <\/span><b>Horizontal Scalability<\/b><span style=\"font-weight: 400;\">, is where the contrasts are most evident between SQL, NoSQL, and NewSQL databases. As mentioned above, the ACID guarantees required by traditional SQL systems required a significant amount of \u201coverhead.\u201d\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/blog.developer.bazaarvoice.com\/tag\/newsql\/\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9946\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/rdbms\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/RDBMS.png?fit=744%2C543&amp;ssl=1\" data-orig-size=\"744,543\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"RDBMS\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/RDBMS.png?fit=300%2C219&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/RDBMS.png?fit=744%2C543&amp;ssl=1\" class=\"aligncenter wp-image-9946\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/RDBMS.png?resize=500%2C365\" alt=\"\" width=\"500\" height=\"365\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/RDBMS.png?resize=300%2C219&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/RDBMS.png?w=744&amp;ssl=1 744w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">This does not necessarily mean RDBMS were slower than NoSQL databases (in the case of reads, assuming queries were adequately optimized), but ensuring the ACID guarantees for write transactions were kept when scaling <\/span><a href=\"https:\/\/web.archive.org\/web\/20080511221610\/http:\/\/xml.sys-con.com\/read\/43755.htm\"><span style=\"font-weight: 400;\">presented difficulties.<\/span><\/a><span style=\"font-weight: 400;\"> Traditionally, RDBMS would scale \u201cvertically,\u201d which typically meant investing in bigger and faster server hardware.\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/hackernoon.com\/database-scaling-horizontal-and-vertical-scaling-85edd2fd9944\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9947\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/verticalscaling\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?fit=1200%2C675&amp;ssl=1\" data-orig-size=\"1200,675\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"VerticalScaling\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?fit=300%2C169&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?fit=1024%2C576&amp;ssl=1\" class=\"aligncenter wp-image-9947\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?resize=500%2C281\" alt=\"\" width=\"500\" height=\"281\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?resize=1024%2C576&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?resize=768%2C432&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?resize=269%2C151&amp;ssl=1 269w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/VerticalScaling.png?w=1200&amp;ssl=1 1200w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">When hardware limitations made vertical scaling infeasible, \u201chorizontal\u201d scaling could be accomplished by \u201csharding\u201d the data across several machines, but this<\/span><a href=\"https:\/\/medium.com\/system-design-blog\/database-sharding-69f3f4bd96db\"><span style=\"font-weight: 400;\"> tended to push complexity<\/span><\/a><span style=\"font-weight: 400;\"> up to the developers who now had to manage several database locations.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Elastic cloud infrastructure made horizontal scaling much more straightforward. One of the principal advantages to NoSQL databases, at least in the early days of cloud computing, was that they could scale this way. However, doing so required NoSQL systems to adopt \u2018BASE\u2019 principles instead, which relaxed the assumptions of ACID transactions.\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/www.cockroachlabs.com\/docs\/v20.1\/cockroachdb-in-comparison\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9948\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/dbhorizontalscale\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?fit=1177%2C182&amp;ssl=1\" data-orig-size=\"1177,182\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"DBHorizontalScale\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?fit=300%2C46&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?fit=1024%2C158&amp;ssl=1\" class=\"aligncenter wp-image-9948\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?resize=500%2C77\" alt=\"\" width=\"500\" height=\"77\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?resize=300%2C46&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?resize=1024%2C158&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?resize=768%2C119&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBHorizontalScale.png?w=1177&amp;ssl=1 1177w\" sizes=\"(max-width: 500px) 100vw, 500px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p><span style=\"font-weight: 400;\">As with other NewSQL databases, CockroachDB was designed with <\/span><a href=\"https:\/\/www.cockroachlabs.com\/blog\/database-evolution\/\"><span style=\"font-weight: 400;\">scale in mind<\/span><\/a><span style=\"font-weight: 400;\">. But like NoSQL systems, it scales horizontally by adding new machines, but with the closest adherence <\/span><a href=\"https:\/\/www.cockroachlabs.com\/blog\/how-cockroachdb-distributes-atomic-transactions\/\"><span style=\"font-weight: 400;\">to ACID principles<\/span><\/a><span style=\"font-weight: 400;\">.\u00a0<\/span><\/p>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=EYC7n6ttcQs&amp;feature=emb_logo\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"9949\" data-permalink=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/dbs\/\" data-orig-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?fit=1427%2C581&amp;ssl=1\" data-orig-size=\"1427,581\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"DBs\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?fit=300%2C122&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?fit=1024%2C417&amp;ssl=1\" class=\"aligncenter wp-image-9949\" src=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?resize=501%2C204\" alt=\"\" width=\"501\" height=\"204\" srcset=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?resize=300%2C122&amp;ssl=1 300w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?resize=1024%2C417&amp;ssl=1 1024w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?resize=768%2C313&amp;ssl=1 768w, https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/DBs.png?w=1427&amp;ssl=1 1427w\" sizes=\"(max-width: 501px) 100vw, 501px\" data-recalc-dims=\"1\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-weight: 400;\">DASH properties define a set of best practices for designing a cloud-native database, particularly one running in a dynamic environment like a Kubernetes cluster. Similarly essential is the ability of a database to serve the needs of developers. In the original whitepaper for Google Spanner, the inspiration for CockroachDB (and a project which CockroachDB\u2019s founders worked on), the authors wrote about building data-driven applications:<\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">\u201c&#8230;developers of many OLTP applications found it difficult to build these applications without a strong schema system, cross-row transactions, consistent replication, and a powerful query language.\u201d<\/span><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/storage.googleapis.com\/pub-tools-public-publication-data\/pdf\/acac3b090a577348a7106d09c051c493298ccb1d.pdf\"><span style=\"font-weight: 400;\">Source<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Despite the drawbacks in the construction of many traditional RDBMS, the SQL functions such as JOIN and WHERE clauses, in addition to the guarantees offered by ACID transactions, had enough value to keep traditional SQL systems competitive with NoSQL. CockroachDB is <\/span><a href=\"https:\/\/www.cockroachlabs.com\/docs\/stable\/architecture\/sql-layer.html#postgresql-wire-protocol\"><span style=\"font-weight: 400;\">wire compatible<\/span><\/a><span style=\"font-weight: 400;\"> with PostgreSQL, which <\/span><a href=\"https:\/\/www.nextplatform.com\/2017\/02\/22\/google-spanner-inspires-cockroachdb-outrun\/\"><span style=\"font-weight: 400;\">was chosen<\/span><\/a><span style=\"font-weight: 400;\"> both for its compatibility with a wide range of languages and for its better Object Relational Mapping (ORM) implementation versus other RDBMS. The ability to use complex, structured queries eliminates one of the significant drawbacks of NoSQL systems. Also, the Isolation guarantees provided in ACID-compliant transactions <\/span><a href=\"https:\/\/www.cockroachlabs.com\/blog\/distributed-sql-webinar\/\"><span style=\"font-weight: 400;\">can be <\/span><\/a><span style=\"font-weight: 400;\">crucial for heavily regulated workflows such as financial ledgers. In our interview with Peter Mattis, a co-founder of CockroachDB, he told us about the original value proposition his team sought to create:<\/span><\/p>\n<p style=\"text-align: center;\"><span style=\"font-weight: 400;\">\u201c&#8230;There are essentially people who are looking at NoSQL systems and being like, \u2018Ah! I got this horizontal scalability, but it doesn&#8217;t have the functionality applications most applications want. They don\u2019t have transactions. They don&#8217;t have indexing. All the niceties you would get from a traditional SQL database.\u2019 The other end of the spectrum, we had the SQL databases, and the SQL databases are like, \u2018Oh! We\u2019ll give you all this functionality, but sorry, you\u2019re going to have to do sharding eventually when you get to a certain scale.\u2019 Why wasn&#8217;t there some marriage in the middle?\u201d<\/span><\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/softwareengineeringdaily.com\/2020\/04\/28\/cockroachdb-with-peter-mattis\/\"><span style=\"font-weight: 400;\">Source<\/span><\/a><\/p>\n<p><span style=\"font-weight: 400;\">Given that CockroachDB and Kubernetes share \u201c<\/span><a href=\"https:\/\/www.cockroachlabs.com\/guides\/kubernetes-statefulsets\/\"><span style=\"font-weight: 400;\">ideological DNA<\/span><\/a><span style=\"font-weight: 400;\">\u201d and a common origin at Google, it may perhaps be no surprise that CockroachDB was built with Kubernetes in mind. Kubernetes is complex, and the additional work of provisioning and managing external databases simply to make an application stateful can be an onerous burden. CockroachDB\u2019s design makes it clear that Kubernetes workflows were taken into account from the beginning. Distributed SQL databases such as CockroachDB unite the flexibility of NoSQL with the expressive power of SQL systems, and their cloud-native features make them an ideal fit for developers building applications on Kubernetes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">For more information on running CockroachDB with Kubernetes, check out the \u201c<\/span><a href=\"https:\/\/www.cockroachlabs.com\/kubernetes-bootcamp\"><span style=\"font-weight: 400;\">Kubernetes Bootcamp<\/span><\/a><span style=\"font-weight: 400;\">\u201d series available at Cockroach Labs\u2019 website. The core product is open source, and you can try a <\/span><a href=\"https:\/\/www.cockroachlabs.com\/product\/cockroachcloud\/\"><span style=\"font-weight: 400;\">free managed cluster of CockroachCloud<\/span><\/a><span style=\"font-weight: 400;\"> (with all enterprise features) here.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">To hear more about CockroachDB, check out our interviews with <\/span><a href=\"https:\/\/softwareengineeringdaily.com\/2020\/04\/28\/cockroachdb-with-peter-mattis\/\"><span style=\"font-weight: 400;\">Peter Mattis<\/span><\/a><span style=\"font-weight: 400;\"> and <\/span><a href=\"https:\/\/softwareengineeringdaily.com\/2020\/04\/28\/cockroachdb-with-peter-mattis\/\"><span style=\"font-weight: 400;\">Ben Darnell<\/span><\/a><span style=\"font-weight: 400;\"> of CockroachDB and CockroachLabs. For lots of great content about databases and distributed storage, check out our <\/span><a href=\"https:\/\/softwareengineeringdaily.com\/?s=databases\"><span style=\"font-weight: 400;\">database archives at SoftwareEngineeringDaily.com<\/span><\/a><span style=\"font-weight: 400;\">.<\/span><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As more organizations shift operations to the cloud, the benefits of cloud-native software and infrastructure continue to accrue. One critical task in managing a cloud-based microservices architecture is container orchestration. Kubernetes is the container orchestrator of choice for 78% of IT Leaders identified in Red Hat\u2019s \u201cState of Open Source 2020\u201d report. It\u2019s a powerful<\/p>\n","protected":false},"author":53,"featured_media":9937,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"What Makes a Database a Good Fit to Run in Kubernetes? by Danny Seymour @CockroachDB","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[1363,83,2143],"tags":[4078,1402,4074,1403,3472,4076,4079,4077,379,4075],"class_list":["post-9931","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-all-episodes","category-articles","category-exclusive-content","tag-acid-principles","tag-cockroach-labs","tag-cockroachcloud","tag-cockroachdb","tag-danny-seymour","tag-dash","tag-distributed-sql-databases","tag-horizontal-scaling","tag-kubernetes","tag-nate-stewart"],"jetpack_publicize_connections":[],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>What Makes a Database a Good Fit to Run in Kubernetes? - Software Engineering Daily<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"What Makes a Database a Good Fit to Run in Kubernetes? - Software Engineering Daily\" \/>\n<meta property=\"og:description\" content=\"As more organizations shift operations to the cloud, the benefits of cloud-native software and infrastructure continue to accrue. One critical task in managing a cloud-based microservices architecture is container orchestration. Kubernetes is the container orchestrator of choice for 78% of IT Leaders identified in Red Hat\u2019s \u201cState of Open Source 2020\u201d report. It\u2019s a powerful\" \/>\n<meta property=\"og:url\" content=\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\" \/>\n<meta property=\"og:site_name\" content=\"Software Engineering Daily\" \/>\n<meta property=\"article:published_time\" content=\"2020-09-22T15:00:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-09-22T03:49:17+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"627\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Danny Seymour\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@software_daily\" \/>\n<meta name=\"twitter:site\" content=\"@software_daily\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Danny Seymour\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\"},\"author\":{\"name\":\"Danny Seymour\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/618234cbe1ece5fb1942f58d2d279e62\"},\"headline\":\"What Makes a Database a Good Fit to Run in Kubernetes?\",\"datePublished\":\"2020-09-22T15:00:55+00:00\",\"dateModified\":\"2020-09-22T03:49:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\"},\"wordCount\":2060,\"publisher\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#organization\"},\"image\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1\",\"keywords\":[\"ACID principles\",\"Cockroach Labs\",\"CockroachCloud\",\"CockroachDB\",\"Danny Seymour\",\"DASH\",\"distributed SQL databases\",\"horizontal scaling\",\"Kubernetes\",\"Nate Stewart\"],\"articleSection\":[\"All Content\",\"Exclusive Articles\",\"Exclusive Content\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\",\"url\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\",\"name\":\"What Makes a Database a Good Fit to Run in Kubernetes? - Software Engineering Daily\",\"isPartOf\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1\",\"datePublished\":\"2020-09-22T15:00:55+00:00\",\"dateModified\":\"2020-09-22T03:49:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage\",\"url\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1\",\"width\":1200,\"height\":627},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/softwareengineeringdaily.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"What Makes a Database a Good Fit to Run in Kubernetes?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#website\",\"url\":\"https:\/\/softwareengineeringdaily.com\/\",\"name\":\"Software Engineering Daily\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/softwareengineeringdaily.com\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#organization\",\"name\":\"Software Engineering Daily\",\"url\":\"https:\/\/softwareengineeringdaily.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1\",\"contentUrl\":\"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1\",\"width\":549,\"height\":169,\"caption\":\"Software Engineering Daily\"},\"image\":{\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/software_daily\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/618234cbe1ece5fb1942f58d2d279e62\",\"name\":\"Danny Seymour\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4346abbfc4b4d898a9c6b21499ae87d8?s=96&d=retro&r=pg\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4346abbfc4b4d898a9c6b21499ae87d8?s=96&d=retro&r=pg\",\"caption\":\"Danny Seymour\"},\"description\":\"Danny is a Santa Fe-based developer who works as a Junior Consultant at Rural Sourcing.\",\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/daniel-seymournm\/\"],\"url\":\"https:\/\/softwareengineeringdaily.com\/author\/danny\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"What Makes a Database a Good Fit to Run in Kubernetes? - Software Engineering Daily","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/","og_locale":"en_US","og_type":"article","og_title":"What Makes a Database a Good Fit to Run in Kubernetes? - Software Engineering Daily","og_description":"As more organizations shift operations to the cloud, the benefits of cloud-native software and infrastructure continue to accrue. One critical task in managing a cloud-based microservices architecture is container orchestration. Kubernetes is the container orchestrator of choice for 78% of IT Leaders identified in Red Hat\u2019s \u201cState of Open Source 2020\u201d report. It\u2019s a powerful","og_url":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/","og_site_name":"Software Engineering Daily","article_published_time":"2020-09-22T15:00:55+00:00","article_modified_time":"2020-09-22T03:49:17+00:00","og_image":[{"width":1200,"height":627,"url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1","type":"image\/jpeg"}],"author":"Danny Seymour","twitter_card":"summary_large_image","twitter_creator":"@software_daily","twitter_site":"@software_daily","twitter_misc":{"Written by":"Danny Seymour","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#article","isPartOf":{"@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/"},"author":{"name":"Danny Seymour","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/618234cbe1ece5fb1942f58d2d279e62"},"headline":"What Makes a Database a Good Fit to Run in Kubernetes?","datePublished":"2020-09-22T15:00:55+00:00","dateModified":"2020-09-22T03:49:17+00:00","mainEntityOfPage":{"@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/"},"wordCount":2060,"publisher":{"@id":"https:\/\/softwareengineeringdaily.com\/#organization"},"image":{"@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1","keywords":["ACID principles","Cockroach Labs","CockroachCloud","CockroachDB","Danny Seymour","DASH","distributed SQL databases","horizontal scaling","Kubernetes","Nate Stewart"],"articleSection":["All Content","Exclusive Articles","Exclusive Content"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/","url":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/","name":"What Makes a Database a Good Fit to Run in Kubernetes? - Software Engineering Daily","isPartOf":{"@id":"https:\/\/softwareengineeringdaily.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage"},"image":{"@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1","datePublished":"2020-09-22T15:00:55+00:00","dateModified":"2020-09-22T03:49:17+00:00","breadcrumb":{"@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#primaryimage","url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1","contentUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1","width":1200,"height":627},{"@type":"BreadcrumbList","@id":"https:\/\/softwareengineeringdaily.com\/2020\/09\/22\/what-makes-a-database-a-good-fit-to-run-in-kubernetes\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/softwareengineeringdaily.com\/"},{"@type":"ListItem","position":2,"name":"What Makes a Database a Good Fit to Run in Kubernetes?"}]},{"@type":"WebSite","@id":"https:\/\/softwareengineeringdaily.com\/#website","url":"https:\/\/softwareengineeringdaily.com\/","name":"Software Engineering Daily","description":"","publisher":{"@id":"https:\/\/softwareengineeringdaily.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/softwareengineeringdaily.com\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/softwareengineeringdaily.com\/#organization","name":"Software Engineering Daily","url":"https:\/\/softwareengineeringdaily.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1","contentUrl":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2024\/01\/cropped-sed_website_banner.png?fit=549%2C169&ssl=1","width":549,"height":169,"caption":"Software Engineering Daily"},"image":{"@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/software_daily"]},{"@type":"Person","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/618234cbe1ece5fb1942f58d2d279e62","name":"Danny Seymour","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/softwareengineeringdaily.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4346abbfc4b4d898a9c6b21499ae87d8?s=96&d=retro&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4346abbfc4b4d898a9c6b21499ae87d8?s=96&d=retro&r=pg","caption":"Danny Seymour"},"description":"Danny is a Santa Fe-based developer who works as a Junior Consultant at Rural Sourcing.","sameAs":["https:\/\/www.linkedin.com\/in\/daniel-seymournm\/"],"url":"https:\/\/softwareengineeringdaily.com\/author\/danny\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/i0.wp.com\/softwareengineeringdaily.com\/wp-content\/uploads\/2020\/09\/KubeCockroach.jpg?fit=1200%2C627&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p7GuoD-2Ab","_links":{"self":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/posts\/9931"}],"collection":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/comments?post=9931"}],"version-history":[{"count":0,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/posts\/9931\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/media\/9937"}],"wp:attachment":[{"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/media?parent=9931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/categories?post=9931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/softwareengineeringdaily.com\/wp-json\/wp\/v2\/tags?post=9931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}