Docker安装Redis

一、单机版本安装 Redis

1. 拉取镜像

这里我需要使用到 6.0.8 版本

docker pull redis:6.0.8

2. 配置文件、数据文件都和容器卷进行映射

在 /app/redis 下创建redis创建配置文件 redis.conf 

mkdir -p /app/redis
touch /app/redis/redis.conf
vim /app/redis/redis.conf

修改以下几项配置:

# 开启密码验证
requirepass 123456

# 允许redis外地连接,需要注释掉绑定的IP
# bind 127.0.0.1

# 关闭保护模式
protected-mode no

# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no

# 开启redis数据持久化
appendonly yes

 3. 创建 redis 容器,并挂载配置

创建容器

docker run -d -p 6379:6379 --name redis --privileged=true \
           -v /app/redis/redis.conf:/etc/redis/redis.conf \
           -v /app/redis/data:/data \
           redis:6.0.8 \
           redis-server /etc/redis/redis.conf

查看容器是否创建成功

docker ps

4. 进入容器进行测试

docker exec -it redis /bin/bash
redis-cli

 验证密码

auth 123456

测试结果

Docker安装Redis_第1张图片

二、主从复制集群模式

1. 创建启动容器

这里还是使用 6.0.8 版本进行安装,直接进入创建配置

使用docker搭建3主3从的Redis集群,每台主机都对应一台从机。

# 启动第1台节点
# --net host 使用宿主机的IP和端口,默认
# --cluster-enabled yes 开启redis集群
# --appendonly yes 开启redis持久化
# --port 6381 配置redis端口号
docker run -d --name redis-node-1 --net host --privileged=true -v /app/redis-cluster/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381

# 启动第2台节点
docker run -d --name redis-node-2 --net host --privileged=true -v /app/redis-cluster/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382

# 启动第3台节点
docker run -d --name redis-node-3 --net host --privileged=true -v /app/redis-cluster/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383

# 启动第4台节点
docker run -d --name redis-node-4 --net host --privileged=true -v /app/redis-cluster/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384

# 启动第5台节点
docker run -d --name redis-node-5 --net host --privileged=true -v /app/redis-cluster/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385

# 启动第6台节点
docker run -d --name redis-node-6 --net host --privileged=true -v /app/redis-cluster/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

2. 构建主从关系

进入节点1(或其中任意一个节点):

docker exec -it redis-node-1 /bin/bash

构建主从关系:

# 宿主机IP:端口
redis-cli --cluster create 192.168.xxx.xxx:6381 192.168.xxx.xxx:6382 192.168.xxx.xxx:6383 192.168.xxx.xxx:6384 192.168.xxx.xxx:6385 192.168.xxx.xxx:6386 --cluster-replicas 1

redis尝试自动进行主从节点分配

因为我们的docker容器IP相同,所以会出现警告,可以直接忽略该警告

redis自动分配结果完成后,需要输入 Yes 确认配置信息

Docker安装Redis_第2张图片

 输入Yes确认后,redis会向其他节点发送信息加入集群,并分配哈希槽

Docker安装Redis_第3张图片

3. 查看集群状态

3.1 进入容器节点1(或集群中其他节点)

docker exec -it redis-node-1 /bin/bash

3.2 使用redis-cli连接到6381节点

redis-cli -p 6381

3.3 使用redis的相关命令查看集群状态:

cluster info

Docker安装Redis_第4张图片

  • 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、pong、meet 等。

3.4 查看集群节点信息

cluster nodes

Docker安装Redis_第5张图片

4. Redis集群读写出错

set k1 v1

当使用 redis-cli连接redis集群时,需要添加 -c参数,否则可能会出现读写出错。

Docker安装Redis_第6张图片

原因:k1经过计算得到的哈希槽为12706,但是当前连接的redis-server为6381(即节点1),它的哈希槽为:[0,5460](在创建构建主从关系时redis有提示,也可以通过 cluster nodes查看),所以会因为存不进去而报错。
执行 set k2 v2可以成功,因为k2计算出的哈希槽在[0-5460]区间中。

 解决方案:

使用-c参数的redis-cli命令连接即可

redis-cli -p 6381 -c

5. 集群信息检查

1. 进入容器节点1

docker exec -it redis-node-1 /bin/bash

 2. 进行集群信息检查

# 输入任意一台主节点地址都可以进行集群检查
redis-cli --cluster check 192.168.xxx.xxx:6381

Docker安装Redis_第7张图片

192.168.153.133:6382 (fc80d6d6...) -> 0 keys | 5462 slots | 1 slaves.:

  • 192.168.153.133:6382 是节点的 IP 地址和端口。
  • (fc80d6d6...) 是节点的 ID。
  • 0 keys 表示节点当前拥有的键数量。
  • 5462 slots 是节点的槽位数量。
  • 1 slaves 是节点的从节点数量。
  • [OK] 1 keys in 3 masters.:

    • 表示在 3 个主节点中共有 1 个键。
  • 0.00 keys per slot on average.:

    • 平均每个槽位拥有的键的数量为 0。
  • Performing Cluster Check (using node 192.168.153.133:6382):

    • 表示正在进行集群检查,使用的是指定的节点 192.168.153.133:6382
  • All nodes agree about slots configuration.:

    • 表示所有节点在槽位配置上达成一致。
  • All 16384 slots covered.:

    • 表示所有的 16384 个槽位都得到了覆盖。

3、主从扩容

1. 启动2台新的容器节点

# 启动第7台节点
docker run -d --name redis-node-7 --net host --privileged=true -v /app/redis-cluster/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387

# 启动第8台节点
docker run -d --name redis-node-8 --net host --privileged=true -v /app/redis-cluster/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

2. 进入6387(节点7)容器内部

docker exec -it redis-node-7 /bin/bash

3. 将6387作为master加入集群

# redis-cli --cluster add-node 本节点地址 要加入的集群中的其中一个节点地址
redis-cli --cluster add-node 192.168.xxx.xxx:6387 192.168.xxx.xxx:6381

4. 检查当前集群状态

redis-cli --cluster check 192.168.xxx.xxx:6381

5. 重新分配集群的槽位

redis-cli --cluster reshard 192.168.xxx.xxx:6381

Docker安装Redis_第8张图片

您想移动多少个插槽(从1移动到16384)?4096
接收节点ID是什么?625d5d8f9a9870c4c68bd36f08b668647269d9c8
请输入所有源节点ID。
键入“all”以将所有节点用作哈希槽的源节点。
输入所有源节点ID后,请键入“done”。
源节点#1:all

6. 查看分配结果

重新分配完成后,查看集群信息

redis-cli --cluster check 192.168.xxx.xxx:6381

因为可能有些槽位中已经存储了 key,完全的重新洗牌重新分配的成本过高,所以redis选择从前3个节点中匀出来一部分给节点7

7. 为主节点6387分配从节点6388

redis-cli --cluster add-node 192.168.153.133:6388 192.168.153.133:6387 --cluster-slave --cluster-master-id 

8. 检查集群当前状态

redis-cli --cluster check 192.168.xxx.xxx:6381

四、主从缩容

4.1 首先删除从节点6388

1. 进入容器节点1
docker exec -it redis-node-1 /bin/bash
2. 检查容器状态,获取6388的节点编号
redis-cli --cluster check 192.168.xxx.xxx:6381
3. 将6388从集群中移除
redis-cli --cluster del-node 192.168.xxx.xxx:6388 <6388节点ID>

4.2 对node7重新分配哈希槽

1. 对集群重新分配哈希槽
redis-cli --cluster reshard 192.168.xxx.xxx:6381
2. redis经过槽位检查后,会提示需要分配的槽位数量

Docker安装Redis_第9张图片

Docker安装Redis_第10张图片

How many slots do you want to move (from 1 to 16384)?

如果我们想直接把node7的4096个哈希槽全部分给某个节点,可以直接输入4096。 输入4096后,会让输入要接收这些哈希槽的节点ID。假如我们想把这4096个槽都分给Node1,直接输入node1节点的编号即可。 然后会提示,询问要从哪些节点中拨出一部分槽位凑足4096个分给Node1。这里我们输入node7的节点编号,回车后输入done。

3. 移除node7节点

node7上面没有了哈希槽,此时便可以将node7从集群中移除。(如果node7上面有哈希槽,直接从集群中移除会报错)

redis-cli --cluster del-node 192.168.xxx.xxx:6387 
4. 最后查看节点状态
redis-cli --cluster check 192.168.153.133:6381

Docker安装Redis_第11张图片

你可能感兴趣的:(Docker,docker,redis,容器)