Redis從單機到集群,一步步教你環境部署以及使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM