本文提到的各种服务和操作都经过本人验证,期间的坑已经替你们踩过了,读者可以参照本文档来一步步实施。觉得有用可以收藏。
【操作系统】CentOS Linux release 7.2.1511 (Core)
【主机列表】
主机名 内网IP地址
opentsdb-1-4 192.168.35.2
opentsdb-1-5 192.168.35.3
opentsdb-1-1 192.168.35.4
opentsdb-1-3 192.168.35.5
opentsdb-1-2 192.168.35.6
【系统脚本语言版本】内置的Python 2.7.5
【opentsdb要求java版本Java-1.6+】
[root@opentsdb-1-4 ~]# yum makecache # 更新yum源
[root@opentsdb-1-4 tony_soft]# for x in {5,1,3,2}; do ssh root@opentsdb-1-$x yum makecache; done
[root@opentsdb-1-4 tony_soft]# yum install -y java-1.8.0-openjdk # 使用yum安装JDK-1.8
解决no jps in (/usr/local/sbin问题:yum install -y java-1.8.0-openjdk-devel.x86_64
继续为其他四个节点分别安装openjdk和jps:
[root@opentsdb-1-4 tony_soft]# for x in {5,1,3,2}; do ssh root@opentsdb-1-$x yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel.x86_64 >> /tmp/jdk_and_jps_INSTALLING.log 2>&1;java -version && jps;echo "FINISHED____ $x";done
【分别下载zookeeper-3.4.14、Hadoop-2.8.4、hbase-1.4.9】
wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-2.8.4/hadoop-2.8.4.tar.gz
wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/stable/hbase-1.4.9-bin.tar.gz
【配置ssh免密登录】
确保从opentsdb-1-4到其他节点能ssh免密登录,具体实施可参考博文:
https://jingyan.baidu.com/article/bea41d43b558ffb4c51be6db.html
【开发自定义批处理脚本】
脚本:
可执行文件callall 用于同时在集群所有节点执行一条命令
可执行文件send2others 用于向其他节点(除opentsdb-1-4之外的节点)传送文件
都放到/usr/local/bin里面,给一个合适的权限。
[root@opentsdb-1-4 etc]# ll -ht /usr/local/bin/ | head -n 3
total 8
-rwxr-xr-x 1 root root 278 4月 24 15:57 callall
-rwxr-xr-x 1 root root 384 4月 24 16:00 send2others
[root@opentsdb-1-4 etc]# cat /usr/local/bin/callall
#!/bin/bash
if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi
cmd=$*
for h in {"opentsdb-1-4","opentsdb-1-5","opentsdb-1-1","opentsdb-1-3","opentsdb-1-2"}
do
echo "正在$h 执行命令$cmd"
ssh $h "$cmd"
if [ $? -eq 0 ];then
echo "--------命令执行成功!"
fi
done ;
[root@opentsdb-1-4 etc]# cat /usr/local/bin/send2others
#!/bin/bash
if [[ $# -lt 1 ]] ; then echo no params ; exit ; fi
p=$1
dir=`dirname $p`
filename=`basename $p`
cd $dir
fullpath=`pwd -P .`
user=`whoami`
for h in {"opentsdb-1-5","opentsdb-1-1","opentsdb-1-3","opentsdb-1-2"}
do
echo "正在同步文件到$h======="
rsync -lr $p ${user}@$h:$fullpath
if [ $? -eq 0 ];then
echo "--------已成功同步到$h"
fi
done ;
【各节点安装NTP时间同步服务】
安装、配置可参考《CentOS 7 中使用NTP进行时间同步》https://www.linuxidc.com/Linux/2015-11/124911.htm
【同步环境变量到其他四个节点】
创建符号链接:
callall ln -s hadoop-2.8.4 hadoop
callall ln -s hbase-1.4.9 hbase
callall ln -s zookeeper-3.4.14 zookeeper
send2others hbase && send2others zookeeper # 同步软连接到其他节点的相应位置
callall 'ls -al /tony_soft/'
先在/etc/profile配好JAVA_HOME、HADOOP_HOME、HBASE_HOME、ZOOKEEPER_HOME;再用send2others 同步到其他四个节点:
cd /etc && send2others profile && callall 'source /etc/profile'
callall echo $PATH && callall echo $HADOOP_HOME && callall echo $HBASE_HOME && callall echo $ZOOKEEPER_HOME
send2others hadoop && send2others hbase && send2others zookeeper # 同步符号链接到其他节点
send2others hbase-1.4.9 && send2others zookeeper-3.4.14 && send2others hadoop-2.8.4 # 同步各个软件包到其他节点
【配置HA-hadoop集群】
角色规划:
opentsdb-1-4 NameNode, QPM(zk), Hmaster, ResourceManager
opentsdb-1-5 NameNode, QPM(zk), Hmaster, ResourceManager
opentsdb-1-1 JournalNode, QPM(zk), DataNode, HRegionServer
opentsdb-1-3 JournalNode, DataNode, HRegionServer
opentsdb-1-2 JournalNode, DataNode, HRegionServer
配置静态IP(略)、关闭防火墙:
callall service iptables stop,再callall cat /etc/selinux/config | grep SELINUX # 确保每个主机的防火墙已关闭SELINUX=disabled
禁用Transparent Hugepage(为了提升hadoop集群性能):
配置省略, 可参考https://www.staroon.dev/2017/11/05/SetEnv/)
为每个节点添加用户hadoop:
callall groupadd hadoop && callall useradd -g hadoop hadoop
创建hdfs相关目录(name目录、jn日志目录)并赋权:
callall 'mkdir -p /dfs/data' && callall 'chown -R hadoop:hadoop /dfs'
callall 'for i in {1,3,2}; do ssh opentsdb-1-$i mkdir /jn_edits; done'
callall 'for i in {1,3,2}; do ssh opentsdb-1-$i chown -R hadoop:hadoop /jn_edits; done'
拷贝hadoop相关命令到/usr/local/bin/目录下并赋权:
callall 'cp /tony_soft/hadoop-2.8.4/bin/hdfs /usr/local/bin/ && chown hadoop:hadoop /usr/local/bin/hdfs'
callall ls -lh /usr/local/bin/hdfs
修改主要配置文件:
core-site.xml
hdfs-site.xml
sshfence
shell(/bin/true)
mapred-site.xml
yarn-site.xml
slaves
opentsdb-1-1
opentsdb-1-3
opentsdb-1-2
【启动HDFS之前的准备】
send2others hadoop-env.sh # hadoop-env.sh添加完JAVA_HOME之后,同步到其他节点
cp /tony_soft/hadoop-2.8.4/bin/hdfs /usr/local/bin/hdfs
cp /tony_soft/hadoop-2.8.4/bin/hadoop /usr/local/bin/
cd /tony_soft/hadoop-2.8.4/bin && send2others hdfs && send2others hadoop
[root@opentsdb-1-4 hadoop]# ll /usr/local/bin/
-rwxr-xr-x 1 root root 278 4月 24 15:57 callall
-rwxr-xr-x 1 hadoop hadoop 6567 4月 24 19:44 hadoop
-rwxr-xr-x 1 hadoop hadoop 12383 4月 24 19:43 hdfs
-rwxr-xr-x 1 root root 389 4月 24 16:27 send2others
-rwxr-xr-x 1 root root 6773 4月 25 13:52 zkServer.sh
以hadoop用户启动HDFS的前提是hadoop用户能ssh免密登录到其他节点
先生成密钥对:
su hadoop
ssh-keygen -t rsa # 一路回车即可
以root用户在/home/hadoop/.ssh目录下:
callall 'mkdir -m 700 /home/hadoop/.ssh' # 批量创建权限码为700的hadoop家目录
send2others id_rsa.pub # 同步公钥到其他hadoop家目录下
callall 'chmod 644 /home/hadoop/.ssh/authorized_keys'
callall 'chown hadoop:hadoop /home/hadoop/.ssh/authorized_keys'
callall 'chmod 600 /home/hadoop/.ssh/id_rsa.pub'
分别切换到hadoop用户,将opentsdb-1-4机器上的hadoop用户下用ssh-keygen生成的
/home/hadoop/.ssh/id_rsa.pub公钥分发到opentsdb-1-{5,1,3,2}机器上的/home/hadoop/.ssh/authorized_keys
callall 'cat /home/hadoop/.ssh/id_rsa.pub > /home/hadoop/.ssh/authorized_keys'
分发后,验证是否可免密ssh登录:for h in {5,1,3,2}; do ssh opentsdb-1-$h hostname; done
【配置zookeeper集群】
ZK三个节点:opentsdb-1-4、opentsdb-1-5、opentsdb-1-1
cd $ZOOKEEPER_HOME
callall mkdir -m 755 /zkdata;done
callall chown -R hadoop:hadoop /zkdata;done
callall ls -l / | grep --color zkdata;done
cp zoo_sample.cfg zoo.cfg
vim zoo.cfg #指定部署zookeeper的3个节点; 指定zk数据存放目录和日志存放目录
for i in {3,4}; do scp conf/zoo.cfg 192.168.35.$i:/tony_soft/zookeeper-3.4.14/conf/ ; done # 同步到其他两个节点
mkdir -m 755 zklog # 在$ZOOKEEPER_HOME目录下创建zk日志存放目录
chown -R hadoop:hadoop zklog
# 为其他两个zk节点创建zk日志存放目录并改权限
for i in {3,4};do ssh 192.168.35.$i cd $ZOOKEEPER_HOME && mkdir -m 755 zklog && chown -R hadoop:hadoop zklog; done
按照zoo.cfg配置的3个zk节点,分别在每个节点的/zkdata目录下创建myid文件:
opentsdb-1-4机器上执行cd /zkdata && echo 1 >> myid
opentsdb-1-5机器上执行cd /zkdata && echo 2 >> myid
opentsdb-1-1机器上执行cd /zkdata && echo 3 >> myid
for h in {5,1}; do ssh opentsdb-1-$h 'cp /tony_soft/zookeeper-3.4.14/bin/zkServer.sh /usr/local/bin/'; done
for h in {5,1}; do ssh opentsdb-1-$h 'chown hadoop:hadoop /usr/local/bin/zkServer.sh'; done
【以hadoop用户按顺序启动zk集群、启动JN集群、格式化HDFS、格式化zkfc、启动hdfs集群】
#必须用原生的zkServer.sh启动,如果用放在/usr/local/bin/zkServer.sh启动就会报各种错
[hadoop@opentsdb-1-4 root]$ for h in {4,5,1}; do ssh opentsdb-1-$h /tony_soft/zookeeper/bin/zkServer.sh start; done
[hadoop@opentsdb-1-4 root]$ for h in {4,5,1}; do ssh opentsdb-1-$h /tony_soft/zookeeper/bin/zkServer.sh status; done # 若成功启动则能看到follower或leader角色
启动JN三个节点:opentsdb-1-1、opentsdb-1-3、opentsdb-1-2
[hadoop@opentsdb-1-4 ~]$ for h in {1,3,2}; do ssh opentsdb-1-$h /tony_soft/hadoop-2.8.4/sbin/hadoop-daemon.sh start journalnode; done
[hadoop@opentsdb-1-4 ~]$ callall jps # 成功启动,在1、3、2机器上可看到JournalNode进程
在4号主机上仍然以hadoop用户格式化HDFS:
[hadoop@opentsdb-1-4 ~]$ hdfs namenode –format # 若看到Exiting with status 0,则格式化成功
由于配了hdfs高可用,需要进行下一步:
在4号机(nn1)启动第一个NN:
[hadoop@opentsdb-1-4 ~]$ $HADOOP_HOME/sbin/hadoop-daemon.sh start namenode
在5号机(nn2)格式化HDFS:
[hadoop@opentsdb-1-4 ~]$ ssh opentsdb-1-5 hdfs namenode –bootstrapStandby # 若Exiting with status 0则格式化成功
在nn1格式化zkfc:
[hadoop@opentsdb-1-4 ~]$ hdfs zkfc –formatZK
在nn1启动HDFS集群:
[hadoop@opentsdb-1-4 ~]$ $HADOOP_HOME/sbin/start-dfs.sh # 验证结果: 和预期的一致
在nn1启动YARN:
[hadoop@opentsdb-1-4 ~]$ $HADOOP_HOME/sbin/start-yarn.sh # yarn配置了高可用,rm1和rm2要分别启动
rm2需要单独启动:
[hadoop@opentsdb-1-4 ~]$ ssh opentsdb-1-5 $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager
原因是缺少libexec目录下的shell脚本,可在hdfs脚本找到DEFAULT_LIBEXEC_DIR目录,放到yarn脚本里:
再次尝试启动rm2:ssh opentsdb-1-5 $HADOOP_HOME/sbin/yarn-daemon.sh start resourcemanager
[hadoop@opentsdb-1-4 ~]$ callall jps
正在opentsdb-1-4 执行命令jps
Warning: Permanently added 'opentsdb-1-4,192.168.35.2' (ECDSA) to the list of known hosts.
17873 Jps
14482 NameNode
16132 ResourceManager
13179 QuorumPeerMain
15646 DFSZKFailoverController
--------命令执行成功!
正在opentsdb-1-5 执行命令jps
Warning: Permanently added 'opentsdb-1-5,192.168.35.3' (ECDSA) to the list of known hosts.
10053 NameNode
7961 QuorumPeerMain
10169 DFSZKFailoverController
10873 ResourceManager
11772 Jps
--------命令执行成功!
正在opentsdb-1-1 执行命令jps
Warning: Permanently added 'opentsdb-1-1,192.168.35.4' (ECDSA) to the list of known hosts.
11168 Jps
9616 DataNode
7735 QuorumPeerMain
8491 JournalNode
10110 NodeManager
--------命令执行成功!
正在opentsdb-1-3 执行命令jps
Warning: Permanently added 'opentsdb-1-3,192.168.35.5' (ECDSA) to the list of known hosts.
7717 JournalNode
9323 NodeManager
10379 Jps
8829 DataNode
--------命令执行成功!
正在opentsdb-1-2 执行命令jps
Warning: Permanently added 'opentsdb-1-2,192.168.35.6' (ECDSA) to the list of known hosts.
8769 DataNode
9258 NodeManager
10315 Jps
7660 JournalNode
--------命令执行成功
【配置并启动hbase集群】
hbase-env.sh 添加下列配置项
export JAVA_HOME= /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.el7_6.x86_64
export HBASE_MANAGES_ZK=false
# Extra Java CLASSPATH elements. Optional.
export HBASE_CLASSPATH=/tony_soft/hadoop-2.8.4/etc/hadoop
hbase-site.xml高可用配置:
regionservers
$HBASE_HOME/conf/regionserver的内容和/tony_soft/hadoop-2.8.4/etc/hadoop/slaves中的一致:
opentsdb-1-1
opentsdb-1-3
opentsdb-1-2
# 分发配置文件到其他节点
[root@opentsdb-1-4 conf]# send2others hbase-env.sh && send2others hbase-site.xml && send2others regionservers
启动HA-HBASE集群:
[hadoop@opentsdb-1-4 conf]$ /tony_soft/hbase-1.4.9/bin/start-hbase.sh # 启动失败,进一步查看日志
[hadoop@opentsdb-1-4 hbase-1.4.9]$ vim /tony_soft/hbase-1.4.9/logs/hbase-hadoop-master-opentsdb-1-4.log
Caused by: java.lang.RuntimeException: Failed to create local dir /opt/hbase-2.0.0-alpha3/tmp/local/jars, DynamicClassLoader failed to init
排错1:修改hbase-env.sh,把hadoop的配置文件所在路径添加到HBASE_CLASSPATH
export HBASE_CLASSPATH=/tony_soft/hadoop-2.8.4/etc/hadoop
[root@opentsdb-1-4 conf]# send2others hbase-env.sh
再次启动,报错:
opentsdb-1-2: mkdir: cannot create directory ‘/tony_soft/hbase-1.4.9/bin/../logs’: Permission denied
opentsdb-1-1: mkdir: cannot create directory ‘/tony_soft/hbase-1.4.9/bin/../logs’: Permission denied
opentsdb-1-3: mkdir: cannot create directory ‘/tony_soft/hbase-1.4.9/bin/../logs’: Permission denied
排错2:修复权限问题:
[root@opentsdb-1-4 hbase-1.4.9]# callall chown -R hadoop:hadoop /tony_soft/hbase-1.4.9 && callall chown -R hadoop:hadoop /tony_soft/hbase/
[hadoop@opentsdb-1-4 hbase-1.4.9]$ for i in {5,1,3,2}; do ssh opentsdb-1-$i mkdir -p /tony_soft/hbase-1.4.9/logs; done
[hadoop@opentsdb-1-4 hbase-1.4.9]$ callall ls -l /tony_soft/hbase-1.4.9 | grep --color logs
[hadoop@opentsdb-1-4 hbase-1.4.9]$ /tony_soft/hbase-1.4.9/bin/start-hbase.sh # 若成功则本机能看到Hmaster服务,5号机没有Hmaster(因为需手动启动,不会自启);另外能看到1、3、2号机上都有HregionServer服务
尝试在5号机上启动另一个Hmaster:
[hadoop@opentsdb-1-4 conf]$ ssh opentsdb-1-5 /tony_soft/hbase/bin/hbase-daemon.sh start master # 失败
启用高可用hbase:
先关闭hbase集群
[hadoop@opentsdb-1-4 conf]$ /tony_soft/hbase-1.4.9/bin/stop-hbase.sh
再添加另一个主机名(或IP地址)到$HBASE_HOME/conf/backup-masters并同步到其他节点
[root@opentsdb-1-4 conf]# send2others backup-masters
[root@opentsdb-1-4 conf]# callall chown hadoop:hadoop /tony_soft/hbase-1.4.9/conf/backup-masters
再次启动hbase集群
[hadoop@opentsdb-1-4 conf]$ /tony_soft/hbase-1.4.9/bin/start-hbase.sh # 成功后可由jps看到相关进程
[hadoop@opentsdb-1-4 hbase-1.4.9]$ callall jps
正在opentsdb-1-4 执行命令jps
Warning: Permanently added 'opentsdb-1-4,192.168.35.2' (ECDSA) to the list of known hosts.
577 HMaster
14482 NameNode
16132 ResourceManager
13179 QuorumPeerMain
844 Jps
15646 DFSZKFailoverController
--------命令执行成功!
正在opentsdb-1-5 执行命令jps
Warning: Permanently added 'opentsdb-1-5,192.168.35.3' (ECDSA) to the list of known hosts.
10053 NameNode
26182 Jps
7961 QuorumPeerMain
10169 DFSZKFailoverController
10873 ResourceManager
26012 HMaster
--------命令执行成功!
正在opentsdb-1-1 执行命令jps
Warning: Permanently added 'opentsdb-1-1,192.168.35.4' (ECDSA) to the list of known hosts.
9616 DataNode
7735 QuorumPeerMain
23529 HRegionServer
23739 Jps
8491 JournalNode
10110 NodeManager
--------命令执行成功!
正在opentsdb-1-3 执行命令jps
Warning: Permanently added 'opentsdb-1-3,192.168.35.5' (ECDSA) to the list of known hosts.
7717 JournalNode
22695 HRegionServer
22904 Jps
9323 NodeManager
8829 DataNode
--------命令执行成功!
正在opentsdb-1-2 执行命令jps
Warning: Permanently added 'opentsdb-1-2,192.168.35.6' (ECDSA) to the list of known hosts.
8769 DataNode
9258 NodeManager
7660 JournalNode
22909 Jps
22686 HRegionServer
--------命令执行成功!
【须先安装Gnuplot】
为什么要安装gnuplot:Opentsdb依赖gnuplot 插件
[root@opentsdb-1-4 conf]# callall yum install –y gnuplot # 为所有节点安装
版本要求:openTSDB-2.3.0及以上,我这里下载一个2.4版的rpm包,以rpm方式安装OpenTSDB:
[root@opentsdb-1-4 tony_soft]# wget
https://github.com/OpenTSDB/opentsdb/releases/download/v2.4.0/opentsdb-2.4.0.noarch.rpm
# 分布式安装openTSDB
分发到其他节点send2others opentsdb-2.4.0.noarch.rpm
然后每个节点安装即可callall rpm –ivh opentsdb-2.4.0.noarch.rpm # 默认会安装到 /usr/share/ 下
openTSDB本身没有分布式的实现方案,而是借助于HBase的分布式集群方案。也就是说openTSDB访问同一个HBase集群,返回相同的数据镜像。TSDMain是openTSDB的进程名。
vim /etc/opentsdb/opentsdb.conf
[root@opentsdb-1-4 opentsdb]# egrep --color "^tsd" /etc/opentsdb/opentsdb.conf
tsd.network.port = 4040 # 自定义HTTP端口号
tsd.http.staticroot = /usr/share/opentsdb/static/ # 使用默认值即可
tsd.http.cachedir = /tmp/opentsdb # 配置openTSDB的缓存目录
# false改为true那么上传数据时会自动创建metric,否则会提示Unknown metric 的错误。也可设置为false但使用tsdb mkmetric proc.loadavg.1m来手动添加 metric
tsd.core.auto_create_metrics = true
tsd.core.plugin_path = /usr/share/opentsdb/plugins # 使用默认opentsDB的插件所在路径
tsd.storage.hbase.zk_quorum = opentsdb-1-4,opentsdb-1-5,opentsdb-1-1 # 配置zk三个主机名
# 启动openTSdb之前,需要在Hbase中创建openTSDB所需的表
[root@opentsdb-1-4 ~]# cd /usr/share/opentsdb/
[root@opentsdb-1-4 opentsdb]# env COMPRESSION=NONE HBASE_HOME=/tony_soft/hbase-1.4.9 ./tools/create_table.sh > /tmp/creatingForTbls4opentsDB.log 2>&1 &
# 脚本会自动在default名称空间下创建4个表tsdb-uid,tsdb,tsdb-tree,tsdb-meta
# 脚本运行失败,查看日志发现在创建default:tsdb表时有错误
create 'tsdb',
{NAME => 't', VERSIONS => 1, COMPRESSION => 'NONE', BLOOMFILTER => 'ROW', DATA_BLOCK_ENCODING => 'DIFF', TTL => 'FOREVER'}
ERROR: For input string: "FOREVER"
# 排错:建表语句不被hbase认可(我安装的是hbase-1.4.9版本),那么去掉FOREVER或者修改其值为2147483647
[root@opentsdb-1-4 ~]# grep -C 3 --color "TSDB_TTL" /usr/share/opentsdb/tools/create_table.sh
# This can save a lot of storage space.
DATA_BLOCK_ENCODING=${DATA_BLOCK_ENCODING-'DIFF'}
DATA_BLOCK_ENCODING=`echo "$DATA_BLOCK_ENCODING" | tr a-z A-Z`
TSDB_TTL=${TSDB_TTL-'FOREVER'}
case $COMPRESSION in
(NONE|LZO|GZIP|SNAPPY) :;; # Known good.
--
{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'}
create '$TSDB_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING', TTL => '$TSDB_TTL'}
create '$TREE_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING'}
# 排错之后重试
[root@opentsdb-1-4 tools]# cd /usr/share/opentsdb/tools && vim create_table.sh
[root@opentsdb-1-4 tools]# grep -C 1 --color "TSDB_TTL" create_table.sh
DATA_BLOCK_ENCODING=`echo "$DATA_BLOCK_ENCODING" | tr a-z A-Z`
#TSDB_TTL=${TSDB_TTL-'FOREVER'}
TSDB_TTL=${TSDB_TTL-'2147483647'}
--
create '$TSDB_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER', DATA_BLOCK_ENCODING => '$DATA_BLOCK_ENCODING', TTL => '$TSDB_TTL'}
[root@opentsdb-1-4 tools]# send2others create_table.sh
[root@opentsdb-1-4 opentsdb]# pwd
/usr/share/opentsdb
[root@opentsdb-1-4 opentsdb]# env COMPRESSION=NONE HBASE_HOME=/tony_soft/hbase-1.4.9 ./tools/create_table.sh > /tmp/re_creatingForTbls4opentsDB.log 2>&1 &
hbase(main):009:0> list # hbase shell中可看到,成功建表
TABLE
tsdb
tsdb-meta
tsdb-tree
tsdb-uid
4 row(s) in 0.0080 seconds
=> ["tsdb", "tsdb-meta", "tsdb-tree", "tsdb-uid"]
# 启动openTSDB集群(也可以仅启动其中1、2台)
[root@opentsdb-1-4 bin]# callall "/usr/share/opentsdb/bin/tsdb tsd > /tmp/tsd_running.log 2>&1 &"
[root@opentsdb-1-4 bin]# callall "jps | grep -v grep | grep -i tsdmain" # 可在所有节点看到TSDMain进程
[root@opentsdb-1-4 bin]# callall "netstat -nltp | grep -i 4040" # 可看到4、5、1、3、2号节点都有对应的4040端口号
# 成功安装opentsdb后,使用客户端脚本向opentsdb插入示例数据
[root@opentsdb-1-4 tmp]# cat openTSdb_test.py
import requests
payload = {
"metric": "sys.cpu.nice",
"timestamp": '1519544801',
"value": '29',
"tags": {
"host": "web01",
"dc": "lga"
}
}
payload1 = {
"metric": "sys.cpu.nice",
"timestamp": '1519544802',
"value": '30',
"tags": {
"host": "web01",
"dc": "lga"
}
}
payload2 = {
"metric": "sys.cpu.nice",
"timestamp": '1519544803',
"value": '29',
"tags": {
"host": "web01",
"dc": "lga"
}
}
payload3 = {
"metric": "sys.cpu.nice",
"timestamp": '1519544804',
"value": '30',
"tags": {
"host": "web01",
"dc": "lga"
}
}
ls = [payload, payload1, payload2, payload3]
def send_json(json):
# 向主机opentsdb-1-5写入数据(因为该节点也有TSDMain)
r = requests.post("http://opentsdb-1-5:4242/api/put?details", json=json)
return r.text
def main():
print send_json(ls)
if __name__ == "__main__":
main()
# tsd返回成功,表明成功写入数据到hbase
[root@opentsdb-1-4 tmp]# python openTSdb_test.py
{"success":4,"failed":0,"errors":[]}
# 到4、5、1其中一台主机(这三台有zk服务QuorumPeerMain)上的hbase shell检查是否已插入数据
[root@opentsdb-1-4 ~]# ssh opentsdb-1-1
hbase(main):001:0> list
TABLE
tsdb
tsdb-meta
tsdb-tree
tsdb-uid
4 row(s) in 0.1660 seconds
=> ["tsdb", "tsdb-meta", "tsdb-tree", "tsdb-uid"]
hbase(main):002:0> scan 'default:tsdb' # 有数据
hbase(main):003:0> scan 'default:tsdb-meta' # 没数据
hbase(main):004:0> scan 'default:tsdb-tree' # 没数据
hbase(main):005:0> scan 'default:tsdb-uid' # 有数据
以下是关于opentsdb的web restFul api安全使用的整理。这里是基于nginx做用户验证(也就是用户名+密码的方式),是为了(云主机)内网用户在使用tsd的api过程中做个身份验证,只允许内网指定用户调用opentsdb的api。
这种简单认证适用于公司内网,通过认证区分不同用户。
CentOS7安装Nginx可参考: https://www.cnblogs.com/kaid/p/7640723.html
Nginx 配置用户名密码登录可参考: https://my.oschina.net/AmosWang/blog/2873864
【step 1】
openTSDB主要配置项:
批量启动TSDMain(即tsd服务):callall "/usr/share/opentsdb/bin/tsdb tsd > /tmp/tsd_running.log 2>&1 &"
【step 2】
安装Nginx过程省略。
安装htpasswd工具(生成用户名和密码并保存到文件)
在/usr/local/nginx/conf/nginx.conf的http代码块里的子块加入相关配置项:
server {
# 此处监听的端口号4242是Nginx对外暴露的端口(TSDMain的服务端口4040)
listen 4242;
auth_basic "Password please";
#密码地址
auth_basic_user_file /usr/local/nginx/conf/ngpwd;
location / {
#代理地址:192.168.x.x是VPC内网,4040是OpenTSDB在内网的端口;外网需访问10.39.37.49:4242
proxy_pass http://192.168.35.2:4040/;
proxy_redirect default;
}
}
启动Nginx服务(略)。
在4号机使用htpasswd工具生成密码文件:
htpasswd -c /usr/local/soft/nginx/conf/pwd tony 接着输入两次密码即可
#htpasswd -c:意思是创建一个加密文件
#/usr/local/nginx/conf/ngpwd:表示加密文件的绝对路径(与上述nginx.conf中的auth_basic_user_file一致)
# tony:用户名(密码tonykidkid)
生成用户密码后,重启nginx服务使配置生效
验证用户认证功能:
(1)从外网浏览器访问http://10.39.46.49:4242/
此时需要输入密码才能继续访问:
(2)从外网采用curl http://10.39.46.49:4242 未发送认证信息访问openTSDB时,HTTP返回码401:
验证成功。
从外网curl -u tony:tonykidkid http://10.39.46.49:4242 发送用户认证信息访问openTSDB时,正常返回:
验证成功。
(3)从VPC内网采用客户端脚本向openTSDB put数据,HTTP返回码401:
验证成功。
(4)从内网访问,带上认证信息,正常返回:
验证成功。
(5)使用客户端脚本向http://192.168.35.2:4242/api/put?details=true 写入单点数据
python脚本Unauthed_openTSdd.py源代码:
未带认证信息时,返回401:
验证成功。
(6)使用客户端脚本以 http://username:password@ip:port/api 方式传入认证信息
python脚本authed_openTSdb_test.py源码:
认证通过,成功写入数据:
在hbase可查到:
验证成功。
【全文结束】读者觉得有什么要补充的,或者哪里不明白的可以给我留言,觉得没问题的可以点个赞 ^_^