Redis集群基于非Docker镜像的搭建参照Redis官网的介绍可以很容易就搭建起来。本来是想使用minikube使用K8S环境搭建一个Redis集群,但是发现购买的云服务是1核的,而minikube的搭建至少需要2核4G的配置。无奈只能退而求其次选择直接使用Docker run命令来部署一个Redis的集群了。
参照Redis的官网依次创建如下的配置文件(文件路径可以选择性改成你自己的路径,但是后面操作的相关路径也需要注意跟着改变):
/root/configcenter/redis-cluster/7003/conf/redis.conf
/root/configcenter/redis-cluster/7004/conf/redis.conf
/root/configcenter/redis-cluster/7005/conf/redis.conf
/root/configcenter/redis-cluster/7000/conf/redis.conf
/root/configcenter/redis-cluster/7001/conf/redis.conf
/root/configcenter/redis-cluster/7002/conf/redis.conf
redis.conf配置信息使用Redis官网示例的配置(注意修改每个配置文件的端口,端口依次是7000、7001、7002、7003、7004、7005):
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
Redis的Docker镜像的使用参照:https://hub.docker.com/_/redis/ 。使用很简单,这里就不过多介绍了。
创建启动脚本,端口为7000的脚本如下:
#!/bin/sh
docker run --net host -v /root/configcenter/redis-cluster/7000/conf:/usr/local/etc/redis \
-v /root/configcenter/redis-cluster/7000/data:/data --name redis-7000 \
-d redis:6.2.1 redis-server /usr/local/etc/redis/redis.conf
其中--name参数指令指定容器的名称为redis-7000, -d参数指令要求容器后台运行。
由于需要使用我们自己配置的redis.conf配置文件,所以使用-v参数将宿主机的redis配置文件的目录挂载到Redis Docker镜像默认使用的配置文件。对应脚本中的命令为:
-v /root/configcenter/redis-cluster/7000/conf:/usr/local/etc/redis
由于Docker容器中的信息会随着容器的删除而丢失,所以需要将存入Redis中的数据放到宿主机上进行保存,防止某个Redis容器被删除而导致数据丢失。依然使用-v命令将容器中/data目录(Redis镜像运行后默认数据都是放入/data目录下)挂载到宿主机指定的目录下。
-v /root/configcenter/redis-cluster/7000/data:/data
--net host指令表示使用主机网络模式,该容器共享主机的网络名称空间。例如,运行当前的端口为7000的Redis服务后,可以直接在主机IP地址的端口7000上使用。可以使用redic-cli命令连接当前使用Redis的Docker镜像运行的服务。示例如下:
# redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000>
端口为7001的启动脚本:
#!/bin/sh
docker run --net host -v /root/configcenter/redis-cluster/7001/conf:/usr/local/etc/redis \
-v /root/configcenter/redis-cluster/7001/data:/data --name redis-7001 \
-d redis:6.2.1 redis-server /usr/local/etc/redis/redis.conf
端口为7002的启动脚本:
#!/bin/sh
docker run --net host -v /root/configcenter/redis-cluster/7002/conf:/usr/local/etc/redis \
-v /root/configcenter/redis-cluster/7002/data:/data --name redis-7002 \
-d redis:6.2.1 redis-server /usr/local/etc/redis/redis.conf
端口为7003的启动脚本:
#!/bin/sh
docker run --net host -v /root/configcenter/redis-cluster/7003/conf:/usr/local/etc/redis \
-v /root/configcenter/redis-cluster/7003/data:/data --name redis-7003 \
-d redis:6.2.1 redis-server /usr/local/etc/redis/redis.conf
端口为7004的启动脚本:
#!/bin/sh
docker run --net host -v /root/configcenter/redis-cluster/7004/conf:/usr/local/etc/redis \
-v /root/configcenter/redis-cluster/7004/data:/data --name redis-7004 \
-d redis:6.2.1 redis-server /usr/local/etc/redis/redis.conf
端口为7005的启动脚本:
#!/bin/sh
docker run --net host -v /root/configcenter/redis-cluster/7005/conf:/usr/local/etc/redis \
-v /root/configcenter/redis-cluster/7005/data:/data --name redis-7005 \
-d redis:6.2.1 redis-server /usr/local/etc/redis/redis.conf
脚本有共通性,其实可以提炼为一个脚本,但是为了便于理解,所以把每个脚本都分开了。
每个脚本执行后使用docker ps命令查询运行的容器信息:
# docker ps | grep redis
ec94502a9817 redis:6.2.1 "docker-entrypoint.s…" 7 days ago Up 7 days redis-7005
b9ae38bf9d22 redis:6.2.1 "docker-entrypoint.s…" 7 days ago Up 7 days redis-7004
c1936510934d redis:6.2.1 "docker-entrypoint.s…" 7 days ago Up 7 days redis-7003
f88a54ab9784 redis:6.2.1 "docker-entrypoint.s…" 7 days ago Up 7 days redis-7002
39cd486e11f5 redis:6.2.1 "docker-entrypoint.s…" 7 days ago Up 7 days redis-7001
ef17ef4c7b09 redis:6.2.1 "docker-entrypoint.s…" 7 days ago Up 7 days redis-7000
使用docker exec -it container-id | container-name sh 进入某个redis容器中。例如:
docker exec -it redis-7000 sh
#
进入容器后执行:(注意,一般建议将127.0.0.1换成对应宿主机的IP)
#redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1
输出如下信息后即表示Redis集群安装成功:
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 99a285ca06fc3ae8f2cc66a344261452a7ced386 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
M: e95a49c0f8cc68a1dac22f1da465e2f7200c2aaa 127.0.0.1:7001
slots:[5461-10922] (5462 slots) master
M: 45b9256ae9d31f21da1968d4b0db388a9ed27597 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
S: 747b253d4e7c6d373514e2e5893cf7378fdc2c28 127.0.0.1:7003
replicates 45b9256ae9d31f21da1968d4b0db388a9ed27597
S: b74cd2dead6e52d6a36b25dbfd4e275fee225453 127.0.0.1:7004
replicates 99a285ca06fc3ae8f2cc66a344261452a7ced386
S: daed1abf124a36991e68691b59a972e100c54d8e 127.0.0.1:7005
replicates e95a49c0f8cc68a1dac22f1da465e2f7200c2aaa
Can I set the above configuration? (type 'yes' to accept): yes ####这里需要输入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 127.0.0.1:7000)
M: 99a285ca06fc3ae8f2cc66a344261452a7ced386 127.0.0.1:7000
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: b74cd2dead6e52d6a36b25dbfd4e275fee225453 127.0.0.1:7004
slots: (0 slots) slave
replicates 99a285ca06fc3ae8f2cc66a344261452a7ced386
M: 45b9256ae9d31f21da1968d4b0db388a9ed27597 127.0.0.1:7002
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
S: 747b253d4e7c6d373514e2e5893cf7378fdc2c28 127.0.0.1:7003
slots: (0 slots) slave
replicates 45b9256ae9d31f21da1968d4b0db388a9ed27597
S: daed1abf124a36991e68691b59a972e100c54d8e 127.0.0.1:7005
slots: (0 slots) slave
replicates e95a49c0f8cc68a1dac22f1da465e2f7200c2aaa
M: e95a49c0f8cc68a1dac22f1da465e2f7200c2aaa 127.0.0.1:7001
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集群,查看集群信息:
# redis-cli -h 127.0.0.1 -p 7000
127.0.0.1:7000> 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:1117400
cluster_stats_messages_pong_sent:1116205
cluster_stats_messages_sent:2233605
cluster_stats_messages_ping_received:1116200
cluster_stats_messages_pong_received:1117398
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2233603
至此,使用Redis的Docker镜像安装 Redis集群就完成了。