Redis高速緩存
利用內存保存數據,讀寫速度遠超硬盤;可以減少I/O操作,降低I/O壓力。
- 發紅包、搶紅包的數據可以存在高速緩存中,加快處理速度,不需要經過數據庫
- 淘寶首頁一些優惠活動商品等熱數據可以存在高速緩存中,而基於大數據的推薦產品從數據庫中讀取
Redis介紹
- Redis是Wmware開發的開源免費的KV型NoSQL緩存產品
- Redis具有很好的性能,最多可以提供10萬次每秒的讀寫
- 目前新浪微博團隊組建了世界上最大規模的Redis集群
- Redis目前的集群方案分為以下幾種:
- RedisCluster:官方推薦,沒有中心節點
- Codis:中間件產品,存在中心節點
- Twemproxy:中間件產品,存在中心節點
RedisCluster
- 沒有中心節點,客戶端與Redis節點直連,不需要中間代理層
- 數據可以被分片存儲,每個節點保存一部分數據,互不相同,某個節點掛掉可能丟失數據,所以要為每個節點設置冗余節點
- 管理方便,后續可以自行添加或刪除節點
Redis主存同步
- Redis集群的數據采取切分存儲,每個節點存儲的各不相同。某個節點掛掉,其存儲的數據就丟失了。
- Redis集群中的數據庫復制通過主從同步來實現的。主節點把數據分發給從節點。主存同步的好處就在於高可用。Redis節點有冗余設計
Redis集群高可用
- Redis集群中應該包含奇數個Master,至少應該有3個Master。
- Redis和PXC集群都有選舉機制,如果超過一半的節點掛掉,那么剩下的節點沒有超過一半,是無法選舉組成一個新的集群的。
- 連接Redis集群的任何一個節點都能正確寫入數據,Redis節點能計算數據應該保存到哪個節點,將數據切分保存到相應的其他節點上。
- Redis節點不配置負載均衡,因為后端項目使用Spring,Spring幫我們實現了負載均衡。(或者使用Nginx代理也行)
配置RedisCluster集群
配置Redis網段
創建net2網段
docker network create --subnet=172.19.0.0/16 net2
安裝第三方Redis鏡像
# 拉取鏡像 docker pull yyyyttttwwww/redis # 修改鏡像名稱 docker tag yyyyttttwwww/redis redis # 運行容器 docker run -it -d --name r1 -p 5001:6379 --net=net2 --ip 172.19.0.2 redis bash # 進入容器 docker exec -it r1 bash
修改容器內redis配置文件,容器中的配置文件路徑: /usr/redis/redis.conf
daemonize yes # 以后台進程運行。這句需要注釋掉,否則在指定配置文件時會啟動失敗(https://www.jianshu.com/p/923eb2e0a5f0) cluster-enabled yes # 開啟集群 cluster-config-file nodes.conf # 集群配置文件 cluter-node-timeout 15000 # 超時時間 appendonly yes # 開啟AOF模式
然后啟動redis
# 進入redis目錄 cd /usr/redis/src/ # 使用配置文件啟動Redisz ./redis-server ../redis.conf
然后按照相同方式啟動其他5個Redis節點
docker run -it -d --name r2 -p 5002:6379 --net=net2 --ip 172.19.0.3 redis bash docker run -it -d --name r3 -p 5003:6379 --net=net2 --ip 172.19.0.4 redis bash docker run -it -d --name r4 -p 5004:6379 --net=net2 --ip 172.19.0.5 redis bash docker run -it -d --name r5 -p 5005:6379 --net=net2 --ip 172.19.0.6 redis bash docker run -it -d --name r6 -p 5006:6379 --net=net2 --ip 172.19.0.7 redis bash
配置第三方Redis集群
利用redis-trib.rb創建Redis集群
docker exec -it r1 bash cd /usr/redis/ mkdir cluster cd src cp redis-trib.rb ../cluster/ cd ../cluster/ ./redis-trib.rb create --replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379
創建完畢后會有三個主節點,三個從節點。(注意:這里要輸入yes,不是y)

root@26a99229635f:/usr/redis/cluster# ./redis-trib.rb create --replicas 1 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 Adding replica 172.19.0.5:6379 to 172.19.0.2:6379 Adding replica 172.19.0.6:6379 to 172.19.0.3:6379 Adding replica 172.19.0.7:6379 to 172.19.0.4:6379 M: fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:6379 slots:0-5460 (5461 slots) master M: 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:6379 slots:5461-10922 (5462 slots) master M: 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:6379 slots:10923-16383 (5461 slots) master S: 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:6379 replicates fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a S: 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:6379 replicates 361923553a5113db299079326ea59a537d6913fd S: df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:6379 replicates 7a60116e296cdfb322f17219335f4de457d06d34 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 172.19.0.2:6379) M: fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:6379 slots:0-5460 (5461 slots) master M: 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:6379 slots:5461-10922 (5462 slots) master M: 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:6379 slots:10923-16383 (5461 slots) master M: 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:6379 slots: (0 slots) master replicates fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a M: 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:6379 slots: (0 slots) master replicates 361923553a5113db299079326ea59a537d6913fd M: df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:6379 slots: (0 slots) master replicates 7a60116e296cdfb322f17219335f4de457d06d34 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
--replicas 1參數表示為每個主節點創建一個從節點
查看集群狀態
/usr/redis/src/redis-cli -c
cluster nodes

root@26a99229635f:/# /usr/redis/src/redis-cli -c 127.0.0.1:6379> cluster nodes fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 172.19.0.2:6379 myself,master - 0 0 1 connected 0-5460 df072f3ef3d26335a3a391a9fa01824892edef49 172.19.0.7:6379 slave 7a60116e296cdfb322f17219335f4de457d06d34 0 1558171927740 6 connected 3c79d17299bf22a0c374291fae517a8769df8128 172.19.0.5:6379 slave fe2e218c8bd90c1e2efa9c82bf5c63dc9140d58a 0 1558171925725 4 connected 7a60116e296cdfb322f17219335f4de457d06d34 172.19.0.4:6379 master - 0 1558171926733 3 connected 10923-16383 49f1ec354df28a07f97c19d2d6893104dda7004d 172.19.0.6:6379 slave 361923553a5113db299079326ea59a537d6913fd 0 1558171929754 5 connected 361923553a5113db299079326ea59a537d6913fd 172.19.0.3:6379 master - 0 1558171928746 2 connected 5461-10922
安裝Redis鏡像
創建外部存儲卷
# 創建外部映射文件 mkdir /home/soft/redis cd /home/soft/redis mkdir r1 r2 r3 r4 r5 r6
修改Redis配置文件(注意一定要按版本拷貝配置文件)
cd r1 vim redis.conf # bind 127.0.0.1 #要注釋掉 # daemonize yes # 以后台進程運行。這句需要注釋掉,否則在指定配置文件時會啟動失敗(https://www.jianshu.com/p/923eb2e0a5f0) cluster-enabled yes # 開啟集群 cluster-config-file nodes.conf # 集群配置文件 cluster-node-timeout 15000 # 超時時間 appendonly yes # 開啟AOF模式
# 拷貝配置文件 cp redis.conf ../r2/redis.conf cp redis.conf ../r3/redis.conf cp redis.conf ../r4/redis.conf cp redis.conf ../r5/redis.conf cp redis.conf ../r6/redis.conf
導入本地Redis鏡像文件,運行Redis容器
docker pull redis # 將/home/soft/redis目錄映射為容器的/data目錄 docker run -it -d -p 5001:6379 -v /home/soft/redis/r1:/data --net=net2 --ip 172.19.0.2 --name r1 redis /data/redis.conf docker run -it -d -p 5002:6379 -v /home/soft/redis/r2:/data --net=net2 --ip 172.19.0.3 --name r2 redis /data/redis.conf docker run -it -d -p 5003:6379 -v /home/soft/redis/r3:/data --net=net2 --ip 172.19.0.4 --name r3 redis /data/redis.conf docker run -it -d -p 5004:6379 -v /home/soft/redis/r4:/data --net=net2 --ip 172.19.0.5 --name r4 redis /data/redis.conf docker run -it -d -p 5005:6379 -v /home/soft/redis/r5:/data --net=net2 --ip 172.19.0.6 --name r5 redis /data/redis.conf docker run -it -d -p 5006:6379 -v /home/soft/redis/r6:/data --net=net2 --ip 172.19.0.7 --name r6 redis /data/redis.conf
配置Redis集群
redis-trib.rb已經不再推薦,使用redis-cli來創建容器。
進入某個節點容器的 /usr/local/bin 目錄,執行如下命令創建容器
./redis-cli --cluster create 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379 --cluster-replicas 1
創建完畢后會有三個主節點,三個從節點。(注意:這里要輸入yes,不是y)

root@4a8c3bf758f0:/usr/local/bin# ./redis-cli --cluster create 172.19.0.2:6379 172.19.0.3:6379 172.19.0.4:6379 172.19.0.5:6379 172.19.0.6:6379 172.19.0.7:6379 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 172.19.0.6:6379 to 172.19.0.2:6379 Adding replica 172.19.0.7:6379 to 172.19.0.3:6379 Adding replica 172.19.0.5:6379 to 172.19.0.4:6379 M: 890da9d1f480380e7154685dc6a757e3a3be2092 172.19.0.2:6379 slots:[0-5460] (5461 slots) master M: b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 172.19.0.3:6379 slots:[5461-10922] (5462 slots) master M: e68561cc3fb54fc5e4153dafc7465bd5b361ec95 172.19.0.4:6379 slots:[10923-16383] (5461 slots) master S: 54e1c37fc1e8cc3b8afb6adb35138a7ad852926c 172.19.0.5:6379 replicates e68561cc3fb54fc5e4153dafc7465bd5b361ec95 S: 55ef9e60a9a5ca5c6ec1dc71b20fb973acbd11fe 172.19.0.6:6379 replicates 890da9d1f480380e7154685dc6a757e3a3be2092 S: 0bcb8196c9f119e18ca07041fe6332ed5d6fc580 172.19.0.7:6379 replicates b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 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 172.19.0.2:6379) M: 890da9d1f480380e7154685dc6a757e3a3be2092 172.19.0.2:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) S: 0bcb8196c9f119e18ca07041fe6332ed5d6fc580 172.19.0.7:6379 slots: (0 slots) slave replicates b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 S: 55ef9e60a9a5ca5c6ec1dc71b20fb973acbd11fe 172.19.0.6:6379 slots: (0 slots) slave replicates 890da9d1f480380e7154685dc6a757e3a3be2092 M: b738cc123c0f5ecf5a329f3d974b8cfb8c88cf20 172.19.0.3:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 54e1c37fc1e8cc3b8afb6adb35138a7ad852926c 172.19.0.5:6379 slots: (0 slots) slave replicates e68561cc3fb54fc5e4153dafc7465bd5b361ec95 M: e68561cc3fb54fc5e4153dafc7465bd5b361ec95 172.19.0.4:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered.
可以進入某個節點容器后,執行如下指令進入集群:
/usr/local/bin/redis-cli -c
查看集群狀態
cluster nodes