Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,也被称为键值存储系统。它被设计为高性能、可扩展、持久化的数据库解决方案,用于处理大规模的数据集。Redis支持多种数据类型,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。它提供了丰富的操作命令,使得开发人员可以方便地使用这些数据类型进行各种操作。
Redis的主要特点包括:
内存存储:Redis将数据存储在内存中,因此具有非常高的读写性能。
持久化:Redis支持将内存中的数据持久化到磁盘,以防止数据丢失。
高可用性:Redis支持主从复制、Sentinel哨兵机制和集群模式,提供高可用性和故障恢复机制。
丰富的数据结构:Redis支持多种数据结构,使得开发者可以灵活地处理不同类型的数据。
由于其高性能和灵活性,Redis常被用于缓存、会话管理、消息队列等场景,并广泛应用于Web开发、分布式系统和云计算中。
1.1、可以选择自己需要的版本进行下载
1.2、解压文件并装载docker镜像,运行redis_docker_images.sh拉取镜像,脚本代码如下:
# 获取当前路径,并将其赋值给变量currPath
currPath=$(pwd);
# 将脚本的第一个参数赋值给变量installpath,用作安装路径
installpath="$1";
# 解压
tar -zxf $currPath/redis_6.2.6.tar.gz -C $installtempath/
# 加载一个Docker镜像
docker load -i $installtempath/redis_6.2.6.tar
2.1、确定三主三从共六个节点,找一个目录构建各个节点对应的data文件夹(空的)和redis.conf配置文件,用来挂载节点redis节点容器;
2.2、每一个redis节点的.conf文件都进行如下配置,将port和cluster-config-file修改成对应节点信息即可:
#bind 0.0.0.0
bind 192.168.10.230
port 6379
# 开启集群模式
cluster-enabled yes
# 集群配置信息存放文件名,每一个节点需要有个配置文件,需要6份,每个节点处于集群的角色都需要告知其他所有节点,彼此知道,这个文件用于存储集群模式下的集群状态等信息,这个问及那是由reids自己维护。如果需要重新创建集群,那么需要将这个文件删掉。
cluster-config-file nodes-6379.conf
# 节点离线时间限制,到达此值时发起某个主从重新选举master
cluster-node-timeout 5000
# 设置本机密码
requirepass Dig1688
# 设置访问别的机器的密码
masterauth Dig1688
# 开启aof
appendonly yes
2.3、构建多个容器节点,运行redis_start.sh构建容器,得到多个redis节点容器,脚本代码如下:
##单体redis配置文件启动写法
## 使用配置文件写法
#docker run --restart=unless-stopped \
#-d --privileged=true \
#--name redis_dig1 \
#-p 19141:6379 \
#-v /home/jenkins/dig_apps/mnt/redis/conf/redis.conf:/etc/redis/redis.conf \
#redis:6.2.6 redis-server /etc/redis/redis.conf
#环境变量
currPath=$(pwd);
installpath="$1";
#装载配置文件-可以把变量定义到配置文件dig.conf里面去--这里用不上,在下面写死了
source $currPath/dig.conf
appspath="$installpath/dig_apps";
# redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000,例如redis端口为6379,则集群总线端口为16379,所有服务器的点需要开通redis的客户端连接端口和集群总线端口,当然,如果有安全组,也要放开这些端口。
# 采用端口映射的方式,存在宿主机id(也就是本虚机ip)不会覆盖掉容器ip,导致外部连接都是走的容器ip,所以一直连接失败;
#docker run --restart=unless-stopped \
#-d --privileged=true \
#--name redis-6379 \
#--net=host \
#-p 6379:6379 \
#-p 16379:16379 \
#-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6379.conf:/etc/redis/redis.conf \
#-v /home/jenkins/dig_apps/mnt/redis-cluster/data6379:/data \
#redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
# 采用 --net=host(宿主网络模式):容器与宿主机共享网络命名空间,容器直接使用宿主机的网络接口,可行;
docker run --restart=unless-stopped \
-d --privileged=true \
--name redis-6379 \
--net=host \
-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6379.conf:/etc/redis/redis.conf \
-v /home/jenkins/dig_apps/mnt/redis-cluster/data6379:/data \
redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
docker run --restart=unless-stopped \
-d --privileged=true \
--name redis-6380 \
--net=host \
-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6380.conf:/etc/redis/redis.conf \
-v /home/jenkins/dig_apps/mnt/redis-cluster/data6380:/data \
redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
docker run --restart=unless-stopped \
-d --privileged=true \
--name redis-6381 \
--net=host \
-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6381.conf:/etc/redis/redis.conf \
-v /home/jenkins/dig_apps/mnt/redis-cluster/data6381:/data \
redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
docker run --restart=unless-stopped \
-d --privileged=true \
--name redis-6382 \
--net=host \
-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6382.conf:/etc/redis/redis.conf \
-v /home/jenkins/dig_apps/mnt/redis-cluster/data6382:/data \
redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
docker run --restart=unless-stopped \
-d --privileged=true \
--name redis-6383 \
--net=host \
-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6383.conf:/etc/redis/redis.conf \
-v /home/jenkins/dig_apps/mnt/redis-cluster/data6383:/data \
redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
docker run --restart=unless-stopped \
-d --privileged=true \
--name redis-6384 \
--net=host \
-v /home/jenkins/dig_apps/mnt/redis-cluster/redis-6384.conf:/etc/redis/redis.conf \
-v /home/jenkins/dig_apps/mnt/redis-cluster/data6384:/data \
redis:6.2.6 redis-server /etc/redis/redis.conf --appendonly yes;
2.4、构建集群
进入任意一个容器
docker exec -it redis-6379 /bin/bash
执行命令构建集群(两种皆可)
第一种
redis-cli -c --cluster create 192.168.10.233:6379 192.168.10.233:6380 192.168.10.233:6381 192.168.10.233:6382 192.168.10.233:6383 192.168.10.233:6384 --cluster-replicas 1 -a Dig1688
第二种
redis-cli -a Dig1688 --cluster create --cluster-replicas 1 192.168.10.233:6379 192.168.10.233:6380 192.168.10.233:6381 192.168.10.233:6382 192.168.10.233:6383 192.168.10.233:6384
连接到Redis服务器,查看所有节点,查看单个节点信息
# 连接到Redis服务器
redis-cli -h 192.168.10.233 -p 6379 -a Dig1688
# 查看所有节点,看节点数量是否正确,主从关系是否正确,节点IP地址是否正确,若正确则构建成功;使用客户端连接集群进行测试;
cluster nodes
# 查看单个节点信息
cluster info
2.5、集群构建失败的情况下,清除节点信息,重构集群
节点清除
# 进入容器
docker exec -it redis-6379 /bin/bash
# 连接到Redis服务器
redis-cli -h 192.168.10.233 -p 6379 -a Dig1688
# 重置节点信息
CLUSTER RESET HARD
# 清空数据库
FLUSHDB
特别注意: 重新构建集群的时候需要到各个节点的容器里面把nodes-6379.conf(举例)文件删除。
再次构建集群,回到2.4重新构建集群。
六个节点都连接正常
spring:
redis:
timeout: 3000
pool:
max-active: 8
max-idle: 8
max-wait: 200
min-idle: 1
database: 0
password: Dig1688
cluster:
nodes: 192.168.10.233:6379,192.168.10.233:6380,192.168.10.233:6381,192.168.10.233:6382,192.168.10.233:6383,192.168.10.233:6384
整理了一下自己搭建redis集群的过程,浅浅的做一下记录。