zoukankan      html  css  js  c++  java
  • 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模式创建集群,在非宿主机测试没问题。

  • 相关阅读:
    myeclipse16怎么去掉项目中的CodeLive Panel?
    JTable动态刷新数据
    javaEE中config.properties文件乱码解决办法
    ZipUtil
    uri中为什么本地文件file后面跟三个斜杠, http等协议跟两个斜杠?
    Java中Access restriction:····的解决方法
    libGDX开发环境搭建-Android Studio 最新版
    mxnet反序列化: 由symbol到gluon
    mxnet symbol reshape用法
    Hybrid
  • 原文地址:https://www.cnblogs.com/xingchong/p/14746151.html
Copyright © 2011-2022 走看看