docker部署redis-cluster(數據分片)

前言

本次就是通過搭建redis-cluster來優化整個項目的運行速度和數據安全

在網上找了比較多的搭建方式,但是大部分都不太齊全,所以我表示深惡痛絕。

還是自己寫一個博客,免得後人找罪受,和記錄一下。

先提前說一下,本次使用的是docker-compse配置文件部署的

redis-cluster的概念

在講redis-cluster之前我們先做一個對比:
一、主從集羣(master-slave)

主從結構的redis由主節點負責讀寫操作,從節點負責讀操作,

這樣也就是讀寫分離,並且每個節點都有相同的數據量,實現高性能
在這裏插入圖片描述
二、哨兵主從集羣(master-slave-sentinel)
簡單的主從集羣有個問題,就是主節點掛了之後,無法從新選舉新的節點作爲主節點進行寫操作,導致服務不可用
因此,需要一種機制對主節點掛了的集羣進行監控,並且重新選舉主節點,這就是哨兵的作用

這樣就可以防止突發事件使主節點掛了而導致這個生態崩壞,實現高可用
在這裏插入圖片描述
二、存在的問題!!!
因爲二、(哨兵主從)存在着因爲即使主節點掛了,還是可以從從節點中選中一個節點當主節點。那麼就要保證每一個節點之間的數據都是全量複製的,可是這樣就會出現一個問題:
我有三個服務器的內存分別爲 32G,16G,8G
那麼就意味着我們所搭建的集羣數據存放量就會所限於最小的服務器!

三、哨兵主從集羣(master-slave-sentinel)
在這裏插入圖片描述
優勢:

  1. 去中心化,集羣最大可增加1000個節點,性能隨節點增加而線性擴展。
  2. 管理方便,後續可自行增加或摘除節點,移動分槽等等。
  3. 簡單,易上手。

關鍵技術點:
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集羣原理及搭建與使用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章