容器化部署Cassandra高可用集群
前提:
三台装有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高可用集群的更多相关文章
- (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)
参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...
- 部署MYSQL高可用集群
mysql-day08 部署MYSQL高可用集群 u 集群架构 ...
- 部署zookeepe高可用集群
部署zookeepe高可用集群 部署规划 Nno1 192.16 ...
- 一键部署Kubernetes高可用集群
三台master,四台node,系统版本为CentOS7 IP ROLE 172.60.0.226 master01 172.60.0.86 master02 172.60.0.106 master0 ...
- Hadoop部署方式-高可用集群部署(High Availability)
版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客的高可用集群是建立在完全分布式基础之上的,详情请参考:https://www.cnblogs.com/yinzhengjie/p/90651 ...
- 基于 Rainbond 部署 DolphinScheduler 高可用集群
本文描述通过 Rainbond 云原生应用管理平台 一键部署高可用的 DolphinScheduler 集群,这种方式适合给不太了解 Kubernetes.容器化等复杂技术的用户使用,降低了在 Kub ...
- 部署 kube-controller-manager 高可用集群
目录 前言 创建kube-controller-manager证书和私钥 生成证书和私钥 将生成的证书和私钥分发到所有master节点 创建和分发kubeconfig文件 分发kubeconfig到所 ...
- k8s集群中部署Rook-Ceph高可用集群
先决条件 为确保您有一个准备就绪的 Kubernetes 集群Rook,您可以按照这些说明进行操作. 为了配置 Ceph 存储集群,至少需要以下本地存储选项之一: 原始设备(无分区或格式化文件系统) ...
- 一文吃透如何部署kubernetes高可用集群
使用 k8s 官方提供的部署工具 kubeadm 自动安装,需要在 master 和 node 节点上安装 docker 等组件,然后初始化,把管理端的控制服务和 node 上的服务都以 pod 的方 ...
随机推荐
- zznuoj 1540 : 直线与圆
题目描述 给出一个圆的圆心坐标与圆的半径,和一条直线上的两点坐标,求这条直线与圆有多少个交点. 输入 输入3个实数x,y,r值分别表示圆心坐标与圆的半径,输入4个实数x1,y1,x2,y2表示直线上的 ...
- JAVA第十次作业
JAVA第十次作业 (一)学习总结 1.用思维导图对java多线程的学习内容进行总结. 参考资料: XMind. 2.下面是一个单线程实现的龟兔赛跑游戏. public class TortoiseH ...
- Java线程池不错的总结博客
ImportNew线程池总结 Java多线程之Executor.ExecutorService.Executors.Callable.Future与FutureTask 线程池,这一篇或许就够了
- 关于mysql设置外键,实现参照性完整性约束,以及workbench上的一个bug(?)
一.本次数据库中有student,course,sc表,其设置情况 -- 创建course表 CREATE TABLE `course` ( `cno` ) NOT NULL, `cname` ) D ...
- sqlserver 知识点
数据库知识点 1.数据库操作: 增:insert into 表名 values(值1,值2,值3) 删:delete 列名 from 表名 where 条件 改:update 表名 set =值 wh ...
- day-06数据类型与深浅拷贝
深浅拷贝 # 值拷贝:应用场景最多 ls = [1, 'abc', [10]] ls1 = ls # ls1直接将ls中存放的地址拿过来# ls内部的值发生任何变化,ls1都会随之变化 ls2 = l ...
- dic and set
一.dic 1.格式:key:value 2.key值必须不可变(可hash) 3.key不可重复(唯一性) 4.优点:查找.插入速度快 5.缺点:空间消耗大 6.实质是以空间换速度 7.常用参数 1 ...
- python requests 请求禁用SSL警告信息解决
Python3 requests模块发送HTTPS请求,关闭SSL 验证,控制台会输出以下错误: InsecureRequestWarning: Unverified HTTPS request is ...
- py-day4-4 python 其他内置函数
# ascii码转换 print(chr(98)) 结果: b print(ord('b')) 结果: 98 # 求几的几次方 print(pow(2,3)) # 2**2 =2*2*2 结果: 8 ...
- python之format函数
自python2.6开始,新增了一种格式化字符串的函数str.format(),可谓威力十足.那么,他跟之前的%型格式化字符串相比,有什么优越的存在呢?让我们来揭开它羞答答的面纱. 语法 它通过{}和 ...