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

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面向文檔

關係型MYSQL ES(JSON)
databse index索引和數據庫一樣
tables types
rows documents
columns(字段) fields
物理設計:每個索引分多個分片,每個分片(lucene索引,一個包含倒排索引的文件目錄)可在集羣中不同服務器間遷移
邏輯設計:文檔即數據,字段類型即mapping,索引即數據庫。新版本不需要type了

倒排索引

Mysql下索引

ID 標籤
1 python
2 python
3 linux,python
4 linux

ES下倒排索引

標籤 ID
python 1,2,3
linux 3,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內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章