1.前期准备:
(1)在开始搭建 Redis 集群之前,确保您的环境中已经正确安装并配置好了 Docker 和 Docker Compose。如果还没有完成安装配置,您可以参考以下两篇文章进行详细了解和操作:
在linux虚拟机上面配置Docker时所踩过的坑_docker 20.10.6设置镜像源不生效-优快云博客
基于docker-compose来搭建zookeeper集群-优快云博客
(2)下载好Finalshell,下载教程如下:
保姆级教程下载finalshell以及连接云服务器基础的使用教程_finalshell下载安装-优快云博客
2.启动docker,拉取镜像,创建相应目录,并且配置redis.conf文件
(1)启动docker,拉取镜像,在/export/server目录下创建目录redis-cluster(建议先创建好目录/export/server,这样后面就不用去修改start_redis.yml挂载路径了
[root@node1 ~]# systemctl start docker
[root@node1 ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
2d429b9e73a6: Pull complete
92ef1eccbb9f: Pull complete
5e00ad97561c: Pull complete
8f865c3d417c: Pull complete
74c736b00471: Pull complete
928f5dbb5007: Pull complete
4f4fb700ef54: Pull complete
6fd0c1bf3b91: Pull complete
Digest: sha256:af0be38eb8e43191bae9b03fe5c928803930b6f93e2dde3a7ad1165c04b1ce22
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
[root@node1 ~]# cd /export/server/
[root@node1 server]# mkdir -p redis-cluster
[root@node1 server]# cd redis-cluster/
注意了,这里redis-cluster的绝对路径是 /export/server/redis-cluster !
(2)创建目录6380,并且配置redis.conf文件
[root@node1 server]# cd redis-cluster/
[root@node1 redis-cluster]# mkdir -p 6380
[root@node1 redis-cluster]# cd 6380
[root@node1 6380]# mkdir conf
[root@node1 6380]# mkdir data
[root@node1 6380]# cd conf/
[root@node1 conf]# vi redis.conf
[root@node1 conf]# cd ../..
[root@node1 redis-cluster]# ls
6380
当前目录的 redis.conf文件内容(记得修改为自己的主机IP,如下图)
# 端口号
port 6380
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456
# 访问主节点密码
masterauth 123456
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.88.101
# 集群节点映射端口
cluster-announce-port 6380
# 集群节点总线端口
cluster-announce-bus-port 16380
(3)创建目录6381,并且配置redis.conf文件
[root@node1 redis-cluster]# mkdir 6381
[root@node1 redis-cluster]# cd 6381
[root@node1 6381]# mkdir conf
[root@node1 6381]# mkdir data
[root@node1 6381]# cd conf/
[root@node1 conf]# vi redis.conf
[root@node1 conf]# cd ../..
[root@node1 redis-cluster]# ls
6380 6381
当前目录的 redis.conf文件内容(记得修改为自己的主机IP,如下图)
# 端口号
port 6381
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456
# 访问主节点密码
masterauth 123456
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.88.101
# 集群节点映射端口
cluster-announce-port 6381
# 集群节点总线端口
cluster-announce-bus-port 16381
(4)创建目录6382,并且配置redis.conf文件
[root@node1 redis-cluster]# mkdir 6382
[root@node1 redis-cluster]# cd 6382
[root@node1 6382]# mkdir conf
[root@node1 6382]# mkdir data
[root@node1 6382]# cd conf/
[root@node1 conf]# vi redis.conf
[root@node1 conf]# cd ../..
[root@node1 redis-cluster]# ls
6380 6381 6382
当前目录的 redis.conf文件内容(记得修改为自己的主机IP,如下图)
# 端口号
port 6382
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456
# 访问主节点密码
masterauth 123456
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.88.101
# 集群节点映射端口
cluster-announce-port 6382
# 集群节点总线端口
cluster-announce-bus-port 16382
(5)创建目录6383,并且配置redis.conf文件
[root@node1 redis-cluster]# mkdir 6383
[root@node1 redis-cluster]# cd 6383
[root@node1 6383]# mkdir conf
[root@node1 6383]# mkdir data
[root@node1 6383]# cd conf/
[root@node1 conf]# vi redis.conf
[root@node1 conf]# cd ../..
[root@node1 redis-cluster]# ls
6380 6381 6382 6383
当前目录的 redis.conf文件内容(记得修改为自己的主机IP,如下图)
# 端口号
port 6383
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456
# 访问主节点密码
masterauth 123456
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.88.101
# 集群节点映射端口
cluster-announce-port 6383
# 集群节点总线端口
cluster-announce-bus-port 16383
(6)创建目录6384,并且配置redis.conf文件
[root@node1 redis-cluster]# mkdir 6384
[root@node1 redis-cluster]# cd 6384
[root@node1 6384]# mkdir conf
[root@node1 6384]# mkdir data
[root@node1 6384]# cd conf/
[root@node1 conf]# vi redis.conf
[root@node1 conf]# vi redis.conf
[root@node1 conf]# cd ../..
[root@node1 redis-cluster]# ls
6380 6381 6382 6383 6384
当前目录的 redis.conf文件内容(记得修改为自己的主机IP,如下图)
# 端口号
port 6384
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456
# 访问主节点密码
masterauth 123456
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.88.101
# 集群节点映射端口
cluster-announce-port 6384
# 集群节点总线端口
cluster-announce-bus-port 16384
(7)创建目录6385,并且配置redis.conf文件
[root@node1 redis-cluster]# mkdir 6385
[root@node1 redis-cluster]# cd 6385
[root@node1 6385]# mkdir conf
[root@node1 6385]# mkdir data
[root@node1 6385]# cd conf/
[root@node1 conf]# vi redis.conf
[root@node1 conf]# cd ../..
[root@node1 redis-cluster]# ls
6380 6381 6382 6383 6384 6385
当前目录的 redis.conf文件内容(记得修改为自己的主机IP,如下图)
# 端口号
port 6385
# 绑定ip
bind 0.0.0.0
# redis-cli访问密码
requirepass 123456
# 访问主节点密码
masterauth 123456
# 保护模式,默认是yes,开启保护模式
protected-mode no
# 是否守护模式,docker方式不需要
daemonize no
# 是否开启AOF持久化模式
appendonly yes
# 是否开启集群模式
cluster-enabled yes
# 集群节点信息文件
cluster-config-file nodes.conf
# 集群节点连接超时时间
cluster-node-timeout 15000
# 集群节点宿主机IP
cluster-announce-ip 192.168.88.101
# 集群节点映射端口
cluster-announce-port 6385
# 集群节点总线端口
cluster-announce-bus-port 16385
3.配置start_redis.yml文件,启动redis集群
(1)首先回到目录/export/server,然后新建文件start_redis.yml
cd /export/server
vi start_redis.yml
(2)配置start_redis.yml文件
version: "3.3"
services:
redis-6380:
image: redis
container_name: redis-6380
restart: always
network_mode: "bridge"
ports:
- "6380:6380"
- "16380:16380"
volumes:
- /export/server/redis-cluster/6380/conf/redis.conf:/usr/local/redis/redis.conf
- /export/server/redis-cluster/6380/data:/data
command: redis-server /usr/local/redis/redis.conf
redis-6381:
image: redis
container_name: redis-6381
network_mode: "bridge"
ports:
- "6381:6381"
- "16381:16381"
volumes:
- /export/server/redis-cluster/6381/conf/redis.conf:/usr/local/redis/redis.conf
- /export/server/redis-cluster/6381/data:/data
command: redis-server /usr/local/redis/redis.conf
redis-6382:
image: redis
container_name: redis-6382
network_mode: "bridge"
ports:
- "6382:6382"
- "16382:16382"
volumes:
- /export/server/redis-cluster/6382/conf/redis.conf:/usr/local/redis/redis.conf
- /export/server/redis-cluster/6382/data:/data
command: redis-server /usr/local/redis/redis.conf
redis-6383:
image: redis
container_name: redis-6383
network_mode: "bridge"
ports:
- "6383:6383"
- "16383:16383"
volumes:
- /export/server/redis-cluster/6383/conf/redis.conf:/usr/local/redis/redis.conf
- /export/server/redis-cluster/6383/data:/data
command: redis-server /usr/local/redis/redis.conf
redis-6384:
image: redis
container_name: redis-6384
network_mode: "bridge"
ports:
- "6384:6384"
- "16384:16384"
volumes:
- /export/server/redis-cluster/6384/conf/redis.conf:/usr/local/redis/redis.conf
- /export/server/redis-cluster/6384/data:/data
command: redis-server /usr/local/redis/redis.conf
redis-6385:
image: redis
container_name: redis-6385
network_mode: "bridge"
ports:
- "6385:6385"
- "16385:16385"
volumes:
- /export/server/redis-cluster/6385/conf/redis.conf:/usr/local/redis/redis.conf
- /export/server/redis-cluster/6385/data:/data
command: redis-server /usr/local/redis/redis.conf
(3)利用docker-compose命令启动redis服务
[root@node1 server]# docker-compose -f start_redis.yml up -d
/usr/local/lib/python3.6/site-packages/paramiko/transport.py:32: CryptographyDeprecationWarning: Python 3.6 is no longer supported by the Python core team. Therefore, support for it is deprecated in cryptography. The next release of cryptography will remove support for Python 3.6.
from cryptography.hazmat.backends import default_backend
WARNING: Found orphan containers (kafka1, kafka2, server_taskmanager_1, server_taskmanager_2, kafka3, server_taskmanager_3, jobmanager) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Creating redis-6385 ... done
Creating redis-6381 ... done
Creating redis-6384 ... done
Creating redis-6380 ... done
Creating redis-6382 ... done
Creating redis-6383 ... done
(4)查看容器状态
[root@node1 server]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d53462f9a041 redis "docker-entrypoint.s…" 24 seconds ago Up 11 seconds 0.0.0.0:6383->6383/tcp, :::6383->6383/tcp, 6379/tcp, 0.0.0.0:16383->16383/tcp, :::16383->16383/tcp redis-6383
f4d25da707e9 redis "docker-entrypoint.s…" 24 seconds ago Up 11 seconds 0.0.0.0:6380->6380/tcp, :::6380->6380/tcp, 6379/tcp, 0.0.0.0:16380->16380/tcp, :::16380->16380/tcp redis-6380
5453d193d978 redis "docker-entrypoint.s…" 24 seconds ago Up 11 seconds 0.0.0.0:6382->6382/tcp, :::6382->6382/tcp, 6379/tcp, 0.0.0.0:16382->16382/tcp, :::16382->16382/tcp redis-6382
c6e35deb9d5e redis "docker-entrypoint.s…" 24 seconds ago Up 12 seconds 0.0.0.0:6384->6384/tcp, :::6384->6384/tcp, 6379/tcp, 0.0.0.0:16384->16384/tcp, :::16384->16384/tcp redis-6384
e693866c8ef9 redis "docker-entrypoint.s…" 24 seconds ago Up 11 seconds 0.0.0.0:6381->6381/tcp, :::6381->6381/tcp, 6379/tcp, 0.0.0.0:16381->16381/tcp, :::16381->16381/tcp redis-6381
edff2dd5e786 redis "docker-entrypoint.s…" 24 seconds ago Up 12 seconds 0.0.0.0:6385->6385/tcp, :::6385->6385/tcp, 6379/tcp, 0.0.0.0:16385->16385/tcp, :::16385->16385/tcp redis-6385
(5)创建redis集群
进入容器redis-6380
docker exec -it redis-6380 /bin/bash
输入如下命令(记得修改为自己的主机IP)
redis-cli -a 123456 --cluster create \
192.168.88.101:6380 \
192.168.88.101:6381 \
192.168.88.101:6382 \
192.168.88.101:6383 \
192.168.88.101:6384 \
192.168.88.101:6385 \
--cluster-replicas 1
这里记得输入yes
效果大致如下
[root@node1 server]# docker exec -it redis-6380 /bin/bash
root@f4d25da707e9:/data# redis-cli -a 123456 --cluster create \
> 192.168.88.101:6380 \
> 192.168.88.101:6381 \
> 192.168.88.101:6382 \
> 192.168.88.101:6383 \
> 192.168.88.101:6384 \
> 192.168.88.101:6385 \
> --cluster-replicas 1
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.88.101:6384 to 192.168.88.101:6380
Adding replica 192.168.88.101:6385 to 192.168.88.101:6381
Adding replica 192.168.88.101:6383 to 192.168.88.101:6382
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 9a0c06ff41136e727bd97f5ffb639cc1ae7b05ed 192.168.88.101:6380
slots:[0-5460] (5461 slots) master
M: a1fbe77bc1446759dc603439a0cb1b41c13e35f7 192.168.88.101:6381
slots:[5461-10922] (5462 slots) master
M: 37e9b1130cd8416ddc28ecf6f91cfe367d39203f 192.168.88.101:6382
slots:[10923-16383] (5461 slots) master
S: edd1f824fa60a5d26b44bfc9658c02cf6334ee7e 192.168.88.101:6383
replicates 9a0c06ff41136e727bd97f5ffb639cc1ae7b05ed
S: e1b794851aaac41055a36eac09cbfc8b4923b6ec 192.168.88.101:6384
replicates a1fbe77bc1446759dc603439a0cb1b41c13e35f7
S: 5a3de16474439db571187571c71116c4321a8820 192.168.88.101:6385
replicates 37e9b1130cd8416ddc28ecf6f91cfe367d39203f
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
.
>>> Performing Cluster Check (using node 192.168.88.101:6380)
M: 9a0c06ff41136e727bd97f5ffb639cc1ae7b05ed 192.168.88.101:6380
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 5a3de16474439db571187571c71116c4321a8820 192.168.88.101:6385
slots: (0 slots) slave
replicates a1fbe77bc1446759dc603439a0cb1b41c13e35f7
S: edd1f824fa60a5d26b44bfc9658c02cf6334ee7e 192.168.88.101:6383
slots: (0 slots) slave
replicates 37e9b1130cd8416ddc28ecf6f91cfe367d39203f
S: e1b794851aaac41055a36eac09cbfc8b4923b6ec 192.168.88.101:6384
slots: (0 slots) slave
replicates 9a0c06ff41136e727bd97f5ffb639cc1ae7b05ed
M: 37e9b1130cd8416ddc28ecf6f91cfe367d39203f 192.168.88.101:6382
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: a1fbe77bc1446759dc603439a0cb1b41c13e35f7 192.168.88.101:6381
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
接着使用redis-cli命令
redis-cli -p 6380 -a 123456
# 查看集群信息
cluster info
# 查看集群节点
cluster nodes
效果大致如下 (如果效果和下面差不多,那么此时redis集群就已经搭建成功了)
root@f4d25da707e9:/data# redis-cli -p 6380 -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6380> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:3011
cluster_stats_messages_pong_sent:3128
cluster_stats_messages_sent:6139
cluster_stats_messages_ping_received:3123
cluster_stats_messages_pong_received:3011
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:6139
total_cluster_links_buffer_limit_exceeded:0
127.0.0.1:6380> cluster nodes
9a0c06ff41136e727bd97f5ffb639cc1ae7b05ed 192.168.88.101:6380@16380 myself,master - 0 0 1 connected 0-5460
5a3de16474439db571187571c71116c4321a8820 192.168.88.101:6385@16385 slave a1fbe77bc1446759dc603439a0cb1b41c13e35f7 0 1732347761256 2 connected
edd1f824fa60a5d26b44bfc9658c02cf6334ee7e 192.168.88.101:6383@16383 slave 37e9b1130cd8416ddc28ecf6f91cfe367d39203f 0 1732347763000 3 connected
e1b794851aaac41055a36eac09cbfc8b4923b6ec 192.168.88.101:6384@16384 slave 9a0c06ff41136e727bd97f5ffb639cc1ae7b05ed 0 1732347763287 1 connected
37e9b1130cd8416ddc28ecf6f91cfe367d39203f 192.168.88.101:6382@16382 master - 0 1732347763000 3 connected 10923-16383
a1fbe77bc1446759dc603439a0cb1b41c13e35f7 192.168.88.101:6381@16381 master - 0 1732347764308 2 connected 5461-10922
127.0.0.1:6380>
(6)补充代码:(这是课外拓展)
redis-cli -h 192.168.88.101 -p 6380 -a 123456 -c
redis-cli -h 192.168.88.101 -p 6381 -a 123456 -c
redis-cli -h 192.168.88.101 -p 6382 -a 123456 -c
systemctl start docker
cd /export/server
docker-compose -f start_redis.yml up -d
docker ps
docker exec -it redis-6380 bash
docker exec -it redis-6381 bash
docker exec -it redis-6382 bash
cd /export/server
docker-compose -f start_redis.yml down
systemctl stop docker
该命令通过 redis-cli
工具连接到 192.168.88.101:6381
上的 Redis 实例,并使用 123456
作为密码进行身份验证。
5.总结:
至此,本文已接近尾声,衷心感谢您的阅读与关注。希望所分享的内容对您有所启发,期待未来能再次与您交流。