利用Docker轻松玩转Cassandra

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: Cassandra 是一个流行的分布式NoSQL数据存储系统。最近有客户问起了Cassandra在如何Docker中运行的一些问题。本文将利用Docker Compose和阿里云容器服务轻松玩转Cassandra

14772213763480

Cassandra 是一个流行的分布式NoSQL数据存储系统。最近有客户问起了Cassandra在如何Docker中运行的一些问题。本文将利用Docker Compose和阿里云容器服务轻松玩转Cassandra。

一键创建Cassandra集群

Docker Hub上已经提供了Cassandra的官方镜像,可以方便地创建单节点Cassandra实例或Cassandra集群。Cassandra采用去中心化的集群架构,没有master节点的概念;但是会有seed节点在新节点连入时通知当前集群。

下面的Docker Compose模板将为你创建一个包含3个节点的Cassandra集群,其中第一个容器“cassandra-1”为seed节点。

version: '2'
services:
  cassandra-1:
    image: cassandra:3
    container_name: cassandra-1
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-1
    ports:
      - 7000
    restart: always
  cassandra-2:
    image: cassandra:3
    container_name: cassandra-2
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-2
      - CASSANDRA_SEEDS=cassandra-1
    ports:
      - 7000
    depends_on:
      - cassandra-1
    restart: always
  cassandra-3:
    image: cassandra:3
    container_name: cassandra-3
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-3
      - CASSANDRA_SEEDS=cassandra-1
    ports:
      - 7000
    depends_on:
      - cassandra-2
    restart: always

注释:这里面一个重要的技巧是:在Docker的容器网络模型中(CNM, Docker Network Model),同一网络中的容器可以通过容器名互相访问。

现在,我们可以轻松利用 docker-compose 命令来启动Cassandra集群了

$ docker-compose up -d

启动之后,我们可以方便地查看集群状态

$ docker-compose ps
   Name                  Command               State                                Ports                              
----------------------------------------------------------------------------------------------------------------------
cassandra-1   /docker-entrypoint.sh cass ...   Up      0.0.0.0:32768->7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp 
cassandra-2   /docker-entrypoint.sh cass ...   Up      0.0.0.0:32769->7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp 
cassandra-3   /docker-entrypoint.sh cass ...   Up      0.0.0.0:32770->7000/tcp, 7001/tcp, 7199/tcp, 9042/tcp, 9160/tcp 
$ docker exec -ti cassandra-1 cqlsh cassandra-2 -e "DESCRIBE CLUSTER"

Cluster: Test Cluster
Partitioner: Murmur3Partitioner

云端部署Cassandra集群

利用阿里云容器服务,我们可以直接使用上文Compose模板部署Cassandra集群,但是为了防止在相同的ECS实例上部署了超过一个个Cassandra节点,我们可以添加部署约束来指明不同的Cassandra节点部署到不同的ECS示例上。

version: '2'
services:
  cassandra-1:
    image: cassandra:3
    container_name: cassandra-1
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-1
      - constraint:aliyun.node_index==1
    ports:
      - 7000
    restart: always
  cassandra-2:
    image: cassandra:3
    container_name: cassandra-2
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-2
      - CASSANDRA_SEEDS=cassandra-1
      - constraint:aliyun.node_index==2
    ports:
      - 7000
    depends_on:
      - cassandra-1
    restart: always
  cassandra-3:
    image: cassandra:3
    container_name: cassandra-3
    environment:
      - CASSANDRA_BROADCAST_ADDRESS=cassandra-3
      - CASSANDRA_SEEDS=cassandra-1
      - constraint:aliyun.node_index==3
    ports:
      - 7000
    depends_on:
      - cassandra-2
    restart: always

注释:

  • 这个示例需要集群中至少包含3个节点
  • constraint:aliyun.node_index约束可以方便地指明将容器部署到集群中的第几个节点

官方Cassandra镜像的问题

在Overlay等网络使用官方Cassandra 2.2镜像的时候,如果没有指明CASSANDRA_LISTEN_ADDRESS我们会遇到一个 “Unknown listen_address” 的问题,

这个原因是因为在镜像的“docker-entrypoint.sh”脚本中,的如下代码

CASSANDRA_LISTEN_ADDRESS="$(hostname --ip-address)"

然而在Overlay网络环境中,容器会包含多块网卡,而hostname --ip-address会返回所有网卡的IP地址导致CASSANDRA_LISTEN_ADDRESS的格式出现问题,一个简单的修正就是使用下面的命令来获取eth0网卡的IP地址

CASSANDRA_LISTEN_ADDRESS="$(hostname --ip-address | cut -d " " -f1)"

在社区中相应的Pull Request为 https://github.com/docker-library/cassandra/pull/77 大家如果遇到了类似的问题可以参考。

总结

利用Docker和Docker Compose模板可以轻松部署Cassandra集群。阿里云容器服务可以轻松复用Docker Compose模板,并添加约束支持灵活的部署控制。

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
21天前
|
Docker 容器
进入Docker容器中
进入Docker容器中
34 2
|
1月前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
1月前
|
Oracle 关系型数据库 数据库
|
1天前
|
存储 运维 监控
构建高效稳定的Docker容器监控体系
【4月更文挑战第18天】 在现代微服务架构中,Docker容器已成为部署和运行应用的标准环境。随之而来的挑战是如何有效监控这些容器的性能与健康状况,确保系统的稳定性和可靠性。本文将探讨构建一个高效稳定的Docker容器监控体系的关键技术和方法,包括日志管理、性能指标收集以及异常检测机制,旨在为运维人员提供实用的指导和建议。
6 0
|
9天前
|
Linux Docker 容器
docker 容器常用命令
docker 容器常用命令
12 0
|
9天前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
14 0
|
9天前
|
存储 Linux Shell
centos 部署docker容器 安装 、基本使用方法(一)
centos 部署docker容器 安装 、基本使用方法(一)
17 0
|
18天前
|
Kubernetes 网络协议 Docker
Docker 容器的DNS
Docker 容器的DNS
23 1
|
21天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
45 1
|
22天前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
99 1