{"id":845,"date":"2020-02-20T10:09:56","date_gmt":"2020-02-20T10:09:56","guid":{"rendered":"http:\/\/www.andreagirardi.it\/blog\/?p=845"},"modified":"2021-02-04T11:19:21","modified_gmt":"2021-02-04T11:19:21","slug":"mongo-replica-set-with-docker-compose","status":"publish","type":"post","link":"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/","title":{"rendered":"Mongo Replica set with docker-compose"},"content":{"rendered":"\n<p>A&nbsp;<em>replica set<\/em>&nbsp;in MongoDB is a group of&nbsp;<code><a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/program\/mongod\/#bin.mongod\" target=\"_blank\" rel=\"noreferrer noopener\" aria-label=\"mongod (opens in a new tab)\">mongod<\/a><\/code>&nbsp;processes that maintain the same data set. Replica sets provide redundancy and&nbsp;<a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/glossary\/#term-high-availability\">high availability<\/a> and are the basis for all production deployments.&nbsp;Replication provides redundancy and increases&nbsp;<a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/glossary\/#term-high-availability\">data availability<\/a>. With multiple copies of data on different database servers, replication provides a level of fault tolerance against the loss of a single database server. A replica set contains several data bearing nodes and optionally one arbiter node. Of the data-bearing nodes, one and only one member is deemed the primary node, while the other nodes are deemed secondary nodes. <\/p>\n\n\n\n<p>The&nbsp;<a href=\"https:\/\/docs.mongodb.com\/manual\/core\/replica-set-primary\/\">primary node<\/a>&nbsp;receives all write operations. A replica set can have only one primary capable of confirming writes with&nbsp;<a href=\"https:\/\/docs.mongodb.com\/manual\/reference\/write-concern\/#writeconcern.&quot;majority&quot;\"><code>{&nbsp;w:&nbsp;\"majority\"&nbsp;}<\/code><\/a>&nbsp;write concern. By default, clients read from the primary&nbsp;<a href=\"https:\/\/docs.mongodb.com\/manual\/replication\/#edge-cases-2-primaries\">[1]<\/a>; however, clients can specify a&nbsp;<a href=\"https:\/\/docs.mongodb.com\/manual\/core\/read-preference\/\">read preference<\/a>&nbsp;to send read operations to secondaries.<\/p>\n\n\n\n<p>Doing it with docker-compose is pretty simple. The first step is to create the <em>docker-compose.yml<\/em> configuration file:<\/p>\n\n\n\n<pre title=\"docker-compose.yml\" class=\"wp-block-code\"><code lang=\"yaml\" class=\"language-yaml\">version: \"3\"\nservices:\n  mongo1:\n    hostname: mongo1\n    container_name: localmongo1\n    image: mongo:latest\n    volumes:\n      - mongodb1-data:\/data\/db\n      - mongodb1-config:\/data\/configdb\n    expose:\n    - 27017\n    ports:\n      - 27011:27017\n    restart: always\n    entrypoint: [ \"\/usr\/bin\/mongod\", \"--bind_ip_all\", \"--replSet\", \"rs0\" ]\n  mongo2:\n    hostname: mongo2\n    container_name: localmongo2\n    image: mongo:latest\n    volumes:\n      - mongodb2-data:\/data\/db\n      - mongodb2-config:\/data\/configdb\n    expose:\n    - 27017\n    ports:\n    - 27012:27017\n    restart: always\n    entrypoint: [ \"\/usr\/bin\/mongod\", \"--bind_ip_all\", \"--replSet\", \"rs0\" ]\n  mongo3:\n    hostname: mongo3\n    container_name: localmongo3\n    image: mongo:latest\n    volumes:\n      - mongodb3-data:\/data\/db\n      - mongodb3-config:\/data\/configdb\n    expose:\n    - 27017\n    ports:\n    - 27013:27017\n    restart: always\n    entrypoint: [ \"\/usr\/bin\/mongod\", \"--bind_ip_all\", \"--replSet\", \"rs0\" ]\n\nvolumes:\n  mongodb1-data: {}\n  mongodb1-config: {}\n  mongodb2-data: {}\n  mongodb2-config: {}\n  mongodb3-data: {}\n  mongodb3-config: {}\n  proftpd-home: {}<\/code><\/pre>\n\n\n\n<p>At this point, docker must be started:<\/p>\n\n\n\n<pre title=\"command line\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ docker-compose up \n# or\n$ docker-compose up -d<\/code><\/pre>\n\n\n\n<p>At this point, enter in one mongo bash and access to mongo console:<\/p>\n\n\n\n<pre title=\"command line\" class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ docker exec -it localmongo1 \/bin\/bash\n$ mongo<\/code><\/pre>\n\n\n\n<p> The last step is to run the DB replica set initialization:<\/p>\n\n\n\n<pre title=\"mongoDB query\" class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\">rs.initiate(\n  {\n    _id : 'rs0',\n    members: [\n      { _id : 0, host : \"mongo1:27017\" },\n      { _id : 1, host : \"mongo2:27017\" },\n      { _id : 2, host : \"mongo3:27017\" }\n    ]\n  }\n)<\/code><\/pre>\n\n\n\n<p>Now, mongo is ready to accept a connection on port 27011 and, as soon as a  DB \/ collection \/ document is created or updated, it will be replicated on secondary servers.<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Share this:<\/h3><div class=\"sd-content\"><ul><li class=\"share-linkedin\"><a rel=\"nofollow\" data-shared=\"sharing-linkedin-845\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=linkedin\" target=\"_blank\" title=\"Click to share on LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-reddit\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-reddit sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=reddit\" target=\"_blank\" title=\"Click to share on Reddit\"><span>Reddit<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow\" data-shared=\"sharing-twitter-845\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\"><span>Twitter<\/span><\/a><\/li><li class=\"share-facebook\"><a rel=\"nofollow\" data-shared=\"sharing-facebook-845\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-skype\"><a rel=\"nofollow\" data-shared=\"sharing-skype-845\" class=\"share-skype sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=skype\" target=\"_blank\" title=\"Share on Skype\"><span>Skype<\/span><\/a><\/li><li class=\"share-pocket\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-pocket sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=pocket\" target=\"_blank\" title=\"Click to share on Pocket\"><span>Pocket<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>A&nbsp;replica set&nbsp;in MongoDB is a group of&nbsp;mongod&nbsp;processes that maintain the same data set. Replica sets provide redundancy and&nbsp;high availability and are the basis for all production deployments.&nbsp;Replication provides redundancy and increases&nbsp;data availability. With multiple copies of data on different database servers, replication provides a level of fault tolerance against the loss of a single database [&hellip;]<\/p>\n<div class=\"sharedaddy sd-sharing-enabled\"><div class=\"robots-nocontent sd-block sd-social sd-social-icon-text sd-sharing\"><h3 class=\"sd-title\">Share this:<\/h3><div class=\"sd-content\"><ul><li class=\"share-linkedin\"><a rel=\"nofollow\" data-shared=\"sharing-linkedin-845\" class=\"share-linkedin sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=linkedin\" target=\"_blank\" title=\"Click to share on LinkedIn\"><span>LinkedIn<\/span><\/a><\/li><li class=\"share-reddit\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-reddit sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=reddit\" target=\"_blank\" title=\"Click to share on Reddit\"><span>Reddit<\/span><\/a><\/li><li class=\"share-twitter\"><a rel=\"nofollow\" data-shared=\"sharing-twitter-845\" class=\"share-twitter sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=twitter\" target=\"_blank\" title=\"Click to share on Twitter\"><span>Twitter<\/span><\/a><\/li><li class=\"share-facebook\"><a rel=\"nofollow\" data-shared=\"sharing-facebook-845\" class=\"share-facebook sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=facebook\" target=\"_blank\" title=\"Click to share on Facebook\"><span>Facebook<\/span><\/a><\/li><li class=\"share-skype\"><a rel=\"nofollow\" data-shared=\"sharing-skype-845\" class=\"share-skype sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=skype\" target=\"_blank\" title=\"Share on Skype\"><span>Skype<\/span><\/a><\/li><li class=\"share-pocket\"><a rel=\"nofollow\" data-shared=\"\" class=\"share-pocket sd-button share-icon\" href=\"https:\/\/www.andreagirardi.it\/blog\/mongo-replica-set-with-docker-compose\/?share=pocket\" target=\"_blank\" title=\"Click to share on Pocket\"><span>Pocket<\/span><\/a><\/li><li class=\"share-end\"><\/li><\/ul><\/div><\/div><\/div>","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"footnotes":""},"categories":[14],"tags":[66,32],"_links":{"self":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts\/845"}],"collection":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/comments?post=845"}],"version-history":[{"count":12,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts\/845\/revisions"}],"predecessor-version":[{"id":932,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/posts\/845\/revisions\/932"}],"wp:attachment":[{"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/media?parent=845"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/categories?post=845"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.andreagirardi.it\/blog\/wp-json\/wp\/v2\/tags?post=845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}