目錄
前言
本次就是通過搭建redis-cluster來優化整個項目的運行速度和數據安全
在網上找了比較多的搭建方式,但是大部分都不太齊全,所以我表示深惡痛絕。
還是自己寫一個博客,免得後人找罪受,和記錄一下。
先提前說一下,本次使用的是docker-compse配置文件部署的
redis-cluster的概念
在講redis-cluster之前我們先做一個對比:
一、主從集羣(master-slave)
主從結構的redis由主節點負責讀寫操作,從節點負責讀操作,
這樣也就是讀寫分離,並且每個節點都有相同的數據量,實現高性能
二、哨兵主從集羣(master-slave-sentinel)
簡單的主從集羣有個問題,就是主節點掛了之後,無法從新選舉新的節點作爲主節點進行寫操作,導致服務不可用
因此,需要一種機制對主節點掛了的集羣進行監控,並且重新選舉主節點,這就是哨兵的作用
這樣就可以防止突發事件使主節點掛了而導致這個生態崩壞,實現高可用
二、存在的問題!!!
因爲二、(哨兵主從)存在着因爲即使主節點掛了,還是可以從從節點中選中一個節點當主節點。那麼就要保證每一個節點之間的數據都是全量複製的,可是這樣就會出現一個問題:
我有三個服務器的內存分別爲 32G,16G,8G
那麼就意味着我們所搭建的集羣數據存放量就會所限於最小的服務器!
三、哨兵主從集羣(master-slave-sentinel)
優勢:
- 去中心化,集羣最大可增加1000個節點,性能隨節點增加而線性擴展。
- 管理方便,後續可自行增加或摘除節點,移動分槽等等。
- 簡單,易上手。
關鍵技術點:
Redis集羣沒有並使用傳統的一致性哈希來分配數據,而是採用另外一種叫做哈希槽 (hash slot)的方式來分配的。
redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,
然後將這個key 分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384。所以我們在測試的時候看到set和get的時候,
直接跳轉到了7000端口的節點。
docker部署redis-cluster
1、docker-compose安裝
可能有些夥伴是不太懂這個的所以,也一併寫在這。
這個不是官方的源,如果想要正規的可以去官網查看(我是用着慢才用這個)
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod下
chmod +x /usr/local/bin/docker-compose
測試
docker-compose -v
如果顯示版本號既表示可以使用
2、編寫docker-compose.yml文件
在編寫之前,我先說一下我的工作目錄:/data/redis
①在這個下面直接運行:(就會創建好六個文件夾)
ps:或者是使用sh腳本
for i in `seq 7001 7006`
do
mkdir -p ${i}/data
done
②在下面編寫:docker-compose.yml文件touch docker-compose.yml
version: '3.4'
x-image:
&default-image
publicisworldwide/redis-cluster
x-restart:
&default-restart
always
x-netmode:
&default-netmode
host
services:
redis1:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7001/data:/data
environment:
- REDIS_PORT=7001
redis2:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7002/data:/data
environment:
- REDIS_PORT=7002
redis3:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7003/data:/data
environment:
- REDIS_PORT=7003
redis4:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7004/data:/data
environment:
- REDIS_PORT=7004
redis5:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7005/data:/data
environment:
- REDIS_PORT=7005
redis6:
image: *default-image
network_mode: *default-netmode
restart: *default-restart
volumes:
- /data/redis/7006/data:/data
environment:
- REDIS_PORT=7006
③啓動所有redis,跟據配置文件
docker-compose up -d
3、創建六個容器
記得要把ip給改了,並且在第一次使用的鏡像是inem0o/redis-trib鏡像,所以可能會pull下面所以沒得事。
docker run --net=host --rm -it inem0o/redis-trib create --replicas 1 192.168.47.138:7001 192.168.47.138:7002 192.168.47.138:7003 192.168.47.138:7004 192.168.47.138:7005 192.168.47.138:7006
出現下面的表示沒問題了
啓動成功
docker部署redis-cluster後測試
1、安裝一個redis-cli客戶端
redis在第三方的源裏,首先添加源,最常用的是epel源
yum install epel-release
然後就可以安裝redis了
yum install -y redis
安裝完成以後配置文件/etc/redis.conf
啓動redis服務端
redis-server /etc/redis.conf
查看是否啓動
ps -ef|grep "redis"
啓動客戶端
redis-cli -c -p *
簡單使用
查看ps -ef|grep redis
2、進入測試
redis-cli -c -p *ip
(7001~7006)
就可以看到效果了:
後記
這個是一個主機模式(host)開啓的,
當然,還有橋接模式之類的,
下面的內容都可以看看,
如何用docker部署redis cluster
Docker Redis 5.0 集羣(cluster)搭建
一文輕鬆搞懂redis集羣原理及搭建與使用