ScyllaDB 是用 C++(Seastar 库:支持高并发和低延迟的异步编程高性能库) 重写的 Cassandra,每节点每秒处理 100 万 TPS,号称是世界上最快的 NoSQL 列存储数据库。ScyllaDB 完全兼容 Apache Cassandra,拥有比 Cassandra 多 10x 倍的吞吐量,降低了延迟。ScyllaDB 在垃圾收集或者 Compaction 的时候不需要暂停,在常规生产负载的时候可以添加和删除节点。本文基于CentOS7.6,部署ScyllaDB 3.3,详细过程如下:
1、准备机器
准备2台机器,安装CentOS7.6。ip计划如下:
192.168.2.15 scylla-node1
192.168.2.16 scylla-node2
2、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3、修改主机名
#设置主机名
hostnamectl set-hostname scylla-node1
通过hostname命令查看主机名,修改完后重启。
4、配置IP映射
vim /etc/hosts
最后增加以下内容:
192.168.2.15 scylla-node1
192.168.2.16 scylla-node2
5、创建用户
在root用户下添加scylla用户:
#添加组
groupadd scylla
#添加用户
adduser scylla -g scylla
#设置密码
passwd scylla
给scylla用户赋予权限:
#编辑/etc/sudoers
vi /etc/sudoers
#在root ALL=(ALL) ALL下增加scylla配置,最终如下
root ALL=(ALL) ALL
scylla ALL=(ALL) ALL
1、安装epel-release扩展包
sudo yum install epel-release
2、下载scylla的repo
sudo curl -o /etc/yum.repos.d/scylla.repo -L http://repositories.scylladb.com/scylla/repo/uuidValue/centos/scylladb-3.3.repo
3、安装scylla
sudo yum install scylla
已安装:
scylla.x86_64 0:3.3.0-0.20200319.7ae2cdf46c7
作为依赖被安装:
PyYAML.x86_64 0:3.10-11.el7 avahi-libs.x86_64 0:0.6.31-19.el7
copy-jdk-configs.noarch 0:3.3-10.el7_5 cups-libs.x86_64 1:1.6.3-40.el7
java-1.8.0-openjdk-headless.x86_64 1:1.8.0.242.b08-0.el7_7 javapackages-tools.noarch 0:3.4.1-11.el7
libjpeg-turbo.x86_64 0:1.2.90-8.el7 libreport-filesystem.x86_64 0:2.1.11-43.el7.centos
libxslt.x86_64 0:1.1.28-5.el7 libyaml.x86_64 0:0.1.4-11.el7_0
lksctp-tools.x86_64 0:1.0.17-2.el7 mdadm.x86_64 0:4.1-1.el7
pcsc-lite-libs.x86_64 0:1.8.8-8.el7 python-javapackages.noarch 0:3.4.1-11.el7
python-lxml.x86_64 0:3.2.1-4.el7 scylla-conf.x86_64 0:3.3.0-0.20200319.7ae2cdf46c7
scylla-jmx.noarch 0:3.3.0-20200320.c1bd349c530 scylla-kernel-conf.x86_64 0:3.3.0-0.20200319.7ae2cdf46c7
scylla-python3.x86_64 0:3.7.6-0.20200320.7ae2cdf46c7 scylla-server.x86_64 0:3.3.0-0.20200319.7ae2cdf46c7
scylla-tools.noarch 0:3.3.0-20200320.47cba912685 scylla-tools-core.noarch 0:3.3.0-20200320.47cba912685
tzdata-java.noarch 0:2019c-1.el7
完毕!
4、配置scylla
/data目录为大容量磁盘,创建数据文件和日志文件目录:
#创建工作目录
sudo mkdir -p /data/scylla/work
#创建数据目录
sudo mkdir -p /data/scylla/data
#创建日志目录
sudo mkdir -p /data/scylla/commitlog
#给目录权限
sudo chmod 777 -R /data/scylla
#更改目录所有者
sudo chown -R scylla:scylla /data/scylla
配置scylla-node1,编辑/etc/scylla/scylla.yaml,修改内容如下:
#集群名称,同集群名称相同
cluster_name: 'SDC-Scylla-Cluster'
#工作目录
workdir: /data/scylla/work
#数据目录
data_file_directories:
- /data/scylla/data
#日志目录
commitlog_directory: /data/scylla/commitlog
#集群种子节点ip,新加入的节点从种子节点同步数据,可为多个,中间逗号分隔
- seeds: "192.168.2.15"
#监听地址(本机ip或主机名)
listen_address: scylla-node1
#rpc地址(本机ip或0.0.0.0)
rpc_address: 0.0.0.0
#如果rpc_address设置为0.0.0.0,则放开此行注释
broadcast_rpc_address: 1.2.3.4
配置scylla-node2,编辑/etc/scylla/scylla.yaml,修改内容如下:
#集群名称,同集群名称相同
cluster_name: 'SDC-Scylla-Cluster'
#工作目录
workdir: /data/scylla/work
#数据目录
data_file_directories:
- /data/scylla/data
#日志目录
commitlog_directory: /data/scylla/commitlog
#集群种子节点ip,新加入的节点从种子节点同步数据,可为多个,中间逗号分隔
- seeds: "192.168.2.15"
#监听地址(本机ip或主机名)
listen_address: scylla-node2
#rpc地址(本机ip或0.0.0.0)
rpc_address: 0.0.0.0
#如果rpc_address设置为0.0.0.0,则放开此行注释
broadcast_rpc_address: 1.2.3.4
完成scylla配置,根据具体情况选择yes/no:
sudo scylla_setup
配置完成后提示如下:
ScyllaDB setup finished.
scylla_setup accepts command line arguments as well! For easily provisioning in a similar environment than this, type:
scylla_setup --no-raid-setup --nic eth0 --no-ntp-setup \
--no-coredump-setup --no-sysconfig-setup --no-io-setup \
--no-version-check --no-node-exporter \
--no-cpuscaling-setup --no-fstrim-setup
5、启动ScyllaDB
#启动ScyllaDB
sudo systemctl start scylla-server
如果启动失败,通过执行sudo journalctl -xe命令根据提示排查问题。
查看集群状态:
[scylla@scylla-node1 /]$ nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 192.168.2.15 970.81 KB 256 ? afcd898f-785f-491d-98d3-ea6e0a837da5 rack1
UN 192.168.2.16 432.26 KB 256 ? ad1c07ab-4466-4db3-92d1-6e11cfa78752 rack1
Note: Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless
三、简单使用
#连接cqlsh
[scylla@scylla-node1 /]$ cqlsh
Connected to SDC-Scylla-Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 | Cassandra 3.0.8 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.
#查看所有键空间
cqlsh> describe keyspaces;
system_traces system_schema system_auth system system_distributed
#创建键空间
cqlsh> create keyspace demo with replication = {'class':'SimpleStrategy', 'replication_factor' : 1};
#使用Keyspace
cqlsh> use demo;
#创建表
cqlsh:demo> create table student(
id int primary key,
name text,
age smallint
);
#插入数据
cqlsh:demo> insert into student(id,name,age) VALUES (1,'wangm',30);
cqlsh:demo> insert into student(id,name,age) VALUES (2,'wangj',29);
#查询所有数据
cqlsh:demo> select * from student;
id | age | name
----+-----+-------
1 | 30 | wangm
2 | 29 | wangj
(2 rows)
#创建索引
cqlsh:demo> create index student_name_index on student(name);
#条件查询
cqlsh:demo> select * from student where name = 'wangm';
id | age | name
----+-----+-------
1 | 30 | wangm
(1 rows)
#查看表详情
cqlsh:demo> describe student;
CREATE TABLE demo.student (
id int PRIMARY KEY,
age smallint,
name text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
AND comment = ''
AND compaction = {'class': 'SizeTieredCompactionStrategy'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE';
CREATE INDEX student_name_index ON demo.student (name);
CREATE MATERIALIZED VIEW demo.student_name_index_index AS
SELECT name, idx_token, id
FROM demo.student
WHERE name IS NOT NULL
PRIMARY KEY (name, idx_token, id)
WITH CLUSTERING ORDER BY (idx_token ASC, id ASC)
AND bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
AND comment = ''
AND compaction = {'class': 'SizeTieredCompactionStrategy'}
AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = '99.0PERCENTILE';