Scylladb学习笔记
文章目录
- 特点概述
- 应用场景
- 安装部署
- 操作
- Cql
- Java
- Golang
- Scylla-manager
- 安装
- 管理集群
- 安全检查
- 修复
- 数据备份和恢复
- 监控
- Scylla-Monitor
- nodetool
- 增删节点
- 架构
- 数据中心和机架
- 去中心化
- 数据分布
- 复制策略
- 一致性级别
- 读写流程
特点概述
一句话概述:Scylla是一个开源、分布式、去中心化、弹性可扩展、高可用、容错、可调一致性、面向行的数据库。
Scylla使用C ++重新实现了Cassandra,以提高性能并利用多核服务。它解决了Apache Cassandra的一些陷阱,是Apache Cassandra的嵌入式替换数据库,这两个数据库之间的驱动程序互相兼容
- 分布式:在多个服务器节点上运行
- 去中心化,没有主从
- 线性扩展:通过添加节点实现水平扩容
- 全球分布:群集可以在地理上分布
- 支持分区容忍度和可用性而不是一致性:最终一致
- 面向行:分区的行数据库,数据存储在稀疏的多维哈希表中,每一行都有一个唯一的键,利用这个键访问这一行的数据
- 写优于读:写入比读取快一个数量级
- 不支持聚合等复杂查询,通过主键支持快速目标读取
- 不支持事务
应用场景
- 大规模部署
- 大量写操作
- 多地分布
- 应用演进:由于其支持灵活的数据模式,所以很适合正在演进的应用,能快速部署时跟上应用的变化
与HBase对比
- Scylla是p2p架构,无单点失效问题,Hbase是主从结构,需要选主,维护主从关系
- Scylla是AP系统,也可以通过调整参数使它成为CP系统(只要R+W>N),HBase是CP系统,对数据有强一致性需求的话使用HBase
- Scylla是一个数据存储和数据管理系统。HBase只负责数据管理,它需要配合HDFS和zookeeper来搭建集群
- Scylla写性能好一些,由于数据哈希较分散,读性能不如HBase。HBase写过程比较繁琐,但其数据在regin内是排序的,读性能更好
- 两个都适合存放 time-series data,例如传感器数据,网站访问,用户行为,股市交易数据等
- Scylla擅长数据接入(*data ingestion*),因为写性能比较好
安装部署
如果安装了自动错误报告工具(abrt),会与Scylla coredump配置冲突
sudo yum remove -y abrt
安装rpm repo
sudo yum install epel-release sudo curl -o /etc/yum.repos.d/scylla.repo -L http://repositories.scylladb.com/scylla/repo/3720ed7b-f9b8-4902-bf9b-4d8a17ea35ce/centos/scylladb-4.4.repo
安装scylla
sudo yum install scylla //如果安装指定版本 sudo yum install scylla-3.0.6
配置scylla
sudo vim /etc/scylla/scylla.yaml
重要参数
- cluster_name:集群名称,如果部署集群模式,那所有节点的这个名称必须一致
- seeds:种子节点ip地址,可以是 gossip 找到这些节点加入集群
- listen_address: 用于连接到集群中其他Scylla节点的IP地址
- rpc_address:用于客户端连接的接口的IP地址
运行如下脚本,配置操作系统相关设置
sudo scylla_setup
启动scylla
sudo systemctl start scylla-server
操作
Cql
show和desc
//查看版本
SHOW VERSION
//查看连接的数据库地址
SHOW HOST
//批量执行.cql文件中的命令
SOURCE '/home/thobbs/commands.cql'
//开启和关闭命令追踪
TRACING ON
TRACING OFFDESCRIBE CLUSTER
DESCRIBE SCHEMA
DESCRIBE KEYSPACES
DESCRIBE KEYSPACE <keyspace name>
DESCRIBE TABLES
DESCRIBE TABLE <table name>
keyspace和table
https://docs.scylladb.com/getting-started/ddl/#truncate-statement
CREATE KEYSPACEUSEALTER KEYSPACEDROP KEYSPACECREATE TABLEALTER TABLEDROP TABLE
replication
TTL
:https://docs.scylladb.com/getting-started/time_to_live/INSERT和UPDATE命令为每一个非主键列提供一个TTL值,默认单位是秒
表级别:在创建时可以设置 default_time_to_live
默认TTL值是null,表示数据不过期
二级索引
不能以非主键的字段做
where
条件查询,需要创建在对应的列上创建一个二级索引才可以
数据增删改查
https://docs.scylladb.com/getting-started/dml/
SELECTINSERTUPDATEDELETEBATCH
数据类型
https://docs.scylladb.com/getting-started/types/
- 数值类型:int、bigint、smallint、tinyint、varint、float、double、decimal
- 文本类型:text、varchar、ascii
- 时间和标识数据:timestamp、date、time、uuid、timeuuid
- 其他数据类型:boolean、blob(二进制大对象)、inet(ip地址)、counter(自增计数器)
- 集合:set、list、map
- 用户自定义类型
Java
https://github.com/scylladb/java-driver
官方给的这个驱动是有问题的:
- 驱动版本号书写有问题
- 修改正确的版本号后,驱动本身的Maven依赖有报错
使用cassandra的java驱动可以实现对于scylla的操作
<dependency><groupId>com.datastax.oss</groupId><artifactId>java-driver-core</artifactId><version>3.10.2-scylla-1</version>
</dependency><dependency><groupId>com.datastax.oss</groupId><artifactId>java-driver-query-builder</artifactId><version>3.10.2-scylla-1</version>
</dependency><dependency><groupId>com.datastax.oss</groupId><artifactId>java-driver-mapper-runtime</artifactId><version>3.10.2-scylla-1</version>
</dependency>
Golang
https://github.com/scylladb/gocql
go get github.com/gocql/gocql
Scylla-manager
安装
安装scylla-manager-server、scylla-manager-client,最好在非scylla-server集群的节点
安装
sudo yum install epel-releasesudo curl -o /etc/yum.repos.d/scylla-manager.repo -L http://downloads.scylladb.com/rpm/centos/scylladb-manager-2.3.reposudo yum install scylla-manager-server scylla-manager-client
配置
sudo vim /etc/scylla-manager/scylla-manager.yaml
重要参数
- http:为scylla-manager绑定http访问端口
- hosts:集群中的节点ip
启动
sudo systemctl start scylla-manager.servicesudo systemctl status scylla-manager.service -l
安装scylla-manager-agent,必须在每个scylla-server的工作节点
安装
sudo curl -o /etc/yum.repos.d/scylla-manager.repo -L http://downloads.scylladb.com/rpm/centos/scylladb-manager-2.3.reposudo yum install scylla-manager-agentsudo scyllamgr_agent_setup -y
配置
sudo vim /etc/scylla-manager-agent/scylla-manager-agent.yaml
重要参数
- auth_token:在集群中的任意某个节点使用
cyllamgr_auth_token_gen
命令生成一个token,然后将其配置在每个节点中 - api_address:复制
/etc/scylla/scylla.yaml
文件中的 api_address。注意api_address参数的父参数是scylla
启动
sudo systemctl start scylla-manager-agentsudo systemctl status scylla-manager-agent -l
- auth_token:在集群中的任意某个节点使用
加入集群
从Scylla Manager服务器中,提供节点之一的IP地址,生成的身份验证令牌和自定义名称:
sctool cluster add --host 34.203.122.52 --name prod-cluster \ --auth-token "6Es3dm24U72NzAu9ANWmU3C4ALyVZhwwPZZPWtK10eYGHJ24wMoh9SQxRZEluWMc0qDrsWCCshvfhk9uewOimQS2x5yNTYUEoIkO1VpSmTFu5fsFyoDgEkmNrCJpXtfM"
通过运行sctool task list命令,验证添加的集群是否具有已注册的修复任务:
sctool task list
通过运行sctool status命令,验证Scylla Manager可以与所有代理通信,并且集群状态为OK:
sctool status
管理集群
安全检查
将群集添加到Scylla Manager时,Scylla Manager会自动添加三个运行状况检查任务和一个定期修复任务。
运行sctool task list
命令时,可以看到运行状况检查创建的任务
修复
https://scylladb.github.io/scylla-manager/2.3/repair/index.html
数据备份和恢复
https://scylladb.github.io/scylla-manager/2.3/backup/index.html
https://scylladb.github.io/scylla-manager/2.3/restore/index.html
监控
Scylla-Monitor
安装
安装docker并添加自身用户到docker用户组,启动docker
sudo systemctl start docker
安装Scylla Monitor Stack
wget https://github.com/scylladb/scylla-monitoring/archive/scylla-monitoring-3.6.3.tar.gztar -xvf scylla-monitoring-3.6.3.tar.gzcd scylla-monitoring-scylla-monitoring-3.6.3
配置
创建
prometheus/scylla_servers.yml
文件- targets:- 192.168.138.130:9180- 192.168.138.131:9180- 192.168.138.132:9180labels:cluster: Scylla_Test_Clusterdc: datacenter1
运行
./start-all.sh -s prometheus/scylla_servers.yml -d prometheus_data
访问grafana,http://192,168,138,129:3000
nodetool
nodetool status
增删节点
架构
数据中心和机架
数据中心(data center)是机架的一个逻辑集合。
Cassandra会充分利用用户提供的集群拓扑的有关信息来确定在哪里存储数据,以及如何高效地路由查询。会尝试将数据的副本存储在多个数据中心,从而尽可能提高可用性和分区和容错性,同时尽量将查询路由到本地数据中心的节点上来得到最优的性能。
去中心化
为了去中心化和数据容错,Cassandra使用了gossip协议,允许每个节点跟踪集群中其他节点的状态信息。
Cassandra使用Gossiper类管理本地节点的Gossip,其会维护存活和死亡节点的一个列表。具体工作如下:
- 每隔一秒,Gossiper会在集群中选择一个随机的节点,并初始化与它的一个Gossip会话。每轮Gossip需要3个消息
- Gossip发起者向它选择的一个朋友发送一个
GossipDigestSynMessage
- 这个朋友收到这个消息时,会返回一个
GossipDigestAckMessage
- 发起者从朋友那里收到这个ack消息时,会向朋友发送一个
GossipDigesAck2Message
结束这轮Gossip
Gossiper判断另一个端点已经死亡时,会将这个端点“判为死亡”,即在本地列表中标志其为死亡,并记入日志。
数据分布
Cassandra将一个集群管理的数据表示为环。会为环中的每个节点分配一个或多个数据区间或范围,由一个令牌描述,这个会确定数据在环中的位置。
令牌是用来标识各个分区的一个64位整数ID,因此可以得出令牌的范围-264~~263-1。
一个节点拥有小于或等于该节点令牌并且大于前一个节点令牌的值区间,有最小令牌的节点拥有小于或等于其令牌区间以及大于最大令牌的区间,这也成为 “回绕区间”,这样令牌就可以指定一个完整的环。
设计这种结构是为了能够将连续的令牌区间分散分布到不同机架的节点上。
分区器(Partitioner)会使用一个哈希函数将数据分配到节点,这个哈希函数将为分区键计算一个令牌。这个分区键令牌会与不同节点的令牌值比较来得到其区间,确定拥有这个数据的节点
复制策略
节点要作为不同数据区间的一个副本,如果一个节点宕机,其他副本仍能响应对这个数据区间的查询,Cassandra采用了一种对用户透明的方式将数据复制到节点,副本因子就是集群中将接收相同数据副本的节点个数。
为了确定副本的放置,提供了两种复制实现策略:
- SimpleStrategy:从分区器指示的节点开始,将副本放置在环中连续的节点上
- NetworkTopologyStrategy:允许为每个数据中心指定一个不同的副本因子。在一个数据中心,会适当地将副本分配到不同机架来得到最大可用性
一致性级别
对于读操作,一致性级别指定了返回数据之前必须有多少个副本节点响应一个读查询。读一致性取最新的数据。//TODO
对于写操作,一致性级别指定必须有多少个副本节点响应这个写操作,才能向客户报告这是一个成功的写操作。
一致性是可调的,一致性界别有如下几个:
- ONE
- TWO
- THREE
- QUORUM:大多数副本(副本因子/2+1)
- ALL:所有副本
区分强弱一致性的公式:R + W > N = 强一致性
- R:读副本数
- W:写副本数
- N:副本因子
读写流程
memtable、SSTable、Commit log
- 写:所有的写操作都是顺序的,就是所有写操作都是追加操作
- 记录数据到 Commit log。
- 写数据到 memtable,每个memtable包含一个特定的表的数据。
- memtable达到一个阈值时,数据flush到磁盘上一个名为SSTable的文件中
- 读:
- 删:不会立即真正删除数据,先标记后合并策略
Scylladb学习笔记相关推荐
- PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 call
您的位置 首页 PyTorch 学习笔记系列 PyTorch 学习笔记(六):PyTorch hook 和关于 PyTorch backward 过程的理解 发布: 2017年8月4日 7,195阅读 ...
- 容器云原生DevOps学习笔记——第三期:从零搭建CI/CD系统标准化交付流程
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 容器云原生DevOps学习笔记——第二期:如何快速高质量的应用容器化迁移
暑期实习期间,所在的技术中台-效能研发团队规划设计并结合公司开源协同实现符合DevOps理念的研发工具平台,实现研发过程自动化.标准化: 实习期间对DevOps的理解一直懵懵懂懂,最近观看了阿里专家带 ...
- 2020年Yann Lecun深度学习笔记(下)
2020年Yann Lecun深度学习笔记(下)
- 2020年Yann Lecun深度学习笔记(上)
2020年Yann Lecun深度学习笔记(上)
- 知识图谱学习笔记(1)
知识图谱学习笔记第一部分,包含RDF介绍,以及Jena RDF API使用 知识图谱的基石:RDF RDF(Resource Description Framework),即资源描述框架,其本质是一个 ...
- 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记
计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...
- Go 学习推荐 —(Go by example 中文版、Go 构建 Web 应用、Go 学习笔记、Golang常见错误、Go 语言四十二章经、Go 语言高级编程)
Go by example 中文版 Go 构建 Web 应用 Go 学习笔记:无痕 Go 标准库中文文档 Golang开发新手常犯的50个错误 50 Shades of Go: Traps, Gotc ...
- MongoDB学习笔记(入门)
MongoDB学习笔记(入门) 一.文档的注意事项: 1. 键值对是有序的,如:{ "name" : "stephen", "genda" ...
最新文章
- Spring Security的RBAC数据模型嵌入
- 学到了!程序员大神用这招让开发效率直接提升 10 倍!!
- 五、Git多人开发:同时变更了文件名和文件内容如何处理?
- 改变Jupyter的默认项目路径
- 数据库MySQL/mariadb知识点——日志记录(2)二进制日志
- 华为开放HMS Wallet Kit能力 将服务更多终端
- 019,Intelidea右键新建选项没有Java class选项
- 【深度学习之美】激活引入非线性,池化预防过拟合(入门系列之十二)
- MSSQL日期格式转换函数(使用CONVERT)
- PHP32向右位移2位是多少,PHP的二进制位移操作
- iotop监视磁盘I/O
- svn删除所有unversioned文件
- plc ge c语言编程,GE PLC编程软件是什么
- 浅谈谷歌退出中国市场带来的问题
- mysql 数据库大小写敏感(数据库的名字、表名字、字段名字、字段值)
- 【渗透技巧】pop3协议渗透
- 《Vision based autonomous driving - A survey of recent methods》读书笔记
- c++ 快排优化(三数取中法)
- 文章采集软件怎么采集文章?
- OpenMMLab简介
热门文章
- linux给文件夹腹权限,文件的权限_腹有诗书气自华的技术博客_51CTO博客
- Scikit Learn-聚类方法
- 树状数组、线段树、分块 在同一题目中的应用(Acwing 243)
- openAi注册指南(包括临时邮箱跟临时验证码接收地址验证)
- 软件插件化,大势所趋新势力
- 工业制造中的大数据分析应用_工业大数据分析方案-美林数据
- 实时数据库 - 笔记
- springboot毕业设计 基于springboot医院预约挂号系统毕业设计设计与实现参考
- 双系统重装win10后恢复grub引导
- Codeforces Round #101 (Div. 2)