大數據只是彙總

所有架構的介紹
過往記憶:https://www.iteblog.com/archives/2607.html

防火牆
1.查看防火牆狀態:
firewall-cmd --state 
2.啓動防火牆
systemctl start firewalld
3.關閉防火牆
systemctl stop firewalld
4.檢查防火牆開放的端口
firewall-cmd --permanent --zone=public --list-ports
5.開放一個新的端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
6.重啓防火牆
firewall-cmd --reload
7.驗證新增加端口是否生效
firewall-cmd --zone=public --query-port=8080/tcp
8.防火牆開機自啓動
systemctl enable firewalld.service
9.防火牆取消某一開放端口
firewall-cmd --zone=public --remove-port=9200/tcp --permanent
yum源
https://www.jianshu.com/p/0f09204cb9de
這個是數據源
http://192.168.9.124:8081/repository/yum-group/

maven
https://www.cnblogs.com/jtnote/p/9982185.html

google安裝
https://www.jianshu.com/p/39d0b8f578d9

分發腳本
#!/bin/bash
#1 獲取輸入參數個數,如果沒有參數直接退出
pcount=$#
if((pcount==0)); then
echo no args;
exit;
fi
#2 獲取文件名稱
p1=$1
fname=$(basename $p1)
echo fname=$fname
#3 獲取上級目錄到絕對路徑
pdir=$(cd -P $(dirname $p1); pwd)
echo pdir=$pdir
#4 獲取當前用戶名稱
user=$(whoami)
#5 循環 ip 103 到 105
for((host=128; host<131; host++)); do
    echo ------------------------------- hadoop$host --------------------------
    rsync -rvl $pdir/$fname $user@hadoop$host:$pdir
done

ArrayBlockQueue參考模板
DemoOne
package com.mongo.until;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class Test {
    public static int i = 0;
    public static int q = 0;
    static ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<String>(10, true);
    // 有界隊列
    static BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<Runnable>(10, true);
    // 放棄拒絕的任務並拋出異常
    static RejectedExecutionHandler discardPolicyHandler = new ThreadPoolExecutor.DiscardPolicy();
    static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, workQueue, discardPolicyHandler);

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        System.out.println("增加值之前" + workQueue.size());
        for (int i = 0; i < 10; i++) {
            //每次執行這個方法
            threadPool.execute(new MyTask2());
            System.out.println("核心線程數" + threadPool.getCorePoolSize());
            System.out.println("線程池數" + threadPool.getPoolSize());
            System.out.println("隊列任務數" + threadPool.getQueue().size());
        }
        System.out.println("增加值之後" + workQueue.size());
        System.out.println(arrayBlockingQueue.toString());
        System.out.println(System.currentTimeMillis() - start);//執行時常
        threadPool.shutdown();
        try {
            //awaitTermination():用於等待子線程結束,再繼續執行下面的代碼。該例中我設置一直等着子線程結束。
            if (threadPool.awaitTermination(6, TimeUnit.SECONDS)) {
                threadPool.shutdownNow();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class MyTask2 implements Runnable {
        public static int i = 0;

        ArrayList<String> list = new ArrayList<>();

        @Override
        public void run() {
            try {
                arrayBlockingQueue.add(str());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ", hello");
        }

        public static String str() {
            String str = "這是測試數據";
            return str;
        }
    }
}

DemoTwo
public class ArrayBlockQueueMain {

    static ArrayBlockingQueue<List<Document>> arrayBlockingQueue = new ArrayBlockingQueue<List<Document>>(1200, true);
    //創建線程池take
    static ExecutorService executor = Executors.newFixedThreadPool(16);
    //創建線程池put
    static ExecutorService executorPool = Executors.newFixedThreadPool(30);
    //創建數據
    static DataUntil dataUntil = new DataUntil();
    static MongoDBUntil mongoDBUntil = new MongoDBUntil();

    public static void main(String[] args) {
        mongoDBUntil.createOnce();
        long start = System.currentTimeMillis();
        System.out.println("操作開始"+Common.getData());
        for (int i = 0; i < 1200; i++) {
            //每次執行這個方法
            executorPool.submit(() -> {
                arrayBlockingQueue.add(dataUntil.createData());
            });
        }
        System.out.println("取值開始:"+arrayBlockingQueue.size());
        for (int i = 0; i < 1200; i++) {
            executor.submit(() -> {
                List<Document> documentList = null;
                try {
                    documentList = arrayBlockingQueue.take();
                    mongoDBUntil.addCllection(documentList);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
        }
        executorPool.shutdown();
        executor.shutdown();
        try {
            executor.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
            mongoDBUntil.mgdbClose();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("所有的子線程都結束了!"+(System.currentTimeMillis() - start) + " ms");
    }
}

反射
//單純的進行造數據
public List<Document> createData(){
    System.out.println("thread id is: " + Thread.currentThread().getId()+"造數據開始時間"+Common.getData());
    //創建要批量傳數據的集合
    //List<ProgramLogsPO> list = new ArrayList<ProgramLogsPO>();
    List<Document> documents = new ArrayList<>();
    //創建節目庫-日誌表
    //ProgramLogsPO programLogsPO = new ProgramLogsPO();
    Document document = new Document();
    for (int i = 0; i < 5000; i++) {
        //Common.increment();
        //document.put("_id",Thread.currentThread().getId()+"_"+ Common.getDataStr()+"_"+ Common.countNum.getAndIncrement());
        Document tmp = new Document();
        tmp.putAll(document);
        document = tmp;
        if(i==1) {
            //通過反射獲取類中的所有
            Field[] declaredFields = ProgramLogsPO.class.getDeclaredFields();
            for (Field field : declaredFields) {
                //可訪問私有變量
                field.setAccessible(true);
                // 獲取屬性類型
                String type = field.getGenericType().toString();
                Method method = null;
                //獲取字段名稱
                String name = field.getName();
                if (name.equals("c_createtime")) {
                    long createtime = System.currentTimeMillis();
                    document.append(name, createtime);
                    continue;
                }
                // 將屬性的首字母大寫
                //name = name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());
                if (type.equals("class java.lang.String")) {
                    //method = programLogsPO.getClass().getMethod("set" + name, String.class);
                    //給對象的這個屬性賦值 String 此處賦值
                    //method.invoke(programLogsPO, Common.createUUID());
                    document.append(name, Common.createUUID());
                    continue;
                }
                if (type.equals("int")) {
                    //method = programLogsPO.getClass().getMethod("set" + name, int.class);
                    //給對象的這個屬性賦值 String 此處賦值
                    //method.invoke(programLogsPO, Common.createInt());
                    document.append(name, Common.createInt());
                    continue;
                }
                if (type.equals("float")) {
                    //method = programLogsPO.getClass().getMethod("set" + name, float.class);
                    //給對象的這個屬性賦值 String 此處賦值
                    //method.invoke(programLogsPO, Common.createFloat());
                    document.append(name, Common.createFloat());
                    continue;
                }
                if (type.equals("long")) {
                    //method = programLogsPO.getClass().getMethod("set" + name, long.class);
                    //給對象的這個屬性賦值 String 此處賦值
                    //method.invoke(programLogsPO, Common.createLong());
                    document.append(name, Common.createLong());
                    continue;
                }
                if (type.equals("java.util.List<java.lang.String>")) {
                    //method = programLogsPO.getClass().getMethod("set" + name, List.class);
                    //給對象的這個屬性賦值 String 此處賦值
                    //method.invoke(programLogsPO, Common.createListUUID());
                    document.append(name, Common.createListUUID());
                    continue;
                }
                if (type.equals("java.util.List<java.lang.Integer>")) {
                    //method = programLogsPO.getClass().getMethod("set" + name, List.class);
                    //給對象的這個屬性賦值 String 此處賦值
                    //method.invoke(programLogsPO, Common.createListInt());
                    document.append(name, Common.createListInt());
                    continue;
                }
            }
        }
        //list.add(programLogsPO);
        documents.add(document);
    }
    System.out.println("thread id is: " + Thread.currentThread().getId()+"造數據結束時間"+Common.getData());
    System.out.println("執行數量爲:"+count.getAndIncrement());
    return documents;
}

AtomicInteger原子變量
DemoOne
//int 原子變量
AtomicInteger count = new AtomicInteger();

DemoTwo

public static AtomicInteger countNum = new AtomicInteger(0);

public static void increment() {
    countNum.getAndIncrement();
}

mongo
集羣安裝教程
複製集
https://www.jianshu.com/p/dbffdb466534

分片
https://blog.csdn.net/liver_life/article/details/100562949
開始和停止
//開始
[root@master mongodb-4.2.2]# bin/mongod -f mongodb.conf  

//停止
> use admin;
switched to db admin
> db.shutdownServer();
server should be down...
選舉機制
原網址:https://www.cnblogs.com/zyfd/p/9811528.html
Primary(主)是MongoDB複製集中的最重要的角色,是能夠接受客戶端/Driver寫請求的節點,(讀請求也是默認路由到Primary節點)。在複製集中,與Primary相對應的有Secondary節點和Arbiter節點,分別表示從節點(可以接受讀請求)和投票節點(僅用於投票選出新的Primary)。複製集是MongoDB的高可用框架,同時可以作爲業務讀寫分離的一種方式。複製集提供了自動故障處理功能(當然還有其他功能,本文不展開),能夠自動檢測Primary節點是否宕機,進而選取新的Primary節點,並通過數據回追或數據回滾等方式實現複製集中數據一致。本文藉助蜂巢MongoDB雲服務的運行日誌查看功能,來簡要介紹Primary的選舉過程。
MongoDB提供了強大的SystemLog模塊,相比MySQL,MongoDB的運行日誌模塊做得更爲貼心,通過日誌能夠有效跟蹤MongoDB內部是如何進行一個個操作的。下面的圖都截取自蜂巢MongoDB雲服務的運行日誌模塊,從中能夠看到了一串的MongoDB選主日誌,非常清晰明瞭。
 
1、什麼時候會發起選舉?
圖中所示,該節點(我)發現在過去的10s中時間內,複製集中沒有Primary,
那麼我怎麼知道這段時間沒有主呢,因爲我每2s會給複製集中的其他節點發送心跳,
 
有些節點不回我
 
在超時時間內(默認10s)我會一直髮。
除了心跳,我還會發送其他的命令,另外我還需要跟着Primary的opLog做複製,但是我發現沒法再跟他做複製了,也找不到其他節點做複製
 
既然沒有Primary。。。
2、我能不能被選爲Primary呢?
我先試探性的問大家願不願意讓我當Primary。於是我打算先發起 “dry election”,讓人驚喜的是另一個節點竟然同意了,開心 :)。由於複製集中一共3個節點。除了自己外另一個節點也同意了,那麼我就有資格當Primary;注意此時term 沒有更新,還是0(看第一個圖~~)。因爲這個是非正式選舉
 
3、既然這樣,那我就發起正式選舉吧
結果當然是十拿九穩了,那麼爲什麼要先有dry呢,爲了保證選舉成功率,相比正式選舉,dry階段檢查的東西少,效率更高些。此時term已經自豪地更新爲1。
 
4、我果然被大家選爲Primary
一切盡在掌握中的感覺真爽!!
5、那我就把自己的角色切換爲Primary唄
等等,這個時候我還不能馬上接受客戶端的寫請求,因爲我得看看自己的數據是不是最新的,怎麼辦呢,oplog裏面的optime。看看大家的狀態(數據新舊情況)
 
我等大家回覆我:
 
好了,節點202回我了(他把他自己的rs.status()發給我, 看看在他的世界裏這個複製集是什麼情況),(200連不上),從這些信息我可以知道,我的數據是最新的。而且我從202知道200確實掛了。
6、既然我的數據是最新的,那麼我就不需要從其他節點拷貝數據了
這裏跟raft不一樣,從raft的論文中,可以確定raft選爲primary是必須要求數據最新的。但MongoDB選出的Primary,數據不一定要最新,只需要滿足一個約定條件即可(oplog落後10s以內)。如果數據落後集羣中的某個/些存活節點(這個情況一般出現在當前節點的priority比擁有更新數據的節點高的時候),在我對外提供寫服務前,我先把這些數據從其他節點從抓過來,應用到我自己這裏。但是我這個是有原則的,我不會那麼貪婪,給我2s(catchUpTimeoutMillis)就好了。我能追上多少就追多少。如果時間到了,我還沒有完全追上咋辦呢,那也沒有辦法,讓這些節點把沒追上的數據回滾掉好了。
7、現在我的數據是最新的了,我開始作爲Primary對外提供寫服務。你們把寫請求發過來吧~~~
也就是說,並不是成爲Primary後馬上就會提供寫服務,而是會有個追數據的過程。我覺得這個特性如果大家麼有正確理解,很容易出現問題。比如用戶設置了writeconcern是majority,在主從切換的場景下,可能還未寫到大多數節點的請求因爲主掛了返回失敗,但其實這個數據會被持久化到新主上。而嚴格的raft不會出現這個情況。
以上用第一張圖大體介紹了選舉過程。然後每一點的仔細介紹時,我將MongoDB的SystemLog級別通過db.setLogLevel()從0設置爲2,重演了一遍選舉。讓大家看到更多的細節。
最後安利下,網易蜂巢MongoDB雲服務已經重磅上線,蜂巢MongoDB由業界著名的數據庫專家姜承堯親自把關架構設計,免費提供售前技術支持。要知道姜大神的出臺費可是業界最貴的 :),歡迎大家註冊試用。有任何意見和建議,請隨時提出。
配置文件
https://www.cnblogs.com/danhuangpai/p/10571158.html
理論壓縮
MongoDB3.0引入WiredTiger,支持壓縮一個新的存儲引擎。 WiredTiger使用頁面管理磁盤I / O。每個頁面都包含很多BSON文件。頁面被寫入磁盤時就被默認壓縮,當在磁盤中被讀入高速緩存時它們就被解壓。

壓縮的基本概念之一是重複值  確切的值以及形式  可以一次以壓縮的格式被存儲,減少了空間的總量。較大的數據單元傾向於更有效地壓縮,因爲有更多重複值。通過在頁面級別壓縮  通常稱爲數據塊壓縮  WiredTiger可以更有效地壓縮數據。

WiredTiger支持多種壓縮庫。你可以決定哪個選項是最適合你的集合水平。這是一個重要的選擇,你的訪問模式和數據可能在集合間大不相同。例如,如果你使用GridFS的存儲較大的文件,如圖片和視頻,MongoDB自動把大文件分成許多較小的“塊”,當需要的時候再重新組合。 GridFS的實施維護兩個集合:fs.files,包含大文件的元數據和其相關的塊;以及fs.chunks,包含大數據分成的255KB的塊。對於圖像和視頻,壓縮可能會有益於fs.files集合,但在fs.chunks的數據可能已經被壓縮,因此它對於這個集合可能需要禁用壓縮。

MongoDB3.0中的壓縮選項
在MongoDB 3.0中,WiredTiger爲集合提供三個壓縮選項:
無壓縮
Snappy(默認啓用)  很不錯的壓縮,有效利用資源
zlib(類似gzip)  出色的壓縮,但需要佔用更多資源
 
有索引的兩個壓縮選項:
無壓縮
前綴(默認啓用)  良好的壓縮,資源的有效利用
添加索引
db.test.ensureIndex({"c_name":1})//單一添加索引
db.user.ensureIndex({"name":1},{"name":"IX_name"})//聯合索引
db.user.ensureIndex({"name":1},{"unique":true})//唯一索引

查詢所有的庫
show dbs

進入對應的數據庫
use mgdb

刪除數據庫
db.dropDatabase

查看庫裏的所有表
show tables

刪除test表中的所有數據
db.test.remove({})

查看test表中的數據
db.test.find().pretty()

磁盤IO進行測試
dd 命令
我們可以利用 dd 命令的複製功能,測試某個磁盤的 IO 性能,須要注意的是 dd 命令只能大致測出磁盤的 IO 性能,不是非常準確。

測試寫性能命令:
 [[email protected] var ]$ time dd if=/dev/zero of=test.file bs=1G count=2 oflag=direct
2+0 records in
2+0 records out
2147483648 bytes (2.1 GB) copied, 13.5487 s, 159 MB/s
real    0m13.556s
user    0m0.000s
sys    0m0.888s 
可以看到,該分區磁盤寫入速率爲 159M/s,其中:
/dev/zero 僞設備,會產生空字符流,對它不會產生 IO 。
if 參數用來指定 dd 命令讀取的文件。
of 參數用來指定 dd 命令寫入的文件。
bs 參數代表每次寫入的塊的大小。
count 參數用來指定寫入的塊的個數。
offlag=direc 參數測試 IO 時必須指定,代表直接寫如磁盤,不使用 cache 。

測試讀性能命令:
[[email protected] var ]$ dd if=test.file of=/dev/null  iflag=direct
4194304+0 records in
4194304+0 records out
2147483648 bytes (2.1 GB) copied, 4.87976 s, 440 MB/s
可以看到,該分區的讀取速率爲 440MB/s

sar 命令
sar 命令是分析系統瓶頸的神器,可以用來查看 CPU 、內存、磁盤、網絡等性能。

sar 命令查看當前磁盤性能的命令爲:

複製代碼
[[email protected] var ]$ sar -d -p 1 2
Linux 3.10.0-693.5.2.el7.x86_64 (server-68)     03/11/2019     _x86_64_    (64 CPU)

02:28:54 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:28:55 PM       sda      1.00      0.00      3.00      3.00      0.01      9.00      9.00      0.90
02:28:55 PM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:28:55 PM polex_pv-rootvol      1.00      0.00      3.00      3.00      0.01      9.00      9.00      0.90
02:28:55 PM polex_pv-varvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:28:55 PM polex_pv-homevol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

02:28:55 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
02:28:56 PM       sda      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:28:56 PM       sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:28:56 PM polex_pv-rootvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:28:56 PM polex_pv-varvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
02:28:56 PM polex_pv-homevol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:          sda      0.50      0.00      1.50      3.00      0.00      9.00      9.00      0.45
Average:          sdb      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:    polex_pv-rootvol      0.50      0.00      1.50      3.00      0.00      9.00      9.00      0.45
Average:    polex_pv-varvol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:    polex_pv-homevol      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
複製代碼
其中, “-d”參數代表查看磁盤性能,“-p”參數代表將 dev 設備按照 sda,sdb……名稱顯示,“1”代表每隔1s採取一次數值,“2”代表總共採取2次數值。

await:平均每次設備 I/O 操作的等待時間(以毫秒爲單位)。 

svctm:平均每次設備 I/O 操作的服務時間(以毫秒爲單位)。

%util:一秒中有百分之幾的時間用於 I/O 操作。  

對於磁盤 IO 性能,一般有如下評判標準:

正常情況下 svctm 應該是小於 await 值的,而 svctm 的大小和磁盤性能有關,CPU 、內存的負荷也會對 svctm 值造成影響,過多的請求也會間接的導致 svctm 值的增加。

await 值的大小一般取決與 svctm 的值和 I/O 隊列長度以 及I/O 請求模式,如果 svctm 的值與 await 很接近,表示幾乎沒有 I/O 等待,磁盤性能很好,如果 await 的值遠高於 svctm 的值,則表示 I/O 隊列等待太長,系統上運行的應用程序將變慢,此時可以通過更換更快的硬盤來解決問題。

%util 項的值也是衡量磁盤 I/O 的一個重要指標,如果 %util 接近 100% ,表示磁盤產生的 I/O 請求太多,I/O 系統已經滿負荷的在工作,該磁盤可能存在瓶頸。長期下去,勢必影響系統的性能,可以通過優化程序或者通過更換更高、更快的磁盤來解決此問題。


ES
https://blog.csdn.net/liuyanglglg/article/details/94367160

ElasticSearch設置用戶名密碼訪問
https://www.cnblogs.com/snail90/p/11444393.html
#做用戶管理的配置
xpack.security.enabled: true
xpack.license.self_generated.type: basic
xpack.security.transport.ssl.enabled: true

elasticsearch-head 設置用戶名密碼訪問

https://blog.csdn.net/vah101/article/details/81335951
#elasticsearch-head有密碼下可以進行查看
http.cors.allow-headers: Authorization

查看url爲:http://192.168.121.128:9100/?auth_user=elastic&auth_password=123456
安裝和部署
單節點安裝和部署
創建ela用戶並分組
    groupadd ela
    useradd -f ela eal
    passwd ela 
    填入密碼
安裝
安裝前準備
[root@ localhost elasticsearch-6.1.1]# cp /etc/security/limits.conf  /etc/security/limits.conf.bak

[root@ localhost elasticsearch-6.1.1]# cp /etc/sysctl.conf /etc/sysctl.conf.bak
vi /etc/security/limits.conf 
在文件末尾添加如下內容:
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

vi /etc/sysctl.conf 
添加下面配置:
vm.max_map_count=655360

並執行命令sysctl -p讓其修改生效:
[root@ localhost elasticsearch-6.1.1]# sysctl -p
vm.max_map_count = 655360

開始安裝
tar -zxvf elasticsearch-7.5.1-linux-x86_64.tar.gz -C /opt/module/
[root@localhost moudle]# cd elasticsearch-7.5.1/config
[root@node2 config]# cat elasticsearch.yml
#配置ES集羣名字
cluster.name: ela
#配置節點名字
node.name: hadoop130
#配置數據路徑
path.data: /opt/moudle/elasticsearch-7.5.1/data
#配置日誌路徑
path.logs: /opt/moudle/elasticsearch-7.5.1/logs
#開啓內存鎖定
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
#允許外網訪問#配置爲本地ip,監聽主機
network.host: 0.0.0.0
. #設置http訪問端口號
http.port: 9200
. #設置tcp訪問端口號
transport.tcp.port: 9300
discovery.seed_hosts: ["hadoop130"]
cluster.initial_master_nodes: ["hadoop130"]
http.cors.enabled: true
http.cors.allow-origin: "*"

啓動並驗證
[root@localhost elasticsearch-7.5.1]# bin/elasticsearch
curl http://192.168.9.130:9200
{
  "name" : "node-1",
  "cluster_name" : "ela",
  "cluster_uuid" : "gv8DzvZeR1W-aOM_UTEdVA",
  "version" : {
    "number" : "6.1.1",
    "build_hash" : "bd92e7f",
    "build_date" : "2017-12-17T20:23:25.338Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
瀏覽器查詢驗證:
 

分佈式安裝和部署
ES版本:7.5.1
服務器三臺
192.168.9.130
192.168.9.131
192.168.9.162

前提:需要安裝java

部署ES集羣,三臺機器同樣的操作
1、添加普通用戶啓動es
useradd 用戶名

2、安裝ES
1)解壓縮
tar xf elasticsearch-7.5.1.tar.gz -C /opt/module/
2)創建文件夾下面配置會指定該路徑
mkdir /opt/module/ elasticsearch-7.5.1/data
mkdir /opt/module/ elasticsearch-7.5.1/logs
3、配置elasticsearch.yml文件內容

cp /opt/module/ elasticsearch-7.5.1/config/elasticsearch.yml /opt/module/ elasticsearch-7.5.1/config/elasticsearch.yml.bak

vim elasticsearch.yml

cluster.name: ela
node.name: hadoop130
node.master: true
node.data: true
path.data: /opt/module/ elasticsearch-7.5.1/data
path.logs: /opt/module/ elasticsearch-7.5.1/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
http.port: 9200
transport.tcp.port: 9300
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping_timeout: 3s
discovery.zen.ping.unicast.hosts: ["192.168.9.130:9300","192.168.9.131:9300","192.168.9.162:9300"]
三臺機器不一樣的配置點如下

node.name: hadoop130      ===》192.168.9.130
node.name: hadoop131      ===》192.168.9.131
node.name: hadoop162      ===》192.168.9.162
4、配置文件重點參數解析
(1)cluster.name
集羣名字,三臺集羣的集羣名字都必須一致

(2)node.name
節點名字,三臺ES節點字都必須不一樣

(3)discovery.zen.minimum_master_nodes:2
表示集羣最少的master數,如果集羣的最少master數據少於指定的數,將無法啓動,官方推薦node master數設置爲集羣數/2+1,我這裏三臺ES服務器,配置最少需要兩臺master,整個集羣纔可正常運行,

(4)node.master該節點是否有資格選舉爲master,如果上面設了兩個mater_node 2,也就是最少兩個master節點,則集羣中必須有兩臺es服務器的配置爲node.master: true的配置,配置了2個節點的話,如果主服務器宕機,整個集羣會不可用,所以三臺服務器,需要配置3個node.masdter爲true,這樣三個master,宕了一個主節點的話,他又會選舉新的master,還有兩個節點可以用,只要配了node master爲true的ES服務器數正在運行的數量不少於master_node的配置數,則整個集羣繼續可用,我這裏則配置三臺es node.master都爲true,也就是三個master,master服務器主要管理集羣狀態,負責元數據處理,比如索引增加刪除分片分配等,數據存儲和查詢都不會走主節點,壓力較小,jvm內存可分配較低一點

(5)node.data
存儲索引數據,三臺都設爲true即可

(6)bootstrap.memory_lock: false
不鎖住物理內存,使用swap內存,有swap內存的可以開啓此項

(7)discovery.zen.ping_timeout: 3000s
自動發現拼其他節點超時時間

(8)discovery.zen.ping.unicast.hosts: ["192.168.9.130:9300","192.168.9.131:9300","192.168.9.162:9300"]
設置集羣的初始節點列表,集羣互通端口爲9300

5、jvm調優
vim /data/elasticsearch/config/jvm.options

-Xms1g   修改爲 ===>  -Xms2g
-Xmx1g   修改爲 ===>  -Xmx2g
設置爲物理內存一半最佳,可根據服務器內存去選擇調

6、設置權限
chown -R ysj: /opt/module/ elasticsearch-7.5.1

7、操作系統調優(必須配置,否則ES起不來)
【1】內存優化
在/etc/sysctl.conf添加如下內容

fs.file-max=655360
vm.max_map_count=655360
sysctl -p生效

解釋:
(1)vm.max_map_count=655360
系統最大打開文件描述符數

(2)vm.max_map_count=655360
限制一個進程擁有虛擬內存區域的大小

【2】修改vim /etc/security/limits.conf

* soft nofile 65536
* hard nofile 65536
* soft nproc 65536
* hard nproc 65536
* soft memlock unlimited
* hard memlock unlimited
解釋:
(nofile)最大開打開文件描述符
(nproc)最大用戶進程數
(memlock)最大鎖定內存地址空間

【3】修改/etc/security/limits.d/90-nproc.conf
將1024修改爲65536

*          soft    nproc     1024     修改前
*          soft    nproc     65536   修改後

啓動es:bin/ elasticsearch

查看集羣狀態:192.168.9.*:9200/?pretty

注意事項:
1.    集羣必須關閉防火牆
2.    啓動命令必須由非root用戶啓動


Kibana
安裝和部署
https://blog.csdn.net/zou79189747/article/details/81118915
https://blog.csdn.net/zou79189747/article/details/80111219
https://blog.csdn.net/niuchenliang524/article/details/82868221
https://www.jianshu.com/p/4d65ed957e62

增刪改查
https://blog.csdn.net/baidu_24545901/article/details/79031291

中文分詞器插件
https://github.com/medcl/elasticsearch-analysis-ik/releases
https://www.cnblogs.com/zzming/p/11733378.html

JAVA對應的API
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.5/_changing_the_client_8217_s_initialization_code.html
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章