目录
前言
本次就是通过搭建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集群原理及搭建与使用