---
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 不能跳过
- 主键列不可修改

