Neo4j Multi-tenancy - neo4j

What is the best way to achieve multi-tenancy in neo4j?
I have seen Tinkerpop and Spring Data.
I'm have multiple clients and I would like to store client info in its own database to ensure security.
I do not want to use labels or indexes to solve this problem.

You mention that you've "seen TinkerPop" but I couldn't tell if that meant you've seen it, considered it and dismissed it as a solution here, so apologies if that is the case and I'm not answering your question.
I've successfully used PartitionStrategy (formerly PartitionGraph) from TinkerPop to achieve multi-tenancy in Neo4j (and other graph databases).
You can read more about the approach here in this blog post on the subject.

Neo4j does not support multi-tenant deployments at this time. You can run multiple instances on the same server, each one on a different port.
Alternatively, you can use a managed hosting service like GrapheneDB, which provides secure independent instances. Disclaimer: I work at GrapheneDB.

Related

How would I know which one to use Gremlin and Tinkerpop

I would like to implement a graph database in our company and wanted your expert help on this. I have a data model. and want to put it into AWS Neptune, but I don't know if I want Tinkerpop or a property graph. I am a newbie. How do I go about getting this data into neptune? Can someone tell me how to start or basics of getting data loaded?
I'm not quite sure I understand the question. Apache TinkerPop is a graph computing framework that includes the Gremlin query language. It is designed for use with property graphs.
Amazon Neptune supports Apache TinkerPop/Gremlin. Loading data into Amazon Neptune can be done via the supported query languages or via the Neptune bulk load API.

ejabberd: manage adding / removing friends

Serious headaches, trying to get ejabberd to integrate into an existing Rails app to support the chat part. Hope anyone wich has gone true this could share some insights on how to best approach cause currently everwhere there are issues.
My goals:
1. Store all data in mysql database for easy backup
for this I have setup mysql usage for ejabberd using the mysql drivers so far so good
2. Easy add and remove users from each others roster ( add and remove friend connections ) for this I have setup module rest and mod_admin_extra to be able to do restfull calls to ejabberd from the rails app. The ejabberd admin module allows to add and remove users BUT ( overflow: https://stackoverflow.com/a/5229902/355281 ) This author says its not possible to store data in mysql Mnesia is always used by mod_admin_extra
3. Temporarily add users to each others list or preferrable have some temp room to add 2 users to so they can chat as long as this group exists. No idea how to approach this
Problems with all this
Seems not all data can be stored in mysql, so data shattering Mnesia & Mysql , very bad to have data in 2 places and be unable to easy backup the mysql database
Have to use rest module to do stuff to the database wich is on itself fine, but how to add 2 users to each friendlist is unclear to me.
Although ejabberd seems to be the most complete out of the box xmpp server I might need to look for another server that tackles above issues. This part of my project has been big headaches hope someone can clarify, provide some suggestions on how to approach.
for example:
If facebook used ejabberd how did they tackle these issues?
Is there a clean rewrite of ejabberd that tackles above problems? perhaps a commercial xmpp server with decent api and ways to add/ remove users and store data in 1 central location?
Since you're already using MySQL, you can just manage the roster using Rails/MySQL Directly.
If you don't wanna do it directly in the DB, which is totally understandable, you can connect to the server through bosh (http://xmpp.org/extensions/xep-0206.html), where you can do all you're asking for. There is a JS bosh client that you might be able to use as a guide to implement it in Rails, it's called http://strophe.im/
Regarding having the data in two places, you should have (or be able to have) all the roster specific tables in MySQL, additionally you can configure pretty much every persistent piece of data to be on mysql, I'd need to know more about your specific concerns and configuration to be able to elaborate more on this though.
eJabberd is highly configurable and extendable, in my experience (over 8 years working with eJabberd) you can basically achieve any kind of behavior one way or the other.

Multi-tenant rails application: what are the pros and cons of different techniques?

I originally wrote my Ruby on Rails application for one client. Now, I am changing it so that it can be used for different clients. My end-goal is that some user (not me) can click a button and create a new project. Then all the necessary changes (new schema, new tables, handling of code) are generated without anyone needing me to edit a database.yml file or add new schema definitions. I am currently using the SCOPED access. So I have a project model and other associated models have a project_id column.
I have looked at other posts regarding multi-tenant applications in Rails. A lot of people seem to suggest creating a different schema for each new client in Postgres. For me, however, it is not much useful for a new client to have a different schema in terms of data model. Each client will have the same tables, rows, columns, etc.
My vision for each client is that my production database first has a table of different projects/clients. And each one of those tables links to a set of tables that are pretty much the same with different data. In other terms a table of tables. Or in other terms, the first table will map to a different set of data for each client that has the same structure.
Is the way I explained my vision at all similar to the way that Postgres implements different "schemas"? Does it look like nested tables? Or does Postgres have to query all the information in the database anyway? I do not currently use Postgres, but I would be willing to learn if it fits the design. If you know of database software that works with Rails that fits my needs, please do let me know.
Right now, I am using scopes to accomplish multi-tenant applications, but it does not feel scalable or clean. It does however make it very easy for a non-technical user to create a new project provided I give them fillable information. Do you know if it is possible with the multi-schema Postgres defintion to have it work automatically after a user clicks a button? And I would prefer that this be handled by Rails and not by an external script if possible? (please do advise either way)
Most importantly, do you recommend any plugins or that I should adopt a different framework for this task? I have found Rails to be limited in some cases of abstraction as above and this is the first time I have ran into a Rails-scaling issue.
Any advice related to multi-tenant applications or my situation is welcome. Any questions for clarification or additional advice are welcome as well.
Thanks,
--Dave
MSDN has a good introduction to multi-tenant data architecture.
At one end of the spectrum, you have one database per tenant ("shared nothing"). "Shared nothing" makes disaster recovery pretty simple, and has the highest degree of isolation between tenants. But it also has the highest average cost per tenant, and it supports the fewest tenants per server.
At the other end of the spectrum, you store a tenant id number in every row of every shared table ("shared everything"). "Shared everything" makes disaster recovery hard--for a single tenant, you'd have to restore just some rows in every shared table--and it has the lowest degree of isolation. (Badly formed queries can expose private data.) But it has the lowest cost per tenant, and it supports the highest number of tenants per server.
My vision for each client is that my production database first has a
table of different projects/clients. And each one of those tables
links to a set of tables that are pretty much the same with different
data. In other terms a table of tables. Or in other terms, the first
table will map to a different set of data for each client that has the
same structure.
This sounds like you're talking about one schema per tenant. Pay close attention to permissions (SQL GRANT and REVOKE statements. And ALTER DEFAULT PRIVILEGES.)
There are two railscasts on multitenancy that using scopes and subdomains and another to help with handling multiple schemas.
There is also the multitenant gem which could help with your scopes and apartment gem for handling multiple schemas.
Here is also a good presentation on multitenancy-with-rails.
Dont forget about using default scopes, while creating named scops the way you are now works it does feel like it could be done better. I came across this guide by Samuel Kadolph regarding this issue a few months ago and it looks like it could work well for your situation and have the benefit of keeping your application free of some PgSQL only features.
Basically the way he describes setting the application up involves adding the concepts of tennants to your application and then using this to scope the data at query time using the database.

using postgreSQL and jsondb in the same web app

My site is written in ruby (rails) and it's very easy to persist the results of an offsite json feed with using jsondb, so I have an app that would benefit from this, but I think I'd like to keep the rest of the site running on postgrs
Would I be better off moving everything to one database (jsondb?) or does rails easily allow me to use multiple ORM's in the same app
# just notes, ignore if you like cos the answers are subjective
# Perhaps I should build two web apps?
Sometimes it is practical to use multiple databases.
I'd take a hard look at the tenacity gem, which was introduced recently as a way to manage multiple databases within Rails .. and even relationships between them.
It doesn't look like it currently supports jsondb, but given its architecture, it should be possible to write your own adapter (... and then contribute it back?)
It's really better to have only one database. If it's better to use postGresql use it or only jsondb.
Having more than one database can be complicated to understand where is really your data.

How are SaaS applications organized?

Consider web (MVC, for example Rails) application for multiple clients as a service.
How to design this?
one application instance per client? (+ one database per client)
one instance for all clients (+ one database for all clients)
Former one is simple, but... "inefficient". How about the latter? (best practices, design patterns) How to separate client data? For example: worker "A" of client "1" has two documents, worker "B" of client "2" has three documents. How to build model associations to protect other users (and clients) data? I think joining every query with Client model is not a good solution.
I would suggest having a look at an earlier response on multi-tenant apps in Ruby on Rails.
It really depends on your use case, but the simplest way to handle this is a single database with scoping to particular applications. You can head from there depending on your requirements/budget.
I am a big fan of the postgresql schema system detailed in that link :P
This MSDN article explains multi-tenant data architectures well.
Probably obvious but I'll note it anyway; the default configuration of Rails instances to store session information client-side in cookies lends itself to having all application instances equally able to service requests.
Another article in the series is also informative in terms of identifying shared services such as monitoring that you will need.

Resources