Redis做爲緩存系統來講仍是頗有價值的,在大數據方向裏,也是須要有緩存系統的。通常能夠考慮tachyon或者redis,因爲redis安裝以及使用更簡單,因此仍是優先考慮了它。那麼在一些場景下爲了保證數據的可靠性,就須要採用集羣的模式部署,所以本篇文章就基於Redis Cluster的背景講解下部署以及後期的使用。html
大體會包括下面的內容:node
以後會介紹一下,如何在Spark中使用redis,敬請期待。linux
首先去官網下載想要的版本:
https://redis.io/downloadc++
我這裏選了一個版本沒那麼高的,省的變化太大,各類軟件兼容不了。因而挑個以前的穩定版本下載,下載redis-3.2.10.tar.gz
拷貝到目標機器。git
把壓縮文件拷貝到指定的服務器上,執行解壓命令:github
tar -zxvf redis-3.2.10.tar.gz
安裝前須要先安裝必要的包,yum -y install gcc gcc-c++ tcl
,這裏安裝的都是通常遇到的錯誤所須要安裝的庫。redis
安裝完後,進入redis-3.2.10
目錄,執行編譯命令:make MALLOC=libc
,這樣就安裝完了windows
安裝完能夠直接啓動測試一下:api
./src/redis-server redis.conf
./src/redis-cli
在控制檯中,輸入下面命令:緩存
set foo bar get foo
看看是否正常
按照上面的方式,在每臺機器上面都裝一下redis。因爲redis cluster集羣必需要三個master,若是作一個備份的話,就須要6個節點。因此我這裏在三臺機器上,安裝redis,而後每臺機器上啓動兩個redis便可。一會會說一下,如何在一臺機器上,啓動兩個redis。
首先安裝一下ruby,由於集羣的腳本是ruby版的
yum -y install ruby ruby-devel rubygems rpm-build
而後執行:
gem install redis
而後把redis-trip.rb
拷貝到/usr/local/bin
下,這樣就能夠在任何目錄執行redis-trip
命令了。
cp src/redis-trip.rb /usr/local/bin
接下來須要根據集羣的狀況,建立server啓動的配置了,先建立redis_cluster
目錄,拷貝redis.conf
:
[root@localnode7 redis-3.2.10]# mkdir redis_cluster [root@localnode7 redis-3.2.10]# cp redis.conf ./redis_cluster/redis.conf
而後修改redis.conf
[root@localnode7 redis-3.2.10]# vi ./redis_cluster/redis.conf
修改的內容有:
bind 0.0.0.0 //爲了別人能訪問,這裏暴力的監聽了全部的地址 port 6379 daemonize yes //redis後臺運行 cluster-enabled yes //開啓集羣 把註釋#去掉 cluster-config-file nodes_6379.conf //集羣的配置 配置文件首次啓動自動生成 cluster-node-timeout 15000 //請求超時 默認15秒,可自行設置 appendonly yes //這裏跟redis持久化的機制有關係,有興趣能夠多關注一下redis的日誌記錄機制
PS:由於redis.conf
配置文件比較大,內容不少。所以你們在修改配置的時候可使用vi的快捷鍵/想要搜索的內容
,而後按enter
,能夠快速定位到想要修改的配置上,若是有多個,能夠再用n
鍵跳轉到下一個匹配結果。
接下來就能夠啓動redis服務器
[root@localnode7 redis-3.2.10]# ./src/redis-server redis_cluster/redis.conf [root@localnode7 redis-3.2.10]# ps -aux | grep redis Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ root 29361 0.0 0.0 130436 2452 ? Ssl 13:21 0:00 ./src/redis-server 127.0.0.1:6379 [cluster] root 29381 0.0 0.0 103464 1080 pts/0 R+ 13:21 0:00 grep redis [root@localnode7 redis-3.2.10]#
若是想要在一臺機器上同時啓動多個redis,能夠直接再拷貝一份redis.conf,命名成redis2.conf,修改裏面的port
參數和cluster-config-file
參數便可。
好比上面的配置修改爲:
bind 0.0.0.0 port 6380 // <----只有這裏發生變化 daemonize yes cluster-enabled yes cluster-config-file nodes_6380.conf // <--只有這裏發生變化 cluster-node-timeout 15000 appendonly yes
而後啓動的時候,指定爲這個conf便可:
./src/redis-server redis_cluster/redis2.conf
再次查詢啓動進程:
[root@localnode4 redis-3.2.10]# ps -aux | grep redis Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ root 7452 0.0 0.0 131892 2984 ? Ssl 15:59 0:08 ./src/redis-server 0.0.0.0:6379 [cluster] root 9337 0.0 0.0 130564 2744 ? Ssl 16:00 0:08 ./src/redis-server 0.0.0.0:6380 [cluster] root 32298 0.0 0.0 103464 1084 pts/0 S+ 19:27 0:00 grep redis [root@localnode4 redis-3.2.10]#
注意:
執行下面的命令啓動集羣建立:
[root@localnode6 redis-3.2.10]# redis-trib.rb create --replicas 1 10.10.10.104:6379 10.10.10.106:6379 10.10.10.107:6379 10.10.10.104:6380 10. 10.10.106:6380 10.10.10.107:6380 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 10.10.10.107:6379 10.10.10.106:6379 10.10.10.104:6379 Adding replica 10.10.10.106:6380 to 10.10.10.107:6379 Adding replica 10.10.10.107:6380 to 10.10.10.106:6379 Adding replica 10.10.10.104:6380 to 10.10.10.104:6379 M: e59449112f33dcb2dfad7a1ec32920470f589c32 10.10.10.104:6379 slots:10923-16383 (5461 slots) master M: 566762510d6b7b2e1b361a8a8d44e4a9d788a92f 10.10.10.106:6379 slots:5461-10922 (5462 slots) master M: 8984e7d3e53ddcec5dd59684f69a1976a4db33ef 10.10.10.107:6379 slots:0-5460 (5461 slots) master S: 8e222ceb6ad4a9ca48566bd467b0e1b6573c2fc0 10.10.10.104:6380 replicates e59449112f33dcb2dfad7a1ec32920470f589c32 S: 0c9e17b5955be559a7edf2853bff02d7415ea72f 10.10.10.106:6380 replicates 8984e7d3e53ddcec5dd59684f69a1976a4db33ef S: a8e54df5776b412de65b904ac3928d0d308fdc15 10.10.10.107:6380 replicates 566762510d6b7b2e1b361a8a8d44e4a9d788a92f Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join.... >>> Performing Cluster Check (using node 10.10.10.104:6379) M: e59449112f33dcb2dfad7a1ec32920470f589c32 10.10.10.104:6379 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 8984e7d3e53ddcec5dd59684f69a1976a4db33ef 10.10.10.107:6379 slots:0-5460 (5461 slots) master 1 additional replica(s) S: a8e54df5776b412de65b904ac3928d0d308fdc15 10.10.10.107:6380 slots: (0 slots) slave replicates 566762510d6b7b2e1b361a8a8d44e4a9d788a92f M: 566762510d6b7b2e1b361a8a8d44e4a9d788a92f 10.10.10.106:6379 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 0c9e17b5955be559a7edf2853bff02d7415ea72f 10.10.10.106:6380 slots: (0 slots) slave replicates 8984e7d3e53ddcec5dd59684f69a1976a4db33ef S: 8e222ceb6ad4a9ca48566bd467b0e1b6573c2fc0 10.10.10.104:6380 slots: (0 slots) slave replicates e59449112f33dcb2dfad7a1ec32920470f589c32 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
中間須要咱們輸入一個yes肯定主從的分配。經過日誌就能夠看到master和slave的一個分配狀況,以及slot的分配。那個slots是跟存儲的時候hash有關的,即一個字符串先要通過哈希,知道他應該存儲到那個節點上,而後纔會存儲到對應的server中。當咱們用普通的api去查詢的時候,須要查那個真正存儲的機器,才能讀取到數據。固然使用cluster api就不會有這個問題了。
下面咱們驗證下集羣的效果:
首先查看一下集羣的狀態,而後建立一個key,再換另外一個節點登陸,看看可否查詢到。
[root@localnode6 redis-3.2.10]# ./src/redis-cli -h 10.10.10.104 -c -p 6379 10.10.10.104:6379> cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_sent:86 cluster_stats_messages_received:86 10.10.10.104:6379> get foo (nil) 10.10.10.104:6379> set foo bar OK 10.10.10.104:6379> get foo "bar" 10.10.10.104:6379> [root@localnode6 redis-3.2.10]# ./src/redis-cli -h 10.10.10.106 -c -p 6379 10.10.10.106:6379> get foo -> Redirected to slot [12182] located at 10.10.10.104:6379 "bar" 10.10.10.104:6379>
這樣咱們的集羣環境就搭建完了。
萬里長征又多走了一步~
若是用windows辦公,仍是有很多圖形化的工具,能夠鏈接redis的,好比redis desktop
:
首先能夠去下面網址去下載對應的版本:
https://redisdesktop.com/download
而後就是無腦安裝了,安裝完登陸到對應的機器上便可。不過貌似是單節點登陸,即你看不到集羣的數據。多是我不會用 :-(
首先在pom.xml中引入Jedis的jar包:
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>
而後測試一下:
public class JedisTest { public static void main(String[] args) { Jedis redis = new Jedis("10.10.10.104",6379); String foo = redis.get("foo"); System.out.println(foo); } }
參考下這片文章就行,試驗過了可用的:
http://www.cnblogs.com/shihaiming/p/5953956.html
1 安裝redis常常遇到的問題:http://www.cnblogs.com/HKUI/p/4439575.html 2 make的時候error: jemalloc/jemalloc.h報錯:http://openskill.cn/article/151 3 linux經常使用目錄介紹:http://www.linuxidc.com/Linux/2016-08/134701.htm 4 redis集羣環境搭建:http://www.cnblogs.com/wuxl360/p/5920330.html 5 redis安裝:http://www.runoob.com/redis/redis-install.html 6 redis官方文檔:https://redis.io/download 7 redis client官方文檔:https://github.com/uglide/RedisDesktopManager 8 redis desktop windows下載:https://redisdesktop.com/download