Redis作為緩存系統來說還是很有價值的,在大數據方向里,也是需要有緩存系統的。一般可以考慮tachyon或者redis,由於redis安裝以及使用更簡單,所以還是優先考慮了它。那么在一些場景下為了保證數據的可靠性,就需要采用集群的模式部署,因此本篇文章就基於Redis Cluster的背景講解下部署以及后期的使用。
大致會包括下面的內容:
- Redis單機版的安裝以及驗證
- Redis集群版的安裝以及驗證
- 使用圖形化工具訪問Redis
- 使用Jedis訪問Redis
- 使用JedisCluster訪問Redis Cluster
之后會介紹一下,如何在Spark中使用redis,敬請期待。
Redis單機版安裝
1.1 下載
首先去官網下載想要的版本:
https://redis.io/download
我這里選了一個版本沒那么高的,省的變化太大,各種軟件兼容不了。於是挑個之前的穩定版本下載,下載redis-3.2.10.tar.gz
拷貝到目標機器。
1.2 安裝
把壓縮文件拷貝到指定的服務器上,執行解壓命令:
tar -zxvf redis-3.2.10.tar.gz
安裝前需要先安裝必要的包,yum -y install gcc gcc-c++ tcl
,這里安裝的都是一般遇到的錯誤所需要安裝的庫。
安裝完后,進入redis-3.2.10
目錄,執行編譯命令:make MALLOC=libc
,這樣就安裝完了
1.3 測試
安裝完可以直接啟動測試一下:
- 啟動服務器,執行下面的命令:
./src/redis-server redis.conf
- 啟動客戶端,執行下面的命令:
./src/redis-cli
在控制台中,輸入下面命令:
set foo bar
get foo
看看是否正常
redis集群安裝
按照上面的方式,在每台機器上面都裝一下redis。由於redis cluster集群必須要三個master,如果做一個備份的話,就需要6個節點。所以我這里在三台機器上,安裝redis,然后每台機器上啟動兩個redis即可。一會會說一下,如何在一台機器上,啟動兩個redis。
2.1 安裝
首先安裝一下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
2.2 修改配置
接下來需要根據集群的情況,創建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
鍵跳轉到下一個匹配結果。
2.3 啟動服務器
接下來就可以啟動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]#
2.4 單個機器啟動多個server
如果想要在一台機器上同時啟動多個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]#
2.5 創建集群
注意:
- 想要搭建集群,至少6個節點,不然執行下面的命令會報錯的
- 在創建集群時,只能用ip地址,不能用主機名,不然會連接不上...不知道為啥...
執行下面的命令啟動集群創建:
[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就不會有這個問題了。
2.6 集群環境驗證
下面我們驗證下集群的效果:
首先查看一下集群的狀態,然后創建一個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
然后就是無腦安裝了,安裝完登錄到對應的機器上即可。不過貌似是單節點登錄,即你看不到集群的數據。可能是我不會用 😦
使用Jedis API訪問Redis Cluster
首先在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);
}
}
使用JedisCluster訪問Redis Cluster
參考下這片文章就行,試驗過了可用的:
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