{"id":1172,"date":"2022-12-21T15:34:03","date_gmt":"2022-12-21T14:34:03","guid":{"rendered":"http:\/\/baptiste-meynier.com\/?p=1172"},"modified":"2023-02-18T18:08:41","modified_gmt":"2023-02-18T17:08:41","slug":"apache-cassandra-draft","status":"publish","type":"post","link":"https:\/\/baptiste-meynier.com\/index.php\/2022\/12\/21\/apache-cassandra-draft\/","title":{"rendered":"Apache Cassandra"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Introduction<\/h2>\n\n\n\n<p class=\"has-text-align-left wp-block-paragraph\">J&#8217;ai d\u00e9velopp\u00e9 une application me permettant d&#8217;historiser les poissons que j&#8217;\u00e9l\u00e8ve dans mes aquariums et ceux de mon association. Il s&#8217;agit d&#8217;une application Java disposant d&#8217;une base de donn\u00e9es MySql dont voici le mod\u00e8le de donn\u00e9es.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"492\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/merise-3.png\" alt=\"\" class=\"wp-image-1356\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/merise-3.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/merise-3-300x144.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/merise-3-768x369.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Une soci\u00e9t\u00e9 m&#8217;a contact\u00e9 et souhaite cr\u00e9er une application mobile permettant aux professionnels de stocker leurs inventaires de poissons. Une \u00e9tude a \u00e9t\u00e9 faite et le grand nombre de donn\u00e9es implique l&#8217;utilisation d&#8217;une base de donn\u00e9es que je ne connais pas, <strong>Apache Cassandra<\/strong>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Qu&#8217;elles sont les particularit\u00e9s de cette base ?<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Th\u00e9or\u00e8me de CAP<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Monsieur <a rel=\"noreferrer noopener\" href=\"https:\/\/fr.wikipedia.org\/wiki\/Eric_Brewer_(scientifique)\" target=\"_blank\">Eric Brewer<\/a> a cr\u00e9\u00e9 ce th\u00e9or\u00e8me permettant de r\u00e9partir les bases de donn\u00e9es selon leurs caract\u00e9ristiques.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"786\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cap-1024x786.png\" alt=\"\" class=\"wp-image-1683\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cap-1024x786.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cap-300x230.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cap-768x590.png 768w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cap-1536x1179.png 1536w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cap.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Coh\u00e9rence (<\/strong><em>Consistency<\/em> en anglais)&nbsp;:<strong> <\/strong>Tous les n\u0153uds du syst\u00e8me voient exactement les m\u00eames donn\u00e9es au m\u00eame moment&nbsp;.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Disponibilit\u00e9<\/strong> (<em>Availability<\/em> en anglais)&nbsp;: garantie que toutes les requ\u00eates re\u00e7oivent une r\u00e9ponse&nbsp;; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Tol\u00e9rance au partitionnement<\/strong> (<em>Partition Tolerance<\/em> en anglais)&nbsp;: aucune panne moins importante qu&#8217;une coupure totale du r\u00e9seau ne doit emp\u00eacher le syst\u00e8me de r\u00e9pondre correctement (ou encore&nbsp;: en cas de morcellement en sous-r\u00e9seaux, chacun doit pouvoir fonctionner de mani\u00e8re autonome).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous savons maintenant que <strong>Cassandra<\/strong> est tol\u00e9rant \u00e0 la panne et garanti une r\u00e9ponse. Si tout cela est possible, c&#8217;est grace \u00e0 son architecture <strong>distribu\u00e9e<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"572\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/07\/distributed_centralized-1024x572.png\" alt=\"\" class=\"wp-image-1196\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/07\/distributed_centralized-1024x572.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/07\/distributed_centralized-300x168.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/07\/distributed_centralized-768x429.png 768w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/07\/distributed_centralized-1536x858.png 1536w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/07\/distributed_centralized.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Base de donn\u00e9es NoSql<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Contrairement aux base de donn\u00e9es traditionnelles, <strong>Cassandra ne dispose pas de syst\u00e8me de jointure<\/strong>. Elles sont couteuses en ressources et ne permettent pas d&#8217;acc\u00e9der \u00e0 la donn\u00e9e de mani\u00e8re optimale. L&#8217;id\u00e9e est de cr\u00e9er un mod\u00e8le de donn\u00e9es en une seule table. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"445\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/flatten_table_process-5.png\" alt=\"\" class=\"wp-image-1396\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/flatten_table_process-5.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/flatten_table_process-5-300x130.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/flatten_table_process-5-768x334.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Ici j&#8217;ai regroup\u00e9 l&#8217;ensemble de mes tables en une seule. C&#8217;est ce que l&#8217;on appelle la <strong>d\u00e9normalisation<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>A noter que le syst\u00e8me de jointure ne pose pas de probl\u00e8me aux architectures non distribu\u00e9s. En revanche elle impliquerait un nombre important de verrous sur un syst\u00e8me distribu\u00e9.  <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Il est \u00e9vident que tu sais que NoSql signifie &#8220;Not Only Sql&#8221;  et non &#8220;Pas SQL&#8221; !<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le mod\u00e8le de donn\u00e9es sur <strong>Cassandra<\/strong> doit \u00eatre pens\u00e9 autrement. L&#8217;id\u00e9e est qu&#8217;il soit le <strong>plus proche possible du besoin client<\/strong>. Dans notre cas il m&#8217;est demand\u00e9 de pouvoir consulter les familles de poisson en fonction des magasins.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/fish_by_shop_and_family.png\" alt=\"\" class=\"wp-image-1397\" width=\"248\" height=\"198\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/fish_by_shop_and_family.png 512w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/fish_by_shop_and_family-300x241.png 300w\" sizes=\"auto, (max-width: 248px) 100vw, 248px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">C&#8217;est ce que l&#8217;on appelle le <strong>Query First design<\/strong>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Orient\u00e9 colonne<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"> Voici de fa\u00e7on sch\u00e9matique de comment sont stock\u00e9es les donn\u00e9es dans une base &#8220;classique&#8221;.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"444\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/relational_read-1.png\" alt=\"\" class=\"wp-image-1374\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/relational_read-1.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/relational_read-1-300x130.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/relational_read-1-768x333.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\"><strong>Cassandra<\/strong> est capable de r\u00e9cup\u00e8rer les donn\u00e9es par colonne!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"444\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/column_read-2.png\" alt=\"\" class=\"wp-image-1376\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/column_read-2.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/column_read-2-300x130.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/column_read-2-768x333.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Dans Cassandra il est possible de ne pas avoir de valeur pour une colonne. Il ne s&#8217;agit pas de valeur null mais bien d&#8217;une <strong>absence totale de donn\u00e9e<\/strong>. Imaginez le gain de stockage !<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Les clefs dans Cassandra:<\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1609\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/question_v1.png\" alt=\"\"><\/td><td>Dr\u00f4le de nom que le <strong>Keyspace<\/strong>\u2026 Si je traduis lit\u00e9ralement il s&#8217;agit d&#8217;un endroit ou il y a des clefs.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Commen\u00e7ons par cr\u00e9er un Keyspace.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">[baptiste@fedora bin]$ .\/cqlsh\nConnected to Test Cluster at 127.0.0.1:9042\n[cqlsh 6.0.0 | Cassandra 4.0.5 | CQL spec 3.4.5 | Native protocol v5]\nUse HELP for help.\ncqlsh&gt; CREATE KEYSPACE fish_shop WITH replication ={'class':'NetworkTopologyStrategy', 'replication_factor': '3'};\ncqlsh&gt; use fish_shop;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; CREATE TABLE fish_by_shop_and_family \n(shop VARCHAR, family VARCHAR, diet VARCHAR, temperature SMALLINT, fish VARCHAR, price FLOAT, \nPRIMARY KEY ((shop,family),diet, temperature, fish)) \nWITH CLUSTERING ORDER BY (diet ASC, temperature DESC);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Quelques exemples d&#8217;insertions de lignes en base:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">INSERT INTO fish_by_shop_and_family (shop, family, diet, temperature, fish, price)  VALUES ('aquareden','cichlidae','omnivore',27,'oscar',20.6);\nINSERT INTO fish_by_shop_and_family (shop, family, diet, temperature, fish, price)  VALUES ('aquareden','cichlidae','omnivore',28,'discus',30);\nINSERT INTO fish_by_shop_and_family (shop, family, diet, temperature, fish, price)  VALUES ('aquareden','cyprinidae','omnivore',27,'barbus clown',4.6);\nINSERT INTO fish_by_shop_and_family (shop, family, diet, temperature, fish, price)  VALUES ('laguna','characidae','insectivore',25,'neon rose',1.9);<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">La partition Key<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">J&#8217;ai choisi le couple Shop \/ Family.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/partition_key-3.png\" alt=\"\" class=\"wp-image-1387\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/partition_key-3.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/partition_key-3-300x140.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/partition_key-3-768x359.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Maintenant que mon Keyspace ma table et mes donn\u00e9es sont ins\u00e9r\u00e9es. Je n&#8217;ai qu&#8217;une envie, c&#8217;est de tester et v\u00e9rifier que \u00e7a fonctionne en faisant une requ\u00eate CQL.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT * FROM fish_by_shop_and_family WHERE price=30;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-vivid-red-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">InvalidRequest: Error from server: code=2200 [Invalid query] message=\"Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\" style=\"padding-top:var(--wp--preset--spacing--40);padding-right:var(--wp--preset--spacing--40);padding-bottom:var(--wp--preset--spacing--40);padding-left:var(--wp--preset--spacing--40)\">MAIS QU&#8217;EST CE QUE C&#8217;EST QUE CETTE BASE DE DONNEES OU JE NE PEUX PAS REQUETER MES DONNEES !!!<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Bien que cela vous soulagera un temps, jeter son clavier par la fen\u00eatre ne r\u00e9soudra pas vos probl\u00e8mes avec Cassandra<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a forc\u00e9ment une raison pour laquelle cette requ\u00eate ne fonctionne pas, essayons de voir ensemble pourquoi. Revenons sur cette histoire de <strong>Keyspace<\/strong>. Je trouve dans la documentation du CQL la fonction <strong>Token<\/strong>, que je d\u00e9cide d&#8217;appliquer \u00e0 ma clef.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT token(shop,family),shop,family FROM fish_by_shop_and_family;\n\n system.token(shop, family) | shop       | family\n----------------------------+------------+---------------\n       -8244308070285158063 |    aquartz |     cichlidae\n       -7298066757405096652 |     laguna |    cyprinidae\n       -7298066757405096652 |     laguna |    cyprinidae\n       -7192375663116393974 | fishotopia |    characidae \n       -5867784217603879931 |  aquareden | pomacentridae\n       -5867784217603879931 |  aquareden | pomacentridae<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons vu que Cassandra \u00e9tait une base de donn\u00e9es distribu\u00e9e.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"639\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/cluster-1-1024x639.png\" alt=\"\" class=\"wp-image-1616\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/cluster-1-1024x639.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/cluster-1-300x187.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/cluster-1-768x479.png 768w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/cluster-1-1536x959.png 1536w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/cluster-1.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Dans Cassandra la donn\u00e9e est r\u00e9partie \u00e0 travers le cluster, chaque noeud se voit affecter une plage de <strong>tokens<\/strong>.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"463\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/09\/token_range-1024x463.png\" alt=\"\" class=\"wp-image-1253\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/09\/token_range-1024x463.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/09\/token_range-300x136.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/09\/token_range-768x347.png 768w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/09\/token_range-1536x695.png 1536w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/09\/token_range.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Cassandra dispose de plusieurs strategies de hashage pour calculer le token. Ce qu&#8217;il faut retenir c&#8217;est que ces strategies sont idempotantes et que le range de token va de -2^63 \u00e0 2^63-1.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Les  virtual nodes sont des abstractions qui permettent de faire varier le nombre de tokens par node. <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le nombre de virtual node s&#8217;adapte en fonction de la taille du disque dur associ\u00e9 au noeud. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ici un exemple de comment sont r\u00e9parties les donn\u00e9es \u00e0 travers le cluster:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"441\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/data_repartition-1.png\" alt=\"\" class=\"wp-image-1384\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/data_repartition-1.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/data_repartition-1-300x129.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/data_repartition-1-768x331.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT * FROM fish_by_shop_and_family WHERE shop='aquartz' AND family='characidae';<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\"> shop    | family     | diet        | temp | fish         | price\n---------+------------+-------------+------+--------------+-------\n aquartz | characidae | insectivore |   25 |    neon rose |   4.1\n aquartz | characidae | insectivore |   25 |  tetra royal |   3.6\n aquartz | characidae | insectivore |   24 |    nez rouge |   2.3\n aquartz | characidae |    omnivore |   25 | tetra citron |   3.4\n aquartz | characidae |    omnivore |   24 |    neon bleu |   2.1<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Il faut faire attention au probl\u00e8me de <strong>wide row<\/strong>. Ce probl\u00e8me arrive lorsqu&#8217;une clef de partition contient trop de lignes associ\u00e9s (se m\u00e9fier des partitions key compos\u00e9s d&#8217;une seule colonne)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group\"><div class=\"wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>La partition key peut etre compos\u00e9e de plusieurs colonnes. Dans ce cas elle s&#8217;appelle  <strong>Composite Partition Key<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n<\/div><\/div>\n<\/div><\/div>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Une petite commande pour trouver ou se situe la donn\u00e9e:<br>.\/nodetool getendpoints fish_shop fish_by_shop_and_family &#8220;aquartz:characidae&#8221;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">L&#8217;algoritme permettant de r\u00e9partir la donn\u00e9e \u00e0 travers le cluster s&#8217;appelle un <strong>Partitioner<\/strong>. Il s&#8217;agit tout simplement d&#8217;une fonction qui transforme une Partition Key en Hash. L&#8217;algoritme par d\u00e9faut s&#8217;appelle le <strong>Murmur3Partitioner<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Cassandra est un programme OpenSource \u00e9crit en Java. N&#8217;h\u00e9sitez pas \u00e0 <a rel=\"noreferrer noopener\" href=\"https:\/\/github.com\/apache\/cassandra\" target=\"_blank\">cloner<\/a> la version que vous utilisez. Vous y trouverez les diff\u00e9rentes impl\u00e9mentations des fonctionnalit\u00e9s mise \u00e0 disposition.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Clustered key<\/h3>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT * FROM fish_by_shop_and_family;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Les donn\u00e9es semblent \u00e9trangement bien ordonn\u00e9es. Vous remarquerez que les lignes sont automatiquements class\u00e9es. Je n&#8217;ai pourtant rien demand\u00e9 en SQL standard j&#8217;aurai utilis\u00e9 avec l&#8217;instruction ORDER BY dans ma requ\u00eate. Ici les donn\u00e9es sont class\u00e9es, <strong>clusteres\u00e9es<\/strong> d\u00e8s leurs insertions gr\u00e2ce au clustered key!<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"478\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/clustered_key-2.png\" alt=\"\" class=\"wp-image-1388\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/clustered_key-2.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/clustered_key-2-300x140.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/clustered_key-2-768x359.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Reprenons une partie  de la commande de cr\u00e9ation de la table:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">PRIMARY KEY ((shop,family),diet, temperature, fish))<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il s&#8217;agit des colonnes qui se situent \u00e0 droite de la Partition key. Ce sont elles qui d\u00e9finissent l&#8217;ordre dans lesquels les donn\u00e9es sont restitu\u00e9es. D&#8217;ou l&#8217;importance de bien r\u00e9fl\u00e9chir \u00e0 sont mod\u00e8le de donn\u00e9es!<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Par  d\u00e9faut si rien n&#8217;est pr\u00e9cis\u00e9 la clustered key va classer de mani\u00e8re ASC. Il est possible de demander un classement DESC. <br>Exemple: WITH CLUSTERING ORDER BY (diet ASC, temperature DESC);<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Les clustered keys sont facultatives, dans ce cas il s&#8217;agit d&#8217;une clef primaire <strong>simple<\/strong>. Dans le cas contraire la clef primaire est dite <strong>compos\u00e9e<\/strong>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Cette fois si je souhaite connaitre les poissons dont la temp\u00e9rature d&#8217;eau moyenne est 25 degr\u00e9s.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code class=\"\">cqlsh:fish_shop&gt; SELECT * FROM fish_by_shop_and_family WHERE shop='aquartz' AND family='characidae' AND temperature=25;<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code has-vivid-red-color has-text-color\"><code class=\"\">InvalidRequest: Error from server: code=2200 [Invalid query] message=\"PRIMARY KEY column \"temperature\" cannot be restricted as preceding column \"diet\" is not restricted\"<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Et oui, l&#8217;ordre de d\u00e9claration des Clustered Colonnes est important lors de la cr\u00e9ation de votre table! Impossible d&#8217;appliquer un pr\u00e9dicat sur une clustered colonne situ\u00e9 \u00e0 droite sans avoir mensionn\u00e9 les colonnes situ\u00e9es avant.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Les Ranges Queries<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">On peut penser que toutes ces contraintes rendent Cassandra difficilement utilisable. En r\u00e9alit\u00e9 c&#8217;est tout l&#8217;inverse, la Clustered Key est une fonctionnalit\u00e9 tr\u00e8s interessante qui facilite le rapatriement de donn\u00e9es par paquet. <\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT * FROM fish_by_shop_and_family WHERE shop='aquartz' AND family='characidae' AND diet='omnivore' AND 24 &lt; temperature;<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Il est possible de d\u00e9finir une Partition Key compos\u00e9e d&#8217;une seule colonne avec une valeur unique pour chaque ligne, cependant cet usage rend les Clustered inutiles&#8230;<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">La Primary Key<\/h3>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"229\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/primary_key-2.png\" alt=\"\" class=\"wp-image-1389\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/primary_key-2.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/primary_key-2-300x67.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/primary_key-2-768x172.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>La clef primaire est unique! Une m\u00eame combinaison de tous ces champs \u00e9craserait les autres champs. A titre d&#8217;exemple, le nom du poisson est discriminant et permet de m&#8217;assurer de pouvoir ins\u00e9rer n&#8217;importe quelle donn\u00e9e.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Les clauses Where ne sont applicables que sur les colonnes d\u00e9clar\u00e9es comme clef primaire.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Revenons sur l&#8217;erreur CQL lorsque l&#8217;on interroge un champ n&#8217;appartenant pas \u00e0 la clef primaire:<\/p>\n\n\n\n<pre class=\"wp-block-code has-vivid-red-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">InvalidRequest: Error from server: code=2200 [Invalid query] message=\"Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING\"<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A mon sens toute l&#8217;architecture de Cassandra est expliqu\u00e9e en un seul message d&#8217;erreur! <\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>L&#8217;instruction ALLOW FILTERING ne doit servir qu&#8217;en mode d\u00e9bug !<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Les indexes invers\u00e9s<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Revenons \u00e0 cette requ\u00e8te qui nous a tant frustr\u00e9 un peu plus haut.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT * FROM fish_by_shop_and_family WHERE price=30;<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il existe une technique pour pouvoir interroger ces donn\u00e9es. L&#8217;id\u00e9e est de cr\u00e9er une autre table qui stocke pour certaines valeurs de champ la localisation de la donn\u00e9e dans la table principale.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"397\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/inverted_indexs_v2-1024x397.png\" alt=\"\" class=\"wp-image-1758\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/inverted_indexs_v2-1024x397.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/inverted_indexs_v2-300x116.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/inverted_indexs_v2-768x297.png 768w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/inverted_indexs_v2-1536x595.png 1536w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/inverted_indexs_v2.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">C&#8217;est ce que l&#8217;on appelle le <strong>predicate push down<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Ecriture de donn\u00e9es<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">La r\u00e9plication des donn\u00e9es<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">La strat\u00e9gie de r\u00e9plication des donn\u00e9es est configur\u00e9e par Keyspace lors de sa cr\u00e9ation.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Simple Strategy<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Il s&#8217;agit de la strategie de r\u00e9plication entre guillemet d\u00e9mo. Elle n&#8217;est utile que pour les architectures sur un Datacenter et un Rack (jamais). Elle \u00e0 le m\u00e9rite tout de m\u00eame d&#8217;expliquer certains m\u00e9canismes de base. Ici nous demandons une r\u00e9plication des donn\u00e9es du Keyspace de trois.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/10\/replication_factor_three-1-1024x1024.png\" alt=\"\" class=\"wp-image-1310\" width=\"572\" height=\"572\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/10\/replication_factor_three-1.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/10\/replication_factor_three-1-300x300.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/10\/replication_factor_three-1-150x150.png 150w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/10\/replication_factor_three-1-768x768.png 768w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Une fois le token calcul\u00e9, la r\u00e9plication suit tout simplement le sens des aiguilles d&#8217;une montre.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Ce qu&#8217;il faut utiliser en Prod, la Network Topology Strategy<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Cette strategie utilise \u00e9galement le sens des aiguilles d&#8217;une montre mais tient en plus compte de la topologie Rack\/Datacenter. <\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"705\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cluster_details-1024x705.png\" alt=\"\" class=\"wp-image-1664\" srcset=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cluster_details-1024x705.png 1024w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cluster_details-300x207.png 300w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cluster_details-768x529.png 768w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cluster_details-1536x1058.png 1536w, https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/cluster_details.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Les donn\u00e9es sont r\u00e9parties sur les diff\u00e9rents Racks (groupement physique) au cas ou il y aurait des probl\u00e8mes d&#8217;alimentations \u00e9l\u00e9ctrique, mat\u00e9riels ou de r\u00e9seaux.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cette strategie implique de renseigner pour chacun des noeuds le couple Datacenter\/Rack dans le fichier <code>cassandra-rackdc.properties<\/code> situ\u00e9 dans le r\u00e9pertoire de conf.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Cassandra se base sur une architecture <strong>Peer to Peer<\/strong>. C&#8217;est \u00e0 dire que chacun des noeuds poss\u00e8de les m\u00eames fonctionnalit\u00e9s.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Il est possible d&#8217;avoir une strategie de r\u00e9plication des donn\u00e9es diff\u00e9rente en fonction selon le Datacenter<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Gossip Protocol<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Cassandra est une entit\u00e9 compos\u00e9e de nombreux individus. La base de donn\u00e9es \u00e0 besoin de maintenir un niveau d&#8217;information commun et distribu\u00e9. Le protocol de dialogue et de transfert des m\u00e9tadonn\u00e9es s&#8217;appelle le <strong>Gossip Protocol<\/strong>. Il s&#8217;agit d&#8217;un protocol assynchrone.<\/p>\n\n\n<div id=\"metaslider-id-1788\" style=\"max-width: 1024px; margin: 0 auto;\" class=\"ml-slider-3-91-0 metaslider metaslider-flex metaslider-1788 ml-slider ms-theme-default\" role=\"region\" aria-roledescription=\"Slideshow\" aria-label=\"Gossip\">\n    <div id=\"metaslider_container_1788\">\n        <div id=\"metaslider_1788\">\n            <ul class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-1792 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1792\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/gossip_protocol_1-1024x1079.png\" height=\"1079\" width=\"1024\" alt=\"\" class=\"slider-1788 slide-1792\" title=\"gossip_protocol_1\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1793 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1793\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/gossip_protocol_2-1024x1079.png\" height=\"1079\" width=\"1024\" alt=\"\" class=\"slider-1788 slide-1793\" title=\"gossip_protocol_2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1794 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1794\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2023\/01\/gossip_protocol_3-1024x1079.png\" height=\"1079\" width=\"1024\" alt=\"\" class=\"slider-1788 slide-1794\" title=\"gossip_protocol_3\" \/><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Chaque noeud dispose d&#8217;un annuaire avec une date de mise \u00e0 jour avec les informations suivantes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Heartbeat State:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Date de d\u00e9marrage du noeud<\/li>\n\n\n\n<li>Date du dernier Gossip <\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Application State:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Status =&gt; <strong>N<\/strong>ormal <strong>L<\/strong>eaving <strong>J<\/strong>oining<\/li>\n\n\n\n<li>Snitch =&gt; Localisation\n<ul class=\"wp-block-list\">\n<li>DC<\/li>\n\n\n\n<li>Rack<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Sch\u00e9ma\n<ul class=\"wp-block-list\">\n<li>Keyspaces<\/li>\n\n\n\n<li>Tables<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Performance\n<ul class=\"wp-block-list\">\n<li>Load (IO Disk)<\/li>\n\n\n\n<li>Severity (IO pression tient compte des compactions et des donn\u00e9es provenant de \/proc\/stat iostat utility)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Seed Node<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Certains noeuds appel\u00e9s <strong>Seeds<\/strong> ont un r\u00f4le un peu sp\u00e9ciaux. Lorsqu&#8217;un noeud est arr\u00eat\u00e9 il garde en m\u00e9moire sa topology. Lors de son red\u00e9marrage ce noeud contactera en premier un Seed node pour s&#8217;informer de l&#8217;\u00e9tat du cluster. La d\u00e9claration de ces noeuds est \u00e0 faire dans la cassandra.yaml et doit \u00eatre identique sur l&#8217;ensemble du datacenter.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Il est recommand\u00e9 d&#8217;avoir une petite liste de seed nodes, 3 par datacenter devrait suffir.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Les seeds nodes ne sont pas des single points of failure.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Consistence<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Les clients, que se soit en lecture ou \u00e9criture, ont la possibilit\u00e9 de choisir leur crit\u00e8re de validit\u00e9 de leur transaction.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Voici la liste des consistences pour l&#8217;\u00e9criture:<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code class=\"\">ALL, EACH_QUORUM, QUORUM, LOCAL_QUORUM, ONE, TWO, THREE, LOCAL_ONE, ANY<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Prenons l&#8217;exemple de la consistence <strong>TWO<\/strong> dans notre cas ou la donn\u00e9e est r\u00e9pliqu\u00e9e trois fois:<\/p>\n\n\n<div id=\"metaslider-id-1422\" style=\"max-width: 1024px; margin: 0 auto;\" class=\"ml-slider-3-91-0 metaslider metaslider-flex metaslider-1422 ml-slider ms-theme-default\" role=\"region\" aria-roledescription=\"Slideshow\" aria-label=\"Consistency\">\n    <div id=\"metaslider_container_1422\">\n        <div id=\"metaslider_1422\">\n            <ul class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-1437 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1437\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/consistency_1-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1422 slide-1437\" title=\"consistency_1\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1438 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1438\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/consistency_2-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1422 slide-1438\" title=\"consistency_2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1439 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1439\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/consistency_3-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1422 slide-1439\" title=\"consistency_3\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1440 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1440\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/consistency_4-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1422 slide-1440\" title=\"consistency_4\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1441 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1441\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/consistency_5-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1422 slide-1441\" title=\"consistency_5\" \/><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Vous avez du la voir partout sur internet, la consistence <strong>QUORUM<\/strong>. Mais qu&#8217;est ce que ca veut dire ?<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code class=\"\">quorum = (sum_of_replication_factors \/ 2) + 1<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dans notre exemple le Quorum \u00e9quivaut \u00e0 une consistence de 2.<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Attention les consistences entre la lecture et l&#8217;\u00e9criture ne sont pas exactement les m\u00eame. Vous trouverez le d\u00e9tail <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.datastax.com\/en\/cassandra-oss\/3.0\/cassandra\/dml\/dmlConfigConsistency.html\" target=\"_blank\">ici<\/a><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<div id=\"metaslider-id-1445\" style=\"max-width: 1024px; margin: 0 auto;\" class=\"ml-slider-3-91-0 metaslider metaslider-flex metaslider-1445 ml-slider ms-theme-default\" role=\"region\" aria-roledescription=\"Slideshow\" aria-label=\"Write Mecanism\">\n    <div id=\"metaslider_container_1445\">\n        <div id=\"metaslider_1445\">\n            <ul class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-1466 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1466\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/write_mecanism_1_short-1024x749.png\" height=\"749\" width=\"1024\" alt=\"\" class=\"slider-1445 slide-1466\" title=\"write_mecanism_1_short\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1450 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1450\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/write_mecanism_2-1024x749.png\" height=\"749\" width=\"1024\" alt=\"\" class=\"slider-1445 slide-1450\" title=\"write_mecanism_2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1452 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1452\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/write_mecanism_3-1024x749.png\" height=\"749\" width=\"1024\" alt=\"\" class=\"slider-1445 slide-1452\" title=\"write_mecanism_3\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1454 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1454\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/11\/write_mecanism_4-1024x749.png\" height=\"749\" width=\"1024\" alt=\"\" class=\"slider-1445 slide-1454\" title=\"write_mecanism_4\" \/><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Il est conseill\u00e9 d&#8217;avoir deux disques s\u00e9par\u00e9s. Un pour les commit logs et l&#8217;autre pour les SSTables.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Le flush de la <strong>MemTable<\/strong> peut \u00eatre d\u00e9clench\u00e9 de deux fa\u00e7ons:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>La taille de la m\u00e9moire d\u00e9passe un seuil d\u00e9finit dans la configuration (memtable_cleanup_threshold).<\/li>\n\n\n\n<li>La taille du commit-log approche de sa taille maximale, le flush de la memtable est forc\u00e9 permettant ainsi lib\u00e9rer des s\u00e9gments de la commit-log.<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"48\" height=\"61\" class=\"wp-image-1604\" style=\"width: 48px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Le Commit log est un fichier ou l&#8217;on ne fait qu&#8217;ajouter des donn\u00e9es (append only). <\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Lors d&#8217;une \u00e9criture le commit log est prioris\u00e9 par rapport \u00e0 la memtable. Cela permet en cas d&#8217;arr\u00eat de l&#8217;instance de minimiser les pertes. Ce fichier est avant tout utilis\u00e9 lors du lancement du noeud.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Il est possible de voir le contenu d&#8217;une SSTable en utilisant sstabledump situ\u00e9 dans le r\u00e9pertoire tools<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"bash\" class=\"language-bash\">bin]$ .\/sstabledump ..\/..\/data\/data\/fish_shop\/fish_by_shop_and_family-63d98b205df711eda61a27354021ba50\/nb-1-big-Data.db \n[\n  {\n    \"partition\" : {\n      \"key\" : [ \"aquartz\", \"cichlidae\" ],\n      \"position\" : 0\n    },\n    \"rows\" : [\n      {\n        \"type\" : \"row\",\n        \"position\" : 36,\n        \"clustering\" : [ \"detritivore\", 26, \"pelmato\" ],\n        \"liveness_info\" : { \"tstamp\" : \"2022-11-06T17:21:27.002499Z\" },\n        \"cells\" : [\n          { \"name\" : \"price\", \"value\" : 10.3 }\n        ]\n      }\n    ]\n  },\n  {\n    \"partition\" : {\n      \"key\" : [ \"laguna\", \"cyprinidae\" ],\n      \"position\" : 73\n    },\n    \"rows\" : [\n      {\n        \"type\" : \"row\",\n        \"position\" : 109,\n        \"clustering\" : [ \"herbivore\", 23, \"barbus nigro\" ],\n        \"liveness_info\" : { \"tstamp\" : \"2022-11-06T17:21:27.311759Z\" },\n        \"cells\" : [\n          { \"name\" : \"price\", \"value\" : 2.4 }\n        ]\n      },\n      {\n        \"type\" : \"row\",\n        \"position\" : 148,\n        \"clustering\" : [ \"omnivore\", 27, \"barbus clown\" ],\n        \"liveness_info\" : { \"tstamp\" : \"2022-11-06T17:21:27.304076Z\" },\n        \"cells\" : [\n          { \"name\" : \"price\", \"value\" : 3.8 }\n        ]\n      }\n    ]\n  },\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Nous savons que Cassandra ne garantit pas que la donn\u00e9e soit identique sur l&#8217;ensemble de ses noeuds. Il est pourtant primordiale de connaitre la derni\u00e8re valeur de la donn\u00e9e. Pour cela Cassandra stocke lors de chaque insertion sa date de mise \u00e0 jour. Cette date est utile \u00e0 bien des m\u00e9canismes!<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"sql\" class=\"language-sql\">cqlsh:fish_shop&gt; SELECT price, WRITETIME(price) FROM fish_by_shop_and_family;\n\n price | writetime(price)\n-------+------------------\n  10.3 | 1667755287002499\n   2.4 | 1667755287311759\n   3.8 | 1667755287304076<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Lecture<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Comment Cassandra lit ses donn\u00e9es ?<\/h3>\n\n\n<div id=\"metaslider-id-1548\" style=\"max-width: 1024px; margin: 0 auto;\" class=\"ml-slider-3-91-0 metaslider metaslider-flex metaslider-1548 ml-slider ms-theme-default\" role=\"region\" aria-roledescription=\"Slideshow\" aria-label=\"Read Path\">\n    <div id=\"metaslider_container_1548\">\n        <div id=\"metaslider_1548\">\n            <ul class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-1583 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1583\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_path_v1_0-1024x623.png\" height=\"623\" width=\"1024\" alt=\"\" class=\"slider-1548 slide-1583\" title=\"read_path_v1_0\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1582 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1582\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_path_v1_1-1024x623.png\" height=\"623\" width=\"1024\" alt=\"\" class=\"slider-1548 slide-1582\" title=\"read_path_v1_1\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1581 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1581\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_path_v1_2-1024x623.png\" height=\"623\" width=\"1024\" alt=\"\" class=\"slider-1548 slide-1581\" title=\"read_path_v1_2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1580 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1580\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_path_v1_3-1024x623.png\" height=\"623\" width=\"1024\" alt=\"\" class=\"slider-1548 slide-1580\" title=\"read_path_v1_3\" \/><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Dans mon sch\u00e9ma j&#8217;ai repr\u00e9sent\u00e9 la MemTable comme une sorte de Map, en r\u00e9alit\u00e9 il s&#8217;agit d&#8217;un arbre binaire \u00e9quilibr\u00e9. C&#8217;est a dire que la profondeur des branches sont plus ou moins les m\u00eames \u00e0 plus ou moins 1 pas.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Read Repair<\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Il s&#8217;agit d&#8217;un m\u00e9canisme assynchrone qui permet de re-synchronizer les donn\u00e9es lors de la lecture.<\/p>\n\n\n<div id=\"metaslider-id-1504\" style=\"max-width: 1024px; margin: 0 auto;\" class=\"ml-slider-3-91-0 metaslider metaslider-flex metaslider-1504 ml-slider ms-theme-default\" role=\"region\" aria-roledescription=\"Slideshow\" aria-label=\"Read Repair\">\n    <div id=\"metaslider_container_1504\">\n        <div id=\"metaslider_1504\">\n            <ul class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-1540 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1540\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_repair_1_v2-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1504 slide-1540\" title=\"read_repair_1_v2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1539 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1539\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_repair_2_v2-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1504 slide-1539\" title=\"read_repair_2_v2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1545 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1545\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_repair_3_v3-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1504 slide-1545\" title=\"read_repair_3_v3\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1537 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1537\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_repair_4_v2-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1504 slide-1537\" title=\"read_repair_4_v2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1536 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1536\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_repair_5_v2-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1504 slide-1536\" title=\"read_repair_5_v2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1535 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1535\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/read_repair_6_v2-1024x752.png\" height=\"752\" width=\"1024\" alt=\"\" class=\"slider-1504 slide-1535\" title=\"read_repair_6_v2\" \/><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Le <strong>Snitch<\/strong> est un algorithme bas\u00e9 sur le Gossip Protocol qui choisira le noeud le plus performant pour transf\u00e9rer la donn\u00e9e compl\u00eate. Il existe comme d&#8217;habitude plusieurs impl\u00e9mentations notamment le <strong>Dynamic Snitch<\/strong> qui tient compte du load et de la severity.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"> <\/h3>\n\n\n\n<h2 class=\"wp-block-heading\">Suppression des donn\u00e9es<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">S&#8217;il n&#8217;est pas simple d&#8217;\u00e9crire une donn\u00e9e de fa\u00e7on distribu\u00e9e en tenant compte des pannes, il est encore plus compliqu\u00e9 de g\u00e9rer les suppressions. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Cassandra est particuli\u00e8rement performant pour l&#8217;\u00e9criture et la lecture des donn\u00e9es, en revanche il l&#8217;est un peu moins pour la suppression.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">La suppression se joue en deux \u00e9tapes:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Cassandra ne supprime pas la donn\u00e9e imm\u00e9diatement. Il va en r\u00e9alit\u00e9 marquer la donn\u00e9e avec un objet fort sympathique, un <strong>Tombstones<\/strong>. Cette date d&#8217;expiration est configurable et est configurable via l&#8217;option gc_grace_seconds<\/li>\n\n\n\n<li>Une fois la date d&#8217;expiration atteinte un process appel\u00e9 <strong>Compaction<\/strong> supprime d\u00e9finitivement la donn\u00e9e.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code class=\"\">DELETE FROM fish_by_shop_and_family WHERE shop='aquartz' AND family='cichlidae';<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Au bout de quelques instants une nouvelle SSTable va \u00eatre g\u00e9n\u00e9r\u00e9e uniquement compos\u00e9 du delta.<\/p>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code class=\"\">[\n{\n    \"partition\" : {\n      \"key\" : [ \"aquartz\", \"cichlidae\" ],\n      \"position\" : 0,\n      \"deletion_info\" : { \n        \"marked_deleted\" : \"2023-01-08T21:26:35.157658Z\",\n        \"local_delete_time\" : \"2023-01-08T21:26:35.15Z\" \n      }\n    },\n    \"rows\" : []\n  }\n]<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Certains ORM ins\u00e8rent des valeurs Null dans des colonnes ce qui d\u00e9clenche la g\u00e9n\u00e9ration de Tombstones<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Les types de tombstones:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Cell tombstones<\/li>\n\n\n\n<li>Row tombstones<\/li>\n\n\n\n<li>Range tombstones<\/li>\n\n\n\n<li>Partition tombstones<\/li>\n\n\n\n<li>TTL tombstones<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"64\" class=\"wp-image-1604\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/information.png\" alt=\"\"><\/td><td>Il est pr\u00e9f\u00e9rable d&#8217;utiliser les Range tombstones  qui occupent moins d&#8217;espace disque que la suppression ligne par ligne.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-black-color has-text-color\"><tbody><tr><td><img loading=\"lazy\" decoding=\"async\" width=\"50\" height=\"61\" class=\"wp-image-1605\" style=\"width: 50px;\" src=\"http:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/warning.png\" alt=\"\"><\/td><td>Un grand nombre de Tombstones peut entrainer des probl\u00e8mes de performances!<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Compaction<\/h2>\n\n\n<div id=\"metaslider-id-1479\" style=\"max-width: 1024px; margin: 0 auto;\" class=\"ml-slider-3-91-0 metaslider metaslider-flex metaslider-1479 ml-slider ms-theme-default\" role=\"region\" aria-roledescription=\"Slideshow\" aria-label=\"Compaction\">\n    <div id=\"metaslider_container_1479\">\n        <div id=\"metaslider_1479\">\n            <ul class='slides'>\n                <li style=\"display: block; width: 100%;\" class=\"slide-1501 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1501\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/compaction_1-1024x410.png\" height=\"410\" width=\"1024\" alt=\"\" class=\"slider-1479 slide-1501\" title=\"compaction_1\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1500 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1500\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/compaction_2-1024x410.png\" height=\"410\" width=\"1024\" alt=\"\" class=\"slider-1479 slide-1500\" title=\"compaction_2\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1499 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1499\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/compaction_3-1024x410.png\" height=\"410\" width=\"1024\" alt=\"\" class=\"slider-1479 slide-1499\" title=\"compaction_3\" \/><\/li>\n                <li style=\"display: none; width: 100%;\" class=\"slide-1498 ms-image \" aria-roledescription=\"slide\" aria-label=\"slide-1498\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/baptiste-meynier.com\/wp-content\/uploads\/2022\/12\/compaction_4-1024x410.png\" height=\"410\" width=\"1024\" alt=\"\" class=\"slider-1479 slide-1498\" title=\"compaction_4\" \/><\/li>\n            <\/ul>\n        <\/div>\n        \n    <\/div>\n<\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans notre exemple nous n&#8217;avons que deux SSTables (aussi appel\u00e9 segment), dans la r\u00e9alit\u00e9 il y a souvent bien plus de SSTable. Une execution regroupera deux a deux les segments et les fusionnera.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fonctionnement sur une machine<\/h2>\n\n\n\n<pre class=\"wp-block-code has-black-color has-text-color\"><code lang=\"bash\" class=\"language-bash\">[baptiste 4.0.5]$ tree\n\u251c\u2500\u2500 bin\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra.in.sh\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cqlsh\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cqlsh.py\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 debug-cql\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 nodetool\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstableloader\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstablescrub\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstableupgrade\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstableutil\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstableverify\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 stop-server\n\u251c\u2500\u2500 conf\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra-env.sh\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra-jaas.config\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra-rackdc.properties\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra-topology.properties\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra.yaml\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 commitlog_archiving.properties\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 cqlshrc.sample\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 hotspot_compiler\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 jvm11-clients.options\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 jvm11-server.options\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 jvm8-clients.options\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 jvm8-server.options\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 jvm-clients.options\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 jvm-server.options\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 logback-tools.xml\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 logback.xml\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 metrics-reporter-config-sample.yaml\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 README.txt\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 triggers\n\u251c\u2500\u2500 data\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 commitlog\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 CommitLog-7-1672654779588.log\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 CommitLog-7-1672654779589.log\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 data\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 fish_by_shop_and_family-245336d082dd11ed9cb22b2b70639517\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 system\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 system_auth\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 network_permissions-d46780c22f1c3db9b4c1b8d9fbc0cc23\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 resource_role_permissons_index-5f2fbdad91f13946bd25d5da3a5c35ec\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 role_members-0ecdaa87f8fb3e6088d174fb36fe5c0d\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 role_permissions-3afbe79f219431a7add7f5ab90d8ec9c\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 roles-5bc52802de2535edaeab188eecebb090\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 system_distributed\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 system_schema\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 aggregates-924c55872e3a345bb10c12f37c1ba895\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 columns-24101c25a2ae3af787c1b40ee1aca33f\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 dropped_columns-5e7583b5f3f43af19a39b7e1d6f5f11f\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 functions-96489b7980be3e14a70166a0b9159450\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 indexes-0feb57ac311f382fba6d9024d305702f\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 keyspaces-abac5682dea631c5b535b3d6cffd0fb6\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 tables-afddfb9dbc1e30688056eed6c302ba09\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 triggers-4df70b666b05325195a132b54005fd48\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u251c\u2500\u2500 types-5a8b1ca866023f77a0459273d308917a\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 views-9786ac1cdd583201a7cdad556410c985\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp; \u2514\u2500\u2500 system_traces\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp;     \u251c\u2500\u2500 events-8826e8e9e16a372887533bc1fc713c25\n\u2502&nbsp;&nbsp; \u2502&nbsp;&nbsp;     \u2514\u2500\u2500 sessions-c5e99f1686773914b17e960613512345\n\u2502&nbsp;&nbsp; \u251c\u2500\u2500 hints\n\u2502&nbsp;&nbsp; \u2514\u2500\u2500 saved_caches\n\u251c\u2500\u2500 doc\n\u251c\u2500\u2500 lib\n\u251c\u2500\u2500 logs\n\u251c\u2500\u2500 pylib\n\u2514\u2500\u2500 tools\n    \u251c\u2500\u2500 bin\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 auditlogviewer\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra.in.sh\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra-stress\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 cassandra-stressd\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 compaction-stress\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 fqltool\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 generatetokens\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 jmxtool\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstabledump\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstableexpiredblockers\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstablelevelreset\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstablemetadata\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstableofflinerelevel\n    \u2502&nbsp;&nbsp; \u251c\u2500\u2500 sstablerepairedset\n    \u2502&nbsp;&nbsp; \u2514\u2500\u2500 sstablesplit\n    \u2514\u2500\u2500 lib<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Bonus<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Qu&#8217;est ce qu&#8217;un seed node ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">About seed nodes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A seed node is used to bootstrap the gossip process for new nodes joining a cluster.<\/li>\n\n\n\n<li>To learn the topology of the ring, a joining node contacts one of the nodes in the -seeds list in <a href=\"javascript:;\">cassandra.yaml<\/a>.<\/li>\n\n\n\n<li>The first time you bring up a node in a new cluster, only one node is the seed node.<\/li>\n\n\n\n<li>The seeds list is a comma delimited list of addresses. Since this example cluster includes 5 nodes, you must change the list from the default value <code>\"127.0.0.1\"<\/code> to the IP address of one of the nodes.<\/li>\n\n\n\n<li>After all nodes are added, all nodes in the datacenter must be configured to use the same seed nodes.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Comment le noeud coordinateur est il d\u00e9sign\u00e9 ?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/stackoverflow.com\/posts\/32868799\/timeline\"><\/a>The coordinator node is typically chosen by an algorithm which takes &#8220;network distance&#8221; into account. Any node can act as the coordinator, and at first requests will be sent to the nodes which your driver knows about. But once it connects and understands the topology of your cluster, it may change to a &#8220;closer&#8221; coordinator.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The coordinator only stores data locally (on a write) if it ends up being one of the nodes responsible for the data&#8217;s token range.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Vue mat\u00e9rializ\u00e9e<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">Quelques commandes<\/h3>\n\n\n\n<h2 class=\"wp-block-heading\">Sources<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.simplilearn.com\/tutorials\/big-data-tutorial\/cassandra-architecture\">https:\/\/www.simplilearn.com\/tutorials\/big-data-tutorial\/cassandra-architecture<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/fr.wikipedia.org\/wiki\/Th%C3%A9or%C3%A8me_CAP\">https:\/\/fr.wikipedia.org\/wiki\/Th%C3%A9or%C3%A8me_CAP<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/watch?v=jYvKiewV-5Q&amp;list=PL2g2h-wyI4SqIigskyJNAeL2vSTJZU_Qp\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=jYvKiewV-5Q&amp;list=PL2g2h-wyI4SqIigskyJNAeL2vSTJZU_Qp<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/watch?v=oma4xwVbhvk&amp;list=PL2g2h-wyI4SrHMlHBJVe_or_Ryek2THgQ\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=oma4xwVbhvk&amp;list=PL2g2h-wyI4SrHMlHBJVe_or_Ryek2THgQ<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/watch?v=69pvhO6mK_o&amp;list=PL2g2h-wyI4Spf5rzSmesewHpXYVnyQ2TS\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=69pvhO6mK_o&amp;list=PL2g2h-wyI4Spf5rzSmesewHpXYVnyQ2TS<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/watch?v=s1xc1HVsRk0&amp;list=PLalrWAGybpB-L1PGA-NfFu2uiWHEsdscD\">https:\/\/www.youtube.com\/watch?v=s1xc1HVsRk0&amp;list=PLalrWAGybpB-L1PGA-NfFu2uiWHEsdscD<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.scylladb.com\/glossary\/cassandra-column-family\/\">https:\/\/www.scylladb.com\/glossary\/cassandra-column-family\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.tutorialspoint.com\/cassandra\/cassandra_data_model.htm\">https:\/\/www.tutorialspoint.com\/cassandra\/cassandra_data_model.htm<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/www-igm.univ-mlv.fr\/~dr\/XPOSE2010\/Cassandra\/modele.html\">http:\/\/www-igm.univ-mlv.fr\/~dr\/XPOSE2010\/Cassandra\/modele.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.fishipedia.fr\/fr\/poissons\/symphysodon-aequifasciatus\">https:\/\/www.fishipedia.fr\/fr\/poissons\/symphysodon-aequifasciatus<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/docs.datastax.com\/en\/dse\/6.8\/dse-admin\/datastax_enterprise\/production\/seedNodesForSingleDC.html\">https:\/\/docs.datastax.com\/en\/dse\/6.8\/dse-admin\/datastax_enterprise\/production\/seedNodesForSingleDC.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/medium.com\/jorgeacetozi\/cassandra-architecture-and-write-path-anatomy-51e339bcfe0c\">https:\/\/medium.com\/jorgeacetozi\/cassandra-architecture-and-write-path-anatomy-51e339bcfe0c<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a rel=\"noreferrer noopener\" href=\"http:\/\/abiasforaction.net\/apache-cassandra-memtable-flush\/\" target=\"_blank\">http:\/\/abiasforaction.net\/apache-cassandra-memtable-flush\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/watch?v=69sHSF0iUqg\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=69sHSF0iUqg<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"http:\/\/kdm.kashliev.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">http:\/\/kdm.kashliev.com\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/docs.datastax.com\/en\/dse\/6.8\/dse-admin\/datastax_enterprise\/production\/calcTokens.html\">https:\/\/docs.datastax.com\/en\/dse\/6.8\/dse-admin\/datastax_enterprise\/production\/calcTokens.html<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.youtube.com\/watch?v=lNIrj9VuBQ0\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/www.youtube.com\/watch?v=lNIrj9VuBQ0<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/anant.us\/blog\/modern-business\/cassandra-sstables-overview\/\">https:\/\/anant.us\/blog\/modern-business\/cassandra-sstables-overview\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/www.scylladb.com\/glossary\/sstable\/\">https:\/\/www.scylladb.com\/glossary\/sstable\/<\/a><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/medium.com\/walmartglobaltech\/tombstones-in-apache-cassandra-d0a068a72dcc\">https:\/\/medium.com\/walmartglobaltech\/tombstones-in-apache-cassandra-d0a068a72dcc<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction J&#8217;ai d\u00e9velopp\u00e9 une application me permettant d&#8217;historiser les poissons que j&#8217;\u00e9l\u00e8ve dans mes aquariums et ceux de mon association. Il s&#8217;agit d&#8217;une application Java disposant d&#8217;une base de donn\u00e9es MySql dont voici le mod\u00e8le de donn\u00e9es. Une soci\u00e9t\u00e9 m&#8217;a contact\u00e9 et souhaite cr\u00e9er une application mobile permettant aux professionnels de stocker leurs inventaires de &hellip;<\/p>\n","protected":false},"author":1,"featured_media":1174,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-1172","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bigdata"],"_links":{"self":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts\/1172","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/comments?post=1172"}],"version-history":[{"count":337,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts\/1172\/revisions"}],"predecessor-version":[{"id":1841,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/posts\/1172\/revisions\/1841"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/media\/1174"}],"wp:attachment":[{"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/media?parent=1172"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/categories?post=1172"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/baptiste-meynier.com\/index.php\/wp-json\/wp\/v2\/tags?post=1172"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}