集群搭建:
1、 准备三台centos7系统的服务器(测试用的虚拟机跑三个系统),IP如下:
192.168.213.128
192.168.213.129
192.168.213.130
2、 准备java环境:
略
3、 防火墙开放9042端口:
开启防火墙 :
systemctl start firewalld
开放9042端口:
firewall-cmd --zone=public --add-port=9042/tcp –permanent
重启防火墙:
firewall-cmd --reload
4、 下载并安装Cassandra:
cd /home/tingmen/apps/
wget https://mirrors.bfsu.edu.cn/apache/cassandra/3.0.21/apache-cassandra-3.0.21-bin.tar.gz
tar -zxf apache-cassandra-3.0.21-bin.tar.gz
mv apache-cassandra-3.0.21-bin cassandra
5、 创建数据存放文件夹:
在/home/tingmen/data/casssandra目录分别创建以下三个文件夹
commitlog
data
saved_caches
6、 修改配置文件:
对每个节点的配置文件进行修改:
vim /home/tingmen/apps/cassandra/conf/cassandra.yaml
cluster_name: ‘cz001’
data_file_directories:
- /home/tingmen/data/cassandra/data
commitlog_directory: /home/tingmen/data/cassandra/commitlog
saved_caches_directory: /home/tingmen/data/cassandra/saved_caches
seed_provider:
- class_name: org.apache.cassandra.locator.SimpleSeedProvider
parameters:
- seeds: "192.168.213.128,192.168.213.129,192.168.213.130" # 修改为集群中可以被发现的机器,多写几个,用逗号隔开
listen_address: 192.168.213.128 # 本机地址
rpc_address: 192.168.213.128 # 本机地址
endpoint_snitch: GossipingPropertyFileSnitch # 表示使用 cassandra-rackdc.properties 文件中的配置
修改cassandra-rackdc.properties
vim /home/tingmen/apps/cassandra/conf/cassandra-rackdc.properties
dc=dc1 # datacenter名,同一个数据中心的用一个名字
rack=rack1 # 不同节点不同,第二个节点为rack2,以此类推......
7、 依次启动Cassandra:
cd /home/tingmen/apps/cassandra/bin/
./cassandra
./nodetool status #可查看节点状态
设计表结构:
DROP KEYSPACE if exists czenv;
CREATE KEYSPACE czenv
WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 3};
use czenv;
drop table if exists temperature ;
CREATE TABLE temperature (
weatherstation_ip text,
event_time timestamp,
value double,
PRIMARY KEY (weatherstation_ip,event_time) );
温度传感器的ip和时间戳为联合主键。
Springboot项目集成:
1、 新建一个spring boot项目, pom.xml中关于Cassandra的依赖如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-cassandra</artifactId>
</dependency>
配置文件中关于Cassandra部分:
spring:
data:
cassandra:
keyspace-name: czenv
#entity-base-packages:
contact-points: 192.168.213.128,192.168.213.129,192.168.213.130
port: 9042
session-name: cz001#新版本为session-name,老版本为cluster_name
local-datacenter: dc1
2、 实体类do:
package com.zikoo.cassandraproj.entity;
import org.springframework.data.cassandra.core.cql.PrimaryKeyType;
import org.springframework.data.cassandra.core.mapping.Column;
import org.springframework.data.cassandra.core.mapping.PrimaryKeyColumn;
import org.springframework.data.cassandra.core.mapping.Table;
import java.sql.Timestamp;
@Table("temperature")
public class Temperature {
@PrimaryKeyColumn(value = "weatherstation_ip",type = PrimaryKeyType.PARTITIONED)
private String weatherstation_ip;
@PrimaryKeyColumn(value = "event_time",type = PrimaryKeyType.CLUSTERED)
private Timestamp event_time;
@Column("value")
private double value;
public String getWeatherstation_ip() {
return weatherstation_ip;
}
public void setWeatherstation_ip(String weatherstation_ip) {
this.weatherstation_ip = weatherstation_ip;
}
public Timestamp getEvent_time() {
return event_time;
}
public void setEvent_time(Timestamp event_time) {
this.event_time = event_time;
}
public double getValue() {
return value;
}
public void setValue(double temperature) {
this.value = temperature;
}
}
3、 实体类vo层:
package com.zikoo.cassandraproj.model;
public class Temperature extends com.zikoo.cassandraproj.entity.Temperature {
}
暂时vo类为空,留着方便之后假如其他来自页面的字段,而不必修改do。
4、 service接口:
import com.zikoo.cassandraproj.model.Temperature;
import java.util.List;
public interface EnvService {
com.zikoo.cassandraproj.entity.Temperature save(com.zikoo.cassandraproj.entity.Temperature weather);
List<com.zikoo.cassandraproj.entity.Temperature> query(Temperature temperature);
boolean delete(Temperature temperature);
}
5、 service层实现类:
import com.zikoo.cassandraproj.dao.EnvService;
import com.zikoo.cassandraproj.entity.Temperature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.data.cassandra.core.query.Criteria;
import org.springframework.data.cassandra.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class EnvServiceImpl implements EnvService {
@Autowired
private CassandraTemplate cassandraTemplate;
@Override
public Temperature save(Temperature temperature) {
return cassandraTemplate.insert(temperature);
}
@Override
public List<Temperature> query(com.zikoo.cassandraproj.model.Temperature temperature) {
return cassandraTemplate.select("select * from czenv.temperature where weatherstation_ip = '"+temperature.getWeatherstation_ip()+"';", Temperature.class);
}
@Override
public boolean delete(com.zikoo.cassandraproj.model.Temperature temperature) {
// String queryStr="DELETE FROM czenv.temperature where weatherstation_ip = '" + temperature.getWeatherstation_ip() + "' and event_time = "+temperature.getEvent_time()+";";
return cassandraTemplate.delete(Query.query(Criteria.where("weatherstation_ip").is(temperature.getWeatherstation_ip())).and(Criteria.where("event_time").lte(temperature.getEvent_time())), Temperature.class);
}
}