第十五章 其他软件基本使用

15.1 ElasticSearch 15.2 Docker 15.3 Linux

15.1 ElasticSearch应用

分布式全文搜索引擎

ES在大数据下更快,小数据查询solr更快
ES仅支持JSON,solor支持JSON,xml,csv
ES自带分布式协调者,solr用Zookeeper

配置文件

bin启动文件
config配置文件
	log4j 日志配置文件
	jvm.optins java 虚拟机相关配置
	elasticsearch.yml ES的配置文件
lib 相关jar包
modules 功能模块
plugins 插件
logs 日志

ES面向文档

关系型MYSQLES(JSON)
databseindex索引和数据库一样
tablestypes
rowsdocuments
columns(字段)fields
物理设计:每个索引分多个分片,每个分片(lucene索引,一个包含倒排索引的文件目录)可在集群中不同服务器间迁移
逻辑设计:文档即数据,字段类型即mapping,索引即数据库。新版本不需要type了

倒排索引

Mysql下索引

ID标签
1python
2python
3linux,python
4linux

ES下倒排索引

标签ID
python1,2,3
linux3,4

IK分词器

下载后放入ES plugins内
选择分词类型: ik_smart 最少切分,ik_max_smart 最细粒度切分

如text内容为中华人民共和国,ik_smart下token是中华人民共和国
ik_max_smart下token是中华,中人民共和国,共和,人民等穷尽所有可能

ik分词器也可以在Plugins/ik/config下添加自己字典

Rest风格操作

创建索引
	PUT/test1/type1/1 //PUT/索引名/类型名/文档id
	{
		"name": "云云", //默认会配置字段类型
		"age":99
	}
	PUT/test2
	{
		"mappings":{
			"properties":{
				"name":{
					"type":"text"
				},
				"age"{
					"type":"long"
				}
			}
		}
	}

拿索引
	GET test2/user/_search?q=name:yunyun
改索引
	POST/test3/_doc/1/_update{
		"doc":{
			"name": 云云
		}
	}
删索引
	DELETE test2
复杂查询
GET test1/user/_search
{
	"query":{ 
		"match":{ //模糊查询
			"name":"云云"
		}
	}
	一些额外配置
	1 "_source":["name","desc"] //则只显示这2个信息,其他不现实
	2 "sort":[{ //则按照age降序
		"age":{
			"order":"desc"
		}
	}]
	3 "from":0,"size":2 //分页,从第一个数据开始,每页2条数据
}

多条件查询
"query":{
	"bool":{
		"must":{
			{
				"match"或者"term":{
					"name":yunyun
				}
			}
		}
	}
}
must表示都要符合and,should表示or或,可改must_not
也可加入filter过滤

高亮查询
GET test1/user/_search
{
	"query":{ 
		"match":{ //模糊查询
			"name":"云云"
		}
	}
	"highlight":{
		"fields":{
			xxxx 这些字段会被高亮
		}
	}
}

term和match区别

term直接通过倒排精确查询
match会用分词器分析后再查询,会拆分查。模糊查询

text和keyword类型区别

text会被分词器解析,keyword当做整体token不会被拆分分析

SpringBoot下使用

@Autowired
@Qualifier("restHighLevelClient")
private ResetHighLevelClient client;

@Test
public void createIndex(){
	//创建索引请求
	CreateIndexRequest request = new CreateIndexRequest("yunyun_index");
	//执行
	CreateIndexResponse response = client.indices().create(request,RequestOptions.DEFAULT);
}

@Test
public void getIndex(){
	GetIndexRequest request = new GetIndexRequest("yunyun_index");
	boolean flag = client.indices().exists(request,RequestOptions.DEFAULT);
}

批量添加
~{
	ArrayList<User> lists = new LinkedList<>();
	list.add(xxx) 添加很多次

	for(int i=0;i<list.size();i++){
		request.add(new IndexRequest("yunyun_index").id(String.valueOf(i)).source(JSON.toJSONString(lists.get(i),~));
		BulkResponse response = client.bulk(request,RequestOptions.DEFAULT);
	}
}

批量搜索
public List<Map<String,Object>> searchPage(String keyword, int pageNumber, int pageSize){
	if(pageNumber<=1){
		pageNumber = 1;
	}
	//条件搜索
	SearchRequest searchRequest = new ~("goods"); 
	SearchSourceBuilder sourceBuilder = new ~();
	//分页
	sourceBuilder.from(pageNumber);
	sourceBuilder.size(pageSize);
	//精准匹配
	TermQueryBuilder qquery = QueryBuilder.termQuery("title",keyword);
	sourceBuilder.query(qquery);
	sourceBuilder.timeout(时间);
	//执行搜索
	searchRequest.source(sourceBuilder);
	SearchResponse response = restHighLevelClient.search(searchRequest,RequestOptions.DEFAULT);
	//解析结果,添加高亮处理
	~ new list
	for(SearchHit hit : searchResponse.getHits()){
		//解析高亮字段,hit.getHighlightFields()返回map,根据我们业务需要处理高亮字段map中key值
		list.add(hit.getSourceAsMap());
	}
	return list;
}

相关问题

ES倒排索引是什么
ES如何实现领导选举
	leader挂了后,clusterStateVersion大的拿票,超过一半支持者当leader和zk差不多
ES搜索过程
	给leader发送读请求,leader使用文档id分析切片在哪里,leader从切片集群中轮询选节点拿到文档document返回给客户端
并发下,ES如何保证读写一致
	主节点通过ping判断从节点是否挂掉和分片决策
	主节点每秒会同步一次从节点数据
ES对于海量数据聚合如何实现
	bulkRequest.add条件,但是不知道这回答是不是能符合面试官要求
GC方面,ES需要注意什么
	http://www.mianshigee.com/question/20372xwx/
如何监控ES集群状态
	ES提供了一个可以获取集群健康状态的API,可以浏览器访问查看

15.2 Docker

虚拟机和Docker区别

虚拟机是虚拟出一套硬件,在其上运行一个完整操作系统,在该操作系统上运行程序

Docker容器内运行程序直接运行于宿主内核,容器没有自己内核,无虚拟硬件,容器比虚拟机更加轻便
Docker更高效利用资源,启动快,,一致运行环境,持续交付和部署,更轻松迁移,维护和扩展

架构(网图)
在这里插入图片描述

三大概念和生命周期

Image镜像
	1 特殊的文件系统,提供程序运行时所需要的程序,库,资源,配置等文件,还包含一些运行时配置参数(如环境变量,用户等)。镜像不包含动态数据,构建后不会再变化。
	2 镜像分层储存
		
Container容器
	容器和镜像类似JAVA的实例和类一样。容器十镜像运行时的实体。
	容器也是分层存储。每个容器运行时,容器是镜像为基础层,在其上加一个当前容器存储层(为容器运行时读写)。容器存储层生命周期和容器一样
	容器不应该向存储层写入任何数据。所有写入操作应该数据卷Volume或绑定宿主目录,跳过存储层直接对宿主读写。性能和稳定性更高。数据卷生命周期独立于容器,容器删除后数据卷数据任然存在。
	
Repository仓库
	其他服务器上需要使用镜像,则需要集中存储发布的Docker Registry。一个Docker Registry可以包含多个仓库,每个仓库包含多个标签,一个标签对应一个镜像。通常一个仓库包含多个版本镜像,标签对应版本
	Docker官方提供了Docker Registry镜像,可以搭建本地私有Docker Registry

比如tomcat分层
Container //顶层可写层,tomcat应用
几层image //应用所需环境,如tomcat jdk
Base image //应用所需最底层镜像,如tomcat下是操作系统
bootfs,kernel

Docker使用

PULL 拿镜像
docker pull tomcat:lastest //拉取tomcat最新版本镜像
RUN 运行镜像
docker run -it --rm ubuntu:16.04 bash
//-i表示交互式操作,t终端。-rm表示容器退出即删除。
//ubuntu:16.04表示以该镜像为基础启动容器。bash表示希望有个交互式shell

docker image ls//查询本地仓库镜像
docker system df//查询镜像,容器,数据卷所占空间
docker image prune//删除所有虚悬镜像
docker image rm xxx//删除镜像

BUILD 构建镜像
//通过Dockerfile定制每一层所添加的配置文件
vim Dockerfile
	FROM //指定基础镜像
	RUN //指定命令行命令
	ADD/EXPOSE等等
docker builder -f(指定位置) Dockerfile -t(容器名称) yunyun:1.0
...

Docker数据管理

容器中两种管理方法
	数据卷 -- 一个供一个或多个容器使用的特殊目录(用来持久化数据,无垃圾回收等)
		容器之间可以共享
		数据卷修改立马生效
		更新不影响镜像
		容器删除也一直存在
		
		docker volume create test //创建名为test数据卷
		--mount source-test,target=/webapp\ //把test数据卷加载到容器webapp目录
		docker volume rm test //删除test数据卷
		docker volume prune
	挂载主机目录
		--mount type=bind,source=/src/webapp,target=/opt/webapp
		//加载本地主机src/webapp目录到容器opt/webapp目录下

Compose

服务:一个应用的容器,可包括许多运行相同镜像的容器实例
项目:一组关联的应用容器组成的完整业务单元

compose默认管理对象是项目,通过子命令对项目中一组容器进行管理

项目根目录下编写docker-compose.yml配置镜像
docker-compose up启动镜像

容器监控

1 docker stats 实时监控,但是无持久化,无报警功能
2 Cadvisor(负责收集容器随时间变化的数据)+InfluxDB(负责储存时序数据)+Grafana(负责分析和展示实时数据)

日志收集平台

graylog

Docker Swarm

Docker引擎内置的集群管理和编排工具

节点
	Docker主机可以初始化Swarm集群或者加入其它Swarm集群,改主机就成为Swarm集群中一个节点
管理节点
	swarm命令只能在管理节点执行,用于对swarm集群管理
工作节点
	管理节点将服务分配工作节点执行

任务
	swarm最小调度单位,就是一个单一容器
服务
	一组任务的集合

快速扩容方式

1 命令方式
//swarm集群中运行名为nignx服务,replicas指定启动副本数
docker service create --replicas 3 -p 80:80 --name nginx nginx:latest

2 portainer
在portainer可视化界面上创建

底层技术

namespcae 来进行资源隔离
cgroup 资源限制

kubernetes(k8s)

15.3 Linux

Xshell连接远程服务器,xftp上传文件

Xshell下操作linux

目录结构

bin常用命令
etc配置文件
home主目录
user类似programfile
root管理员目录
等等

常用命令

绝对路径,相对路径
cd.. 返回上一级
cd/ 切换根目录
ls, cd
pwd显示当前目录
mkdir 创建目录 / rmdir 删除空目录
cp (old) (new) 复制
rm 删文件或者目录 rm-f 强制删除 rm-r 递归删除
mv 移动文件或者目录

基本属性

10个字母
第一个字母 d则表示目录, l则表示文档
r 可读 w 可写 x可执行

例子
d  rwx  r-x  r-x (目录 主权限  组权限  其他用户权限)
这里表示组权限和其他用户权限不可写

rwx也可以用数字表示,r=4,w=2,x=1
owner = rwx = 7
group = --- = 0

也可以修改文件属组和权限

文件内容查看

cat 由第一行开始显示文件内容
tac 由最后一行开始显示
nl 显示时加行号
more 一页一页显示,空格翻页,enter下一行
less 和more类似,q退出,上下键翻页
head 只看头几行
tail 只看末尾几行
ifconfig 看网络配置

linux 软和硬链接

和软硬拷贝差不多

VIM编辑器

命令,输入,底线三大模式
i 切换输入模式,输入字符
x 删除当前光标所在字符
ESC 输入模式退回命令模式
命令模式下按 :冒号进入底线命令
底线模式下按 wq w保存 q退出

账号管理

一般我们不是root账户
添加用户 useradd -选项 用户名
删除 userdel -r 用户名
修改 usemod 修改内容 用户名
切换用户 su yunyun
		exit 退出yunyun用户返回root

用户组管理

对etc/group文件更新
groupadd xxx

磁盘管理

df 列出文件系统整体磁盘使用量
du 检查磁盘空间使用量

进程管理

ps 当前系统执行进程信息
	-a 终端运行所有进程信息
	-u 以用户信息显示进程
	-x 显示参数
ps -aux | grep mysql //过滤只看mysql进程
ps -ef 查看父进程信息
kill -9 pid 杀死进程

环境安装

rpm/解压缩/yum在线安装

Linux额外应用

1 如何查询特定文件 find

find - name "target.java" //当前目录递归寻找target.java文件

2 检索文件内容 grep

grep "yunyun" target* //查找以target开头,包含yunyun内容的所在行

3 对文件内容做统计 awk

awk '{print $1,$4}' yunyun.txt //打印yunyun.txt 的第一和第四切片内容

4 批量替换文本内容

sed 's/^Str/String'  replace.java //字符串操作,以Str开头的内容,被替换成String内容
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱肉肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值