天天看點

docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!

docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!
為了提高Redis的存儲容量和響應速度,有時候我們需要搭建Redis叢集。本文主要講述Redis叢集環境的搭建步驟以及如何在SpringBoot中整合使用Redis叢集。

SpringBoot實戰電商項目mall(30k+star)位址:https://github.com/macrozheng/mall

Redis叢集搭建

這裡我們使用最友善的搭建方式,使用Docker Compose來搭建,對Docker Compose不了解的朋友可以參考下《使用Docker Compose部署SpringBoot應用》。我們将搭建一個6節點的Redis叢集,包括3個主節點和3個從節點。
  • 在搭建Redis叢集之前,我們需要修改下Redis的配置檔案

    redis.conf

    ,該檔案的下載下傳位址:https://github.com/antirez/redis/blob/5.0/redis.conf
  • 需要修改的屬性如下,主要是修改了一些叢集配置和運作端口,端口号需要按需修改為6391~6396:
# 開啟叢集功能
cluster-enabled yes
# 設定運作端口
port 6391
# 設定節點逾時時間,機關毫秒
cluster-node-timeout 15000
# 叢集内部配置檔案
cluster-config-file "nodes-6391.conf"
           
  • 然後我們需要編寫docker-compose.yml檔案用于編排6個Redis容器,具體屬性的作用可以參考下面的注釋;
version: "3"
services:
  redis-master1:
    image: redis:5.0 # 基礎鏡像
    container_name: redis-master1 # 容器名稱
    working_dir: /config # 切換工作目錄
    environment: # 環境變量
      - PORT=6391 # 會使用config/nodes-${PORT}.conf這個配置檔案
    ports: # 映射端口,對外提供服務
      - 6391:6391 # redis的服務端口
      - 16391:16391 # redis叢集監控端口
    stdin_open: true # 标準輸入打開
    tty: true # 背景運作不退出
    network_mode: host # 使用host模式
    privileged: true # 擁有容器内指令執行的權限
    volumes:
      - /mydata/redis-cluster/config:/config #配置檔案目錄映射到主控端
    entrypoint: # 設定服務預設的啟動程式
      - /bin/bash
      - redis.sh
  redis-master2:
    image: redis:5.0
    working_dir: /config
    container_name: redis-master2
    environment:
      - PORT=6392
    ports:
      - 6392:6392
      - 16392:16392
    stdin_open: true
    network_mode: host
    tty: true
    privileged: true
    volumes:
      - /mydata/redis-cluster/config:/config
    entrypoint:
      - /bin/bash
      - redis.sh
  redis-master3:
    image: redis:5.0
    container_name: redis-master3
    working_dir: /config
    environment:
      - PORT=6393
    ports:
      - 6393:6393
      - 16393:16393
    stdin_open: true
    network_mode: host
    tty: true
    privileged: true
    volumes:
      - /mydata/redis-cluster/config:/config
    entrypoint:
      - /bin/bash
      - redis.sh
  redis-slave1:
    image: redis:5.0
    container_name: redis-slave1
    working_dir: /config
    environment:
      - PORT=6394
    ports:
      - 6394:6394
      - 16394:16394
    stdin_open: true
    network_mode: host
    tty: true
    privileged: true
    volumes:
      - /mydata/redis-cluster/config:/config
    entrypoint:
      - /bin/bash
      - redis.sh
  redis-slave2:
    image: redis:5.0
    working_dir: /config
    container_name: redis-slave2
    environment:
      - PORT=6395
    ports:
      - 6395:6395
      - 16395:16395
    stdin_open: true
    network_mode: host
    tty: true
    privileged: true
    volumes:
      - /mydata/redis-cluster/config:/config
    entrypoint:
      - /bin/bash
      - redis.sh
  redis-slave3:
    image: redis:5.0
    container_name: redis-slave3
    working_dir: /config
    environment:
      - PORT=6396
    ports:
      - 6396:6396
      - 16396:16396
    stdin_open: true
    network_mode: host
    tty: true
    privileged: true
    volumes:
      - /mydata/redis-cluster/config:/config
    entrypoint:
      - /bin/bash
      - redis.sh
           
  • 從docker-compose.yml檔案中我們可以看到,我們的Redis容器分别運作在6391~6396這6個端口之上, 将容器中的

    /config

    配置目錄映射到了主控端的

    /mydata/redis-cluster/config

    目錄,同時還以

    redis.sh

    腳本作為該容器的啟動腳本;
  • redis.sh

    腳本的作用是根據environment環境變量中的

    PORT

    屬性,以指定配置檔案來啟動Redis容器;
redis-server  /config/nodes-${PORT}.conf
           
  • 接下來我們需要把Redis的配置檔案和

    redis.sh

    上傳到Linux伺服器的

    /mydata/redis-cluster/config

    目錄下;
docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!
  • 接下來上傳我們的docker-compose.yml檔案到Linux伺服器,并使用docker-compose指令來啟動所有容器;
docker-compose up -d
           
  • 啟動過程中會輸出如下資訊;
docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!
  • 此時進入其中一個Redis容器之中,初始化Redis叢集;
# 進入Redis容器
docker exec -it redis-master1 /bin/bash
# 初始化Redis叢集指令
redis-cli --cluster create 
192.168.6.139:6391 192.168.6.139:6392 192.168.6.139:6393 
192.168.6.139:6394 192.168.6.139:6395 192.168.6.139:6396 
--cluster-replicas 1
           
  • 叢集建立過程中會讓你确認配置,輸入

    yes

    确認即可;
docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!
  • Redis叢集建立成功後會輸出如下資訊;
docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!
  • 建立成功後我們可以使用

    redis-cli

    指令連接配接到其中一個Redis服務;
# 單機模式啟動
redis-cli -h 127.0.0.1 -p 6391
# 叢集模式啟動
redis-cli -c -h 127.0.0.1 -p 6391
           
  • 之後通過

    cluster nodes

    指令可以檢視節點資訊,發現符合原來3主3從的預期。
docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!

SpringBoot中使用Redis叢集

我們在《Spring Data Redis 最佳實踐!》中講到了在SpringBoot中如何使用Redis,用的是單節點的Redis服務,這次我們講下如何使用Redis叢集服務。
  • 我們在原來代碼的基礎上進行改造,修改application.yml配置檔案,添加Redis叢集配置;
spring:
  redis:
#    host: 192.168.6.139 # Redis伺服器位址
#    database: 0 # Redis資料庫索引(預設為0)
#    port: 6379 # Redis伺服器連接配接端口
    password: # Redis伺服器連接配接密碼(預設為空)
    timeout: 3000ms # 連接配接逾時時間
    lettuce:
      pool:
        max-active: 8 # 連接配接池最大連接配接數
        max-idle: 8 # 連接配接池最大空閑連接配接數
        min-idle: 0 # 連接配接池最小空閑連接配接數
        max-wait: -1ms # 連接配接池最大阻塞等待時間,負值表示沒有限制
    cluster:
      nodes:
        - 192.168.6.139:6391
        - 192.168.6.139:6392
        - 192.168.6.139:6393
        - 192.168.6.139:6394
        - 192.168.6.139:6395
        - 192.168.6.139:6396
           
  • 此時我們再次調用擷取品牌詳情的接口,就會把品牌資訊緩存到Redis叢集中去了;
  • 由于Redis容器

    redis-master1

    redis-slave2

    互為主從,是以裡面都緩存了相同的品牌詳情資訊。
docker privileged作用_Docker環境下秒建Redis叢集,連SpringBoot也整上了!

配置檔案位址

https://github.com/macrozheng/mall-learning/tree/master/document/redis-cluster

項目源碼位址

https://github.com/macrozheng/mall-learning/tree/master/mall-tiny-redis

本文 GitHub https:// github.com/macrozheng/m all-learning 已經收錄,歡迎大家Star!

繼續閱讀