Moving from Postgres to RethinkDB

yes or no?

 

by Guilherme Pereira

@guiferrpereira

 

The Problem

We need to scale between datacenters!!!

Postgres Replication

Master to Master

  • Bucardo
  • PgCluster
  • ...

Work in progress ...

Noop... You have to change boy!

But i love postgres... so what are my options?

  • Redis
  • Cassandra
  • MongoDB
  • ElasticSearch
  • CouchDB
  • HBase
  • ...

Which one?

RethinkDB ? Isn't dead?

Syntax?

* ReQL

Ruby / Rails and RethinkDB

How easy it was moving?

# PostgresDB ActiveRecord
UR.where(user: user).includes(:user_transaction)

# RethinkDB NoBrainer
UR.where(user: user).eager_load(:transaction)


# PostgresDB ActiveRecord
UR.where(uid: uids)

# RethinkDB NoBrainer
UR.where(:uid.in => uids)

Text

# PostgresDB ActiveRecord

AM.
  where(uid: [nil, d.uid]).
  where(hd_model: [nil, d.hd.try(:fetch, 'model', nil)]).
  order('CAST(uid IS NOT NULL AS INTEGER) + CAST(hd_model IS NOT NULL AS INTEGER) DESC').
  pluck(:app_id).
  first

# RethinkDB NoBrainer

AM.
  where(:uid.in => [nil, d.uid]).
  where(:hd_model.in => [nil, d.hd.try(:fetch, 'model', nil)]).
  order_by(->(doc) { (doc[:uid].nil? ? 0 : 1) + (doc[:hd_model].nil? ? 0 : 1) } => :desc).
  pluck(:app_id).raw.
  first.try(:[], "app_id")

So easy?

Probably not!

# RethinkDB  DIRECT ReQL (Slow!)
NoBrainer.run { |r| 
    r.table("transactions").merge { |transaction| 
        {
            :usage_rights => r.table('usage_rights')
                .get_all([transaction['identifier'], transaction['uid']], {
                    index: 'idx_identifier_uid_multi'
                }).coerce_to('array')
        } 
    } 
}.count


# PostgresDB
usage_rights.
        joins('JOIN transactions ON usage_rights.identifier = transactions.identifier 
                AND usage_rights.uid = transactions.uid')

Speed?

Pretty console

!!! Attention this will work with javascript ReQL 

You want ruby syntax go check on your irb :P

Dump data

* For this you have to install python driver...

 

 

 

* And it's a little bit slow...

sudo pip install rethinkdb
rethinkdb dump [options]

*** My advice do table by table :)

Just flowers? Why?

Well ...

Downsides

* You have to learn new language: ReQL

 

* Custom querys can be messy (simple joins)

 

* For Master-Master replication you will need 3 servers

 

* (LIKE / match) don't have indexes, it will be slow

 

* Refactor your code to get all stuff working

 

* Migrate your current data

Any Questions?

Made with Slides.com