目录
1. 准备环境:
2. 简介:
-> 2.1 前言:
-> 2.2 Redis集群架构实现了对redis的水平扩容
-> 2.3 redis cluster集群原理
3. 搭建后特别需要注意的问题
->3.1 [重点]: 如果一个服务出现故障: 是否可以继续提供服务???
---> 3.1.1 如果集群中故障redis服务存在主从服务,
---> 3.1.2 如果redis集群中没有按官方推荐的去做主从备份
-> 3.2 理解:
---> 3.2.1 修改配置 redis.conf
-> 3.3 单服务器部署多个节点是否会影响带宽
4. 实际操作
-> 4.1 创建文件夹
-> 4.2 进入目录
-> 4.3 创建模板
--> 4.3.1 文件输入内容
---> 4.3.2 模板注释
---> 4.3.3 特别注意宿主机ip
-> 4.4 在当前目录下操作
-> 4.5 创建docker 容器
-> 4.6 进入redis-8010容器
-> 4.7 创建redis-cluster集群配置
-> 4.8 搭建成功了, 进入集群redis查看(内网ip)
-> 4.9 测试,如图所示, 也就解释了上述问题
5.出现异常, 执行下面重新来过
下一篇: java使用redis集群进行操作
1. 准备环境:
云服务器<虚拟机也可以>, centos7.9, docker-ce , 有redis镜像
2. 简介:
-> 2.1 前言(云服务器请与06配合使用):
===> 传送门: 06-redis集群模式(中) 项目测试的云服务ip变内网等(解决大多数问题)
主从模式 哨兵模式, 都会在集群模式中体现出来, 官方推荐集群最少三主三从 6个redis服务
-> 2.2 Redis集群架构实现了对redis的水平扩容
即启动N个redis节点,将整个数据分布存储在这N个redis节点中,每个节点存储总数据的1/N。redis集群通过分区提供一定程度的可用性,即使集群中有一部分节点失效或无法进行通讯,集群也可以继续处理命令请求。
-> 2.3 redis cluster集群原理
redis cluster集群默认16384个hash槽,集群搭建成功之后,需要给每一个主节点分配hash槽。当外部数据插入的时候,会对key进行crc16然后对16384取模,这样就计算出哪个节点对该数据进行管理。创建集群时就已经分配哈希槽, 如果采用的3主3从的结构,主从模式通过哨兵模式,实现类主服务故障自动切换, 进而实现类服务的高可用
3. 搭建后特别需要注意的问题
->3.1 [重点]: 如果一个服务出现故障: 是否可以继续提供服务???
---> 3.1.1 如果集群中故障redis服务存在主从服务,
那么访问的时候回访问从redis服务,集群正常运行, 参考主从哨兵机制,
重新选举master 一般30秒
---> 3.1.2 如果redis集群中没有按官方推荐的去做主从备份
其中有一台redis服务故障挂掉,emm, 会导致整个集群则都不能使用,因为Redis集群的时候每一个Redis节点保存的数据不一样,如果一个节点有问题则整个数据就缺失。
-> 3.2 理解:
假设是一个云平台, 每个数据存在不同服务里 其中正好存你的数据服务gg了, 并且还没从服务重新选举, emm 其他人没影响<需要做一下配置> , 你的数据查不出来了
---> 3.2.1 修改配置 redis.conf
取决于redis.conf中的参数cluster-require-full-coverage
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为yes ,整个集群都挂掉
如果某一段插槽的主从都挂掉,而cluster-require-full-coverage为no , 该插槽数据全都不能使用,也无法存储。
-> 3.3 单服务器部署多个节点是否会影响带宽
相当会了 详细介绍引用他人文章了: Redis Cluster集群优势劣势已经介绍
4. 实际操作
-> 4.1 创建文件夹
mkdir -p /usr/local/src/docker/redis-cluster
-> 4.2 进入目录
cd /usr/local/src/docker/redis-cluster
-> 4.3 创建模板
vim redis-cluster.tmpl
--> 4.3.1 文件输入内容
port ${PORT}
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 10.0.4.*
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
bind 0.0.0.0
protected-mode no
---> 4.3.2 模板注释
port: 节点端口(对外通信)
cluster-enabled: 开启集群
cluster-config-file: 集群的配置是 nodes.conf
cluster-node-timeout:连接超时时间5000毫秒
cluster-announce-ip:宿主机ip
cluster-announce-port:集群节点映射端口
cluster-announce-bus-port:集群总线端口
appendonly:持久化模式 aof是否开启
---> 4.3.3 特别注意宿主机ip
1 可以是内网ip(如果想远端必须是公网ip)
ps: 但是公网ip需要进行下面操作: ===> 传送门: 06-redis集群模式(中) 项目测试的云服务ip变内网等(解决大多数问题)
2 可以使用域名解析
3 不可以使用172.0.0.1
-> 4.4 在当前目录下操作
for port in $(seq 8010 8015); \
do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
解释一下: shell脚本 循环 参数传递 生成配置文件
-> 4.5 创建docker 容器
for port in $(seq 8010 8015); \
do \
docker run -it -d -p ${port}:${port} -p 1${port}:1${port} \
--privileged=true -v /usr/local/src/docker/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--privileged=true -v /usr/local/src/docker/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net redis-net \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
-> 4.6 进入redis-8010容器
docker exec -it redis-8010 bash
-> 4.7 创建redis-cluster集群配置
redis-cli --cluster create 10.0.4.*:8010 10.0.4.*:8011 10.0.4.*:8012 10.0.4.*:8013 10.0.4.*:8014 10.0.4.*:8015 --cluster-replicas 1
-> 4.8 搭建成功了, 进入集群redis查看(内网ip)
redis-cli -c -h 10.0.4.* -p 8010
cluster nodes #查看集群节点数
cluster info #查看集群基本信息
-> 4.9 测试,如图所示, 也就解释了上述问题
5.出现异常, 执行下面重新来过
批量删除容器 批量删除目录挂载
docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker stop
docker ps -a | grep -i "redis-801*" | awk '{print $1}' | xargs docker rm -f
#shell脚本 删除redis容器
for i in $(seq 8010 8015); \
do docker rm -f redis-${i}; \
done;
rm -rf 801{0..5}/conf/redis.conf
rm -rf 801{0..5}
[留下拓展, 正式生产环境 配置密码等配置, 后续补充]
预告06篇: 06-redis集群模式(中) 项目测试的云服务ip变内网等(解决大多数问题)