scylla-driver is shard aware and contains extensions that work with the TokenAwarePolicy supported by Scylla 2.3 and onwards. Using this policy, the driver can select a connection to a particular shard based on the shard's token. As a result, latency is significantly reduced because there is no need to pass data between the shards.
Details on the scylla cql protocol extensions https://github.com/scylladb/scylla/blob/master/docs/dev/protocol-extensions.md#intranode-sharding
For using it you only need to enable TokenAwarePolicy on the Cluster
See the configuration of native_shard_aware_transport_port and native_shard_aware_transport_port_ssl on scylla.yaml:
https://github.com/scylladb/scylla/blob/master/docs/dev/protocols.md#cql-client-protocol
from cassandra.cluster import Cluster
from cassandra.policies import TokenAwarePolicy, RoundRobinPolicy
cluster = Cluster(load_balancing_policy=TokenAwarePolicy(RoundRobinPolicy()))shard_aware_optionsSetting it to
dict(disable=True)would disable the shard aware functionally, for cases favoring once connection per host (example, lots of processes connecting from one client host, generating a big load of connectionsOther option is to configure scylla by setting
enable_shard_aware_drivers: falseon scylla.yaml.
from cassandra.cluster import Cluster
cluster = Cluster(shard_aware_options=dict(disable=True))
session = cluster.connect()
assert not cluster.is_shard_aware(), "Shard aware should be disabled"
# or just disable the shard aware port logic
cluster = Cluster(shard_aware_options=dict(disable_shardaware_port=True))
session = cluster.connect()cluster.is_shard_aware()New method available on
Clusterallowing to check whether the remote cluster supports shard awareness (bool)
from cassandra.cluster import Cluster
cluster = Cluster()
session = cluster.connect()
if cluster.is_shard_aware():
print("connected to a scylla cluster")cluster.shard_aware_stats()New method available on
Clusterallowing to check the status of shard aware connections to all available hosts (dict)
from cassandra.cluster import Cluster
cluster = Cluster()
session = cluster.connect()
stats = cluster.shard_aware_stats()
if all([v["shards_count"] == v["connected"] for v in stats.values()]):
print("successfully connected to all shards of all scylla nodes")in_memoryflagNew flag available on
TableMetadata.optionsto indicate that it is an In Memory table
Note
in memory tables is a feature existing only in Scylla Enterprise
from cassandra.cluster import Cluster
cluster = Cluster()
session = cluster.connect()
session.execute("""
CREATE KEYSPACE IF NOT EXISTS keyspace1
WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'};
""")
session.execute("""
CREATE TABLE IF NOT EXISTS keyspace1.standard1 (
key blob PRIMARY KEY,
"C0" blob
) WITH in_memory=true AND compaction={'class': 'InMemoryCompactionStrategy'}
""")
cluster.refresh_table_metadata("keyspace1", "standard1")
assert cluster.metadata.keyspaces["keyspace1"].tables["standard1"].options["in_memory"] == True