当前位置:   article > 正文

Docker安装Redis

docker安装redis

一、单机版本安装 Redis

1. 拉取镜像

这里我需要使用到 6.0.8 版本

docker pull redis:6.0.8

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

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

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

修改以下几项配置:

  1. # 开启密码验证
  2. requirepass 123456
  3. # 允许redis外地连接,需要注释掉绑定的IP
  4. # bind 127.0.0.1
  5. # 关闭保护模式
  6. protected-mode no
  7. # 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
  8. daemonize no
  9. # 开启redis数据持久化
  10. appendonly yes

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

创建容器

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

查看容器是否创建成功

docker ps

4. 进入容器进行测试

  1. docker exec -it redis /bin/bash
  2. redis-cli

 验证密码

auth 123456

测试结果

二、主从复制集群模式

1. 创建启动容器

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

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

  1. # 启动第1台节点
  2. # --net host 使用宿主机的IP和端口,默认
  3. # --cluster-enabled yes 开启redis集群
  4. # --appendonly yes 开启redis持久化
  5. # --port 6381 配置redis端口号
  6. 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
  7. # 启动第2台节点
  8. 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
  9. # 启动第3台节点
  10. 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
  11. # 启动第4台节点
  12. 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
  13. # 启动第5台节点
  14. 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
  15. # 启动第6台节点
  16. 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

构建主从关系:

  1. # 宿主机IP:端口
  2. 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 确认配置信息

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

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

  • 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

4. Redis集群读写出错

set k1 v1

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

原因: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. 进行集群信息检查

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

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台新的容器节点

  1. # 启动第7台节点
  2. 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
  3. # 启动第8台节点
  4. 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加入集群

  1. # redis-cli --cluster add-node 本节点地址 要加入的集群中的其中一个节点地址
  2. 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

您想移动多少个插槽(从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 <node7的ID(主容器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经过槽位检查后,会提示需要分配的槽位数量

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 <node7节点ID>
4. 最后查看节点状态
redis-cli --cluster check 192.168.153.133:6381

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/305505
推荐阅读
相关标签
  

闽ICP备14008679号