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