GITHUB 地址:https://github.com/xiaoxuan6/docker-redis-cluster
1、启动容器
docker-compose up -d
2、开启集群
轻易找一个容器进入,这里我抉择 node-1
进入。在进入容器后,输出如下命令开启集群 .
a、应用固定 ip
自定义 network
网络
redis-cli --cluster create 172.27.0.11:6379 172.27.0.12:6380 172.27.0.13:6381 172.27.0.14:6382 172.27.0.15:6383 172.27.0.16:6384 --cluster-replicas 1
b、应用动静 ip
应用 network_mode
为 host
因为应用的是 Host 网络,因而间接 localhost + port 指定就行,–cluster-replicas 设置每个 Master 复制的数量
# 留神将 ip 换成本人服务的 ip
# redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 --cluster-replicas 1
这里有个坑,ip 如何应用 127.0.0.1 程序代码执行会报错,必须应用本地中的 ip(ip address | grep eth0)
报错:Can’t communicate with any node in the cluster
3、测试
3.1、查看节点属性
127.0.0.1:6379> 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_sent:34
cluster_stats_messages_pong_sent:37
cluster_stats_messages_sent:71
cluster_stats_messages_ping_received:32
cluster_stats_messages_pong_received:34
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:71
3.2、查看节点信息
127.0.0.1:6379> cluster nodes
d221716225e355966aa300efb8ca5bef496fd4b9 127.0.0.1:6380@16380 master - 0 1668232069546 2 connected 5461-10922
357a2c306a0349e12ea2434c92655c6f0d5b207d 127.0.0.1:6384@16384 slave 7460b8066d02612d7028db2d8cecd368febd4e77 0 1668232069000 1 connected
c0d025968fdf0070dbecf5085f287e324264309e 127.0.0.1:6383@16383 slave 5d8ede04727c1581cd040f51da79f9f076e0c4fd 0 1668232070709 3 connected
7460b8066d02612d7028db2d8cecd368febd4e77 127.0.0.1:6379@16379 myself,master - 0 1668232069000 1 connected 0-5460
edfa7fe812375524b6c586897887033382864392 127.0.0.1:6382@16382 slave d221716225e355966aa300efb8ca5bef496fd4b9 0 1668232070000 2 connected
5d8ede04727c1581cd040f51da79f9f076e0c4fd 127.0.0.1:6381@16381 master - 0 1668232069647 3 connected 10923-16383
slave,master,myself 区别
关键字 | 阐明 |
---|---|
slave | 该节点为备份节点 |
master | 该节点为主节点 |
myself | 该节点为以后链接的节点 |
3.3、插入一个值
$ docker exec -it node-1 sh
# redis-cli
127.0.0.1:6379> get name
(error) MOVED 5798 127.0.0.1:6380
报错:(error) MOVED 5798 127.0.0.1:6380
报错起因:是因为启动redis-cli
时没有设置集群模式所导致,启动的时候应用 - c 参数来启动集群模式,命令如下:
redis-cli -c
正确用法:
进入容器 node1
$ docker exec -it node-1 sh
redis-cli -c
127.0.0.1:6379> set name eto
-> Redirected to slot [5798] located at 127.0.0.1:6380
OK
127.0.0.1:6380>
留神:这里依据切片主动切换到了该数据分片所在的节点上,所以上面能够看到连贯的节点变为了 127.0.0.1:6380
而后退出,重启进入容器 node2
$ docker exec -it node-2 sh
redis-cli -c -p 6380
127.0.0.1:6380> get name
"eto"
127.0.0.1:6380>
4、更多操作
check cluster
redis-cli --cluster check ip:port
容错机制
nodes master 6381
宕机 nodes slave 6383
顶替 nodes master 6381
变成 nodes master 6383
,
当 nodes fail 6381
重启之后变成 nodes slave 6381
,nodes master 6383
不变还是 master
如果想把 nodes slave
6381
变成 master,须要 stop nodes master6383
,而后重启 nodes fail6383
留神:这里 master 和 slave 切换会耗时几秒,不能进行立即重启
扩容
Add-Node
缩容
Del-Node
注意事项
1、依照 Redis
官网:https://redis.io/topics/cluster-tutorial 的提醒,为了使 Docker
与 Redis Cluster
兼容,您须要应用 Docker
的 host
网络模式。
host 网络模式能够让容器共享宿主机网络栈,容器将不会虚构出本人的网卡,配置本人的 IP 等,而是应用宿主机的 IP 和端口。
2、应用了数据卷 ./node6/redis.conf:/usr/local/etc/redis/redis.conf
, 必须笼罩容器启动后默认执行的命令。