redis安裝、測試&集群的搭建&踩過的坑


1 redis的安裝

1.1   安裝redis

  版本說明

   本教程使用redis3.0版本。3.0版本主要增加了redis集群功能。

安裝的前提條件:

需要安裝gcc:yum install gcc-c++

 

1、下載redis的源碼包。

2、把源碼包上傳到linux服務器

3、解壓源碼包

tar -zxvf redis-3.0.0.tar.gz

4、Make

5、Make install

[root@bogon redis-3.0.0]# make install PREFIX=/usr/local/redis

 

1.2   啟動redis

1、前端啟動模式

/usr/local/redis/bin/redis-server

默認是前端啟動模式,端口是6379

2、后端啟動

1)從redis的源碼目錄中復制redis.conf到redis的安裝目錄。

2)修改配置文件

 

3)[root@bogon bin]# ./redis-server redis.conf

 

1.3   Redis常用命令

./redis-cli 

127.0.0.1:6379> set a 10

OK

127.0.0.1:6379> get a

"10"

 

1.4   Java代碼測試redis,需使用jedis.jar

import java.util.HashSet;

import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;
/**
 * 測試jedis,redis的客戶端,想連接到虛擬機中的redis-server需要關閉iptables
 * 執行:service iptables stop
 * @author HELLXZ
 * @date 創建時間:2017年8月17日 上午8:41:05
 */
public class testJedis {

    @Test
    //單機測試
    public void testJedis(){
        Jedis jedis = new Jedis("192.168.25.133", 6379);
        jedis.set("haha", "helloworld!");
        String string = jedis.get("haha");
        System.out.println(string);
        jedis.close();
    }
    
    @Test
    //池測試
    public void testJedisPool(){
        JedisPool jedisPool = new JedisPool("192.168.25.133", 6379);
        Jedis resource = jedisPool.getResource();
        resource.set("hei", "ha");
        String string = resource.get("hei");
        System.out.println(string);
        resource.close();
        //關閉連接池
        jedisPool.close();
    }
}

 

1.4.1   此處的坑

代碼測試顯示失敗,連接失敗,想了一陣,以為是bind的ip地址不對,修改redis.conf的bind的ip,測試沒有用。

然后百度發現問題在於虛擬機使用的cent6.4的防火牆還開着,關閉后測試通過。

cent7以下用到的防火牆是iptables,關閉防火牆代碼如下

關閉防火牆命令: 
service iptables stop 
永久關閉防火牆:
chkconfig iptables off

cent7以上關閉命令:

systemctl stop firewalld.service #停止firewall
systemctl disable firewalld.service #禁止firewall開機啟動

 

1.5   常用數據類型

1) String

2) Hash

3) List

4) Set

5) SortedSet

其中1)2)最常用

2   Redis集群的搭建

2.1   Redis集群相關概念

2.1.1   redis-cluster架構圖

 

集群基礎知識:

redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value

Redis 集群中內置了 16384 個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點

Key:a

計算a的hash值,例如值為100,100這個槽在server1上,所以a應該放到server1.

 

Key:hello

Hash值:10032,此槽在server2上。Hell可以應該存在server2.

 

2.1.2   redis-cluster投票:容錯

(1)領着投票過程是集群中所有master參與,如果半數以上master節點與master節點通信超過(cluster-node-timeout),認為當前master節點掛掉.

(2):什么時候整個集群不可用(cluster_state:fail)? 

    a:如果集群任意master掛掉,且當前master沒有slave.集群進入fail狀態,也可以理解成集群的slot映射[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage參數,默認關閉,打開集群兼容部分失敗.

    b:如果集群超過半數以上master掛掉,無論是否有slave集群進入fail狀態.

  ps:當集群不可用時,所有對集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤

 

2.2   我們的集群結構

集群中有三個節點的集群,每個節點有一主一備。需要6台虛擬機。

搭建一個偽分布式的集群,使用6個redis實例來模擬。

 

2.3   搭建集群需要的環境

搭建集群需要使用到官方提供的ruby腳本。

需要安裝ruby的環境。

 

安裝ruby

yum install ruby

yum install rubygems

 

redis集群管理工具redis-trib.rb

[root@bogon ~]# cd redis-3.0.0

[root@bogon redis-3.0.0]# cd src

[root@bogon src]# ll *.rb

-rwxrwxr-x. 1 root root 48141 Apr  1 07:01 redis-trib.rb

[root@bogon src]#

 

腳本需要的ruby包

需要上傳到linux服務。

安裝ruby的包

gem install redis-3.0.0.gem

顯示情況如下:

[root@bogon ~]# gem install redis-3.0.0.gem

Successfully installed redis-3.0.0

1 gem installed

Installing ri documentation for redis-3.0.0...

Installing RDoc documentation for redis-3.0.0...

 

2.4   集群的搭建

第一步:創建6個redis實例,端口號從7001~7006

創建實例舉例第一個,后邊相同,復制改名文件夾,配置文件改端口號即可:

cd /usr/local/redis #進入redis安裝路徑

cd bin

rm -rf dump.db  #刪除緩存的數據庫

cd ..

cp bin ../redis-cluster/redis01 #復制bin並重命名到redis-cluster目錄下

#此時redis_cluster 中已經有一個redis01的實例文件夾了,
#此時可以先修改一下配置文件,比如:修改端口號,開啟cluster-enabled yes
#然后 各種復制這個文件夾,創建6個實例
cp redis01 redis02
cp redis01 redis03
cp redis01 redis04
cp redis01 redis05
cp redis01 redis06
#之后參考第二步把沒有修改的端口號改正確即可

 

第二步:修改redis.conf(這些都在redis01~06中,都需要修改!)

  1) 修改端口號

 

  2) 打開cluster-enable前面的注釋。

第三步:把創建集群的ruby腳本(redis-trib.rb)從redis安裝路徑下的src路徑,復制到redis-cluster目錄下。

cd /usr/local/redis/src

cp *.rb /usr/local/redis-cluster

 

第四步:啟動6個redis實例,刪除dump.db文件,打開redis.conf更改端口號,開啟cluster-enabled yes

創建腳本  vim startall.sh 輸入如下並保存

 1 cd redis01
 2 ./redis-server redis.conf
 3 cd ..
 4 cd redis02
 5 ./redis-server redis.conf
 6 cd ..
 7 cd redis03
 8 ./redis-server redis.conf
 9 cd ..
10 cd redis04
11 ./redis-server redis.conf
12 cd ..
13 cd redis05
14 ./redis-server redis.conf
15 cd ..
16 cd redis06
17 ./redis-server redis.conf

此處保存完畢,chmod +x startall.sh授權,一定要 ./startall.sh 執行,然后再繼續操作!

查看狀態   ps aux|grep redis

 

 

第五步:創建集群。具體ip為虛擬機設置的ip,請注意

./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005  192.168.25.133:7006

接下來會彈一堆代碼。看看就好,后邊需要輸入請求yes繼續執行

[root@bogon redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.25.133:7001 192.168.25.133:7002 192.168.25.133:7003 192.168.25.133:7004 192.168.25.133:7005  192.168.25.133:7006
>>> Creating cluster
Connecting to node 192.168.25.133:7001: OK
Connecting to node 192.168.25.133:7002: OK
Connecting to node 192.168.25.133:7003: OK
Connecting to node 192.168.25.133:7004: OK
Connecting to node 192.168.25.133:7005: OK
Connecting to node 192.168.25.133:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.25.133:7001
192.168.25.133:7002
192.168.25.133:7003
Adding replica 192.168.25.133:7004 to 192.168.25.133:7001
Adding replica 192.168.25.133:7005 to 192.168.25.133:7002
Adding replica 192.168.25.133:7006 to 192.168.25.133:7003
M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.133:7001
   slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.133:7002
   slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.133:7003
   slots:10923-16383 (5461 slots) master
S: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.133:7004
   replicates 5a8523db7e12ca600dc82901ced06741b3010076
S: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.133:7005
   replicates bf6f0929044db485dea9b565bb51e0c917d20a53
S: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.133:7006
   replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
Can I set the above configuration? (type 'yes' to accept): yes

輸入yes之后繼續,接下來的代碼到join...需要耐心等待,如果出現一兩行的省略號,那么很遺憾,可能前邊你的./startall.sh沒有啟動!!!ctrl+c關閉當前,刪除各個文件夾中生成的dump.db,然后啟動腳本./startall.sh,重復上述操作即可成功!

>>> 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 192.168.25.133:7001)
M: 5a8523db7e12ca600dc82901ced06741b3010076 192.168.25.133:7001
   slots:0-5460 (5461 slots) master
M: bf6f0929044db485dea9b565bb51e0c917d20a53 192.168.25.133:7002
   slots:5461-10922 (5462 slots) master
M: c5e334dc4a53f655cb98fa3c3bdef8a808a693ca 192.168.25.133:7003
   slots:10923-16383 (5461 slots) master
M: 2a61b87b49e5b1c84092918fa2467dd70fec115f 192.168.25.133:7004
   slots: (0 slots) master
   replicates 5a8523db7e12ca600dc82901ced06741b3010076
M: 14848b8c813766387cfd77229bd2d1ffd6ac8d65 192.168.25.133:7005
   slots: (0 slots) master
   replicates bf6f0929044db485dea9b565bb51e0c917d20a53
M: 3192cbe437fe67bbde9062f59d5a77dabcd0d632 192.168.25.133:7006
   slots: (0 slots) master
   replicates c5e334dc4a53f655cb98fa3c3bdef8a808a693ca
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@bogon redis-cluster]# 

至此,redis集群搭建完成

每個redis集群的節點都是會互相ping pong 的,接下來我們測試一下 

#結尾的-c一定要寫!不然會出現move失敗的錯誤!
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p 7002 -c #結尾的-c一定要寫!不然會出現move失敗的錯誤!


[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p 7002
192.168.25.133:7002> set a 100
(error) MOVED 15495 192.168.25.133:7003
192.168.25.133:7002> 
[root@bogon redis-cluster]# redis01/redis-cli -h 192.168.25.133 -p 7002 -c
192.168.25.133:7002> set a 100
-> Redirected to slot [15495] located at 192.168.25.133:7003
OK
192.168.25.133:7003> 

2.5 java代碼測試集群

 1 @Test
 2     public void testJedisCluster() {
 3         HashSet<HostAndPort> nodes = new HashSet<>();
 4         nodes.add(new HostAndPort("192.168.25.133", 7001));
 5         nodes.add(new HostAndPort("192.168.25.133", 7002));
 6         nodes.add(new HostAndPort("192.168.25.133", 7003));
 7         nodes.add(new HostAndPort("192.168.25.133", 7004));
 8         nodes.add(new HostAndPort("192.168.25.133", 7005));
 9         nodes.add(new HostAndPort("192.168.25.133", 7006));
10         
11         JedisCluster cluster = new JedisCluster(nodes);
12         
13         cluster.set("key1", "1000");
14         String string = cluster.get("key1");
15         System.out.println(string);
16         
17         cluster.close();
18     }

 

2.6   關閉redis集群(節點)

有開啟自然有關閉,比較麻煩,一般的教程里沒寫,先cd到redis-cluster/,也可以把以下代碼裝進腳本如:vim shutdownall.sh,保存后chmod +x shutdownall.sh ,執行的時候./shutdownall.sh即可

redis01/redis-cli -p 7001 shutdown

redis02/redis-cli -p 7002 shutdown

redis03/redis-cli -p 7003 shutdown

redis04/redis-cli -p 7004 shutdown

redis05/redis-cli -p 7005 shutdown

redis06/redis-cli -p 7006 shutdown

 

2.7   重啟redis集群(節點)

回憶我們創建redis集群的時候是create的cluster,那么重啟呢?其實重啟更簡單!完全無需我們在create一個新的cluster!百度一會了,發現幾乎沒有解決方案,或者有解決方案的沒有技術分享,不多說,直接說結論:

我們創建了集群之后,集群已經存在了,無需創建,僅僅重啟各個節點就可以運行了!本文上邊有提到startall.sh腳本的創建,只需執行那個腳本就啟動了集群了!

./startall.sh

 -------本文理論部分來自傳智黑馬授課筆記,僅作記錄,實際操作的部分以及筆記中不全的步驟在這里得以補全,添加自認為會坑的細節。不喜勿噴。

 

無法連接的bug解決引用自: 

http://blog.csdn.net/skymouse2002/article/details/52279553


免責聲明!

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



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