分布式NoSQL数据库Cassandra集群搭建

1 Cassandra介绍

1.1 Cassandra介绍

  Cassandra是一套开源分布式NoSQL数据库系统。它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,此后,由于Cassandra良好的可扩展性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。
Cassandra是一个混合型的非关系的数据库,类似于Google的BigTable。其主要功能比Dynamo (分布式的Key-Value存储系统)更丰富,但支持度却不如文档存储MongoDB(介于关系数据库和非关系数据库之间的开源产品,是非关系数据库当中功能最丰富,最像关系数据库的。支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型)。Cassandra最初由Facebook开发,后转变成了开源项目。它是一个网络社交云计算方面理想的数据库。以Amazon专有的完全分布式的Dynamo为基础,结合了Google BigTable基于列族(Column Family)的数据模型。P2P去中心化的存储。很多方面都可以称之为Dynamo 2.0。

1.2 Cassandra的特点

弹性可扩展性 - Cassandra是高度可扩展的; 它允许添加更多的硬件以适应更多的客户和更多的数据根据要求。
数据存储灵活 - Cassandra适应所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据您的需要动态地适应变化的数据结构。
便捷的数据分发 - Cassandra通过在多个数据中心之间复制数据,可以灵活地在需要时分发数据。
快速写入 - Cassandra被设计为在廉价的商品硬件上运行。 它执行快速写入,并可以存储数百TB的数据,而不牺牲读取效率。

2 准备环境

  Cassandra选择了无中心的P2P架构,网络中的所有节点都是对等的,它们构成了一个环,节点之间通过Gossip协议每秒钟和至多三个节点交换一次数据,这样每个节点都拥有其它所有节点的信息,包括位置、状态等。为了保证数据交换的准确性,所有的节点必须使用同一份集群列表,这样的节点又被称作seed节点。


 

 主机

环境 部署内容
 192.168.220.129(master) centos7.6

apache-cassandra-3.11.6
jdk1.8.0_202

192.168.220.130(seed) centos7.6

apache-cassandra-3.11.6
jdk1.8.0_202

192.168.220.131(seed) centos7.6

apache-cassandra-3.11.6
jdk1.8.0_202

 

 

 

 

 

 

 

 

 

 

3 集群搭建

安装包下载地址:http://archive.apache.org/dist/cassandra
wget http://archive.apache.org/dist/cassandra/3.11.6/apache-cassandra-3.11.6-bin.tar.gz

3.1 搭建java环境

[root@test1 ~]# mkdir /usr/java
[root@test1 ~]# tar -zxvf jdk-8u202-linux-x64.tar.gz -C /usr/java >/dev/null 2>&1
[root@test1 ~]# vim /etc/profile.d/java.sh 
export JAVA_HOME=/usr/java/jdk1.8.0_202
export PATH=$PATH:$JAVA_HOME/bin
[root@test1 ~]# source /etc/profile.d/java.sh
验证:
[root@test1 ~]# java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)

3.2 部署Cassandra

添加用户
[root@test1 ~]# useradd cassandra

创建目录
[root@test1 ~]# mkdir -pv /data01/cassandra/{commitlog,data,saved_caches}
[root@test1 ~]# mkdir -pv /var/log/cassandra/
目录授权
chown -R cassandra.cassandra /data01/cassandra/{commitlog,data,saved_caches} 
[root@test1 ~]# chown -R cassandra.cassandra /var/log/cassandra/

编辑文件
[root@test1 ~]# vim /opt/cassandra/conf/cassandra.yaml
#集群名称
cluster_name: 'test'
#数据存储的目录,默认为/var/lib/cassandra/data,这里按照自己的路径配置,这项可以有多个目录分行写
data_file_directories:
- /data01/cassandra/data
#提交日志存放目录,默认为/var/lib/cassandra/data。
data_file_directories:
- /data01/cassandra/data
#缓存目录,默认为/var/lib/cassandra/saved_caches。
saved_caches_directory: /data01/cassandra/saved_caches
#seed节点 这里我使用192.168.220.130和192.168.220.131服务器作为种子节点,ip中间使用逗号隔开
seeds: “192.168.220.130,192.168.220.131”
#监听地址 这项配置当前服务器ip,rpc_address 和 listen_address一样填写当前服务器ip
listen_address:192.168.220.129
rpc_address:192.168.220.129
其他两台机器如上配置,注意的是 listen_address, rpc_address 这两项填写该台服务器地址($ip)

JVM内存堆大小和gc日志文件路径修改
默认为4G
[root@test1 ~]# vim /opt/cassandra/conf/jvm.options
#JVM内存堆
#-Xms4G
#-Xmx4G
#gc日志文件路径
-Xloggc:/var/log/cassandra/gc.log

cassandra日志路径文件修改
vim /opt/cassandra/conf/logback.xml
<level>INFO</level>
    </filter>
    <file>/var/log/cassandra/system.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>/var/log/cassandra/system.log.%i.zip</fileNamePattern>

<file>/var/log/cassandra/debug.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>/var/log/cassandra/debug.log.%i.zip</fileNamePattern>

3.3 集群启动

创建启动文件
[root@test1 ~]# vim /etc/systemd/system/cassandra.service
[Unit]
Description=Cassandra Server Service
After=network.service

[Service]
Type=simple
Environment=JAVA_HOME=/usr/java/jdk1.8.0_202

PIDFile=/home/cassandra/cassandra.pid
User=cassandra
ExecStart=/opt/cassandra/bin/cassandra -f -p /home/cassandra/cassandra.pid
StandardOutput=journal
StandardError=journal
LimitNOFILE=100000
LimitMEMLOCK=infinity
LimitNPROC=32768
LimitAS=infinity

[Install]
WantedBy=multi-user.target

启动
[root@test1 ~]# systemctl start cassandra
[root@test1 ~]# systemctl enable cassandra
[root@test1 ~]# ps -ef |grep cassandra

4 Cassandra集群验证及简单使用

4.1 Cassandra集群验证

[root@test1 /opt/cassandra/bin]# ./nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens       Owns (effective)  Host ID                               Rack
UN  192.168.220.129  263.76 KiB  256          35.3%             c425b8ec-68e7-4be6-8a09-1e5f57e10da0  rack1
UN  192.168.220.130  223.55 KiB  256          31.2%             ca9b052b-fd7d-4e1f-8627-c5946dbfa9ea  rack1
UN  192.168.220.131  358.28 KiB  256          33.5%             51b921a2-f378-46ff-aa21-fe1021aeb1a6  rack1

4.2 Cassandra简单使用

官方文档:http://cassandra.apache.org/doc/latest/cql/index.html

[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>
1 查询全部的keyspace
cqlsh> describe keyspaces;
ks1  system_schema  system_auth  system  system_distributed  system_traces

2 创建一个keyspace:CREATE KEYSPACE IF NOT EXISTS test WITH REPLICATION = {'class': 'SimpleStrategy','replication_factor':1};
   class : 副本配置策略(总共有三种):
    Simple Strategy(RackUnaware Strategy):副本不考虑机架的因素,按照Token放置在连续下几个节点。假如副本数为3,属于A节点的数据在B.C两个节点中也放置副本。
        OldNetwork Topology Strategy(RackAware Strategy):考虑机架的因素,除了基本的数据外,先找一个处于不同数据中心的点放置一个副本,其余N-2个副本放置在同一数据中心的不同机架中。
        Network Topology Strategy(DatacneterShard Strategy):将M个副本放置到其他的数据中心,将N-M-1的副本放置在同一数据中心的不同机架中。

3 使用某个keyspace:use myCas;

4 查询全部的table:desc tables;                                    

5 创建一张表:CREATE TABLE user (id int, user_name varchar, PRIMARY KEY (id) );
创建表的时候至少指定一个主键

6 向表中插入一条记录:INSERT INTO user (id,user_name) VALUES (1,'test');
列名必须要显示指定,如果表中已存在相同主键的记录,那么该操作会覆盖表中已存在的记录

使用参考
https://www.cnblogs.com/youzhibing/p/6549960.html
https://www.cnblogs.com/leiwenbin627/p/11780223.html

4.3 Cassandra设置访问密码

修改配置文件 cassandra.yaml
把 authenticator: AllowAllAuthenticator改为authenticator: PasswordAuthenticator

重启cassandra
[root@test1 ~]# systemctl restart cassandra

此时之前的登录方式无法再登录进去
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129 
Connection error: ('Unable to connect to any servers', {'192.168.220.129': AuthenticationFailed('Remote end requires authentication.',)})

使用默认用户名cassandra和默认密码cassandra登录
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129 -ucassandra -pcassandra
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cassandra@cqlsh> 

创建用户
CREATE USER myusername WITH PASSWORD 'mypassword' SUPERUSER ;
cassandra@cqlsh> CREATE USER root WITH PASSWORD 'flz_3qc' SUPERUSER ;

删除默认帐号
注意:需要用新创建的账号重新登录,才可以删除默认账号
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129 -uroot -pflz_3qc
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
root@cqlsh> DROP USER cassandra;
root@cqlsh> 

无密码登录
vim /root/.cassandra/cqlshrc
[authentication]
username = root
password = flz_3qc
测试
[root@test1 /opt/cassandra/bin]# ./cqlsh 192.168.220.129
Connected to test at 192.168.220.129:9042.
[cqlsh 5.0.1 | Cassandra 3.11.6 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
root@cqlsh> 

 

 

上一篇:NOSQL相关


下一篇:NoSQL数据库之Redis Cluster(集群)