到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 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