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模式创建集群,在非宿主机测试没问题。