title: Cassandra集群部署及维护 #标题tags: #标签
date: 2022-01-04
categories: linux大杂烩 # 分类

Cassandra集群部署及维护 - 图1

Cassandra简介

Apache Cassandra最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynamo的完全分布式的架构于一身Facebook于2008将 Cassandra 开源,

Apache Cassandra是一个高度可扩展的高性能分布式数据库,用于处理大量商用服务器上的大量数据,提供高可用性,无单点故障,是一种NoSQL类型的数据库。

由于Cassandra良好的可扩展性,被Digg、Twitter等知名Web 2.0网站所采纳,成为了一种流行的分布式结构化数据存储方案。

Cassandra特点

Cassandra因其卓越的技术特性而变得如此受欢迎。下面给出了Cassandra的一些特性:

  • 弹性可扩展性:Cassandra是高度可扩展的; 它允许添加更多的硬件以适应更多的客户和更多的数据根据要求。
  • 始终基于架构:Cassandra没有单点故障,它可以连续用于不能承担故障的关键业务应用程序。
  • 快速线性性能:Cassandra是线性可扩展性的,即它为你增加集群中的节点数量增加你的吞吐量。因此,保持一个快速的响应时间。
  • 灵活的数据存储:Cassandra适应所有可能的数据格式,包括:结构化,半结构化和非结构化。它可以根据您的需要动态地适应变化的数据结构。
  • 便捷的数据分发:Cassandra通过在多个数据中心之间复制数据,可以灵活地在需要时分发数据。
  • 事务支持:Cassandra支持属性,如原子性,一致性,隔离和持久性(ACID)。
  • 快速写入:Cassandra被设计为在廉价的商品硬件上运行。 它执行快速写入,并可以存储数百TB的数据,而不牺牲读取效率。

Cassandra架构

Cassandra的设计目的是处理跨多个节点的大数据工作负载,而没有任何单点故障。Cassandra在其节点之间具有对等分布式系统,并且数据分布在集群中的所有节点之间。

集群中的所有节点都扮演相同的角色。 每个节点是独立的,并且同时互连到其他节点。集群中的每个节点都可以接受读取和写入请求,无论数据实际位于集群中的何处。

当节点关闭时,可以从网络中的其他节点提供读/写请求。

Cassandra中的数据复制

在Cassandra中,集群中的一个或多个节点充当给定数据片段的副本。

如果检测到一些节点以过期值响应,Cassandra将向客户端返回最近的值。

返回最新的值后,Cassandra在后台执行读修复以更新失效值。

下图显示了Cassandra如何在集群中的节点之间使用数据复制,以确保没有单点故障的示意图。

Cassandra集群部署及维护 - 图2

:Cassandra在后台使用Gossip协议,允许节点相互通信并检测集群中的任何故障节点。Gossip协议是一个通信协议,一种传播消息的方式,使用Gossip协议的有:Redis Cluster、Consul、Apache Cassandra等。

Cassandra的相关术语

Cassandra的关键组件如下:

  • 节点:它是存储数据的地方。
  • 数据中心:它是相关节点的集合。
  • 集群:集群是包含一个或多个数据中心的组件。
  • 提交日志:提交日志是Cassandra中的崩溃恢复机制。每个写操作都写入提交日志。
  • Mem-表:mem-表是存储器驻留的数据结构。提交日志后,数据将被写入mem表。有时,对于单列族,将有多个mem表。
  • SSTable:它是一个磁盘文件,当其内容达到阈值时,数据从mem表中刷新。
  • 布隆过滤器:这些只是快速,非确定性的算法,用于测试元素是否是集合的成员。它是一种特殊的缓存。 每次查询后访问Bloom过滤器。

安装Cassandra集群

环境准备

OS 主机名 IP Cassandra版本 Cluster Port Client Port
Cent OS 7.5 centos-20-2 192.168.20.2 3.11.11 7000 9042
Cent OS 7.5 centos-20-3 192.168.20.3 3.11.11 7000 9042
Cent OS 7.5 centos-20-4 192.168.20.4 3.11.11 7000 9042

环境配置

所有节点必须对节点进行初始化配置。

修改系统限制

  1. $ mv /etc/security/limits.conf{,.bak}
  2. cat > /etc/security/limits.conf << EOF
  3. * - nofile 655360
  4. * - memlock unlimited
  5. * - stack 655360
  6. * - nproc unlimited
  7. EOF
  8. cat > /etc/sysctl.conf << EOF
  9. kernel.sysrq = 0
  10. kernel.core_uses_pid = 1
  11. fs.file-max=655360
  12. kernel.msgmnb = 65536
  13. kernel.msgmax = 65536
  14. kernel.shmmax = 68719476736
  15. kernel.shmall = 4294967296
  16. kernel.pid_max = 655360
  17. net.ipv4.tcp_tw_reuse = 1
  18. net.ipv4.tcp_tw_recycle = 0
  19. net.ipv4.tcp_max_tw_buckets = 10000
  20. net.ipv4.tcp_fin_timeout = 30
  21. net.ipv4.tcp_timestamps = 0
  22. net.ipv4.tcp_sack = 1
  23. net.ipv4.tcp_window_scaling = 1
  24. net.ipv4.tcp_ecn = 0
  25. net.ipv4.tcp_keepalive_time = 600
  26. net.ipv4.tcp_keepalive_intvl = 30
  27. net.ipv4.tcp_keepalive_probes = 3
  28. net.ipv4.tcp_max_orphans = 655360
  29. net.ipv4.tcp_max_syn_backlog = 262144
  30. net.ipv4.tcp_mem = 65536 131072 262144
  31. net.ipv4.udp_mem = 65536 131072 262144
  32. net.ipv4.tcp_rmem = 4096 87380 16777216
  33. net.ipv4.tcp_wmem = 4096 16384 16777216
  34. net.ipv4.ip_local_port_range = 1024 65535
  35. net.ipv4.route.gc_timeout = 100
  36. # 禁止icmp重定向报文
  37. net.ipv4.conf.all.accept_redirects = 0
  38. # 禁止icmp源路由
  39. net.ipv4.conf.all.accept_source_route = 0
  40. net.core.somaxconn = 65535
  41. net.core.rmem_default = 8388608
  42. net.core.wmem_default = 8388608
  43. net.core.rmem_max = 16777216
  44. net.core.wmem_max = 16777216
  45. net.core.netdev_max_backlog = 262144
  46. vm.swappiness = 10
  47. vm.overcommit_memory = 1
  48. vm.max_map_count = 262144
  49. EOF
  50. sysctl -p

配置ntp时间同步

任意一台节点配置时间服务器,其他节点制定定时任务即可。

  1. $ yum -y install ntp
  2. $ vim /etc/ntp.conf # 修改配置文件
  3. # 找到(17行左右):
  4. #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
  5. # 改为(网段是你自己的网段,表示允许哪个网段的客户端来同步时间):
  6. restrict 192.168.20.0 mask 255.255.255.0 nomodify notrap
  7. # 找到
  8. server 0.centos.pool.ntp.org iburst
  9. server 1.centos.pool.ntp.org iburst
  10. server 2.centos.pool.ntp.org iburst
  11. server 3.centos.pool.ntp.org iburst
  12. # 将其注释掉,表示不使用互联网上的时间同步服务器
  13. #server 0.centos.pool.ntp.org iburst
  14. #server 1.centos.pool.ntp.org iburst
  15. #server 2.centos.pool.ntp.org iburst
  16. #server 3.centos.pool.ntp.org iburst
  17. # 末尾追加
  18. server 127.127.1.0
  19. fudge 127.127.1.0 stratum 5
  20. # 在上级时钟源失效时,NTP会使用127.127.1.0的本地时钟,将local时间作为ntp服务器时间提供给ntp客户端。
  21. # NTP把本地主机的时钟也看作外部时钟源来处理,分配的地址是127.127.1.0
  22. # 让硬件时间和系统时间一起同步
  23. $ echo 'SYNC_HWCLOCK=yes' >> /etc/sysconfig/ntpd
  24. # 重启ntp服务器生效
  25. $ systemctl restart ntpd && systemctl enable ntpd
  26. # 配置其他客户端定时同步时间(哪些机器要同步上面时间服务器的时间,就进行以下配置)
  27. $ yum -y install ntp
  28. $ crontab -e # 写入以下定时任务
  29. */5 * * * * /usr/sbin/ntpdate 192.168.20.2 &> /dev/null

配置jdk环境

Cassandra运行需要jdk环境,请自行去官网下载jdk。我这里用的是jdk 8版本。

$ tar zxf jdk-8u261-linux-x64.tar.gz  -C /opt/
$ ln -sf /opt/jdk1.8.0_261 /opt/jdk
$ cat >> /etc/profile << EOF
export JAVA_HOME=/opt/jdk
export CLASSPATH=\$JAVA_HOME/lib
export PATH=\$JAVA_HOME/bin:\$PATH
EOF

$ source /etc/profile
$ java -version
java version "1.8.0_261"
Java(TM) SE Runtime Environment (build 1.8.0_261-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.261-b12, mixed mode)

下载并配置Cassandra

下面的代码块中的操作,只需要在其中一个节点执行即可,我这里在192.168.20.2这个节点执行。(其他节点并不是不需要安装配置,而是可以在一个节点上配置好后,scp拷贝到其余节点,然后稍作修改即可使用。)

# 下载二进制包
$ wget https://mirrors.tuna.tsinghua.edu.cn/apache/cassandra/3.11.11/apache-cassandra-3.11.11-bin.tar.gz --no-check-certificate

# 解压并创建相关目录及cassandra的启动用户并更改属主
$ tar -zxf apache-cassandra-3.11.11-bin.tar.gz -C /opt/
$ ln -sf /opt/apache-cassandra-3.11.11 /opt/cassandra
$ mkdir -p  /data/cassandra/{data,commitlog,saved_caches,logs,hints}
$ useradd cassandra -s /sbin/nologin 


# 修改配置文件
$ vim /opt/cassandra/conf/cassandra.yaml

cluster_name: 'ljz_test_cluster'           # 集群名称
data_file_directories:
    - /data/cassandra/data                   # 数据目录(出于性能原因,如果有多个磁盘,可以考虑将提交日志和数据文件放在不同的磁盘上。)
commitlog_directory: /data/cassandra/commitlog      # 提交日志,如果未设置,则默认目录为$CASSANDRA_HOME/data/commitlog
saved_caches_directory: /data/cassandra/saved_caches     # 保存缓存,如果未设置,默认目录$CASSANDRA_HOME/data/saved_caches
hints_directory: /data/cassandra/hints     # 存储提示的目录。如果没有设置,目录为$CASSANDRA HOME/data/hints。

seed_provider:
        ......... # 省略部分内容
      parameters:
          # seeds is actually a comma-delimited list of addresses.
          # Ex: "<ip1>,<ip2>,<ip3>"
          - seeds: "192.168.20.2,192.168.20.3,192.168.20.4"      # 指定参与集群的节点IP,逗号分隔

# 端口相关配置
storage_port: 7000           # 命令和数据传输端口
ssl_storage_port: 7001        # ssl加密的命令和数据传输端口
listen_address: 192.168.20.2       # 监听地址,不可设置为0.0.0.0
rpc_address: 192.168.20.2         # 设置rpc监听地址
rpc_port: 9160                # rpc监听端口
native_transport_port: 9042         # native 监听端口



# 设置日志存储目录
$ sed -i '/JVM_PATCH_VERSION/a\CASSANDRA_LOG_DIR=/data/cassandra/logs' /opt/cassandra/conf/cassandra-env.sh



$ chown -R cassandra /data/cassandra /opt/cassandra /opt/apache-cassandra-3.11.11



# 定义systemd启停文件

$ cat << EOF > /etc/systemd/system/cassandra.service
[Unit]
Description=Cassandra Server Service
After=network.service

[Service]
Type=simple
Environment=JAVA_HOME=/opt/jdk

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

[Install]
WantedBy=multi-user.target
EOF






# 将所需文件及目录copy到另外两个节点
$ for i in 3 4;do rsync -az /data/cassandra 192.168.20.${i}:/data/;done
$ for i in 3 4;do rsync -az /opt/apache-cassandra-3.11.11 192.168.20.${i}:/opt/;done
$ for i in 3 4;do rsync -az /etc/systemd/system/cassandra.service 192.168.20.${i}:/etc/systemd/system/;done

其他节点修改配置

当第一个节点将修改后的配置传过来后,还需要对其进行微调,比如目录属主、监听地址等。每个节点要进行的操作都类似,只是sed修改的IP改为节点本身的即可。

##################### 192.168.20.3 节点配置 #####################
$ useradd cassandra -s /sbin/nologin 
$ ln -sf /opt/apache-cassandra-3.11.11 /opt/cassandra
# 将下面的两个sed指令中的IP改为你所在的节点IP即可
$ sed -i 's#listen_address:.*#listen_address: 192.168.20.3#g' /opt/cassandra/conf/cassandra.yaml
$ sed -i 's#rpc_address:.*#rpc_address: 192.168.20.3#g' /opt/cassandra/conf/cassandra.yaml
$ chown -R cassandra /data/cassandra /opt/cassandra /opt/apache-cassandra-3.11.11




##################### 192.168.20.4 节点配置 #####################
$ useradd cassandra -s /sbin/nologin 
$ ln -sf /opt/apache-cassandra-3.11.11 /opt/cassandra
$ sed -i 's#listen_address:.*#listen_address: 192.168.20.4#g' /opt/cassandra/conf/cassandra.yaml
$ sed -i 's#rpc_address:.*#rpc_address: 192.168.20.4#g' /opt/cassandra/conf/cassandra.yaml
$ chown -R cassandra /data/cassandra /opt/cassandra /opt/apache-cassandra-3.11.11

启动并检查cassandra集群状态

当所有节点准备好后,即可启动cassandra集群。

$ systemctl start cassandra       # 启动

$ systemctl status cassandra    # 确认状态为running

查看集群相关状态

$ /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.20.2  70.91 KiB  256          65.3%             6c053c1c-a58b-4d86-8e05-41979e6a98ab  rack1
UN  192.168.20.3  100.19 KiB  256          70.6%             57281348-4fb4-48a0-960f-a2093ab0776a  rack1
UN  192.168.20.4  139.13 KiB  256          64.1%             4332da84-1d6c-40db-af8b-ed915d3380ef  rack1



$ /opt/cassandra/bin/nodetool describecluster        # 查看集群名称等信息
Cluster Information:
    Name: Ljz_Cluster
    Snitch: org.apache.cassandra.locator.SimpleSnitch
    DynamicEndPointSnitch: enabled
    Partitioner: org.apache.cassandra.dht.Murmur3Partitioner
    Schema versions:
        e84b6a60-24cf-30ca-9b58-452d92911703: [192.168.20.2, 192.168.20.3, 192.168.20.4]


$ /opt/cassandra/bin/cqlsh 192.168.20.2 9042      # 测试是否可以登录到交互窗口
Connected to Ljz_Cluster at 192.168.20.2:9042.
[cqlsh 5.0.1 | Cassandra 3.11.11 | CQL spec 3.4.4 | Native protocol v4]
Use HELP for help.
cqlsh>

经过以上测试,就可以确认cassandra集群没有问题了。

cassandra运维指令

查看集群所有node心跳状态

# 第一列为UN表示正常,DN表示宕机
$ /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.20.2  70.91 KiB  256          65.7%             0402df20-2f51-4977-b3b9-9a59ea410f0d  rack1
UN  192.168.20.3  70.92 KiB  256          65.9%             eabe2f1c-8173-4058-9f8f-6131fd105a86  rack1
UN  192.168.20.4  70.91 KiB  256          68.4%             a70355f5-e3f3-474d-ac10-702734058bb8  rack1

查看当前节点进程全局信息

$ /opt/cassandra/bin/nodetool info
ID                     : 0402df20-2f51-4977-b3b9-9a59ea410f0d
Gossip active          : true
Thrift active          : false
Native Transport active: true
Load                   : 70.91 KiB
Generation No          : 1641979690
Uptime (seconds)       : 277
Heap Memory (MB)       : 131.28 / 890.00
Off Heap Memory (MB)   : 0.00
Data Center            : datacenter1
Rack                   : rack1
Exceptions             : 0
Key Cache              : entries 10, size 816 bytes, capacity 44 MiB, 91 hits, 107 requests, 0.850 recent hit rate, 14400 save period in seconds
Row Cache              : entries 0, size 0 bytes, capacity 0 bytes, 0 hits, 0 requests, NaN recent hit rate, 0 save period in seconds
Counter Cache          : entries 0, size 0 bytes, capacity 22 MiB, 0 hits, 0 requests, NaN recent hit rate, 7200 save period in seconds
Chunk Cache            : entries 10, size 640 KiB, capacity 190 MiB, 22 misses, 145 requests, 0.848 recent hit rate, 88.148 microseconds miss latency
Percent Repaired       : 100.0%
Token                  : (invoke with -T/--tokens to see all 256 tokens)

查看cassandra版本

$ /opt/cassandra/bin/nodetool version
ReleaseVersion: 3.11.11