分享知識-快樂自己:redis叢集搭建
Redis 介紹:
2、C 語言編寫
3、基於記憶體執行,並且支援持久化
4、Key value 儲存
5、是主流的 Nosql 資料庫之一
Redis 優點:
1、記憶體使用方面,表現優異
2、資料讀寫快速高效
3、持久化效能相比其他Nosql資料庫要好
4、擴充套件性和移植性強
5、分散式中不可或缺的一員
Redis 安裝(單個): ofollow,noindex">點我下載redis包 點我下載redis客戶端
安裝依賴:
yum install gcc-c++ 安裝!
1):解壓redis包到指定目錄
[root@admin tools]# tar -zxvf redis-3.2.10.tar.gz -C ../redis/
2):進入redis的解壓目錄輸入make
3):安裝 make install PREFIX="安裝路徑"
如果在安裝的位置看到一個bin目錄 說明安裝成功了。
可能會出現的問題:
1):如果make報錯
make[1]: 進入目錄“/software/redis-3.2.10/src” CC adlist.o /bin/sh: cc: 未找到命令 make[1]: *** [adlist.o] 錯誤 127 make[1]: 離開目錄“/software/redis-3.2.10/src” make: *** [all] 錯誤 2 問題 少cc元件!
解決辦法:
yum install gcc-c++ 安裝!
1-1):如果yum安裝過程中出現映象的問題
解決辦法:
1、清空自帶的yum源
rm -rf /etc/yum.repos.d/*
2、建立本地yum源
vim /etc/yum.repos.d/xx.repo 字尾名必須是以 repo結尾的! xx是檔名,自擬!
3、編輯檔案xx.repo
[local] name=local baseurl=file:///mnt gpgcheck=0
4、掛載光碟 光碟的掛載點必須是 上面的baseurl
mount /dev/cdrom /mnt/
只有掛載只有才有 /mnt/目錄
5、實現永久掛載光碟
vim /etc/fstab
在檔案中的最後一行輸入
/dev/cdrom /mnt iso9660 defaults 0 0
6、讓檔案立即生效
mount -a
可以使用yum了。
2):如果遇到 CC adlist.o
In file included from adlist.c:34:0: zmalloc.h:50:31: 致命錯誤:jemalloc/jemalloc.h:沒有那個檔案或目錄 #include <jemalloc/jemalloc.h>
解決辦法:
make MALLOC=libc
解決完錯誤 重新 make 就 OK 了。
4):啟動 redis
5):redis 連線測試
開啟新的建立 進入redis的命令列模式
注意另一個啟動redis的視窗,現在不能關閉。
6):修改 配置redis.conf檔案 後臺執行
修改pid的檔案位置:
修改 bind 新增主機 IP 連線客戶端:之後重啟redis服務
測試連線:
7):關閉 redis 服務
Redis Cluster叢集設計:
Redis叢集搭建的方式有多種,例如使用zookeeper等,但從redis3.0之後版本支援Redis-Cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線。
其redis-cluster架構圖如下:
結構特點:
1、所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
2、節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
3、客戶端與redis節點直連,不需要中間proxy層。客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可。
4、redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster負責維護node<->slot<->value。
5、Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。
redis cluster節點分配:
假如現在有三個主節點分別是:A, B, C三個節點,它們可以是一臺機器上的三個埠,也可以是三臺不同的伺服器。
那麼,採用雜湊槽 (hash slot)的方式來分配16384個slot的話,它們三個節點分別承擔的slot區間是:
節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383.
獲取資料:
如果存入一個值,按照redis cluster雜湊槽的演算法: CRC16('key')%16384 = 6782。 那麼就會把這個 key 的儲存分配到節點B上了。
同樣,當我連線(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的演算法,然後內部跳轉到B節點上獲取資料。
新增一個主節點:
新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大致就會變成這樣:
節點A覆蓋1365-5460
節點B覆蓋6827-10922
節點C覆蓋12288-16383
節點D覆蓋0-1364,5461-6826,10923-12287
同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。
Redis Cluster主從模式(選舉和容錯)
Redis Cluster為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點掛掉後,就會從從節點選取一個來充當主節點,從而保證叢集不會掛掉。
上面那個例子裡, 叢集有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個叢集了。A和C的slot也無法訪問。
所以我們在叢集建立的時候,一定要為每個主節點都新增從節點, 比如像這樣, 叢集包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也可以繼續正確工作。
B1節點替代了B節點,所以Redis叢集將會選擇B1節點作為新的主節點,叢集將會繼續正確地提供服務。 當B重新開啟後,它就會變成B1的從節點。
不過需要注意,如果節點B和B1同時掛了,Redis叢集就無法繼續正確地提供服務了。
Redis 安裝(叢集)
Redis偽分散式叢集搭建在一臺伺服器上搭建6個redis!
1):首先關閉上一個的 redis 服務。
[root@admin bin]# ./redis-cli -h 192.168.31.206 -p 6379 shutdown
2):清除dump.rdb檔案
rm -rf dump.rdb
3):建立一個叢集資料夾
[root@admin opt]# mkdir redis-cluster
4):叢集資料夾中建立6個redis目錄
[root@admin redis-cluster]# mkdir redis01 redis02 redis03 redis04 redis05 redis06
5):把之前的 redis/bin 分別拷貝到6個redis目錄下 、把之前的redis.conf 檔案拷貝到bin下
1、先將之前的 redis bin 拷貝到 redis01下;redis.conf 拷貝到 bin 下
[root@admin opt]# cp -r ./redis/redis-3.2.10/bin ./redis-cluster/redis01/ [root@admin opt]# cp -r ./redis/redis-3.2.10/redis.conf ./redis-cluster/redis01/bin/
2、修改 redis.conf 檔案【叢集設定】
注意6379埠對應的這個叢集設定 不要取消註釋,方便後續演示單機版操作!
3、修改redis.conf檔案中的port埠
4、修改 bind IP 地址
5、依次拷貝 redis01下的bin 到 redis02-redis06 中
[root@admin redis-cluster]# cp -r redis01/bin ./redis02/ [root@admin redis-cluster]# cp -r redis01/bin ./redis03/ [root@admin redis-cluster]# cp -r redis01/bin ./redis04/ [root@admin redis-cluster]# cp -r redis01/bin ./redis05/ [root@admin redis-cluster]# cp -r redis01/bin ./redis06/
6、依次修改 redis-02-redis06 bin/redis.conf 中的port埠號
分別為:7002 7003 7004 7005 7006
[root@admin redis-cluster]# vim redis02/bin/redis.conf [root@admin redis-cluster]# vim redis03/bin/redis.conf [root@admin redis-cluster]# vim redis04/bin/redis.conf [root@admin redis-cluster]# vim redis05/bin/redis.conf [root@admin redis-cluster]# vim redis06/bin/redis.conf
7、寫個批處理檔案一次把所有的redis啟動
start-all.sh:
cd redis01/bin ./redis-server redis.conf cd ../../ cd redis02/bin/ ./redis-server redis.conf cd ../../ cd redis03/bin/ ./redis-server redis.conf cd ../../ cd redis04/bin/ ./redis-server redis.conf cd ../../ cd redis05/bin/ ./redis-server redis.conf cd ../../ cd redis06/bin/ ./redis-server redis.conf cd ../../
stop-all.sh:
cd redis01/bin/ ./redis-cli -h 192.168.31.206 -p 7001 shutdown cd ../../ cd redis02/bin/ ./redis-cli -h 192.168.31.206 -p 7002 shutdown cd ../../ cd redis03/bin/ ./redis-cli -h 192.168.31.206 -p 7003 shutdown cd ../../ cd redis04/bin/ ./redis-cli -h 192.168.31.206 -p 7004 shutdown cd ../../ cd redis05/bin/ ./redis-cli -h 192.168.31.206 -p 7005 shutdown cd ../../ cd redis06/bin/ ./redis-cli -h 192.168.31.206 -p 7006 shutdown cd ../../
8、啟動叢集測試
[root@admin redis-cluster]# ./start-all.sh -bash: ./start-all.sh: 許可權不夠 [root@admin redis-cluster]# chmod 700 start-all.sh
[root@admin redis-cluster]# ./start-all.sh [root@admin redis-cluster]# ps -ef|grep redis
停止:(開啟後 這裡先不用關閉 可省略此步驟)
[root@admin redis-cluster]# ./stop-all.sh -bash: ./stop-all.sh: 許可權不夠 [root@admin redis-cluster]# chmod 700 stop-all.sh [root@admin redis-cluster]# ./stop-all.sh
6):安裝ruby Ruby可以把我們所有的redis連線在一起
yuminstallruby
把 redis-3.0.0.gem 這個檔案放在 redis-cluster 目錄下即可!
yuminstallredis-3.0.0.gem 或者 geminstallredis-3.0.0.gem
7):安裝叢集
./redis-trib.rbcreate --replicas 1 192.168.31.206:7001 192.168.31.206:7002 192.168.31.206:7003 192.168.31.206:7004 192.168.31.206:7005 192.168.31.206:7006
如果沒有 redis-trib.rb 點我提供好了 。
8):測試叢集
客戶端也成功連線: