elasticsearch的功能,主要用在搜索領域,這里,我來研究這個,也是項目需要,為公司開發了一款CMS系統,網站上的搜索欄功能,我打算采用elasticsearch來實現。 elasticsearch的高性能,低延時是最大的吸引力。
系統環境:
Centos6.8, X86_64。
Elasticsearch的版本: 2.3.5,下載地址來自官網,選擇的是RPM包。
es安裝完畢后,默認安裝的路徑是/usr/share/elasticsearch, 配置文件,默認是在/etc/elasticsearch目錄。這里要重點說說配置文件的信息:
1 [root@CloudGame bin]# cd /etc/elasticsearch/ 2 [root@CloudGame elasticsearch]# ll 3 total 12 4 -rwxr-x---. 1 root elasticsearch 3189 Jul 27 18:34 elasticsearch.yml 5 -rwxr-x---. 1 root elasticsearch 2571 Jul 27 18:34 logging.yml 6 drwxr-x---. 2 root elasticsearch 4096 Jul 27 18:44 scripts 7 [root@CloudGame elasticsearch]# tree 8 . 9 ├── elasticsearch.yml #es的系統配置文件 10 ├── logging.yml #es的日志配置文件 11 └── scripts 12 13 1 directory, 2 files
單實例的啟動很簡單,安裝完成后,直接service elasticsearch start即可啟動,日志在/var/log/elasticsearch目錄,數據在/var/lib/elasticsearch目錄。
這里重點放在如何配置單機多實例上面。為了簡單起見,多實例就選擇啟動2個實例,更多的實例,和2個實例是一樣的配置,只是簡單的相應改改參數即可。
1. 在/etc目錄下創建esconf目錄,然后在esconf下面創建esins1以及esins2目錄。將原本/etc/elasticsearch目錄的內容copy到esins1以及esins2目錄下。
1 [root@CloudGame esconf]# pwd 2 /etc/esconf 3 [root@CloudGame esconf]# tree 4 . 5 ├── esins1 6 │ ├── elasticsearch.yml 7 │ ├── logging.yml 8 │ └── scripts 9 ├── esins2 10 ├── elasticsearch.yml 11 ├── logging.yml 12 └── scripts 13 14 15 4 directories, 6 files
2. 修改配置文件elasticsearch.yml,對esins1以及esins2下面的這個文件都做修改。主要是修改其節點信息,網絡鏈接信息,以及日志數據路徑信息。下面直接上修改好的配置文件內容。
實例1: esins1目錄下的elasticsearch.yml內容
1 [root@CloudGame esins1]# cat elasticsearch.yml 2 # ======================== Elasticsearch Configuration ========================= 3 # 4 # NOTE: Elasticsearch comes with reasonable defaults for most settings. 5 # Before you set out to tweak and tune the configuration, make sure you 6 # understand what are you trying to accomplish and the consequences. 7 # 8 # The primary way of configuring a node is via this file. This template lists 9 # the most important settings you may want to configure for a production cluster. 10 # 11 # Please see the documentation for further information on configuration options: 12 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html> 13 # 14 # ---------------------------------- Cluster ----------------------------------- 15 # 16 # Use a descriptive name for your cluster: 17 # 18 cluster.name: tksearch #es默認的集群名稱是elasticsearch,注意,集群中是以name來區分節點屬於那個集群的。 19 # 20 # ------------------------------------ Node ------------------------------------ 21 # 22 # Use a descriptive name for the node: 23 # 24 node.name: node1 #節點的名稱 25 # 26 # Add custom attributes to the node: 27 # 28 # node.rack: r1 29 # 30 node.master: true #是否讓這個節點作為默認的master,若不是,默認會選擇集群里面的第一個作為master,es有一套選擇那個節點作為master的機制 31 # ----------------------------------- Paths ------------------------------------ 32 # 33 # Path to directory where to store the data (separate multiple locations by comma): 34 # 35 path.data: /home/AppData/es/esins1/data #配置節點數據存放的目錄 36 # 37 # Path to log files: 38 # 39 path.logs: /home/AppData/es/esins1/logs #配置節點日志存放的目錄 40 # 41 # ----------------------------------- Memory ----------------------------------- 42 # 43 # Lock the memory on startup: 44 # 45 # bootstrap.mlockall: true 46 # 47 # Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory 48 # available on the system and that the owner of the process is allowed to use this limit. 49 # 50 # Elasticsearch performs poorly when the system is swapping the memory. 51 # 52 # ---------------------------------- Network ----------------------------------- 53 # 54 # Set the bind address to a specific IP (IPv4 or IPv6): 55 # 56 network.host: 0.0.0.0 #配置節點綁定的地址,全0表示可以綁定任何地址,當然這里,本機可以是127.0.0.1回還地址,也可以是ifconfig看到的eth1的地址。 57 # 58 # Set a custom port for HTTP: 59 # 60 http.port: 9200 #配置當前節點對外http訪問的端口號,默認是9200,不配的話,es會從9200-9299當中找一個未用過的。 61 # 62 # For more information, see the documentation at: 63 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html> 64 # 65 transport.tcp.port: 9300 #es集群節點之間的通信端口號。默認9300. 66 # --------------------------------- Discovery ---------------------------------- 67 # 68 # Pass an initial list of hosts to perform discovery when new node is started: 69 # The default list of hosts is ["127.0.0.1", "[::1]"] 70 # 71 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] #集群多播時發現其他節點的主機列表, 真實多機集群環境下,這里會是多個主機的IP列表,默認格式“host:port”的數組 72 # 73 # Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1): 74 # 75 # discovery.zen.minimum_master_nodes: 3 76 # 77 # For more information, see the documentation at: 78 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html> 79 # 80 # ---------------------------------- Gateway ----------------------------------- 81 # 82 # Block initial recovery after a full cluster restart until N nodes are started: 83 # 84 # gateway.recover_after_nodes: 3 85 # 86 # For more information, see the documentation at: 87 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html> 88 # 89 # ---------------------------------- Various ----------------------------------- 90 # 91 # Disable starting multiple nodes on a single system: 92 # 93 node.max_local_storage_nodes: 2 #默認情況下,是不建議單機啟動多個node的,這里這個參數,就是告知es單機上啟動了幾個實例,這里我們配置2個,若是要配置3個或者更多實例,修改這個數字即可 94 # 95 # Require explicit names when deleting indices: 96 # 97 # action.destructive_requires_name: true
實例2: esins2目錄下的elasticsearch.yml內容,配置和esins1幾乎一樣。

1 [root@CloudGame esins2]# cat elasticsearch.yml 2 # ======================== Elasticsearch Configuration ========================= 3 # 4 # NOTE: Elasticsearch comes with reasonable defaults for most settings. 5 # Before you set out to tweak and tune the configuration, make sure you 6 # understand what are you trying to accomplish and the consequences. 7 # 8 # The primary way of configuring a node is via this file. This template lists 9 # the most important settings you may want to configure for a production cluster. 10 # 11 # Please see the documentation for further information on configuration options: 12 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/setup-configuration.html> 13 # 14 # ---------------------------------- Cluster ----------------------------------- 15 # 16 # Use a descriptive name for your cluster: 17 # 18 cluster.name: tksearch 19 # 20 # ------------------------------------ Node ------------------------------------ 21 # 22 # Use a descriptive name for the node: 23 # 24 node.name: node2 25 # 26 # Add custom attributes to the node: 27 # 28 # node.rack: r1 29 # 30 node.master: false 31 # ----------------------------------- Paths ------------------------------------ 32 # 33 # Path to directory where to store the data (separate multiple locations by comma): 34 # 35 path.data: /home/AppData/es/esins2/data 36 # 37 # Path to log files: 38 # 39 path.logs: /home/AppData/es/esins2/logs 40 # 41 # ----------------------------------- Memory ----------------------------------- 42 # 43 # Lock the memory on startup: 44 # 45 # bootstrap.mlockall: true 46 # 47 # Make sure that the `ES_HEAP_SIZE` environment variable is set to about half the memory 48 # available on the system and that the owner of the process is allowed to use this limit. 49 # 50 # Elasticsearch performs poorly when the system is swapping the memory. 51 # 52 # ---------------------------------- Network ----------------------------------- 53 # 54 # Set the bind address to a specific IP (IPv4 or IPv6): 55 # 56 network.host: 0.0.0.0 57 # 58 # Set a custom port for HTTP: 59 # 60 http.port: 9201 61 # 62 # For more information, see the documentation at: 63 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-network.html> 64 # 65 transport.tcp.port: 9301 66 # --------------------------------- Discovery ---------------------------------- 67 # 68 # Pass an initial list of hosts to perform discovery when new node is started: 69 # The default list of hosts is ["127.0.0.1", "[::1]"] 70 # 71 discovery.zen.ping.unicast.hosts: ["127.0.0.1:9300"] 72 # 73 # Prevent the "split brain" by configuring the majority of nodes (total number of nodes / 2 + 1): 74 # 75 # discovery.zen.minimum_master_nodes: 3 76 # 77 # For more information, see the documentation at: 78 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-discovery.html> 79 # 80 # ---------------------------------- Gateway ----------------------------------- 81 # 82 # Block initial recovery after a full cluster restart until N nodes are started: 83 # 84 # gateway.recover_after_nodes: 3 85 # 86 # For more information, see the documentation at: 87 # <http://www.elastic.co/guide/en/elasticsearch/reference/current/modules-gateway.html> 88 # 89 # ---------------------------------- Various ----------------------------------- 90 # 91 # Disable starting multiple nodes on a single system: 92 # 93 node.max_local_storage_nodes: 2 94 # 95 # Require explicit names when deleting indices: 96 # 97 # action.destructive_requires_name: true
3. 由於配置中指定了配置文件和數據的路徑了,所以,要在相應的路徑下創建所需的目錄。
1 /home/AppData/es/esins1/data 2 /home/AppData/es/esins1/logs 3 /home/AppData/es/esins2/data 4 /home/AppData/es/esins2/logs
4. 啟動es, 先啟動es實例1. 注意,es啟動時指定的配置文件時,要指定配置文件所在的路徑,這個路徑包含elasticsearch.yml以及logging.yml
1 [root@CloudGame bin]# ./elasticsearch -d -Des.path.conf=/etc/esconf/esins1 -p /etc/esconf/esins1.pid 2 [root@CloudGame bin]# Exception in thread "main" java.lang.RuntimeException: don't run elasticsearch as root. 3 at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:93) 4 at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:144) 5 at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:270) 6 at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35) 7 Refer to the log for complete error details.
喲,錯了啊,不能用root啟動es,見鬼,再來一次吧。
1 [water@CloudGame bin]$ ./elasticsearch -d -Des.path.conf=/etc/esconf/esins1 -p /etc/esconf/esins1.pid 2 [water@CloudGame bin]$ Exception in thread "main" SettingsException[Failed to open stream for url [/etc/esconf/esins1/elasticsearch.yml]]; nested: AccessDeniedException[/etc/esconf/esins1/elasticsearch.yml]; 3 Likely root cause: java.nio.file.AccessDeniedException: /etc/esconf/esins1/elasticsearch.yml 4 at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) 5 at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) 6 at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) 7 at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) 8 at java.nio.file.Files.newByteChannel(Files.java:317) 9 at java.nio.file.Files.newByteChannel(Files.java:363) 10 at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:380) 11 at java.nio.file.Files.newInputStream(Files.java:108) 12 at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067) 13 at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88) 14 at org.elasticsearch.bootstrap.Bootstrap.initialSettings(Bootstrap.java:202) 15 at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:241) 16 at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35) 17 Refer to the log for complete error details.
喲嘿,還是錯??? 訪問etc/esconf/esins1/elasticsearch.yml被阻止了???想起來了,這個文件是在root用戶下創建配置的。修改一下用戶組吧: chown -R water:water /etc/esconf/esins1。再來一次。。。
1 [water@CloudGame bin]$ ./elasticsearch -d -Des.path.conf=/etc/esconf/esins1 -p /etc/esconf/esins1.pid 2 [water@CloudGame bin]$ Exception in thread "main" SettingsException[Failed to open stream for url [/etc/esconf/esins1/elasticsearch.yml]]; nested: AccessDeniedException[/etc/esconf/esins1/elasticsearch.yml]; 3 Likely root cause: java.nio.file.AccessDeniedException: /etc/esconf/esins1/elasticsearch.yml 4 at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) 5 at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) 6 at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) 7 at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) 8 at java.nio.file.Files.newByteChannel(Files.java:317) 9 at java.nio.file.Files.newByteChannel(Files.java:363) 10 at java.nio.file.spi.FileSystemProvider.newInputStream(FileSystemProvider.java:380) 11 at java.nio.file.Files.newInputStream(Files.java:108) 12 at org.elasticsearch.common.settings.Settings$Builder.loadFromPath(Settings.java:1067) 13 at org.elasticsearch.node.internal.InternalSettingsPreparer.prepareEnvironment(InternalSettingsPreparer.java:88) 14 at org.elasticsearch.bootstrap.Bootstrap.initialSettings(Bootstrap.java:202) 15 at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:241) 16 at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35) 17 Refer to the log for complete error details.
怎么還是一樣的錯啊,去看看日志吧,靠,/home/AppData/es/esins1/logs下面什么也沒有啊???????倒,這個目錄也是在root權限下創建的,water沒有寫的權限。。。。。。再給這數據和日志目錄改屬組。。。。。
1 [root@CloudGame es]# ll 2 total 8 3 drwxr-xr-x. 4 root root 4096 Oct 18 11:20 esins1 4 drwxr-xr-x. 4 root root 4096 Oct 18 11:21 esins2 5 [root@CloudGame es]# chown -R water:water * 6 [root@CloudGame es]# ll 7 total 8 8 drwxr-xr-x. 4 water water 4096 Oct 18 11:20 esins1 9 drwxr-xr-x. 4 water water 4096 Oct 18 11:21 esins2 10 [root@CloudGame es]# cd esins1/ 11 [root@CloudGame esins1]# ll 12 total 8 13 drwxr-xr-x. 2 water water 4096 Oct 18 11:20 data 14 drwxr-xr-x. 2 water water 4096 Oct 18 11:49 logs
再來啟動一次,應該可以了吧。。。。
1 [water@CloudGame bin]$ ./elasticsearch -d -Des.path.conf=/etc/esconf/esins1 -p /etc/esconf/esins1.pid 2 [water@CloudGame bin]$ Exception in thread "main" java.nio.file.AccessDeniedException: /etc/esconf/esins1.pid 3 at sun.nio.fs.UnixException.translateToIOException(UnixException.java:84) 4 at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) 5 at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) 6 at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) 7 at java.nio.file.spi.FileSystemProvider.newOutputStream(FileSystemProvider.java:430) 8 at java.nio.file.Files.newOutputStream(Files.java:172) 9 at org.elasticsearch.common.PidFile.create(PidFile.java:76) 10 at org.elasticsearch.common.PidFile.create(PidFile.java:55) 11 at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:247) 12 at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35) 13 Refer to the log for complete error details.
去你的,怎么還是權限的問題,來pid文件沒有辦法寫入。。。。。再搞一次權限配置。。。。
1 [root@CloudGame etc]# chown -R water:water esconf
再啟動,再不好,是不是就不玩了。。。。
1 [water@CloudGame bin]$ ./elasticsearch -d -Des.path.conf=/etc/esconf/esins1 -p /etc/esconf/esins1.pid 2 [water@CloudGame bin]$
哈哈哈,很好,這次啟動不錯了,說明八九不離十了。
同樣的,參照啟動esins1的過程,啟動esins2.一切都ok。 esconf下面有兩個pid文件
1 [root@CloudGame esconf]# ll -al 2 total 32 3 drwxr-xr-x. 4 water water 4096 Oct 18 12:00 . 4 drwxr-xr-x. 126 root root 12288 Oct 18 13:25 .. 5 drwxr-xr-x. 3 water water 4096 Oct 18 11:38 esins1 6 -rw-rw-r--. 1 water water 5 Oct 18 11:55 esins1.pid 7 drwxr-xr-x. 3 water water 4096 Oct 18 11:39 esins2 8 -rw-rw-r--. 1 water water 5 Oct 18 12:00 esins2.pid
到此,單機雙實例的啟動完成。。。
真的完成了么?要不訪問看看,那就驗證一下吧,下面來幾張截圖demo一下最后的結果!
esins1的基本信息:
esins2的基本信息:
esins1的健康狀態:
esins2的健康狀態: