Docker安装redis(单机、主从、哨兵、集群)

单机

Docker Hub查询官方提供的redis版本,这里选用7.0.5。Docker Hub

#拉取镜像

docker pull redis:7.0.5

#创建容器

docker run -d --name redis-1 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-1:/data redis:7.0.5 --port 6381 --appendonly yes --requirepass "123456" --masterauth "123456"

-d 后台运行

--name redis-1 容器命名为redis-1

--restart=always docker重启时自动重启容器

--net host 使用宿主机的ip端口

--privileged=true 获取宿主机root权限

-v /home/用户名/docker-redis/redis-1:/data 挂载data目录,格式:宿主机地址:容器内部地址

redis:7.0.5 加载的镜像

--port 6381 设置服务端口

--appendonly yes 开启持久化

-requirepass "123456" 设置密码

--masterauth "123456" 作为从机时访问主机密码

#进入容器

docker exec -it redis-1 /bin/bash

#进入redis终端

redis-cli -p 6381 -a 123456

redis相关参考资料

redis各版本配置文件Redis configuration | Redis

redis说明文档中文版Redis 命令参考 — Redis 命令参考

主从模式

一主一从,从机作为主机的备份,实时复制主机数据,只能读不能写。

主机故障后,可以手动切换客户端的连接地址到从机继续使用。

一般用于防止数据丢失,或简单的读写分离。

#运行容器2作为从机

docker run -d --name redis-2 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-2:/data redis:7.0.5 --port 6382 --appendonly yes --requirepass "123456" --replicaof 192.168.20.20 6381 --masterauth "123456"

相比单机模式新增参数:

--replicaof 192.168.20.20 6381 设置主机地址

--masterauth "123456" 访问主机密码

#进入容器2检查结果,查看角色和主机连接状态

docker exec -it redis-2 /bin/bash

redis-cli -p 6382 -a 123456

info replication

#解除主从关系

replicaof no one

哨兵模式

一般架构为一主二从三哨兵,哨兵不具备数据读写功能,只用于监控主从机的健康状况。

主机故障后,哨兵选举其中一个从机成为主机,其它从机开始从新主机复制数据,原主机恢复后再作为从机加入。一般建议哨兵数量为>=3的奇数个,防止某一台哨兵无法连接到主机导致误切换。最小的哨兵架构为一主一从一哨兵。

比起主从模式,哨兵模式多了自动故障转移。

配置哨兵模式 

#创建一主(6381)二从(6382、6383)redis容器

docker run -d --name redis-1 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-1:/data redis:7.0.5 --port 6381 --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-2 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-2:/data redis:7.0.5 --port 6382 --appendonly yes --requirepass "123456" --replicaof 192.168.20.20 6381 --masterauth "123456"

docker run -d --name redis-3 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-3:/data redis:7.0.5 --port 6383 --appendonly yes --requirepass "123456" --replicaof 192.168.20.20 6381 --masterauth "123456"

#编辑哨兵配置文件sentinel.conf

#关闭保护模式,允许外部访问
protected-mode no
#不限制外部访问客户端的IP
bind 0.0.0.0
#日志文件路径
logfile "/data/sentinel.log"
#要监视的主机
#格式:sentinel monitor <主机组名> <主机ip> <端口> <判断主机失效的最少哨兵数量>
#------------填写实际<主机ip>、<端口>------------
sentinel monitor mymaster 192.168.20.20 6381 2
#访问redis密码
#------------填写实际密码------------
sentinel auth-pass mymaster 123456
#判断主机失效所需的毫秒数
sentinel down-after-milliseconds mymaster 30000
#故障转移每个阶段执行超时毫秒数
sentinel failover-timeout mymaster 180000
#故障转移时同时对新主机执行同步的从机数量
sentinel parallel-syncs mymaster 1

#复制3份sentinel.conf

cp sentinel.conf /home/用户名/docker-redis/sentinel-1/sentinel.conf

cp sentinel.conf /home/用户名/docker-redis/sentinel-2/sentinel.conf

cp sentinel.conf /home/用户名/docker-redis/sentinel-3/sentinel.conf

#创建3个哨兵容器(26381、26382、26383)

docker run -d --name sentinel-1 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/sentinel-1/sentinel.conf:/usr/local/etc/redis/sentinel.conf -v /home/用户名/docker-redis/sentinel-1/data:/data redis:7.0.5 redis-sentinel /usr/local/etc/redis/sentinel.conf --port 26381

docker run -d --name sentinel-2 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/sentinel-2/sentinel.conf:/usr/local/etc/redis/sentinel.conf -v /home/用户名/docker-redis/sentinel-2/data:/data redis:7.0.5 redis-sentinel /usr/local/etc/redis/sentinel.conf --port 26382

docker run -d --name sentinel-3 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/sentinel-3/sentinel.conf:/usr/local/etc/redis/sentinel.conf -v /home/用户名/docker-redis/sentinel-3/data:/data redis:7.0.5 redis-sentinel /usr/local/etc/redis/sentinel.conf --port 26383

参数说明:

-v /home/用户名/docker-redis/sentinel-1/sentinel.conf:/usr/local/etc/redis/sentinel.conf  挂载配置文件

-v /home/用户名/docker-redis/sentinel-1/data:/data 挂载数据目录

redis-sentinel /usr/local/etc/redis/sentinel.conf  指定配置文件启动哨兵

--port 26381  客户端访问哨兵端口

#跟踪哨兵运行日志,测试主机下线再上线

sudo tail -f ~/docker-redis/sentinel-1/data/sentinel.log

集群模式

三对主从,去中心化的分布式缓存,根据key计算得到槽点值,分配到槽点对应的主从机存取。Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。

某一主机故障后,对应的从机成为主机,主机恢复后成为新主机的从机。

相比哨兵模式,集群模式除了能实现自动故障转移外,还实现了数据扩容。

网络策略上需要开通客户端访问和集群总线端口,集群总线端口=redis客户端访问端口+10000。

客户端访问端口开放给客户端和其它节点,集群总线端口开放给其它节点。

创建集群

#创建6个容器

docker run -d --name redis-1 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-1:/data redis:7.0.5 --port 6381 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-2 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-2:/data redis:7.0.5 --port 6382 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-3 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-3:/data redis:7.0.5 --port 6383 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-4 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-4:/data redis:7.0.5 --port 6384 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-5 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-5:/data redis:7.0.5 --port 6385 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-6 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-6:/data redis:7.0.5 --port 6386 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

新增参数:

--cluster-enabled yes 开启集群

--masterauth "123456" 访问主机密码

#进入任意容器,创建集群关系

docker exec -it redis-1 /bin/bash

redis-cli --cluster create 192.168.20.20:6381 192.168.20.20:6382 192.168.20.20:6383 192.168.20.20:6384 192.168.20.20:6385 192.168.20.20:6386 --cluster-replicas 1 -a 123456

#检查集群各节点状态

redis-cli --cluster check 192.168.20.20:6381 -a 123456

#进入redis集群客户端,查看节点状况

redis-cli -p 6381 -a 123456 -c

-c 表示属于集群操作,存取时key时会自动转到对应槽点所属的节点

cluster info
cluster nodes

 #集群存取key

 #停止其中一个主节点,测试自动故障转移

集群扩容

#再新建两个节点6387和6378

docker run -d --name redis-7 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-7:/data redis:7.0.5 --port 6387 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

docker run -d --name redis-8 --restart=always --net host --privileged=true -v /home/用户名/docker-redis/redis-8:/data redis:7.0.5 --port 6388 --cluster-enabled yes --appendonly yes --requirepass "123456" --masterauth "123456"

#进入容器,把节点6387作为主节点加入集群

docker exec -it redis-7 /bin/bash

redis-cli --cluster add-node 192.168.20.20:6387 192.168.20.20:6381 -a 123456

#分配槽点

 #把节点6388作为6387的从节点加入集群

redis-cli --cluster add-node 192.168.20.20:6388 192.168.20.20:6387 --cluster-slave --cluster-master-id 6acb08a89975b4737ccd56bd03deab5c3c93f455 -a 123456

集群缩容

 #清空6387的槽点

redis-cli --cluster reshard 192.168.20.20:6381 -a 123456

 #从集群移除6387和6388节点

redis-cli --cluster del-node 192.168.20.20:6387 6acb08a89975b4737ccd56bd03deab5c3c93f455 -a 123456

redis-cli --cluster del-node 192.168.20.20:6388 2848ce7f4623a171b4e5fa37f2bbb67af29b3481 -a 123456

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值