Docker redis 集群搭建

Docker redis 集群搭建
 
Redis 集群是一个提供在多个 Redis 节点间共享数据的程序集。
Redis 集群并不支持处理多个 keys 的命令,因为这需要在不同的节点间移动数据,从而达不到像 Redis 那样的性能,在高负载的情况下可能会导致不可预料的错误.
Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。
Redis 集群的优势:
  • 自动分割数据到不同的节点上。
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。
Redis 集群没有使用一致性 hash, 而是引入了哈希槽的概念。Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
1、下载 redis.conf
下载地址:https://github.com/antirez/redis/blob/unstable/redis.conf
2、修改 redis.conf
开启集群功能:
[Bash shell]  纯文本查看  复制代码
?
1
cluster-enabled yes
设置节点端口:
[Bash shell]  纯文本查看  复制代码
?
1
port 6391
节点超时时间,单位毫秒:
[Bash shell]  纯文本查看  复制代码
?
1
cluster-node-timeout 15000
集群内部配置文件:
[Bash shell]  纯文本查看  复制代码
?
1
cluster-config- file "nodes-6379.conf"
3、编写 docker-compose.yml
节点规划图如下:
配置如下:
[Bash shell]  纯文本查看  复制代码
?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
version: "3.6"
services:
   redis-master1:
      image: redis:5.0 # 基础镜像
      container_name: redis-master1 # 容器服务名
      working_dir: /config # 工作目录
      environment: # 环境变量
        - PORT=6391 # 跟 config/nodes-6391.conf 里的配置一样的端口
      ports: # 映射端口,对外提供服务
        - "6391:6391" # redis 的服务端口
        - "16391:16391" # redis 集群监控端口
      stdin_open: true # 标准输入打开
      networks: # docker 网络设置
         redis-master:
             ipv4_address: 172.50.0.2
      tty : true
      privileged: true # 拥有容器内命令执行的权限
      volumes: [ "/c/project/docker/redis/config:/config" ] # 映射数据卷,配置目录
      entrypoint: # 设置服务默认的启动程序
        - /bin/bash
        - redis.sh
   redis-master2:
        image: redis:5.0
        working_dir: /config
        container_name: redis-master2
        environment:
               - PORT=6392
        networks:
           redis-master:
              ipv4_address: 172.50.0.3
        ports:
          - "6392:6392"
          - "16392:16392"
        stdin_open: true
        tty : true
        privileged: true
        volumes: [ "/c/project/docker/redis/config:/config" ]
        entrypoint:
          - /bin/bash
          - redis.sh
   redis-master3:
        image: redis:5.0
        container_name: redis-master3
        working_dir: /config
        environment:
               - PORT=6393
        networks:
           redis-master:
             ipv4_address: 172.50.0.4
        ports:
          - "6393:6393"
          - "16393:16393"
        stdin_open: true
        tty : true
        privileged: true
        volumes: [ "/c/project/docker/redis/config:/config" ]
        entrypoint:
          - /bin/bash
          - redis.sh
   redis-slave1:
        image: redis:5.0
        container_name: redis-slave1
        working_dir: /config
        environment:
             - PORT=6394
        networks:
           redis-slave:
              ipv4_address: 172.30.0.2
        ports:
          - "6394:6394"
          - "16394:16394"
        stdin_open: true
        tty : true
        privileged: true
        volumes: [ "/c/project/docker/redis/config:/config" ]
        entrypoint:
          - /bin/bash
          - redis.sh
   redis-salve2:
        image: redis:5.0
        working_dir: /config
        container_name: redis-salve2
        environment:
              - PORT=6395
        ports:
          - "6395:6395"
          - "16395:16395"
        stdin_open: true
        networks:
           redis-slave:
               ipv4_address: 172.30.0.3
        tty : true
        privileged: true
        volumes: [ "/c/project/docker/redis/config:/config" ]
        entrypoint:
          - /bin/bash
          - redis.sh
   redis-salve3:
        image: redis:5.0
        container_name: redis-slave3
        working_dir: /config
        environment:
           - PORT=6396
        ports:
          - "6396:6396"
          - "16396:16396"
        stdin_open: true
        networks:
           redis-slave:
             ipv4_address: 172.30.0.4
        tty : true
        privileged: true
        volumes: [ "/c/project/docker/redis/config:/config" ]
        entrypoint:
          - /bin/bash
          - redis.sh
networks:
   redis-master:
      driver: bridge # 创建一个docker 的桥接网络
      ipam:
        driver: default
        config:
           -
            subnet: 172.50.0.0 /16
   redis-slave:
        driver: bridge
        ipam:
          driver: default
          config:
             -
              subnet: 172.30.0.0 /16
4、编写 redis 默认的启动脚本
创建文件 config/redis.sh,内容如下:
[Bash shell]  纯文本查看  复制代码
?
1
redis-server  /config/nodes- ${PORT}.conf
5、启动集群
启动服务命令如下:
[Bash shell]  纯文本查看  复制代码
?
1
$ docker-compose up -d
查看服务运行:
[Bash shell]  纯文本查看  复制代码
?
1
$ docker ps
初始化集群(这一步开始命令须在 redis5.0 及以上版本运行)。
创建 3 主 3 从的 redis 集群:
[Bash shell]  纯文本查看  复制代码
?
1
$ redis-cli --cluster create 192.168.99.100:6391 192.168.99.100:6392 192.168.99.100:6393 192.168.99.100:6394 192.168.99.100:6395 192.168.99.100:6396 --cluster-replicas 1
输入 yes,确认要初始化:
查看初始化结果。
进入 redis-cli, 查看节点信息:
[Bash shell]  纯文本查看  复制代码
?
1
2
root@ae9e587e62f4: /data # redis-cli -h 192.168.99.100 -p 6391
192.168.99.100:6391> cluster nodes
上图显示,redis 集群符合预期。
6、测试集群
普通模式连接:由于 test 根据哈希槽计算,是分布在 6392 服务上。所以这里会提示转到 6392。
[Bash shell]  纯文本查看  复制代码
?
1
root@ae9e587e62f4: /data # redis-cli -h 192.168.99.100 -p 6391
集群模式连接:以下例子显示操作正常。
[Bash shell]  纯文本查看  复制代码
?
1
2
root@ae9e587e62f4: /data # redis-cli -c -h 192.168.99.100 -p 6391 set test 1
root@ae9e587e62f4: /data # redis-cli -c -h 192.168.99.100 -p 6391 get test
集群模式连接读写正常,集群搭建成功。

更多java学习资料可关注:itheimaGZ获取

发布了731 篇原创文章 · 获赞 3 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/u010395024/article/details/104746474
今日推荐