Datastax Ruby Driver for Apache Cassandra

If you’re reading this on GitHub, please note that this is the readme for the development version and that some features described here might not yet have been released. You can view the documentation for the latest released version here.

Build Status

A Ruby client driver for Apache Cassandra. This driver works exclusively with the Cassandra Query Language version 3 (CQL3) and Cassandra’s native protocol.

This driver is based on the cql-rb gem by Theo Hultberg and we added support for:

Check out the slides from Ruby Driver Explained for a detailed overview of the Ruby Driver architecture.

Compatibility

This driver works exclusively with the Cassandra Query Language v3 (CQL3) and Cassandra’s native protocol. The current version works with:

  • Apache Cassandra versions 1.2, 2.0 and 2.1
  • DataStax Enterprise 3.1-4.8
  • Ruby (MRI) 2.2, 2.3
  • JRuby 1.7

Note: JRuby 1.6 is not officially supported, although 1.6.8 should work. Rubinius is not supported. MRI 1.9.3, 2.0, 2.1, and JRuby 9k are not officially supported, but they should work.

Quick start

require 'cassandra'

cluster = Cassandra.cluster # connects to localhost by default

cluster.each_host do |host| # automatically discovers all peers
  puts "Host #{host.ip}: id=#{host.id} datacenter=#{host.datacenter} rack=#{host.rack}"
end

keyspace = 'system'
session  = cluster.connect(keyspace) # create session, optionally scoped to a keyspace, to execute queries

future = session.execute_async('SELECT keyspace_name, columnfamily_name FROM schema_columnfamilies') # fully asynchronous api
future.on_success do |rows|
  rows.each do |row|
    puts "The keyspace #{row['keyspace_name']} has a table called #{row['columnfamily_name']}"
  end
end
future.join

Note: The host you specify is just a seed node, the driver will automatically discover all peers in the cluster.

Read more:

Installation

Install via rubygems

gem install cassandra-driver

Install via Gemfile

gem 'cassandra-driver'

Note: if you want to use compression you should also install snappy or lz4-ruby. Read more about compression.

Upgrading from cql-rb

Some of the new features added to the driver have unfortunately led to changes in the original cql-rb API. In the examples directory, you can find an example of how to wrap the ruby driver to achieve almost complete interface parity with cql-rb to assist you with gradual upgrade.

What’s new in v2.1

See the changelog for details on patch releases.

Features:

Breaking Changes:

  • Splat style positional arguments support, deprecated in 2.0.0, has been dropped
  • Setting :synchronize_schema to true will no longer perform the initial fetching if schema metadata.

Bug Fixes:

  • [RUBY-93] Reconnection can overflow the stack
  • [RUBY-95] Speed up generation of large token maps
  • [RUBY-97] Allow disabling of the initial population of schema metadata
  • [RUBY-98] Use of undefined class variable in Table#create_partition_key
  • [RUBY-102] Allow custom types in schema metadata
  • [RUBY-103] Don’t regenerate schema metadata for the same replication strategies and options
  • [RUBY-116] fix thread leak on connection error
  • [RUBY-119] Use require 'datastax/cassandra' to avoid namespace conflicts
  • [RUBY-128] Fix decoding of large values in maps, sets and lists.
  • [RUBY-202] Allow password authenticator to be used for LDAP authentication.
  • [RUBY-255] ControlConnection.peer_ip ignores peers that are missing critical information in system.peers.

Code examples

The DataStax Ruby Driver uses the awesome Cucumber Framework for both end-to-end, or acceptance, testing and constructing documentation. All of the features supported by the driver have appropriate acceptance tests with easy-to-copy code examples in the features/ directory.

Running tests

If you don’t feel like reading through the following instructions on how to run ruby-driver tests, feel free to check out .travis.yml for the entire build code.

  • Check out the driver codebase and install test dependencies:
git clone https://github.com/datastax/ruby-driver.git
cd ruby-driver
bundle install --without docs
bundle exec cucumber # runs end-to-end tests (or bundle exec rake cucumber)
bundle exec rspec # runs unit tests (or bundle exec rake rspec)
bundle exec rake integration # run integration tests
bundle exec rake test # run both as well as integration tests

Changelog & versioning

Check out the releases on GitHub and changelog. Version numbering follows the semantic versioning scheme.

Private and experimental APIs, defined as whatever is not in the public API documentation, i.e. classes and methods marked as @private, will change without warning. If you’ve been recommended to try an experimental API by the maintainers, please let them know if you depend on that API. Experimental APIs will eventually become public, and knowing how they are used helps in determining their maturity.

Prereleases will be stable, in the sense that they will have finished and properly tested features only, but may introduce APIs that will change before the final release. Please use the prereleases and report bugs, but don’t deploy them to production without consulting the maintainers, or doing extensive testing yourself. If you do deploy to production please let the maintainers know as this helps determining the maturity of the release.

Known bugs & limitations

  • Because the driver reactor is using IO.select, the maximum number of tcp connections allowed is 1024.
  • Because the driver uses IO#write_nonblock, Windows is not supported.

Please refer to the usage documentation for more information on common pitfalls

Contributing

For contributing read CONTRIBUTING.md

Credits

This driver is based on the original work of Theo Hultberg on cql-rb and adds a series of advanced features that are common across all other DataStax drivers for Apache Cassandra.

The development effort to provide an up to date, high performance, fully featured Ruby Driver for Apache Cassandra will continue on this project, while cql-rb has been discontinued.

Copyright 2013-2016 DataStax, Inc.

Licensed under the Apache License, Version 2.0 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.