title: Cassandra集群部署及维护 #标题tags: #标签
date: 2022-01-04
categories: linux大杂烩 # 分类
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在后台使用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 |
环境配置
所有节点必须对节点进行初始化配置。
修改系统限制
$ mv /etc/security/limits.conf{,.bak}
cat > /etc/security/limits.conf << EOF
* - nofile 655360
* - memlock unlimited
* - stack 655360
* - nproc unlimited
EOF
cat > /etc/sysctl.conf << EOF
kernel.sysrq = 0
kernel.core_uses_pid = 1
fs.file-max=655360
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.pid_max = 655360
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_ecn = 0
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_max_orphans = 655360
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 16384 16777216
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.route.gc_timeout = 100
# 禁止icmp重定向报文
net.ipv4.conf.all.accept_redirects = 0
# 禁止icmp源路由
net.ipv4.conf.all.accept_source_route = 0
net.core.somaxconn = 65535
net.core.rmem_default = 8388608
net.core.wmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
vm.swappiness = 10
vm.overcommit_memory = 1
vm.max_map_count = 262144
EOF
sysctl -p
配置ntp时间同步
任意一台节点配置时间服务器,其他节点制定定时任务即可。
$ yum -y install ntp
$ vim /etc/ntp.conf # 修改配置文件
# 找到(17行左右):
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# 改为(网段是你自己的网段,表示允许哪个网段的客户端来同步时间):
restrict 192.168.20.0 mask 255.255.255.0 nomodify notrap
# 找到
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# 将其注释掉,表示不使用互联网上的时间同步服务器
#server 0.centos.pool.ntp.org iburst
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
# 末尾追加
server 127.127.1.0
fudge 127.127.1.0 stratum 5
# 在上级时钟源失效时,NTP会使用127.127.1.0的本地时钟,将local时间作为ntp服务器时间提供给ntp客户端。
# NTP把本地主机的时钟也看作外部时钟源来处理,分配的地址是127.127.1.0
# 让硬件时间和系统时间一起同步
$ echo 'SYNC_HWCLOCK=yes' >> /etc/sysconfig/ntpd
# 重启ntp服务器生效
$ systemctl restart ntpd && systemctl enable ntpd
# 配置其他客户端定时同步时间(哪些机器要同步上面时间服务器的时间,就进行以下配置)
$ yum -y install ntp
$ crontab -e # 写入以下定时任务
*/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