Redis——Redis集群搭建记录 docker方式
redis集群模式,为去中心化结构。
共16384个孔位。0~16383
集群中各个节点分别负责一部分孔位。
每个节点都有全部的元数据,具备路由功能。
客户端请求到达任一节点,是本节点孔位就直接处理,否则就hash转到相应节点。
集群搭建完成后,尚需用predixy等工具,实现负载均衡。集群对客户端透明。
配置 redis cluster
在 redis 4 之前均是依赖 redis-trib.rb 来配置 redis cluster,
在redis 5 之后,则可以使用 redis-cli 来实现 redis-trib.rb 的功能。
这里使用的是 redis 5 版本,通过 redis_cli 来搭建集群。
redis cluster 常用命令: 创建集群 redis-cli --cluster create host1:port1 ... hostN:portN --cluster-replicas 1 检查集群 slot 分配情况,是否全覆盖 redis-cli --cluster check host1:port1 修复集群出现 slot 分配异常的问题 redis-cli --cluster fix host1:port1 检查集群节点信息 redis-cli --cluster info host1:port1 分配 slot redis-cli --cluster reshard host1:port1 检查节点中 slot 分配是否均衡 redis-cli --cluster rebalance host1:port1 添加从节点 redis-cli --cluster add-node --cluster-slave --cluster-master-id \
83ff9f8d3413e7999253d3dc3f89f79998526354 127.0.0.1:6382 127.0.0.1:6379 删除节点,删除前要先移走对应的 slot redis-cli --cluster del-node host1:port1 node_id
在单台宿主,用docker启6个redis实例,实现redis集群。
此方式仅供学习,单台宿主,只能算是伪集群。
docker搭建redis集群。
拉出可用的镜像
docker pull redis:5.0.8
docker pull redis:6.2.3
1、方式一,能布署成功,但在宿主之外的机器无法跨节点访问。
启动6个redis实例
docker run -d --name redis1 \ --hostname redis1_host \ -v /root/data/soft/redis/ins-cluster/redis1_data:/data \ -p 6321:6379 redis:5.0.8 \ --cluster-enabled yes \ --cluster-config-file redis1_cluster.conf docker run -d --name redis2 \ --hostname redis2_host \ -v /root/data/soft/redis/ins-cluster/redis2_data:/data \ -p 6322:6379 redis:5.0.8 \ --cluster-enabled yes \ --cluster-config-file redis2_cluster.conf docker run -d --name redis3 \ --hostname redis3_host \ -v /root/data/soft/redis/ins-cluster/redis3_data:/data \ -p 6323:6379 redis:5.0.8 \ --cluster-enabled yes \ --cluster-config-file redis3_cluster.conf docker run -d --name redis4 \ --hostname redis4_host \ -v /root/data/soft/redis/ins-cluster/redis4_data:/data \ -p 6324:6379 redis:5.0.8 \ --cluster-enabled yes \ --cluster-config-file redis4_cluster.conf docker run -d --name redis5 \ --hostname redis5_host \ -v /root/data/soft/redis/ins-cluster/redis5_data:/data \ -p 6325:6379 redis:5.0.8 \ --cluster-enabled yes \ --cluster-config-file redis5_cluster.conf docker run -d --name redis6 \ --hostname redis6_host \ -v /root/data/soft/redis/ins-cluster/redis6_data:/data \ -p 6326:6379 redis:5.0.8 \ --cluster-enabled yes \ --cluster-config-file redis6_cluster.conf
查询容器的ip地址
docker exec -it redis1 cat /etc/hosts | grep host docker exec -it redis2 cat /etc/hosts | grep host docker exec -it redis3 cat /etc/hosts | grep host docker exec -it redis4 cat /etc/hosts | grep host docker exec -it redis5 cat /etc/hosts | grep host docker exec -it redis6 cat /etc/hosts | grep host docker inspect redis1 docker inspect redis1 | grep IPAddress docker inspect redis2 | grep IPAddress docker inspect redis3 | grep IPAddress docker inspect redis4 | grep IPAddress docker inspect redis5 | grep IPAddress docker inspect redis6 | grep IPAddress docker exec -it redis1 bash
配置集群
(此种方式,能成功配好集群,但是从外部访问时若存在跨节点访问,因不识别172.17.0.*的ip导致无法访问)
docker exec -it redis1 \ redis-cli --cluster create \ 172.17.0.5:6379 \ 172.17.0.6:6379 \ 172.17.0.7:6379 \ 172.17.0.8:6379 \ 172.17.0.9:6379 \ 172.17.0.10:6379 \ --cluster-replicas 1
查看集群状态
docker exec -it redis1 redis-cli -p 6321 cluster info docker exec -it redis1 redis-cli -p 6321 cluster nodes docker exec -it redis1 redis-cli -p 6321 info replication
测试集群
docker exec -it redis1 redis-cli -p 6321 -c set "name" "zhangsan" docker exec -it redis5 redis-cli -p 6325 -c get "name" docker exec -it redis4 redis-cli -p 6324 -c set "name" "wangliu" docker exec -it redis5 redis-cli -p 6325 -c get "name"
非宿主机连接测试
redis-cli -h 172.31.140.161 -p 6326 -c set "name" "liuqi" redis-cli -h 172.31.140.161 -p 6326 -c get "name" redis-cli -h 172.31.140.161 -p 6321 -c get "name" redis-cli -h 172.31.140.161 -p 6323 -c get "name" [root@izm5e6u39ae8sj3eivv3rvz data]# redis-cli -h 172.31.140.161 -p 6326 -c 172.31.140.161:6326> get name -> Redirected to slot [5798] located at 172.31.140.161:6322 "liuqi" 172.31.140.161:6322>
其它命令
docker stop redis1 redis2 redis3 redis4 redis5 redis6
docker rm redis1 redis2 redis3 redis4 redis5 redis6
rm -rfv redis*_data
2、方式二,用host模式创建。
docker使用 host模式
的网络连接类型,Docker在使用host模式
下创建的容器是没有自己独立的网络命名空间的,是跟物理机共享一个网络空间,进而可以共享物理机的所有端口与IP,这样就可以让公共网络直接访问容器了,尽管这种方式有安全隐患,但目前来说还没找到其他可行性模式。
docker run -d --name redis1 \ --hostname redis1_host \ --net host \ -v /root/data/soft/redis/ins-cluster/redis1_data:/data \ redis:5.0.8 \ --port 6321 \ --cluster-enabled yes \ --cluster-config-file redis1_cluster.conf docker run -d --name redis2 \ --hostname redis2_host \ --net host \ -v /root/data/soft/redis/ins-cluster/redis2_data:/data \ redis:5.0.8 \ --port 6322 \ --cluster-enabled yes \ --cluster-config-file redis2_cluster.conf docker run -d --name redis3 \ --hostname redis3_host \ --net host \ -v /root/data/soft/redis/ins-cluster/redis3_data:/data \ redis:5.0.8 \ --port 6323 \ --cluster-enabled yes \ --cluster-config-file redis3_cluster.conf docker run -d --name redis4 \ --hostname redis4_host \ --net host \ -v /root/data/soft/redis/ins-cluster/redis4_data:/data \ redis:5.0.8 \ --port 6324 \ --cluster-enabled yes \ --cluster-config-file redis4_cluster.conf docker run -d --name redis5 \ --hostname redis5_host \ --net host \ -v /root/data/soft/redis/ins-cluster/redis5_data:/data \ redis:5.0.8 \ --port 6325 \ --cluster-enabled yes \ --cluster-config-file redis5_cluster.conf docker run -d --name redis6 \ --hostname redis6_host \ --net host \ -v /root/data/soft/redis/ins-cluster/redis6_data:/data \ redis:5.0.8 \ --port 6326 \ --cluster-enabled yes \ --cluster-config-file redis6_cluster.conf
配置集群
配置集群,用宿主的ip进行配置
docker exec -it redis1 \ redis-cli --cluster create \ 172.31.140.161:6321 \ 172.31.140.161:6322 \ 172.31.140.161:6323 \ 172.31.140.161:6324 \ 172.31.140.161:6325 \ 172.31.140.161:6326 \ --cluster-replicas 1
用host模式创建集群,在非宿主机测试没问题。