Cassandra: connecting to multiple clusters via cqlengine


This might be simple or very niche but I had to spend a lot of time figuring it out so I just wanted to put it up somewhere.

Say you have 3 cassandra clusters C_X, C_Y and C_Z and you have tables T_X1, T_X2, T_Y1, T_Z1 such that

C_X hosts T_X1 and T_X2
C_Y hosts T_Y1
C_Z hosts T_Z1

Now you can create connections to all of these like so

cluster_x = Cluster(C_X)
session_x = cluster_x.connect()

cluster_y = Cluster(C_Y)
session_y = cluster_y.connect()

cluster_z = Cluster(C_Z)
session_z = cluster_z.connect()

And then you create some named tables ( https://datastax.github.io/python-driver/cqlengine/queryset.html#named-tables )

n_t_x1 = NamedTable(T_X1)
n_t_x2 = NamedTable(T_X2)
n_t_y1 = NamedTable(T_Y1)
n_t_z1 = NamedTable(T_Z1)

but how do you tell cassandra driver which table is hosted on which cluster or which session / connection should it use?

SIMPLE!

from cassandra.cqlengine import connection as cql_connection
cql_connection.register_connection("CONN_X", C_X)
n_t_x1.__connection__ = "CONN_X"
n_t_x2.__connection__ = "CONN_X"

cql_connection.register_connection("CONN_Y", C_Y)
n_t_y1.__connection__ = "CONN_Y"

cql_connection.register_connection("CONN_Z", C_Z)
n_t_z1.__connection__ = "CONN_Z"

 

now queries to n_t_x1 will be routed to connection with the name “CONN_X” and so on.

PS: it’s kinda hidden the documentation here [driver 3.7.0] https://datastax.github.io/python-driver/cqlengine/connections.html#default-model-connection

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s