前提:

三台装有docker的虚拟机,这里用VM1,VM2,VM3表达(当然生产环境要用三个独立物理机,否则无高可用可言),装docker可参见Ubuntu离线安装docker。

开始部署:

部署图

如上图所示,三台VM的IP分别为:

192.168.0.101

192.168.0.102

192.168.0.103

客户端将使用这三个IP来连接集群,每个VM通过端口映射由docker网桥myBridge来与Cassandra容器通信,容器的IP会在启动容器时指定

部署步骤:

1. 建docker网桥myBridge(名字随意)

在三台VM上,这里假定是ubuntu16.04.5,使用docker命令创建自定义docker网桥,用于VM和docker容器通讯

sudo docker network create --driver=bridge --subnet=200.1.1.0/24 myBridge

2. 准备cassandra的docker镜像,data目录,cassandra.yaml配置文件

首先创建好如下目录,假如VM的用户名是capcom923

/home/capcom923/cassandra/

2.1. docker镜像

由于我们要单独挂载cassandra.yaml配置文件,直接使用官方cassandra docker镜像会导致无法启动(因为镜像的启动文件docker-entrypoint.sh要修改cassandra.yaml文件,会造成device busy的错误),所以我注释掉了cassandra官网镜像中docker-entrypoint.sh文件的38行至53行,并重新生成了docker镜像,并导出为tar包供大家直接使用,请直接下载:(链接:https://pan.baidu.com/s/14n9_DGHCkAFRumln8muuQw 提取码:l1rx )

将tar包下载到该位置/home/capcom923/cassandra/cassandra-3.11.2-bps.tar

2.3. data目录

创建一个叫data的空目录即可

/home/capcom923/cassandra/data/

该目录用于cassandra存放所有持久化的数据

2.3. cassandra.yaml配置文件

该文件是cassandra的主要配置文件,由于三台VM的IP和角色各不尽相同,所以配置文件也不一样。

基于默认的cassandra.yaml文件,要对三台VM进行以下配置:

第一台VM:角色为种子节点,该节点在集群扩容缩容时,以及其它节点重启时是必须活着的,其它时候是可以宕机的。

配置节 值 说明
cluster_name 'MyCluster' 集群的名字,同一个集群的名字要相同
authenticator PasswordAuthenticator 生产环境都要用户名密码认证,默认的用户名/密码是cassandra/cassandra
seeds 192.168.0.101 种子节点VM的IP,注意不是容器的IP。
broadcast_address 192.168.0.101 节点VM的IP,注意不是容器的IP。
broadcast_rpc_address 192.168.0.101 节点VM的IP,注意不是容器的IP。
listen_address 200.1.1.11 节点容器的IP。
auto_snapshot false 尽管官方建议是true,但实际使用时,太消耗磁盘,所以建议改为false
endpoint_snitch GossipingPropertyFileSnitch 生产环境标配

编辑完毕后,存放在/home/capcom923/cassandra/cassandra.yaml

第二台VM:角色为普通节点

配置节 值 说明
cluster_name 'MyCluster' 集群的名字,同一个集群的名字要相同
authenticator PasswordAuthenticator 生产环境都要用户名密码认证,默认的用户名/密码是cassandra/cassandra
seeds 192.168.0.101 种子节点VM的IP,注意不是容器的IP。
broadcast_address 192.168.0.102 节点VM的IP,注意不是容器的IP。
broadcast_rpc_address 192.168.0.102 节点VM的IP,注意不是容器的IP。
listen_address 200.1.1.12 节点容器的IP。
auto_snapshot false 尽管官方建议是true,但实际使用时,太消耗磁盘,所以建议改为false
endpoint_snitch GossipingPropertyFileSnitch 生产环境标配

编辑完毕后,存放在/home/capcom923/cassandra/cassandra.yaml

第三台VM:角色为普通节点

配置节 值 说明
cluster_name 'MyCluster' 集群的名字,同一个集群的名字要相同
authenticator PasswordAuthenticator 生产环境都要用户名密码认证,默认的用户名/密码是cassandra/cassandra
seeds 192.168.0.101 种子节点VM的IP,注意不是容器的IP。
broadcast_address 192.168.0.103 节点VM的IP,注意不是容器的IP。
broadcast_rpc_address 192.168.0.103 节点VM的IP,注意不是容器的IP。
listen_address 200.1.1.13 节点容器的IP。
auto_snapshot false 尽管官方建议是true,但实际使用时,太消耗磁盘,所以建议改为false
endpoint_snitch GossipingPropertyFileSnitch 生产环境标配

编辑完毕后,存放在/home/capcom923/cassandra/cassandra.yaml

我也将这三个配置好的文件给大家参考,分别在1/2/3文件夹里(链接:https://pan.baidu.com/s/10i_iBdvMdfgFQHoWEUG6LQ 提取码:h7n4 )

至此,所以每台VM的目录结构为

/home/capcom923/cassandra/cassandra-3.11.2-bps.tar

/home/capcom923/cassandra/data/

/home/capcom923/cassandra/cassandra.yaml

3. 加载cassandra的docker镜像

在三台VM上执行

docker load -i /home/capcom923/cassandra/cassandra-3.11.2-bps.tar

4. 运行cassandra集群

在每一台VM上,先关闭ubuntu防火墙

sudo service ufw stop

sudo service firewalld stop(如果装了firewalld的话)

在第一台VM上:

sudo docker run --name cassandraNode1 -d -e CASSANDRA_DC=datacenter1 -v /home/capcom923/cassandra/cassandra.yaml:/etc/cassandra/cassandra.yaml -v /home/capcom923/cassandra/data:/var/lib/cassandra --restart unless-stopped --network myBridge --ip 200.1.1.11 -p 7000:7000 -p 9042:9042 cassandra:3.11.2.bps

在第二台VM上:

sudo docker run --name cassandraNode2 -d -e CASSANDRA_DC=datacenter1 -v /home/capcom923/cassandra/cassandra.yaml:/etc/cassandra/cassandra.yaml -v /home/capcom923/cassandra/data:/var/lib/cassandra --restart unless-stopped --network myBridge --ip 200.1.1.12 -p 7000:7000 -p 9042:9042 cassandra:3.11.2.bps

在第三台VM上:

sudo docker run --name cassandraNode3 -d -e CASSANDRA_DC=datacenter1 -v /home/capcom923/cassandra/cassandra.yaml:/etc/cassandra/cassandra.yaml -v /home/capcom923/cassandra/data:/var/lib/cassandra --restart unless-stopped --network myBridge --ip 200.1.1.13 -p 7000:7000 -p 9042:9042 cassandra:3.11.2.bps

5. 检查cassandra集群

在第一台VM上执行

sudo docker exec -it cassandraNode1 bash

进入容器之后,执行

nodetool status

注意三个节点开头的信息,UN代表Up Normal状态,都是UN就证明集群工作正常了,开始有UJ,说明Up Joining,一会儿就会变UN

6. 修改system_auth的配置

在第五步的窗口中继续执行

cqlsh -u cassandra -p cassandra

连接进cassandra控制台

并输入ALTER KEYSPACE system_auth WITH replication = {'class': 'NetworkTopologyStrategy','datacenter1': '3'};

回车

将这个keyspace的策略和副本改成3,

然后输入exit退出cassandra控制台

再输入nodetool repair执行修复

然后在其余两台VM中的容器中都要执行nodetool repair,由此用户认证授权表得以及时同步,否则会引起从某一台节点无法登录的情况。

注意,cassandra/cassandra是系统默认用户,登录时要求至少过半的节点存活才可以。

至此,搭建完毕~

容器化部署Cassandra高可用集群的更多相关文章

  1. (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

    参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...

  2. 部署MYSQL高可用集群

                                                  mysql-day08     部署MYSQL高可用集群 u 集群架构                   ...

  3. 部署zookeepe高可用集群

                                                                部署zookeepe高可用集群 部署规划 Nno1         192.16 ...

  4. 一键部署Kubernetes高可用集群

    三台master,四台node,系统版本为CentOS7 IP ROLE 172.60.0.226 master01 172.60.0.86 master02 172.60.0.106 master0 ...

  5. Hadoop部署方式-高可用集群部署(High Availability)

    版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的高可用集群是建立在完全分布式基础之上的,详情请参考:https://www.cnblogs.com/yinzhengjie/p/90651 ...

  6. 基于 Rainbond 部署 DolphinScheduler 高可用集群

    本文描述通过 Rainbond 云原生应用管理平台 一键部署高可用的 DolphinScheduler 集群,这种方式适合给不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kub ...

  7. 部署 kube-controller-manager 高可用集群

    目录 前言 创建kube-controller-manager证书和私钥 生成证书和私钥 将生成的证书和私钥分发到所有master节点 创建和分发kubeconfig文件 分发kubeconfig到所 ...

  8. k8s集群中部署Rook-Ceph高可用集群

    先决条件 为确保您有一个准备就绪的 Kubernetes 集群Rook,您可以按照这些说明进行操作. 为了配置 Ceph 存储集群,至少需要以下本地存储选项之一: 原始设备(无分区或格式化文件系统) ...

  9. 一文吃透如何部署kubernetes高可用集群

    使用 k8s 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod 的方 ...

随机推荐

  1. TableLaout

    <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...

  2. wpf 圆角TextBox 样式

    <Style x:Key="RoundCornerTextStyle" TargetType="{x:Type TextBox}"> <Set ...

  3. amoeba 使用笔记

    环境 延用MySQL 主主+主从笔记的环境 Java version “1.8.0_73” 安装 wget http://nchc.dl.sourceforge.net/project/amoeba/ ...

  4. 一个权重的物体拷贝权重给多个(oneWeightToMany)

    你是否在做项目的时候经常会遇见一个物体带权重需要拷贝给其他物体,这时候其他物体多的数不胜数 你怎么办呢? 举例:假如一头狮子 身体你已经做好了,但是模型师把半个身体都做满了垂落的实体模型毛发,你是否感 ...

  5. django登录逻辑

    django-restframework中已经实现了登录逻辑,只需要安装配置就可以使用 pip install djangorestframework-jwt REST_FRAMEWORK = { ' ...

  6. RGB颜色名称与色值对应表

    实色效果 英文名称 R.G.B 16色 实色效果 英文名称 R.G.B 16色   Snow 255 250 250 #FFFAFA   PaleTurquoise1 187 255 255 #BBF ...

  7. C++vector针对排序操作练习

    目的: 定义5个学生,包含名字和分数,对成员进行从大到小排序,并输出 #include <iostream> #include <cstring> #include <v ...

  8. 学习Python3 天眼查 爬虫

    刚开始学习Python,不愿意看基础,记忆不好,那些语法记不住,直接上个项目,这样比较深刻 刚好公司有个情况要查企业的信息,就想做个爬虫吧,有验证码的不愿意搞,那是个老大难问题,就选择了天眼查 过程都 ...

  9. Rabbit MQ

    前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列,队列我们可以理解为管道.以管道的方式做消息传递. 场景: 1.其实我们在双11的时候,当我们凌晨大量的秒杀和抢购商品,然后去结算的时候, ...

  10. httpd日志格式

    日志的缺省格式有如下几种: LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{U ...