0
点赞
收藏
分享

微信扫一扫

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】

Sky飞羽 2023-02-25 阅读 26


Redis集群部署实战

部署方式采用:分片+高可用+负载均衡

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_redis

  • 三个主机,三个从机(用来做备份)
  • 当主机挂了,对应得从机就要替代原来得主机

Redis是一个单独的集群——集群,我们就要建立自己的网卡(Redis的网卡)

# 创建网卡【步骤一】
docker network create redis --subnet 172.38.0.0/16

### 过程:
可以先将原有容器都删除来进行测试(可选)
docker rm -f $(docker ps -aq)

执行命令后查看网络中是否有我们创建好的redis服务了
docker network ls

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_02

### 过程:
也可以查看网络的具体信息
docker network inspect redis
就可以看到我们自己分配的网络,低下是没有一个网络的

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_03

redis要写配置文件,我们用脚本一次性写好配置文件

  • 启动六个容器很慢——使用shell脚本快速创建,通过脚本创建六个redis配置

# 通过脚本创建六个redis配置
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.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

### 解释:

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_04

测试结果:

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_05

redis配置好后,需要去一个一个启动

# 一个一个开启服务【容器】
docker run -p 6371:6379 -p 16371: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.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

### 解释
-p 6371:6379
两个端口号做映射
6371是外部访问
--name redis-1
命名为 redis-1
--net redis
网络使用我们redis的网络
-d
后台运行
--ip 172.38.0.11
绑定的ip号
redis:5.0.9-alpine3.11
使用的redis版本
如果没有这个镜像,运行命令会自动下载【注意】
redis-server /etc/redis/redis.conf
通过redis.conf来启动

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_06

# 测试服务是否启动了
docker ps

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_3c_07

# 同理,我们将其余的都开启
#启动:redis-2服务
docker run -p 6372:6379 -p 16372: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.38.0.12 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

### 解释:
容器外的6372映射到容器内的6379【容器内不变】

#启动:redis-3服务
docker run -p 6373:6379 -p 16373: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.38.0.13 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动:redis-4服务
docker run -p 6374:6379 -p 16374: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.38.0.14 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动:redis-5服务
docker run -p 6375:6379 -p 16375: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.38.0.15 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

#启动:redis-6服务
docker run -p 6376:6379 -p 16376: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.38.0.16 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf

# 测试服务是否启动了
docker ps

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_redis_08

开始创建集群了

我们先随便进入一个容器(redis-1)

# 进入redis-1容器
docker exec -it redis-1 /bin/sh

### 注意:
redis中没有 /bin/bash 命令,所以用的是 /bin/sh命令【效果是一样的】
进入后默认的pwd是 /data目录

### 查看一下/data目录下:
appendonly.aof:aof配置——持久化
nodes.conf:节点配置

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_3c_09

连接集群的配置

# 这时候我们就在/data目录下创建我们的集群
/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1

### 解释:
/data # :进入redis-1容器的目录
redis-cli :用来连接
--cluster :通过什么方式连接【-集群的方式】
create :集群就需要创建
需要写端口号,不然连接不上
--cluster-replicas 1 :集群的切片

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_10

# 连接集群的配置文件内容

/data # redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38
.0.14:6379 172.38.0.15:6379 172.38.0.16: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.38.0.15:6379 to 172.38.0.11:6379
Adding replica 172.38.0.16:6379 to 172.38.0.12:6379
Adding replica 172.38.0.14:6379 to 172.38.0.13:6379
M: 163c0747779d2f629f5e9d236dce80740bd7c747 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: 8be0dbf6887f9abd03c81630a292993624316a08 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: d48856d8dcdec93017c14c4a6a03ab2ee4cd53d6 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: 9c45a8c19173f82fd170f4b52b4e18e2b4942dc1 172.38.0.14:6379
replicates d48856d8dcdec93017c14c4a6a03ab2ee4cd53d6
S: 698fb424a8f2ce3246f8f684001b16f4c3526039 172.38.0.15:6379
replicates 163c0747779d2f629f5e9d236dce80740bd7c747
S: e9f3295c0cd99747e5df6eb53e5b74adaf43d41f 172.38.0.16:6379
replicates 8be0dbf6887f9abd03c81630a292993624316a08
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.38.0.11:6379)
M: 163c0747779d2f629f5e9d236dce80740bd7c747 172.38.0.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: 9c45a8c19173f82fd170f4b52b4e18e2b4942dc1 172.38.0.14:6379
slots: (0 slots) slave
replicates d48856d8dcdec93017c14c4a6a03ab2ee4cd53d6
S: e9f3295c0cd99747e5df6eb53e5b74adaf43d41f 172.38.0.16:6379
slots: (0 slots) slave
replicates 8be0dbf6887f9abd03c81630a292993624316a08
M: d48856d8dcdec93017c14c4a6a03ab2ee4cd53d6 172.38.0.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: 8be0dbf6887f9abd03c81630a292993624316a08 172.38.0.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 698fb424a8f2ce3246f8f684001b16f4c3526039 172.38.0.15:6379
slots: (0 slots) slave
replicates 163c0747779d2f629f5e9d236dce80740bd7c747
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

测试是否搭建成功

/data # redis-cli -c

### 解释:
/data # :进入redis-1容器的目录
redis-cli :光这个连接的是单机
redis-cli -c :加上连接的是集群

127.0.0.1:6379> cluster info

### 解释:
查看集群信息

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_11

127.0.0.1:6379> cluster nodes

### 解释:
查看集群节点

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_redis_12

# 测试,set一个值,看容器中是否有值分配
127.0.0.1:6379> set a b

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_13

# 所以按照集群概念,当第三个主机挂了,他的从机也会存有相应的值——【体现了高可用】

# 测试,将第三个主机(redis-3)停掉后,看从机是否还存有相应的值
## 1、先从开一个窗口,然后将redis-3停掉

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_redis_14

## 2、这时候进入一个容器然后get一下a,看能否得到对应的值
* 但是不能进入停止的主机中去get,这样无效
127.0.0.1:6379> get a
### 注:如果以前主机停了就没有值了,但是现在集群主机停了,从机判断之后会自动替代主机

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_15

127.0.0.1:6379> cluster nodes

### 解释:
查看集群节点

10_36_Docker【实战】—Redis集群部署实战【部署方式采用:分片+高可用+负载均衡】_docker_16

小结

使用docker搭建redis集群完成
我们使用了docker技术之后,所有技术都会慢慢的变得简单起来!


举报

相关推荐

0 条评论