--- title: "CentOS7 安装 Cassandra 集群" date: 2019-10-30T00:59:02+08:00 lastmod: 2019-10-30T00:59:02+08:00 keywords: [] tags: ["cassandra"] categories: ["database"] --- # 环境 主机名 | Public IP | Cluster IP| 操作系统 | Cassandra 版本 ---- | ---- | ---- | ---- | ---- cassandra101 | 10.0.4.101 | 10.10.10.101 | CentOS7.6 | 3.0.18 cassandra102 | 10.0.4.102 | 10.10.10.102 | CentOS7.6 | 3.0.18 cassandra103 | 10.0.4.103 | 10.10.10.103 | CentOS7.6 | 3.0.18 - 下载 [apache-cassandra-3.0.18-bin.tar.gz](https://mirrors.tuna.tsinghua.edu.cn/apache/cassandra/3.0.18/apache-cassandra-3.0.18-bin.tar.gz) # 各节点初始配置 - 关闭 selinux、防火墙 - 部署 java 运行环境 - 创建 cassandra 用户 ```bash useradd -m cassandra ``` - 创建数据目录 ```bash cd /var/lib mkdir -p cassandra/data1 #多个存储磁盘可以创建多个数据存储目录 mkdir -p cassandra/hints #建议与数据磁盘分开 mkdir -p cassandra/commitlog #建议与数据磁盘分开 mkdir -p cassandra/saved_caches #建议与数据磁盘分开 chown -R cassandra.cassandra cassandra/ ``` - 创建日志目录 ```bash cd /var/log mkdir -p cassandra chown -R cassandra.cassandra cassandra/ ``` - 创建 pid 目录 ```bash cd /run mkdir -p cassandra chown -R cassandra.cassandra cassandra/ ``` - 增加 sysctl.conf 配置,执行 sysctl -p 生效 ``` vm.max_map_count=1048576 ``` - 安装 jemalloc (推荐) ```bash yum install jemalloc ``` - 创建文件 /usr/lib/systemd/system/cassandra.service,内容如下 ``` [Unit] Description=Cassandra Requires=network.service After=network.service [Service] Type=forking WorkingDirectory=/opt/cassandra Environment=JAVA_HOME=/opt/jre Environment=LOCAL_JMX=no PIDFile=/run/cassandra/cassandra.pid ExecStart=/opt/cassandra/bin/cassandra -p /run/cassandra/cassandra.pid User=cassandra Group=cassandra LimitNOFILE=65536 LimitNPROC=65536 LimitMEMLOCK=infinity SuccessExitStatus=143 [Install] WantedBy=multi-user.target ``` # 部署 Cassandra - 登陆 cassandra101,下载 cassandra,解压至 /opt/ 下 - 修改 /opt/cassandra/conf/cassandra.yaml ```yaml cluster_name: CassandraCluster hists_directory: /var/lib/cassandra/hints data_file_directories: - /var/lib/cassandra/data1 commitlog_directory: /var/lib/cassandra/commitlog saved_caches_directory: /var/lib/cassandra/saved_caches seed_provider: - class_name: org.apache.cassandra.locator.SimpleSeedProvider parameters: - seeds: "10.10.10.101,10.10.10.102,10.10.10.103" listen_address: 10.10.10.101 rpc_address: 10.0.4.101 ``` - 修改 /opt/cassandra/conf/logback.xml ```bash sed -i 's,\${cassandra.logdir},/var/log,' /opt/cassandra/conf/logback.xml ``` - 修改 /opt/cassandra/conf/cassandra-env.sh ```bash # 这里我暂时关闭了 jmx 远程验证,否则需要手动创建 jmxremote.password 文件 sed -i 's/jmxremote.authenticate=true/jmxremote.authenticate=false/' /opt/cassandra/conf/cassandra-env.sh ``` - 修改 cassandra 目录的权限 ```bash chown -R cassandra.cassandra cassandra/ ``` - 打包 cassandra 目录,部署到 cassandra102 和 cassandra103 的 /opt 下,并修改 cassandra.yaml ``` # cassandra102 listen_address: 10.10.10.102 rpc_address: 10.0.4.102 # cassandra103 listen_address: 10.10.10.103 rpc_address: 10.0.4.103 ``` # 启动集群 - 启动 cassandra 服务 ```bash systemctl daemon-reload systemctl start cassandra ``` # 简单使用 - cqlsh 连接数据库 ```bash /opt/cassandra/bin/cqlsh 10.0.4.101 9042 cqlsh> desc keyspaces; ``` # 注意事项 - 创建包含复合主键的表 ```cql create table t1 ( c1 text, c2 text, c3 text, c4 text, c5 text, primary key((c1,c2),c3,c4) ); - 复合主键的第一列 "(c1,c2)" 构成 PartitionKey,其余列 c3,c4 都是 ClusteringKey - Cassandra 对 PartitionKey 计算 Hash 值,决定该记录的存放 node,ClusteringKey 在 Partition 内部排序 - 默认只支持**主键列**和**索引列**查询,否则需要手动指定 **allow filtering** - 根据多个 ClustringKey 查询时,需指定全部的 PartitionKey,ClusteringKey 不能跳过 - 主键列不可修改