1.Elasticsearch簡單介紹
Elasticsearch (ES)是一個基於Lucene構建的開源、分佈式、RESTful 接口全文搜索引擎。Elasticsearch 還是一個分佈式文檔數據庫,其中每個字段均是被索引的數據且可被搜索,它能夠擴展至數以百計的服務器存儲以及處理PB級的數據。它可以在很短的時間內在儲、搜索和分析大量的數據。它通常作爲具有複雜搜索場景情況下的核心發動機。
Elasticsearch就是爲高可用和可擴展而生的。可以通過購置性能更強的服務器來完成。
1.1Elasticsearch優勢
橫向可擴展性:只需要增加臺服務器,做一點兒配置,啓動一下Elasticsearch就可以併入集羣。
分片機制提供更好的分佈性:同一個索引分成多個分片(sharding), 這點類似於HDFS的塊機制;分而治之的方式可提升處理效率。
高可用:提供複製( replica) 機制,一個分片可以設置多個複製,使得某臺服務器在宕機的情況下,集羣仍舊可以照常運行,並會把服務器宕機丟失的數據信息複製恢復到其他可用節點上。
使用簡單:只需一條命令就可以下載文件,然後很快就能搭建一一個站內搜索引擎。
1.2Elasticsearch應用場景
大型分佈式日誌分析系統ELK elasticsearch(存儲日誌)+logstash(收集日誌)+kibana(展示數據)
大型電商商品搜索系統、網盤搜索引擎等。
1.3Elasticsearch存儲結構
Elasticsearch是文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON作爲文檔序列化的格式,比如下面這條用戶數據:
{
"name" : "yushengjun",
"sex" : 0,
"age" : 25
}
關係數據庫 ⇒ 數據庫 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 類型(type) ⇒ 文檔(Docments) ⇒ 字段(Fields)
2.Linux環境安裝Elasticsearch
1、安裝JDK環境變量
export JAVA_HOME=/usr/local/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
source /etc/profile
2、下載elasticsearch安裝包
下載elasticsearch安裝包
官方文檔https://www.elastic.co/downloads/elasticsearch
注意:linux安裝內存建議1g內存以上
3、上傳elasticsearch安裝包
4、解壓elasticsearch
tar -zxvf elasticsearch-6.4.3.tar.gz
5、修改elasticsearch.yml
network.host: 192.168.223.130(阿里雲需要用內網ip,另外開通端口號)
http.port: 9200
6、啓動elasticsearch報錯
cd /usr/local/elasticsearch-6.4.3/bin
./elasticsearch
can not run elasticsearch as root
解決方案:
因爲安全問題elasticsearch 不讓用root用戶直接運行,所以要創建新用戶
第一步:liunx創建新用戶 adduser XXX 然後給創建的用戶加密碼 passwd XXX 輸入兩次密碼。
第二步:切換剛纔創建的用戶 su XXX 然後執行elasticsearch 會顯示Permission denied 權限不足。
第三步:給新建的XXX賦權限,chmod 777 * 這個不行,因爲這個用戶本身就沒有權限,肯定自己不能給自己付權限。所以要用root用戶登錄付權限。
第四步:root給XXX賦權限,chown -R XXX /你的elasticsearch安裝目錄。
然後執行成功。
創建一個分組
groupadd elasticsearch
useradd elasticsearch -g elasticsearch -p 123456
chown -R elasticsearch:elasticsearch elasticsearch-6.4.3
su elasticsearch切換用戶
繼續報錯
bootstrap checks failed max virtual memory areas vm.max_map_count [65530] is
vi /etc/sysctl.conf
vm.max_map_count=655360
sysctl -p
max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[前面的*一定也要]
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
重啓服務器即可(修改以後一定要重啓)
7、訪問elasticsearch
關閉防火牆 systemctl stop firewalld.service
8.驗證環境是否安裝成功
http://192.168.223.130:9200
9300與9200區別
9300端口: ES節點之間通訊使用
9200端口: ES節點 和 外部 通訊使用
3.Linux環境安裝Kibana(elasticsearch圖形化界面)
Kibana是一個開源的分析和可視化平臺,設計用於和Elasticsearch一起工作。你用Kibana來搜索,查看,並和存儲在Elasticsearch索引中的數據進行交互。你可以輕鬆地執行高級數據分析,並且以各種圖標、表格和地圖的形式可視化數據。Kibana使得理解大量數據變得很容易。它簡單的、基於瀏覽器的界面使你能夠快速創建和共享動態儀表板,實時顯示Elasticsearch查詢的變化。
Kibana環境安裝
tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz
vim config/kibana.yml
將默認配置改成如下:
server.port: 5601
server.host: "192.168.223.130"
elasticsearch.url: "http:// 192.168.223.130:9200"
啓動Kibana
./bin/kibana
驗證安裝是否成功
http://192.168.223.130:5601
Kibana實現增刪改查
###創建索引
PUT /mymayikt
####查詢索引
GET /mymayikt
####添加文檔 /索引名稱/類型/id
PUT /mymayikt/user/1
{
"name":"yushengjun",
"sex":0,
"age":22
}
###查詢文檔
GET /mymayikt/user/1
###刪除索引
DELETE /mymayikt
3.Elasticsearch版本控制
1.爲什麼要進行版本控制
爲了保證數據再多線程操作下的準確性
2.悲觀鎖和樂觀鎖
悲觀鎖:假設會發生併發衝突,屏蔽一切可能違反數據準確性的操作
悲觀鎖:假設不會發生併發衝突,只在提交操作是檢查是否違反數據完整性。
3.內部版本控制和外部版本控制
內部版本控制:_version自增長,修改數據後,_version會自動的加1
外部版本控制:爲了保持_version與外部版本控制的數值一致
使用version_type=external檢查數據當前的version值是否小於請求中的version值
當前版本
更新version小於當前更新失敗
4.SpringBoot整合Elasticsearch
maven依賴
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
application.yml
spring:
data:
elasticsearch:
####集羣名稱
cluster-name: myes
####地址
cluster-nodes: 192.168.223.130:9300
實體類層
@Document(indexName = "mymayikt", type = "user")
@Data
public class UserEntity {
@Id
private String id;
private String name;
private int sex;
private int age;
}
Dao類層
public interface UserReposiory extends CrudRepository<UserEntity, String> {
}
控制器層
@RestController
public class EsController {
@Autowired
private UserReposiory userReposiory;
@RequestMapping("/addUser")
public UserEntity addUser(@RequestBody UserEntity user) {
return userReposiory.save(user);
}
@RequestMapping("/findUser")
public Optional<UserEntity> findUser(String id) {
return userReposiory.findById(id);
}
}
啓動項目
@SpringBootApplication
@EnableElasticsearchRepositories(basePackages = "com.mayikt.repository")
public class AppEs {
public static void main(String[] args) {
SpringApplication.run(AppEs.class, args);
}
}
報錯以下錯誤
None of the configured nodes are available:
解決方案:
Vi /usr/local/elasticsearch-6.4.3/config/elasticsearch.yml
cluster.name: myes