利用Docker轻松玩转Cassandra

简介: 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服务器,运行该镜像。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
1天前
|
应用服务中间件 Linux nginx
百度搜索:蓝易云【Docker容器安装Nginx教程。】
注意:在运行容器时,可以根据需要使用其他参数进行自定义配置,例如将本地文件挂载到容器中,或者使用自定义配置文件等。这些配置超出了本教程的范围,但你可以参考Docker文档和Nginx文档以获取更多详细信息。
57 2
|
6天前
|
监控 Shell Docker
深入了解 Docker 容器操作命令:掌握容器化管理的关键
Docker 已经成为现代应用程序开发和部署的行业标准。它借助容器化技术,提供了一种轻量、可移植和可扩展的方式来构建、发布和运行应用程序。然而,最近我在工作中发现,一些家人们对 Docker 容器的操作命令还不太熟悉。因此,本文旨在深入介绍 Docker 容器操作的各个方面,包括对每个命令及其参数的详细解释。希望通过这篇文章,我们可以一起探讨和学习,进一步提高对 Docker 的理解和应用能力。
59 1
 深入了解 Docker 容器操作命令:掌握容器化管理的关键
|
7天前
|
程序员 数据安全/隐私保护 开发者
Docker中容器的随机命名方式
Docker中容器的随机命名方式
22 0
|
8天前
|
网络协议 Docker 容器
修改docker容器端口映射
修改docker容器端口映射
17 0
|
10天前
|
Docker 微服务 容器
探索Docker容器技术:轻松部署和管理应用程序
在当今的软件开发和部署领域,容器技术已经成为一个备受欢迎的话题。其中,Docker容器凭借其简便性、可移植性和高效性,成为了首选的容器解决方案。本文将深入介绍Docker容器技术,帮助您了解其工作原理、用途以及如何开始使用它。
|
12天前
|
Docker 容器
docker容器网桥连接
容器之间如何互相通讯?具体的命令有哪些?
|
12天前
|
Ubuntu 应用服务中间件 nginx
docker容器数据持久化
docker 容器内的数据是独立于镜像之外的,那么如何将其持久化到宿主机呢?答案便是利用「数据卷」,那什么又是「数据卷」呢?
|
13天前
|
监控 Linux Docker
免费的5款Docker 容器 GUI 管理工具!后悔没早点发现!
免费的5款Docker 容器 GUI 管理工具!后悔没早点发现!
37 0
|
19天前
|
Docker 容器
Docker 容器中运行 Kibana
Docker 容器中运行 Kibana
28 0
|
19天前
|
Linux 应用服务中间件 nginx
docker 快速查询容器是否正常启动
docker 快速查询容器是否正常启动
27 0
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多