Docker是快速检查新技术而无需安装麻烦的最佳工具。
在本文中,我们将编写一个简单的docker-compose文件,它将触发一个3节点的cassandra集群。
第一步当然是在系统上安装Docker。
创建一个文本文件,将其命名为docker-compose.yml,然后通过首选的文本工具复制/粘贴以下文本。
version: '2'
services:
###############################
cassandra0:
image: cassandra
container_name: cassandra0
ports:
- 9042:9042
- 7199:7199
###############################
cassandra1:
image: cassandra
container_name: cassandra1
ports:
- 9142:9042
links:
- cassandra0:seed
environment:
- CASSANDRA_SEEDS=seed
###############################
cassandra2:
image: cassandra
container_name: cassandra2
ports:
- 9242:9042
links:
- cassandra0:seed
environment:
- CASSANDRA_SEEDS=seed
这个docker文件定义了三个容器。Cassandra0
容器是用作主要种子的容器。其他两个将其链接,并通过CASSANDRA_SEEDS
环境变量获取种子,该变量设置为“seed
”,这是cassandra0
容器的别名。
通过以下命令启动容器:
docker-compose up -d
通过以下命令检查第一个节点的状态:
docker exec cassandra0 nodetool status
您应该得到与以下屏幕截图中显示的结果相同的结果:
使用其他容器名称(cassandra1、cassandra2)重复相同的操作应该得到相同的结果。
命令结果部分的重要信息是每个节点行开头的两个字母应该是UN。U代表向上,N代表正常。
使用下面的python程序在其中创建一个keyspace和一个表。
import logging
log = logging.getLogger()
log.setLevel('INFO')
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(name)s: %(message)s"))
log.addHandler(handler)
from cassandra import ConsistencyLevel
from cassandra.cluster import Cluster
from cassandra.query import SimpleStatement
KEYSPACE = "mykeyspace"
def createKeySpace():
cluster = Cluster(contact_points=['127.0.0.1'],port=9142)
session = cluster.connect()
log.info("Creating keyspace...")
try:
session.execute("""
CREATE KEYSPACE %s
WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': '2' }
""" % KEYSPACE)
log.info("setting keyspace...")
session.set_keyspace(KEYSPACE)
log.info("creating table...")
session.execute("""
CREATE TABLE mytable (
mykey text,
col1 text,
col2 text,
PRIMARY KEY (mykey, col1)
)
""")
except Exception as e:
log.error("Unable to create keyspace")
log.error(e)
createKeySpace();
你可以使用每个容器中包含的cqlsh工具使用以下命令检查Keyspace:
docker exec -it cassandra0 cqlsh
然后,您可以使用命令“describe mykeyspace”来获取有关新创建的Keyspace的详细信息。
我们将再次使用python在表中插入一些记录。将以下功能添加到程序中。
def insertData(number):
cluster = Cluster(contact_points=['127.0.0.1'],port=9142)
session = cluster.connect()
log.info("setting keyspace...")
session.set_keyspace(KEYSPACE)
prepared = session.prepare("""
INSERT INTO mytable (mykey, col1, col2)
VALUES (?, ?, ?)
""")
for i in range(number):
if(i%100 == 0):
log.info("inserting row %d" % i)
session.execute(prepared.bind(("rec_key_%d" % i, 'aaa', 'bbb')))
insertData(1000)
使用与下面类似的函数读取新插入的数据并不那么困难:
def readRows():
cluster = Cluster(contact_points=['127.0.0.1'],port=9142)
session = cluster.connect()
log.info("setting keyspace...")
session.set_keyspace(KEYSPACE)
rows = session.execute("SELECT * FROM mytable")
log.info("key\tcol1\tcol2")
log.info("---------\t----\t----")
count=0
for row in rows:
if(count%100==0):
log.info('\t'.join(row))
count=count+1;
log.info("Total")
log.info("-----")
log.info("rows %d" %(count))
通过停止和启动三个容器中的一个,可以很容易地检查系统是否仍然可用,即使其中一个节点已关闭。将python程序中的端口从9142更改为9042或9242,以便与特定节点通信。
原文链接: link.