<>Redis集群部署实战
<>部署方式采用:分片+高可用+负载均衡
* 三个主机,三个从机(用来做备份)
* 当主机挂了,对应得从机就要替代原来得主机
Redis是一个单独的集群——集群,我们就要建立自己的网卡(Redis的网卡)
# 创建网卡【步骤一】 docker network create redis --subnet 172.38.0.0/16 ### 过程:
可以先将原有容器都删除来进行测试(可选) docker rm -f $(docker ps -aq) 执行命令后查看网络中是否有我们创建好的redis服务了
docker network ls
### 过程: 也可以查看网络的具体信息 docker network inspect redis 就可以看到我们自己分配的网络,低下是没有一个网络的
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 ### 解释:
测试结果:
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来启动
# 测试服务是否启动了 docker ps
# 同理,我们将其余的都开启 #启动: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
开始创建集群了
我们先随便进入一个容器(redis-1)
# 进入redis-1容器 docker exec -it redis-1 /bin/sh ### 注意: redis中没有 /bin/bash
命令,所以用的是 /bin/sh命令【效果是一样的】 进入后默认的pwd是 /data目录 ### 查看一下/data目录下:
appendonly.aof:aof配置——持久化 nodes.conf:节点配置
连接集群的配置
# 这时候我们就在/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 :集群的切片
# 连接集群的配置文件内容 /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 ### 解释: 查看集群信息
127.0.0.1:6379> cluster nodes ### 解释: 查看集群节点
# 测试,set一个值,看容器中是否有值分配 127.0.0.1:6379> set a b
# 所以按照集群概念,当第三个主机挂了,他的从机也会存有相应的值——【体现了高可用】 #
测试,将第三个主机(redis-3)停掉后,看从机是否还存有相应的值 ## 1、先从开一个窗口,然后将redis-3停掉
## 2、这时候进入一个容器然后get一下a,看能否得到对应的值 * 但是不能进入停止的主机中去get,这样无效 127.0.0.1:6379> get a
### 注:如果以前主机停了就没有值了,但是现在集群主机停了,从机判断之后会自动替代主机
127.0.0.1:6379> cluster nodes ### 解释: 查看集群节点
小结
使用docker搭建redis集群完成
我们使用了docker技术之后,所有技术都会慢慢的变得简单起来!