如何用Docker部署高可用的redis集群?
- 实现目标
创建流程
# 创建网卡 docker network create redis --subnet 172.38.0.0/16 # 通过脚本创建六个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 #启动六个容器 for port in $(seq 1 6); \ do \ docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \ -v /mydata/redis/node-${port}/data:/data \ -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \ done # 进入一个redis,注意这里是 sh命令 docker exec -it redis-1 /bin/sh # 创建集群 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 # 连接集群 redis-cli -c # 查看集群信息 cluster info # 查看节点 cluster nodes # set a b # 停止到存值的容器 # 然后再次get a,发现依旧可以获取值 # 查看节点,发现高可用完全没问题
- 心得体会
不用哨兵模式,构建的集群可以有多个master!
redis如何搭建集群?
- 首先要启动多个redis-server
通过conf文件标识身份:ip地址:端口号 所有的server启动好了过后,通过以下命令制定自己的master,每台服务器启动的时候默认都是自己为master
slaveof [ip] [端口]
查看主从复制信息
info replication
自己不想当slave了,用一个命令恢复到master身份
slaveof no one
redis的哨兵模式如何实现?
增加配置文件“sentinel.conf”,文件内容一句话搞定!
#myredis是为设定的redis master主服务器起的别名 #127.0.0.1是master的ip #1 是投票权重 sentinel monitor myredis 127.0.0.1 6381 1
启动模式
redis-sentinel myredis/sentinel.conf
- 怎么制定谁是哨兵?
随开启的哨兵模式谁就是哨兵 - 哨兵之间是如何通信的?
通过发布订阅模式,哨兵监听master,订阅master,master发布消息给哨兵,在master内部存储有订阅者的身份标识(ip:端口),所以每个哨兵都能通过这种方式感知到其他哨兵! - 楼主目前实验来看,一旦启用哨兵模式,集群就只能有一个master,不能有多个
redis 主从复制?
- slave 只能读master的信息不能写信息,尽管他也有自己的slave
- 发布订阅模式也是一样,只有master可以发布频道,slave即使可以发布信息,其他订阅该频道的用户也无法收到,反正slave只能读的权利,没有写的权利!
- 发布订阅的命令?
下述命令的执行者是redis-cli
subscribe channel [channel....]
publish channel1 message
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。