先关闭防火墙操作:
firewall-cmd --state #查看默认防火墙状态(关闭后显示notrunning,开启后显示running)
systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall开机启动
首先安装influxdb,安装步骤一步一步下来
wget https://dl.influxdata.com/influxdb/releases/influxdb-1.2.4.x86_64.rpm
sudo yum localinstall influxdb-1.2.4.x86_64.rpm
如果在这里命令安装不行,请直接进Centos图形界面直接点击安装,点上面链接下载安装包,里面所有小问题操作我都会记载请详细查看,有问题
可以留言给我。
安装完成之后,启动并查看这个服务是否在正常运行:
systemctl start influxdb.service
systemctl status influxdb.service
启动后打开 web 管理界面 http://#####:8083/ 默认用户名和密码是 root 和 root. InfluxDB 的 Web 管理界面端口是 8083,HTTP API 监听端口是 8086,如果需要更改这些默认设定,修改 InfluxDB 的配置文件(/etc/influxdb/influxdb.conf)并重启就可以了。
这里如果安装有别的新的版本,会打开web 管理界面 http://#####:8083/ 可能出现页面打不开或者404页面,请进入etc/influxdb目录下的,打开influxdb.conf文件。修改这里打开端口和设置为true,因为新版本已经关闭了,打开这两个,因为后面http进行java代码操作进行公网访问,也会需要打开进行访问
这里如果Centos7出现文件只读现象,不可以修改,请用该命令进行调整读写权限:chmod 777 -R /文件路径/
—R可以授权文件夹下面的所有文件,给父文件权限就行
另外Centos7在dos界面使用 ctrl+alt+F1切换到图形界面 ,在图形界面使用 ctrl+alt+F2切换到dos界面
如果这里打开后,可以进行访问后台界面了,后台界面ip查看
Centos输入命令:ifconfig -a
第一个ip就是你们的ip地址,配上端口号8083就可以访问,如果centos装在虚拟机,就在centos里面访问可以直接localhost:8083访问,如果在别的系统,内网区域里面可以用刚才查看的ip192.168.80.131:8083访问后台
windows下查看
centos下面查看
还有一个8086的端口打开了grafana和java代码公网操作的,也就是http的,直接像这种访问是没有后台界面的,如果用拼接操作是可以进行操作的,后台会响应json数据回来,
就像这样,我创建一个数据库
这样后台就已经创建了一个数据库了,然后后面的查看链接我写在后面,下面继续安装grafana
安装grafana
https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana-4.3.2-1.x86_64.rpm
sudo yum localinstall grafana-4.3.2-1.x86_64.rpm
如果命令安装不了,请直接点击上面链接进行下载,在centos图形界面直接点击进行安装就行,安装包可以放在home下面
<span style="color:#333333">完成安装之后,启动并检查它的状态:</span>
[root@metrics ~]# systemctl start grafana-server.service
[root@metrics ~]# systemctl status grafana-server.service
如果安装成功,可以直接访问后台界面,
账号密码默认是admin和admin
ip地址和刚才查看公网一样的就是,192.168.80.131:3000,端口是默认3000继续访问,
windows下面访问
centos可以直接localhost:3000访问界面
安装上面两步骤就已经基本完成安装了
下面是进行操作部分
首先influxdb要插入数据:
第一种方法直接centos命令行操作:
这要链接influxdb进行命令操作
分为有验证和无验证链接

链接上了以后就可以进行dos命令sql语句操作了
#创建数据库
create database "db_name"
#显示所有的数据库
show databases
#删除数据库
drop database "db_name"
#使用数据库
use db_name
#显示该数据库中所有的表
show measurements
#创建表,直接在插入数据的时候指定表名
insert test,host=127.0.0.1,monitor_name=test count=1
#删除表
drop measurement "measurement_name"
##插入数据
insert admin,username=admin password=123456
第二种用java代码操作的(包括还有其他语言咯):
package com.influxdb.test;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import junit.framework.Assert;
import org.influxdb.dto.QueryResult;
import org.influxdb.dto.QueryResult.Result;
import org.influxdb.dto.QueryResult.Series;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.BeanWrapperImpl;
import com.influxdb.pojo.CodeInfo;
public class InfluxDBTest {
private InfluxDBConnect influxDBConnect;
private String username = "root";// 用户名
private String password = "root";// 密码
private String openurl = "http://192.168.80.131:8086";// 连接地址
private String database = "sms";// 数据库
private String measurement = "sys_code";
//http://192.168.80.130:8086/query?q=CREATE+DATABASE+%22testDB%22&db=testDB
@Before
public void setUp() {
// 创建 连接
influxDBConnect = new InfluxDBConnect(username, password, openurl, database);
influxDBConnect.influxDbBuild();
//influxDBConnect.createRetentionPolicy();
//influxDBConnect.deleteDB("sms");
// influxDB.createDB(database);
}
@Test
public void testInsert() {// 测试数据插入
Map<String, String> tags = new HashMap<String, String>();
Map<String, Object> fields = new HashMap<String, Object>();
List<CodeInfo> list = new ArrayList<CodeInfo>();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm");
for (int i = 40; i <= 60; i++) {
CodeInfo info1 = new CodeInfo();
info1.setId(i);
info1.setFlag(1);
info1.setName("BANKS");
info1.setCode("ABC");
info1.setDescr("中国农业银行");
info1.setDescrE("ABC");
info1.setTime(new Date().getTime());
info1.setCreatedBy("system");
info1.setCreatedAt(formatter.format(new Date()));
list.add(info1);
}
for (CodeInfo info : list) {
tags.put("TAG_CODE", info.getCode());
tags.put("TAG_NAME", info.getName());
fields.put("ID", info.getId());
fields.put("FLAG", info.getFlag());
fields.put("NAME", info.getName());
fields.put("CODE", info.getCode());
fields.put("DESCR", info.getDescr());
fields.put("DESCR_E", info.getDescrE());
fields.put("CREATED_BY", info.getCreatedBy());
fields.put("CREATED_AT", info.getCreatedAt());
fields.put("TIME", info.getTime());
influxDBConnect.insert(measurement, tags, fields);
}
}
@Test
public void testQuery() {// 测试数据查询
String command = "select * from sys_code";
QueryResult results = influxDBConnect.query(command);
if (results.getResults() == null) {
return;
}
List<CodeInfo> lists = new ArrayList<CodeInfo>();
for (Result result : results.getResults()) {
List<Series> series = result.getSeries();
for (Series serie : series) {
// Map<String, String> tags = serie.getTags();
List<List<Object>> values = serie.getValues();
List<String> columns = serie.getColumns();
lists.addAll(getQueryData(columns, values));
}
}
Assert.assertTrue((!lists.isEmpty()));
Assert.assertEquals(2, lists.size());
}
@Test
public void testQueryWhere() {// tag 列名 区分大小写
String command = "select * from sys_code where TAG_CODE='ABC'";
QueryResult results = influxDBConnect.query(command);
if (results.getResults() == null) {
return;
}
List<CodeInfo> lists = new ArrayList<CodeInfo>();
for (Result result : results.getResults()) {
List<Series> series = result.getSeries();
for (Series serie : series) {
List<List<Object>> values = serie.getValues();
List<String> columns = serie.getColumns();
lists.addAll(getQueryData(columns, values));
}
}
Assert.assertTrue((!lists.isEmpty()));
Assert.assertEquals(1, lists.size());
CodeInfo info = lists.get(0);
Assert.assertEquals(info.getCode(), "ABC");
}
@Test
public void deletMeasurementData() {
String command = "delete from sys_code where TAG_CODE='ABC'";
String err = influxDBConnect.deleteMeasurementData(command);
Assert.assertNull(err);
}
/*** 整理列名、行数据 ***/
private List<CodeInfo> getQueryData(List<String> columns,
List<List<Object>> values) {
List<CodeInfo> lists = new ArrayList<CodeInfo>();
for (List<Object> list : values) {
CodeInfo info = new CodeInfo();
BeanWrapperImpl bean = new BeanWrapperImpl(info);
for (int i = 0; i < list.size(); i++) {
String propertyName = setColumns(columns.get(i));// 字段名
Object value = list.get(i);// 相应字段值
bean.setPropertyValue(propertyName, value);
}
lists.add(info);
}
return lists;
}
/*** 转义字段 ***/
private String setColumns(String column) {
String[] cols = column.split("_");
StringBuffer sb = new StringBuffer();
for (int i = 0; i < cols.length; i++) {
String col = cols[i].toLowerCase();
if (i != 0) {
String start = col.substring(0, 1).toUpperCase();
String end = col.substring(1).toLowerCase();
col = start + end;
}
sb.append(col);
}
return sb.toString();
}
}
package com.influxdb.test;
import java.util.Map;
import org.influxdb.InfluxDB;
import org.influxdb.InfluxDBFactory;
import org.influxdb.dto.Point;
import org.influxdb.dto.Point.Builder;
import org.influxdb.dto.Query;
import org.influxdb.dto.QueryResult;
/**
* 时序数据库 InfluxDB 连接
*/
public class InfluxDBConnect {
private String username;// 用户名
private String password;// 密码
private String openurl;// 连接地址
private String database;// 数据库
private InfluxDB influxDB;
public InfluxDBConnect(String username, String password, String openurl,
String database) {
this.username = username;
this.password = password;
this.openurl = openurl;
this.database = database;
}
/** 连接时序数据库;获得InfluxDB **/
public InfluxDB influxDbBuild() {
if (influxDB == null) {
influxDB = InfluxDBFactory.connect(openurl, username, password);
//influxDB.createDatabase(database);
}
return influxDB;
}
/**
* 设置数据保存策略 defalut 策略名 /database 数据库名/ 30d 数据保存时限30天/ 1 副本个数为1/ 结尾DEFAULT
* 表示 设为默认的策略
*/
public void createRetentionPolicy() {
String command = String
.format("CREATE RETENTION POLICY \"%s\" ON \"%s\" DURATION %s REPLICATION %s DEFAULT",
"defalut", database, "30d", 1);
this.query(command);
}
/**
* 查询
*
* @param command
* 查询语句
* @return
*/
public QueryResult query(String command) {
return influxDB.query(new Query(command, database));
}
/**
* 插入
*
* @param measurement
* 表
* @param tags
* 标签
* @param fields
* 字段
*/
public void insert(String measurement, Map<String, String> tags,
Map<String, Object> fields) {
Builder builder = Point.measurement(measurement);
builder.tag(tags);
builder.fields(fields);
influxDB.write(database, "", builder.build());
}
/**
* 删除
*
* @param command
* 删除语句
* @return 返回错误信息
*/
public String deleteMeasurementData(String command) {
QueryResult result = influxDB.query(new Query(command, database));
return result.getError();
}
/**
* 创建数据库
*
* @param dbName
*/
public void createDB(String dbName) {
influxDB.createDatabase(dbName);
}
/**
* 删除数据库
*
* @param dbName
*/
public void deleteDB(String dbName) {
influxDB.deleteDatabase(dbName);
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getOpenurl() {
return openurl;
}
public void setOpenurl(String openurl) {
this.openurl = openurl;
}
public void setDatabase(String database) {
this.database = database;
}
}
package com.influxdb.pojo;
import java.io.Serializable;
public class CodeInfo implements Serializable {
private static final long serialVersionUID = 1L;
private Integer id;
private Integer flag;
private String name;
private String code;
private String descr;
private String descrE;
private String createdBy;
private String createdAt;
private Long time;
private String tagCode;
private String tagName;
/**
* @return the flag
*/
public Integer getFlag() {
return flag;
}
/**
* @param flag
* the flag to set
*/
public void setFlag(Integer flag) {
this.flag = flag;
}
/**
* @param createdAt
* the createdAt to set
*/
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
/**
* @return the id
*/
public Integer getId() {
return id;
}
/**
* @param id
* the id to set
*/
public void setId(Integer id) {
this.id = id;
}
/**
* @return the createdAt
*/
public String getCreatedAt() {
return createdAt;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getDescr() {
return descr;
}
public void setDescr(String descr) {
this.descr = descr;
}
public String getDescrE() {
return descrE;
}
public void setDescrE(String descrE) {
this.descrE = descrE;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
/**
* @return the time
*/
public Long getTime() {
return time;
}
/**
* @param time
* the time to set
*/
public void setTime(Long time) {
this.time = time;
}
public String getTagCode() {
return tagCode;
}
public void setTagCode(String tagCode) {
this.tagCode = tagCode;
}
public String getTagName() {
return tagName;
}
public void setTagName(String tagName) {
this.tagName = tagName;
}
}
jar包
运行结果:
整个项目我打包放这链接下:有需要的可以下载:已经全部测试通过了:
https://download.youkuaiyun.com/download/qq_27026603/10310940
最后我们就是让grafana的图标监控展示出来了:
先进入dataSources配置数据源:
记得是配置8086的那个端口,否则不会成功,包括java代码的
上面没有设置数据库密码可以不输入
在进入dashboard里面new一个模板
拉入插件
点击进入编辑
编辑查询语句,模板标题,以及颜色和一些参数配置就ok
配置好了,保存,选择右上角过滤的时间
数据图形监控就显示了
最后提供一些http API:
数据库操作:
- 查看数据库的Continous Queries
- show continuous queries
- 创建新的Continous Queries
- create continous query cq_name on db_name begin select sum(count) into new_table_name from table_name group by time(30m) end
- cq_name:连续查询名字
- db_name:数据库名字
- sum(count):计算总和
- table_name:当前表名
- new_table_name:存新的数据的表名
- 30m:时间间隔为30分钟
- 删除Continous Queries
- drop continous query cp_name on db_name
- 查看当前数据库Retention Policies
- show retention policies on "db_name"
- 创建新的Retention Policies
- create retention policy "rp_name" on "db_name" duration 3w replication 1 default
- rp_name:策略名
- db_name:具体的数据库名
- 3w:保存3周,3周之前的数据将被删除,influxdb具有各种事件参数,比如:h(小时),d(天),w(星期)
- replication 1:副本个数,一般为1就可以了
- default:设置为默认策略
- 修改Retention Policies
- alter retention policy "rp_name" on "db_name" duration 30d default
- 删除Retention Policies
- drop retention policy "rp_name"
- #显示用户
- show users
- #创建用户
- create user "username" with password 'password'
- #创建管理员权限用户
- create user "username" with password 'password' with all privileges
- #删除用户
- drop user "username"
有什么问题可以留言咨询我,我看到会尽快回复。