利用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

相关实践学习
巧用云服务器ECS制作节日贺卡
本场景带您体验如何在一台CentOS 7操作系统的ECS实例上,通过搭建web服务器,上传源码到web容器,制作节日贺卡网页。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
231 77
|
2天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
37 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
13天前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
86 35
|
1月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
12天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
2天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
28 10
|
1天前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
35 12
|
18天前
|
Unix Linux Docker
CentOS停更沉寂,RHEL巨变限制源代:Docker容器化技术的兴起助力操作系统新格局
操作系统是计算机系统的核心软件,管理和控制硬件与软件资源,为用户和应用程序提供高效、安全的运行环境。Linux作为开源、跨平台的操作系统,具有高度可定制性、稳定性和安全性,广泛应用于服务器、云计算、物联网等领域。其发展得益于庞大的社区支持,多种发行版如Ubuntu、Debian、Fedora等满足不同需求。
44 4
|
1月前
|
数据建模 应用服务中间件 nginx
docker替换宿主与容器的映射端口和文件路径
通过正确配置 Docker 的端口和文件路径映射,可以有效地管理容器化应用程序,确保其高效运行和数据持久性。在生产环境中,动态替换映射配置有助于灵活应对各种需求变化。以上方法和步骤提供了一种可靠且易于操作的方案,帮助您轻松管理 Docker 容器的端口和路径映射。
116 3
|
2月前
|
运维 Kubernetes Docker
深入理解容器化技术:Docker与Kubernetes的协同工作
深入理解容器化技术:Docker与Kubernetes的协同工作
72 12