之前在搭建Redis集群的时候,发现全网找不到一篇完整教程,即从安装Docker环境开始,到项目中使用Redis集群结束的过程。自己也在搭建过程中踩了许多坑,今天就把搭建过程记录下来,既便于自己之后回顾,也希望可以帮到其他人。
文章目录
- 1.安装Docker环境
- 1.1 安装Docker
- 1.2 配置Docker镜像站
- 2.Docker搭建Redis集群
- 2.1 搭建Redis三主三从集群模式
- 2.2 检验集群模式及数据存取
- 3.项目中使用Redis集群
- 3.1 RESP远程连接
- 3.2 项目配置
1.安装Docker环境
1.1 安装Docker
Linux系统选择CentOS 7,安装DOcker的前提条件是64位CPU架构的计算机、运行Linux3.8或更高版本的内核(CentOS内核不小于3.10)。
-
可以通过以下命令查看系统内核和CPU位数:
uname -r
-
更新yum包,确保软件包最新(Root 权限)
sudo yum update
-
安装Docker所需要的软件包
yum install -y yum-utils device-mapper-persistent-data lvm2
-
安装docker 默认安装最新稳定版
yum install -y docker-ce
-
启动docker并加入开机自启动
#启动Docker systemctl start docker #加入开机自启 systemctl enable docker
-
验证是否安装成功
docker version
打印内容如下图说明安装成功。
1.2 配置Docker镜像站
-
修改Docker配置文件
国内很多Docker镜像站现在已经失效了,所以要写入Docker镜像站配置文件(/etc/docker/daemon.json),首次使用需要先创建。
# 创建目录 sudo mkdir -p /etc/docker # 写入配置文件 sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.unsee.tech", "https://dockerpull.org", "https://docker.1panel.live", "https://dockerhub.icu" ] } EOF
-
重启Dokcer服务生效
sudo systemctl daemon-reload sudo systemctl restart docker
-
测试Docker是否可用
sudo docker run hello-world
打印内容如下图说明安装成功。
使用以下命令查看容器是否创建成功
docker ps -a
2.Docker搭建Redis集群
2.1 搭建Redis三主三从集群模式
-
下载Redis镜像文件
docker pull redis:6.0.8
查看Docker中的镜像文件
docker images
打印内容中出现redis镜像,说明下载成功
-
启动6个Redis 容器,端口依次从6379到6384,并把数据卷挂载到宿主机(持久化,保证Redis节点宕机或容器被意外删除后数据不丢失)
# 第一台 docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6379 # 第二台 docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6380 # 第三台 docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381 # 第四台 docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382 # 第五台 docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383 # 第六台 docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
-d:表示以 “后台模式” 运行容器。
–net host:容器将与宿主机共享相同的网络接口和 IP 地址。
–privileged=true:启用容器的特权模式。
-v /data/redis/share/redis-node-1:/data:卷挂载,将宿主机的目录
/data/redis/share/redis-node-1
映射到容器内的/data
目录。–appendonly yes:启用 AOF (Append Only File) 持久化模式。
查看Redis容器是否创建成功:
docker ps -a
打印内容出现六个Redis容器的名字,说明创建成功。
-
将6个Redis容器搭建成三主三从集群模式
首先进入其中一个容器
docker exec -it redis-node-1 /bin/bash
搭建三主三从集群模式,一台主机对应一台从机
redis-cli --cluster create 192.168.191.143:6379 192.168.191.143:6380 192.168.191.143:6381 192.168.191.143:6382 192.168.191.143:6383 192.168.191.143:6384 --cluster-replicas 1
其中"192.168.191.143"这个ip地址要改成自己虚拟机ip,通过下面的命令得到
ifconfig
如下图所示,即为虚拟机ip
2.2 检验集群模式及数据存取
-
检验Redis集群是否创建成功。
启动Redis容器命令:
docker start redis-node-1 redis-node-2 redis-node-3 redis-node-4 redis-node-5 redis-node-6
进入其中一个Redis容器内部:
docker exec -it redis-node-1 /bin/bash # 退出命令:exit
以集群的方式进入redis-node-1对应端口的客户端:
redis-cli -p 6379 -c # 推出命令:quit
查看集群信息:
cluster info
如下图则集群模式创建成功:
-
数据存取测试,搭建好集群模式后,要检验各节点之间是否可以实现数据实时同步。
在redis-node-1中存入Map类型的数据:gender male
docker exec -it redis-node-1 /bin/bash redis-cli -p 6379 -c set gender male
在redis-node-6中读取key:gender
docker exec -it redis-node-6 /bin/bash redis-cli -p 6384 -c get gender
3.项目中使用Redis集群
3.1 RESP远程连接
-
在RESP中配置连接,填写名字(随意)、地址(与虚拟机ip一致)、端口(与Redis节点对应端口一致)、密码(如果没有密码则不用填写),如下图:
-
连接成功后可以正常显示数据
3.2 项目配置
现在来到所有流程的最后一步,如何在原来的Spring项目中使用Redis集群模式呢?
运行原来的项目,因为之前的Redis节点只有一个,现在变成了Redis三主三从集群模式,所以会报错:
Invocation of init method failed; nested exception is org.redisson.client.RedisException: MOVED redirection loop detected. Node redis://192.168.191.143:6381 has further redirect to redis://192.168.191.143:6381
可以判断出是Redission的配置文件出错了,把原来的单节点模式改为集群模式之后,项目就可以正常运行:
public RedissonClient redissonClient(){
// 配置
Config config = new Config();
// config.useSingleServer().setAddress("redis://192.168.191.143:6379");
config.useClusterServers().addNodeAddress("redis://192.168.191.143:6379","redis://192.168.191.143:6380","redis://192.168.191.143:6381","redis://192.168.191.143:6382","redis://192.168.191.143:6383","redis://192.168.191.143:6384");
// 创建RedissonClient对象
return Redisson.create(config);
}