ScyllaDB 是用 C++ 重写的 Cassandra,每节点每秒处理 100 万 TPS。ScyllaDB 完全兼容 Apache Cassandra,拥有比 Cassandra 多 10x 倍的吞吐量,降低了延迟。 ScyllaDB 是性能优异的 NoSQL 列存储数据库。 ScyllaDB 在垃圾收集或者 Compaction 的时候不需要暂停;在常规生产负载的时候可以添加和删除节点。官网地址:https://www.scylladb.com
基于ScyllaDB如此高的性能,用于替换 Cassandra势在必行。ScyllaDB 安装建议直接使用Docker安装替代二进制安装,原因二进制步骤繁琐,且经常安装失败。同时ScyllaDB 对cpu和系统也需要较高版本。
1.首先下载docker镜像:
docker pull scylladb/scylla
2.暴露端口,持久化数据 部署scylladb
docker run -p 9042:9042 -it --name some-scylla --volume /var/lib/scylla:/var/lib/scylla -d scylladb/scylla
3.其他集群部署方式可以参考 docker镜像地址:https://hub.docker.com/r/scylladb/scylla/
1.首先进入scylladb
docker exec -it some-scylla cqlsh
2.新建一个数据库:
CREATE KEYSPACE IF NOT EXISTS myCas WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};
describe keyspaces;
use mycas;
因为scylladb 直接是兼容Cassandra,故我们可以直接使用Cassandra的golang客户端github.com/gocql/gocql
package dbtest
import (
"testing"
"github.com/gocql/gocql"
"github.com/labstack/gommon/log"
"fmt"
)
var session *gocql.Session
//初始化
func init() {
cluster := gocql.NewCluster("127.0.0.1:9042")
cluster.Keyspace = "mycas"
cluster.Consistency = gocql.Consistency(1)
cluster.NumConns = 3
var err error
session, err = cluster.CreateSession()
if err != nil {
log.Panic("start", err)
return
}
}
//创建表
func TestScylla_Create(t *testing.T) {
query := fmt.Sprintf(`CREATE TABLE user(id int PRIMARY KEY, user_name varchar);`)
session.Query(query).Exec()
}
//插入数据
func TestScylla_Insert(t *testing.T) {
query := fmt.Sprintf(`INSERT INTO user (id,user_name) VALUES (1,'zhangsan')`)
err := session.Query(query).Exec()
if err != nil {
fmt.Println(err)
}
}
//删除表
func TestScylla_Drop(t *testing.T) {
query := fmt.Sprintf(`drop table user;`)
err := session.Query(query).Exec()
if err != nil {
fmt.Println(err)
}
}
//查询数据
func TestScylla_Select(t *testing.T) {
query := fmt.Sprintf("SELECT * from user;")
iter := session.Query(query).Iter()
defer func() {
if iter != nil {
iter.Close()
}
}()
var id int
var name string
for iter.Scan(&id, &name) {
fmt.Println(id, name)
}
}
//批量执行数据
func TestScylla_Batch(t *testing.T) {
query := fmt.Sprintf(`BEGIN BATCH
UPDATE user SET user_name = 'asdqw' where id = %d;
INSERT INTO user (id,user_name) VALUES (2,'zhangsan');
APPLY BATCH;`, 1)
err := session.Query(query).Exec()
if err != nil {
fmt.Println(err)
}
}