Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mongeez at SecondMarket - Michael Lysaght VP of Engineering, SecondMarket

mongodb
January 20, 2012

Mongeez at SecondMarket - Michael Lysaght VP of Engineering, SecondMarket

MongoDB New York User Group 1-17-2012

Have you ever heard an engineer say, "I don't know why it doesn't work, it works on my machine"? Have you had to wait for SysOps to run a data change across multiple environments, and realize they forgot to run it somewhere? Managing your data modifications can be a major headache, especially for larger teams. Automating these changes has improved productivity and deployment consistency at SecondMarket who have open sourced a tool called Mongeez to help resolve this issue. This tool, loosely based on liquibase, automates deployment of mongodb data changes whilst maintaining consistency with your codebase. Michael Lysaght & Oleksii Iepishkin will talk about the problem and their solution.

mongodb

January 20, 2012
Tweet

More Decks by mongodb

Other Decks in Technology

Transcript

  1. Had  an  immature  document     structure  which  changed  

      a  lot  when  adding  new  assets   Started  to  encounter  some     dependency  management  issues  
  2. Had  an  immature  document     structure  which  changed  

      a  lot  when  adding  new  assets   Started  to  encounter  some     dependency  management  issues   Needed  to  ensure  document   structural  changes  were     synched  with  code  changes  
  3. So  what  problem  does  mongeez  solve?   It  allows  you

     to  change  your  document  structure   &  your  code  in  unison.    
  4. So  what  problem  does  mongeez  solve?   It  allows  you

     to  change  your  document  structure   &  your  code  in  unison.     But  the  power  comes  when  it  enables  these   changes  to  be  propagated  together  through  all   your  development,  test  and  producAon   environments.    
  5. <mongoChangeLog>          <changeSet  changeId="ChangeSet-­‐1"  author="mlysaght">    

                 <script>                          db.organizaAon.insert({                                "OrganizaAon"  :  "10Gen”,  "LocaAon"  :  "NYC”,  DateFounded  :  {"Year"  :  2008,  "Month"  :  01,   "day"  :01}});                          db.organizaAon.insert({            "OrganizaAon"  :  "SecondMarket”,  "LocaAon"  :  "NYC”,  DateFounded  :  {"Year"  :  2004,  "Month"  :  5,   "day"  :4}});                  </script>          </changeSet>          <changeSet  changeId="ChangeSet-­‐2"  author="mlysaght">                  <script>                          db.user.insert({  "Name"  :  "Michael  Lysaght"});                  </script>                  <script>                          db.user.insert({  "Name"  :  "Oleksii  Iepishkin"});                  </script>          </changeSet>   </mongoChangeLog>    
  6. <mongoChangeLog>          <changeSet  changeId="ChangeSet-­‐1"  author="mlysaght">    

                 <script>                          db.organizaAon.insert({                                "OrganizaAon"  :  "10Gen”,  "LocaAon"  :  "NYC”,  DateFounded  :  {"Year"  :  2008,  "Month"  :  01,   "day"  :01}});                          db.organizaAon.insert({            "OrganizaAon"  :  "SecondMarket”,  "LocaAon"  :  "NYC”,  DateFounded  :  {"Year"  :  2004,  "Month"  :  5,   "day"  :4}});                  </script>          </changeSet>          <changeSet  changeId="ChangeSet-­‐2"  author="mlysaght">                  <script>                          db.user.insert({  "Name"  :  "Michael  Lysaght"});                  </script>                  <script>                          db.user.insert({  "Name"  :  "Oleksii  Iepishkin"});                  </script>          </changeSet>   </mongoChangeLog>    
  7. <mongoChangeLog>          <changeSet  changeId="ChangeSet-­‐1"  author="mlysaght">    

                 <script>                          db.organizaAon.insert({                                "OrganizaAon"  :  "10Gen”,  "LocaAon"  :  "NYC”,  DateFounded  :  {"Year"  :  2008,  "Month"  :  01,   "day"  :01}});                          db.organizaAon.insert({            "OrganizaAon"  :  "SecondMarket”,  "LocaAon"  :  "NYC”,  DateFounded  :  {"Year"  :  2004,  "Month"  :  5,   "day"  :4}});                  </script>          </changeSet>          <changeSet  changeId="ChangeSet-­‐2"  author="mlysaght">                  <script>                          db.user.insert({  "Name"  :  "Michael  Lysaght"});                  </script>                  <script>                          db.user.insert({  "Name"  :  "Oleksii  Iepishkin"});                  </script>          </changeSet>   </mongoChangeLog>    
  8. Can  have  mulAple     changeSet  Files  to   keep

     things  neat   in  mongeez.xml  
  9. <changeFiles>          <file  path="changeset1.xml"/>      

       <file  path="changeset2.xml"/>   </changeFiles>    
  10. Make  your  code  change   and  checkin  to  your  

      source  control  system   together  
  11. Mongeez  mongeez  =  new  Mongeez();   mongeez.setFile(      

             new  ClassPathResource(”/path_to/mongeez.xml"));   mongeez.setMongo(new  Mongo(host,  port));   mongeez.setDbName(”yourDbName");   mongeez.process();     Either  in  the  code  …  
  12.      <bean  id="mongoUri"  class="com.mongodb.MongoURI">          

         <constructor-­‐arg  value="${mongodb.uri}"/>        </bean>          <bean  id="mongo"  class="com.mongodb.Mongo">                <constructor-­‐arg  ref="mongoUri"/>        </bean>          <bean  id="mongeez"  class="org.mongeez.MongeezRunner">                <property  name="mongo"  ref="mongo"/>                <property  name="executeEnabled"  value="${migrate}"/>                <property  name="dbName"  value="${db.name}"/>                <property  name="file"  value="classpath:com/secondmarket/mongo/ mongeez.xml"/>        </bean>     ….  Or  via  Spring  integraAon  
  13. What’s  under  the  hood?   •  The  first  Ame  mongeez

     runs  in  a  new   environment  it  creates  a  collecAon  in  your   database  called  mongeez      
  14. What’s  under  the  hood?   •  The  first  Ame  mongeez

     runs  in  a  new   environment  it  creates  a  collecAon  in  your   database  called  mongeez   •  All  changeSets  are  then  executed;  as  each  one  is   executed  it  is  recorded  in  the  mongeez  collecAon   atomically,  so  it  can  run  in  a  clustered   environment      
  15. What’s  under  the  hood?   •  The  first  Ame  mongeez

     runs  in  a  new   environment  it  creates  a  collecAon  in  your   database  called  mongeez   •  All  changeSets  are  then  executed;  as  each  one  is   executed  it  is  recorded  in  the  mongeez  collecAon   atomically,  so  it  can  run  in  a  clustered   environment   •  The  next  Ame  you  run  mongeez  in  that   environment,  it  iterates  through  all  changeSets  in   your  XML  file,  but  will  only  execute  changeSets   that  have  not  been  run  previously        
  16. Other  things  we  have  used  mongeez   for   • 

    For  running  your  ensureIndexes  on  every   deploy  (using  alwaysRun  flag)  or  anything  you   would  like  to  run  on  startup  in  Mongo   •  For  ensuring  staAc  data  is  in  place