Linux系统下使用docker来部署Redis集群

redis 集群简易图

我们要让 redis 集群拥有 分片 + 高可用 + 负载均衡 的作用

1、安装docker,点击我跳转docker安装博客

2、创建网卡 ,我们不使用 --link 的docker选项来让我们的网络连接,我们可以自定义网络

docker network create --driver bridge --subnet 172.77.0.0/16 --gateway 172.77.0.1 redis

#--driver bridge 默认就是桥接模式

#--subnet 子网掩码

#--gateway 网关

#redis 我们对这个自定网络的命名

docker network ls

docker network inspect redis

[root@qwh ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 7824a4fe0564 bridge bridge local 5e248a90ad9f host host local b70935957a82 none null local 49dd4d92fd8e redis bridge local

[root@qwh ~]# docker network inspect redis [ { "Name": "redis", "Id": "49dd4d92fd8efc60cbdf2f30e92c4340071355c1fd26cbbb3cb8bb14f486a6eb", "Created": "2022-11-13T22:44:48.756136319+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.77.0.0/16", "Gateway": "172.77.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ]

3、通过脚本创建六个redis配置

vim redis.sh

cat redis.sh

for port in $(seq 1 6); do mkdir -p /mydata/redis/node-${port}/conf touch /mydata/redis/node-${port}/conf/redis.conf cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf port 6379 bind 0.0.0.0 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-announce-ip 172.77.0.7${port} cluster-announce-port 6379 cluster-announce-bus-port 16379 appendonly yes EOF done

shmod 755 redis.sh

4、运行六个redis

docker run -p 6371:6379 -p 16671:16379 --name redis-1 \ 
-v /mydata/redis/node-1/data:/data \ 
-v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \ 
-d --net redis --ip 172.77.0.71 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

参数说明

#-d 让容器运行在后台

#-p 添加主机到容器的端口映射

#-v 添加目录映射,这里最好nginx容器的根目录最好写成和php容器中根目录一样。但是不一定非要一样,如果不一样在配置nginx的时候需要注意

#-name 容器的名称

#--net 使用自定义网络

#--ip 指定ip

#redis-server /etc/redis/redis.conf 启动redis

Unable to find image 'redis:5.0.9-alpine3.11' locally 5.0.9-alpine3.11: Pulling from library/redis cbdbe7a5bc2a: Pull complete dc0373118a0d: Pull complete cfd369fe6256: Pull complete 3e45770272d9: Pull complete 558de8ea3153: Pull complete a2c652551612: Pull complete Digest: sha256:83a3af36d5e57f2901b4783c313720e5fa3ecf0424ba86ad9775e06a9a5e35d0 Status: Downloaded newer image for redis:5.0.9-alpine3.11 8dec8461ac577ac1bd7203a173e354c970d038cb166c54cf119ebb2a64d735a2

docker run -p 6372:6379 -p 16672:16379 --name redis-2 \ -v /mydata/redis/node-2/data:/data \ -v /mydata/redis/node-2/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.77.0.72 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6373:6379 -p 16673:16379 --name redis-3 \ -v /mydata/redis/node-3/data:/data \ -v /mydata/redis/node-3/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.77.0.73 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6374:6379 -p 16674:16379 --name redis-4 \ -v /mydata/redis/node-4/data:/data \ -v /mydata/redis/node-4/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.77.0.74 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6375:6379 -p 16675:16379 --name redis-5 \ -v /mydata/redis/node-5/data:/data \ -v /mydata/redis/node-5/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.77.0.75 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker run -p 6376:6379 -p 16676:16379 --name redis-6 \ -v /mydata/redis/node-6/data:/data \ -v /mydata/redis/node-6/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.77.0.76 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

docker ps

5、进入redis1容器

[root@qwh ~]# docker exec -it redis-1 /bin/bash OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown

#redis默认没有bash

docker exec -it redis-1 /bin/sh

6、创建redis集群

redis-cli --cluster create 172.77.0.71:6379 172.77.0.72:6379 172.77.0.73:6379 172.77.0.74:6379 172.77.0.75:6379 172.77.0.76:6379 --cluster-replicas 1

Performing hash slots allocation on 6 nodes... Master[0] -> Slots 0 - 5460 Master[1] -> Slots 5461 - 10922 Master[2] -> Slots 10923 - 16383 Adding replica 172.77.0.75:6379 to 172.77.0.71:6379 Adding replica 172.77.0.76:6379 to 172.77.0.72:6379 Adding replica 172.77.0.74:6379 to 172.77.0.73:6379 M: 764e25bf621e4a43f7c1d44213e2b898118f3765 172.77.0.71:6379 slots:[0-5460] (5461 slots) master M: 19d86a0a92252d04ee05b0ca642c3e586eb62794 172.77.0.72:6379 slots:[5461-10922] (5462 slots) master M: d59aea1e087f65e9cf8f2c7cbb110abfae429b20 172.77.0.73:6379 slots:[10923-16383] (5461 slots) master S: c3a45eedffeea52d60addf387571c446f72f0f47 172.77.0.74:6379 replicates d59aea1e087f65e9cf8f2c7cbb110abfae429b20 S: 58fffd90cb8e4c96fc01101a61496d3e314e1290 172.77.0.75:6379 replicates 764e25bf621e4a43f7c1d44213e2b898118f3765 S: 35e0cb6b794a5b83f7edb454ca9caae39802e8fa 172.77.0.76:6379 replicates 19d86a0a92252d04ee05b0ca642c3e586eb62794 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 172.77.0.71:6379) M: 764e25bf621e4a43f7c1d44213e2b898118f3765 172.77.0.71:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s) M: d59aea1e087f65e9cf8f2c7cbb110abfae429b20 172.77.0.73:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s) S: 58fffd90cb8e4c96fc01101a61496d3e314e1290 172.77.0.75:6379 slots: (0 slots) slave replicates 764e25bf621e4a43f7c1d44213e2b898118f3765 S: c3a45eedffeea52d60addf387571c446f72f0f47 172.77.0.74:6379 slots: (0 slots) slave replicates d59aea1e087f65e9cf8f2c7cbb110abfae429b20 M: 19d86a0a92252d04ee05b0ca642c3e586eb62794 172.77.0.72:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s) S: 35e0cb6b794a5b83f7edb454ca9caae39802e8fa 172.77.0.76:6379 slots: (0 slots) slave replicates 19d86a0a92252d04ee05b0ca642c3e586eb62794 [OK] All nodes agree about slots configuration. Check for open slots... Check slots coverage... [OK] All 16384 slots covered.

8、测试redis集群的高可用功能

redis-cli -c

#-c 连接集群结点时使用,此选项可防止moved和ask异常

127.0.0.1:6379> cluster nodes #查看集群的节点信息 d59aea1e087f65e9cf8f2c7cbb110abfae429b20 172.77.0.73:6379@16379 master - 0 1668352765000 3 connected 10923-16383 58fffd90cb8e4c96fc01101a61496d3e314e1290 172.77.0.75:6379@16379 slave 764e25bf621e4a43f7c1d44213e2b898118f3765 0 1668352764593 5 connected c3a45eedffeea52d60addf387571c446f72f0f47 172.77.0.74:6379@16379 slave d59aea1e087f65e9cf8f2c7cbb110abfae429b20 0 1668352764994 4 connected 19d86a0a92252d04ee05b0ca642c3e586eb62794 172.77.0.72:6379@16379 master - 0 1668352764493 2 connected 5461-10922 35e0cb6b794a5b83f7edb454ca9caae39802e8fa 172.77.0.76:6379@16379 slave 19d86a0a92252d04ee05b0ca642c3e586eb62794 0 1668352765495 6 connected 764e25bf621e4a43f7c1d44213e2b898118f3765 172.77.0.71:6379@16379 myself,master - 0 1668352764000 1 connected 0-5460

#给 gang 赋予一个值:123

127.0.0.1:6379> set gang 123

OK

127.0.0.1:6379> get gang

"123"

exit

exit

docker stop redis-1 #停止 redis-1 容器的运行

docker exec -it redis-2 /bin/sh

redis-cli -c #再次进入redis

127.0.0.1:6379> cluster nodes

19d86a0a92252d04ee05b0ca642c3e586eb62794 172.77.0.72:6379@16379 myself,master - 0 1668353178000 2 connected 5461-10922 764e25bf621e4a43f7c1d44213e2b898118f3765 172.77.0.71:6379@16379 master,fail - 1668352980393 1668352979190 1 connected 35e0cb6b794a5b83f7edb454ca9caae39802e8fa 172.77.0.76:6379@16379 slave 19d86a0a92252d04ee05b0ca642c3e586eb62794 0 1668353180000 6 connected c3a45eedffeea52d60addf387571c446f72f0f47 172.77.0.74:6379@16379 slave d59aea1e087f65e9cf8f2c7cbb110abfae429b20 0 1668353180635 4 connected d59aea1e087f65e9cf8f2c7cbb110abfae429b20 172.77.0.73:6379@16379 master - 0 1668353179000 3 connected 10923-16383 58fffd90cb8e4c96fc01101a61496d3e314e1290 172.77.0.75:6379@16379 master - 0 1668353179632 7 connected 0-5460

#我们发现172.77.0.71:6379@16379 master,fail 掉了

127.0.0.1:6379> get gang

-> Redirected to slot [4288] located at 172.77.0.75:6379

"123"

#master172.77.0.71 挂掉了,但是它的 slave 172.77.0.75 接过了它的任务,继续运行,成功实现高可用!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值