NoSQL 系统评估

发布于 2024-09-19 18:55:29 字数 10717 浏览 29 评论 0

Cassandra 系统

Cassandra ( https://cassandra.apache.org ) 是一个开源的、分布式、无中心、弹性可扩展、高可用、容错、一致性可调、面向行的数据库,它基于 Amazon Dynamo 的分布式设计和 Google Bigtable 的数据模型,由 Facebook 创建,在一些最流行的网站中得到应用。

Cassandra 的直接竞品包括 Hbase 等。和相关竞品相比,其主要设计和特点如下:

  • 分布式去中心化,本质上是一种 P2P 架构(相对于主从架构而言)
  • 弹性可扩展性,动态水平扩展
  • 高可用性和容错
  • 可调节的一致性
  • 基于多维稀疏哈希表的存储架构(也被成为面向行的存储)
  • 灵活的数据模式(相对于 KV 而言)
  • 高性能,充分利用多处理器和多核、高性能网络和存储等硬件系统

默认情况下,cas 使用到的端口如下,在做单主机多实例部署时,需要注意侦听冲突:

  • 7199 - JMX (was 8080 pre Cassandra 0.8.xx)
  • 7000 - Internode communication (not used if TLS enabled)
  • 7001 - TLS Internode communication (used if TLS enabled)
  • 9160 - Thrift client API
  • 9042 - CQL native transport port

安装和配置

规划示例

本案我们将尝试安装一个两主机/四节点的群集系统,每个主机提供两个虚拟 IP 地址,应用运行在虚拟 IP 之上,构成节点。

具体配置如下:
host1: 192.168.9.41(主节点,seed),192.168.9.42
操作系统为 CentOS 7.9

host2: 192.168.9.43,192.168.9.44
操作系统为 Oracle Linux 7.9

cassandra 系统规划配置

  • 群集名称 - ulCluster
  • 数据中心名称 - ulsctc,单数据中心
  • 机架名 - rackvm, 单机架
  • 主 seed - casnode1

为了在单主机上支持多个运行实例,我们的构想为为每个实例建立一个用户(casnode14) 和一个工作目录(/opt/casnode14),并赋予对应的权限。

每个工作目录中,包括了所有实例运行需要的文件和文件夹结构,包括以下内容

  • cassandra 程序文件夹,进一步包括了 conf、bin 等,由安装文件解压而来
  • data 数据文件夹,手工创建
  • logs 日志文件夹,手工创建
  • hint 提示文件夹,手工创建
  • saved_caches 缓存文件夹,手工创建
  • commitlog 提交日志文件夹,手工创建

然后在 conf 文件中,针对这些配置信息进行相应修改,满足运行环境需求。可以先准备好一份完整的文件结构,复制到不同的主机上,修改配置运行即可。

支撑软件

cassandra 安装和运行需要 java(1.8) 和 python(2.7)。在操作系统上进行确认。

其他可能用到的支撑软件包括: nano,wget,screen

系统需求和准备

在所有主机上,修改/etc/hosts 文件,增加如下内容:

192.168.9.41 casnode1
192.168.9.42 casnode2
192.168.9.43 casnode3
192.168.9.44 casnode4

随后在配置文件中可以直接使用主机名。

创建用户,赋权和文件夹准备的示例命令如下:

useradd casnode4 // 创建工作用户
mkdir /opt/casnode4 // 创建工作目录
cd /opt/casnode4 /
mkdir data logs hints commitlog saved_caches // 创建相关目录
chown -R casnode4:casnode4 /opt/casnode4 // 修改工作目录属主
su casnode2 // 切换工作用户

在线安装

cassandra 官方提供了基于软件包的安装方式。如果单独主机安装,可以考虑这种方式。

二进制包方式

可以直接在官网上下载最新稳定版的 tarball 文件: https://cassandra.apache.org/download/

解压后,重新将目录命名为 cassandra,放入/opt/casnode 文件夹中

节点配置(以 node4 为例)

节点配置包括以下内容

// cassandra-env.sh 7190+n
// 由于使用绝对路径,注释以下选项
## JVM_OPTS="$JVM_OPTS -Xlog:gc:/opt/casnode6/logs/gc.log"
// 设置 JMX 端口号,不冲突
JMX_PORT="7194"

// jvm.options JVM 选项 
-Xloggc:/opt/casnode4/logs/gc.log

// 如果 java >9 
-Xlog:gc:/opt/casnode4/logs/gc.log

// logback.xml, 文件位置,四处
<file>/opt/casnode4/logs/system.log</file>


// cassandra.yaml,集群名称,侦听地址,rpc,data/commitlog/saved_caches/hints
cluster_name: 'ulCluster'
listen_address: casnode4

       - seeds: "casnode1"


rpc_address: casnode4
start_rpc: true

data_file_directories:
       - /opt/casnode4/data

commitlog_directory: /opt/casnode4/commitlog
saved_caches_directory: /opt/casnode4/saved_caches
hints_directory: /opt/casnode4/hints

启动系统和状态检查

// 按需,关闭防火墙
systemctl stop firewalld

// 切换到用户,启动系统
screen -S casnode4 
cd /opt/casnode4/cassandra/bin
./cassandra -f  // 前端显示过程  

// 验证
nodetool status

cqlsh node1 

基本数据操作

// 连接一个节点
cqlsh node1 

// 查询键空间
desc keyspaces;

常见安装配置错误

  • 端口冲突
    需要使用 netstat 检查程序端口占用,并在配置文件中修改相关冲突的端口。
  • 配置语法错误
    要特别注意 data_file_director 的配置语法。
  • OpenJDK 11 环境
    如果使用 OpenJDK 或者 8 以上的版本,可能会遇到如下错误或警告:
intx ThreadPriorityPolicy=42 is outside the allowed range [ 0 ... 1 ]

-Xloggc is deprecated. Will use -Xlog:gc:./../logs/gc.log instead.

Unrecognized VM option 'UseParNewGC'

Unrecognized VM option 'PrintGCDateStamps'

Option UseConcMarkSweepGC was deprecated 

Unrecognized VM option 'PrintHeapAtGC'
Unrecognized VM option 'PrintTenuringDistribution'
Unrecognized VM option 'PrintGCApplicationStoppedTime'
Unrecognized VM option 'PrintPromotionFailure'
Unrecognized VM option 'UseGCLogFileRotation'

处理方式,在 jvm.option 文件中,注释 ThreadPriorityPolicy 项目,修改 -Xloggc

## -XX:+UseParNewGC
# -XX:ThreadPriorityPolicy=1
# -XX:+UseConcMarkSweepGC
# -XX:+PrintGCDateStamps
# -XX:+PrintHeapAtGC
# -XX:+PrintTenuringDistribution
# -XX:+PrintPromotionFailure

-Xlog:gc:/opt/casnode5/logs/gc.log

Cassandra 简单应用

键空间和表

// 连接集群
cqlsh casnode1

// 创建键空间
CREATE KEYSPACE IF NOT EXISTS uldata 
WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };

// 列出所有键空间
desc keyspaces;

// 切换键空间
use uldata;

// 创建表
Create table Users (
       UserNo int,
       Name text,
       contact text,
       descp text,
       Primary key(UserNo)
);

// 查询表
desc tables;

// 插入数据
INSERT INTO Users  (UserNo, Name, contact) 
VALUES  (101, 'yanjh','yanjh@sina.com');

// 查询数据
SELECT * from Users where UserNo= 101;

Nodejs 开发

Cassandra 提供了一个半官方的 Nodejs 库,名为 cassandra-driver,可用进行数据管理开发,其简单的使用示例如下

// cas 库和配置信息
const cassandra = require('cassandra-driver');
const CAS_CONFIG = { 
cps:["casnode1", "casnode3" ],
dc: "datacenter1",
ks: "uldata"
} 

// cas 客户端
const client = new cassandra.Client({
contactPoints: CAS_CONFIG.cps,
localDataCenter: CAS_CONFIG.dc,
keyspace: CAS_CONFIG.ks
});

// 创建查询语句,注意如果不直接使用 key, 可能需要 ALLOW FILTERING
const query = 'SELECT UserNo, Name, contact FROM Users WHERE Name = ? ALLOW FILTERING';

// 执行查询
client
.execute(query, [ 'yanjh' ])
.then(r => {
console.log('Users: ', r.rows);
});

Yugadb 系统

Cockroach 系统

概述

cockroach(蟑螂) 是一个新兴的分布式 NewSQL 数据库系统。和传统关系性、非关系性、对象数据库和类似的竞争对手相比,它具备一些自己的特点:

-- 几乎完全的点对点复制网络,理想的可扩展性和高可用性
-- 更好的事务支持
-- SQL API 几乎可以直接支持传统 Postgres 客户端应用和数据操作方法
-- 单一的可执行软件,全参数化配置,方便操作、移植,特别是对云计算环境的支持
-- 使用 go 语言开发,性能和资源占用比较有优势
-- 提供了基于 Web 的管理和监控程序和丰富的功能

系统安装和配置

规划和准备

本例初步规划使用四台主机,但配置 8 个独立的 IP 地址,每个作为一个节点。

所使用的 Linux 发行版本不限。

首先创建和修改 host 文件,所有节点主机都建议配置。此处每个节点的主机名称为 cknoden,群集 dns 域为 ulsc.local。

192.168.9.31 cknode1.ulsc.local
192.168.9.32 cknode2.ulsc.local
192.168.9.33 cknode3.ulsc.local
192.168.9.34 cknode4.ulsc.local
192.168.9.35 cknode5.ulsc.local
192.168.9.36 cknode6.ulsc.local
192.168.9.37 cknode7.ulsc.local
192.168.9.39 cknode9.ulsc.local

建议创建专门的 cockroach 用户,来进行相关的运行和操作。

sudo create cockroach
sudo mkdir /opt/cockroach
sudo chown cockroach:cockroach /opt/cockroach

cockroach 群集,对于时间同步的要求比较高,强烈建议安装 ntpdate 客户端,并使用自动校时机制:

## 编辑 /etc/crontab ,增加以下内容
/5 * * * * /usr/sbin/ntpdate cn.pool.ntp.org

我们规划使用/opt/cockroach 作为主工作文件夹,作为 cockroach 的宿主文件夹,下属文件和目录包括:

cockroach 主程序文件
datan // 节点 n 的数据文件夹,节点运行后内含 Logs 日志文件夹
certsn // 节点 n 的证书文件夹
startn.sh // 节点 n 启动文件

可以从 cockroach lab 官方网站上,下载最新的 cockroach 二进制版本。

wget -qO-   https://binaries.cockroachdb.com/cockroach-v20.2.3.linux-amd64.tgz   | tar xvz
tar xvzf cockroach-v20.2.3.linux-amd64.tgz

证书管理

我们使用安全方式创建群集,需要先进行相关证书的创建和管理。

所有证书管理操作,都在 node1 主机上完成。证书文件包括群集证书、节点证书和客户证书

  • 群集证书
    如果是完全的新建群集,需要先创建群集证书。
cd /opt/cockroach 
./cockroach cert create-ca \
--certs-dir=certs \
--ca-key=certs/ca.key

此处为了方便管理,将 cert 和 key 文件放在同一个文件夹中。理论上,需要将 cert 分配给所有节点主机。

  • 节点证书
    节点证书是各个节点之间通讯安全的保证,所有节点证书都基于群集证书创建。

基于群集证书和各节点主机名称,可以创建各节点的证书和 key。

./cockroach cert create-node \
cknode7 \
cknode7.ulsc.local \
--certs-dir=certs \
--ca-key=certs/ca.key
mkdir certs/n7
mv certs/node.* certs/n7/.

命令执行后,会在 certs 文件夹中,生成 node.crt 和 node.key 文件(但都是针对 cknode7 的),为了方便管理,为 Node7 创建了文件夹,随后应当将这两个文件复制到 node7 所在的主机和运行实例 cert 文件夹中。

配置完成后,所有节点实例的 certs 文件夹中,一般有三个文件,包括 ca.crt,node.crt 和 node.key 文件。

  • 客户端证书
    客户端证书,用于客户端软件和应用连接群集使用。
cockroach cert create-client \
root \
--certs-dir=certs \
--ca-key=certs/ca.key

生成的客户端证书的形式为 client-name.key 和 client-name.crt。

启动第一个节点

逻辑上而言,cockroach 的所有节点的地位都是相同的,但基于方便,我们会将 node1 作为初始配置节点,因为基于这个节点,有一些额外的工作,如初始化群集和证书管理等等。

为了方便使用,我们在/opt/cockroach 目录下,创建 start1.sh 文件作为节点 1 的启动文件,内容如下:

#!/bin/bash
./cockroach start \
--certs-dir=certs1 \
--store=data1 \
--listen-addr=cknode1.ulsc.local:26257 \
--http-addr=cknode1.ulsc.local:8090 \
--join=cknode1.ulsc.local:26257,cknode4.ulsc.local:26257 \
--background

此命令可以指定证书文件夹(文件夹中必须包含 node.cert 和 node.key 文件)、数据文件夹、侦听 IP 和端口、http 服务端口、群集入口(可以设置多个) 和是否后端运行等。

全新创建群集时,运行以上命令,虽然节点启动,但没有初始的群集,需要使用以下命令进行初始化:

./cockroach init --certs-dir=certs --host=cknode1.ulsc.local:26257

初始化群集后,才可以使用浏览器访问管理 UI

https://cknode1.ulsc.local:8090  

启动时,经常可以遇到证书的错误,除了正确的证书文件位置外,还需要将所有的.key 文件的权限修改为 0400(属主只读),并确认相关文件的属主均为 cockroach。

启动其他节点

启动其他节点,同样可以创建节点启动脚本,修改为对应的参数就可以了。特别要注意区分数据文件夹和证书文件夹。

如果配置得当,程序启动后,就可以直接连接到群集,并加入群集了。

可以在一个主机上,运行多个实例,使用不同的 IP、端口、证书和 Data 文件夹进行区分。

连接群集和创建管理账号

在 node1 上,可以直接使用 root 账号证书连接群集:

./cockroach sql --certs-dir=certs --host=cknode1.ulsc.local:26257

连接群集后,可以考虑创建一个额外的管理员账号和工作数据库,并进行赋权:

CREATE USER dbadmin WITH PASSWORD 'admin123';
GRANT admin TO dbadmin WITH ADMIN OPTION;
SHOW GRANTS FOR dbadmin;
CREATE database uldata;
GRANT ALL ON DATABASE uldata TO dbadmin;

创建管理账号后,可以使用浏览器访问管理界面,并使用管理员账号进行登录。

常见故障

  • 服务启动时,提示证书权限错误,修改 key 文件为属主只读权限
    chmode 440 *.key
  • 节点不能启动,而且没有明确的错误信息,可能是由于服务器时间不同步造成
    启动后,可以使用 ps 或者 netstat 查看程序运行状态,可能会看到程序没有正常启动的状态。
  • 服务可以启动,但数据不能同步,可能是节点双向通讯故障造成,如果使用主机名成作为节点名称,要保证 dns 或者 hosts 解析

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

月野兔

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文