前景:
因为要用Jmeter调es做一些操作,但是还没有环境,就自己搭了一个,所以就从部署基础环境开始吧。
一、安装jdk(已安装可跳过)
以下操作我这里都是用root操作的
1、创建一个目录文件夹(用来放置jdk)
mkdir xxx & mkdir -p /xxx/java
2、解压jdk
tar -zxvf jdk-8u301-linux-x64.tar.gz
3、设置软连接(也可不设置,这里只是为了方便)
ln -s jdk1.8.0_121 jdk
4、配置环境变量
vim /etc/profile
将以下几行加入至文件中
export JAVA_HOME=/xxx/java/jdk #你的jdk路径地址
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib/ext:$JRE_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASSPATH PATH
要注意的是,环境变量千万别改错咯,不然会影响到其他的命令使用!!!
*如果出现/usr/libexec/grepconf.sh: line 5: grep: command not found那就是环境变量配错了,用下面这个命令重新把profile这个文件改过来
export PATH=/usr/bin:/usr/sbin:/bin:/sbin:/usr/X11R6/bin*
5、生效环境变量
source /etc/profile
6、查看配置是否成功
java -version
出现以下代表配置完毕
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
二、部署es(已安装可跳过)
一样的步骤,自行创建一个文件夹用于放置下载的es文件
1、解压es
tar -zxvf elasticsearch-6.4.3.tar.gz
2、切换用户(es不能使用root用户启动,不然会报错)
groupadd es
useradd es -g es -p 123456
su - es
3、授权刚解压的es文件夹
chown -R es:es /xxx/es/elasticsearch-6.4.3
4、配置elasticsearch.yml(在config目录下)
在配置文件的底部加入以下两行,用于设置ip及端口
network.host: 0.0.0.0
http.port: 9200
5、启动es
./elasticsearch-6.4.3/bin/elasticsearch -d
6、配置密码
在elasticsearch.yml添加以下几行
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true
然后重启es
使用./elasticsearch-setup-passwords interactive 设置密码
8、创建、查询索引
这里只简单讲解,详细可查看大佬的https://blog.csdn.net/sss294438204/article/details/122884953
注意:因为我们配置了密码,所以后续的操作都要带上es的账号密码才可进行
a)创建索引
curl -X PUT "http://0.0.0.0:9200/test3" -u elastic:123456
出现{"acknowledged":true,"shards_acknowledged":true,"index":"test3"}代表创建成功
b)查询索引
curl -X GET "http://0.0.0.0:9200/test3/_search" -u elastic:123456
返回:
{"took":1,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":0,"max_score":null,"hits":[]}}
c)给索引加文档
我这里版本不支持 _ + name的类型 所以创建一个doc类型的id为1111的文档
curl -X PUT "http://0.0.0.0:9200/test3/doc/1111" -H 'Content-Type: application/json' -d '{"aaa":"asd","name":"as"}' -u elastic:123456
返回:
{"_index":"test3","_type":"doc","_id":"1111","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}
再次查询:
curl -X GET "http://0.0.0.0:9200/test3/_search" -u elastic:123456
返回:
{"took":2,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"test3","_type":"doc","_id":"1111","_score":1.0,"_source":{"aaa":"asd","name":"as"}}]}}
可以看到数据已经写进去了,那我们测试数据准备完毕
三、使用Jmeter编写es脚本
因为es是暴露了restful api,所以可以直接用Jmeter的http请求来进行编写
只需要填写这些参数就可以了(ip地址就写es机器所在地址),是不是很简单!入参如果有查询条件再写,没有的话就不用写,也可以跟在路径后面,毕竟是get的嘛
成功返回
这里需要注意的是,这是在es还没有账户密码的情况下调用的,而我们现在设置了账户密码,那自然需要加上用户密码进行访问,与curl的-u会有所不同!
Jmeter添加es账户密码方式:
1、需要添加HTTP信息头管理器,添加Authorization字段,值为base64加密值,值需要为“Basic +加密值”
2、加密值通过beanshell的方式来取(也可以写个jar包,通过java请求),在HTTP信息头管理器前面加上BeanShell 预处理程序,代码如下:
import java.nio.charset.StandardCharsets;
import java.util.Base64;
String name = "elastic";
String password = "123456";
String basebase = name + ":" + password;
log.info("auth string: " + basebase);
//Base64编码
Base64.Encoder encoder = Base64.getEncoder();
String s = encoder.encodeToString(basebase.getBytes(StandardCharsets.UTF_8));
log.info("______________________________________________________");
log.info("s="+s);
vars.put("userpasswd",s)
至此,全部设置完毕,可进行配置线程进行压测啦!
四、遇到的问题
es启动日志默认在安装包目录下的logs文件夹的elasticsearch.log,可看到es启动情况
a)es启动出现如下报错
启动没多久后ps -ef | grep ela 发现没有es的进程了,发现es被自动关闭了!
因为es索引文件是映射到虚拟内存空间的,只有当访问索引的时候,才会从磁盘读到物理内存里(提高查询速度),这里看到es需要的最低虚拟内存空间是252144,而我这只有65530,所以导致es报错无法启动
解决办法:使用root 临时修改sysctl -w vm.max_map_count=262144
永久修改:echo vm.max_map_count=262144>> /etc/sysctl.conf sysctl -p
b)es配置密码时出现以下报错
Unexpected response code [403] from calling GET http://xxx:9200/_xpack/security/_authenticate?pretty
It doesn't look like the X-Pack security feature is available on this Elasticsearch node.
Please check if you have installed a license that allows access to X-Pack Security feature.
原因是没开启X-pack安全
解决办法:curl -H "Content-Type:application/json" -XPOST http://localhost:9200/_xpack/license/start_trial?acknowledge=true
再使用./elasticsearch-setup-passwords interactive 设置密码
c)curl、Jmeter未加用户密码访问报错
如果es配置了账户密码,但是在进行操作es时没有加上用户密码就会报以下的错
{"error":{"root_cause":[{"type":"security_exception","reason":"missing authentication token for REST request [/test3/_create/1111]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}}],"type":"security_exception","reason":"missing authentication token for REST request [/test3/_create/1111]","header":{"WWW-Authenticate":"Basic realm=\"security\" charset=\"UTF-8\""}},"status":401}