springboot連線基於docker搭建的redis叢集
祝願明天考研的同學都能考上
環境:win10 /Docker for windows/docker redis叢集
由於redis叢集每次重新cluster nodes會更新spring boot配置的spring.redis.cluster.nodes。docker容器與本地宿主機不在同一個網段下面,更新會導致nodes不可達,所以需要在路由表裡面加一個路由。
參見:http://www.cnblogs.com/brock0624/p/9788710.html 實現容器內網通過獨立ip直接訪問
如何在docker for windows的環境下搭建redis叢集,請參見我的這篇文章:https://blog.csdn.net/xielinrui123/article/details/85104446
然後,我開始我的正文
上次在docker for windows的環境下搭建redis的叢集裡面,我是建立了一個docker network,然後將叢集放到裡面。這次我做了一點修改,直接在預設的docker環境中搭建好了叢集,搭建的叢集預設的ip網段是172.17.0.0/16 。為了和上述教程保持一致,所以做了這一個修改。
簡單描述一下構建過程:假定根據docker for windows的環境下搭建redis的叢集教程,已經建立了兩個自定義的docker image
然後可以使用下面的指令,建立一個基於docker預設網段172.17.0.0/16的redis叢集
# 建立6個redis節點 和 叢集排程節點(ruby2)
docker run -d -p 7001:6379 --name r1 redis-cluster docker run -d -p 7002:6379 --name r2 redis-cluster docker run -d -p 7003:6379 --name r3 redis-cluster docker run -d -p 7004:6379 --name r4 redis-cluster docker run -d -p 7005:6379 --name r5 redis-cluster docker run -d -p 7006:6379 --name r6 redis-cluster docker run --name ruby2 -i -d ruby-redis
# 進入ruby2容器的shell介面中
docker exec -it ruby2 /bin/bash
# 安裝redis的ruby外掛
gem install redis --version 3.0.7
然後進入windows環境執行 docker inspect 容器名,檢視6個節點在網段中的ip,用於Ruby2容器開啟對redis叢集的監管。
得到6個節點的ip地址之後,切換到ruby2容器的shell命令操作檯
# 6379埠號是redis服務的預設埠號
./redis-trib.rb create --replicas 1 172.17.0.3:6379 172.17.0.9:6379 172.17.0.7:6379 172.17.0.6:6379 172.17.0.5:6379 172.17.0.4:6379
此時,沒有密碼的叢集就搭建好了。為了能讓springboot能夠有效連線到redis,我們需要給redis叢集設定密碼。分別使用下列指令,進入6個節點:
# 進入6個 redis 節點
docker exec -it r1 /bin/bash
docker exec -it r2 /bin/bash
docker exec -it r3 /bin/bash
docker exec -it r4 /bin/bash
docker exec -it r5 /bin/bash
docker exec -it r6 /bin/bash
均執行
# 進入redisclient
redis-cli -c
# 修改密碼,注意每個節點的密碼應該保持相等
config set masterauth kexuejia123
config set requirepass kexuejia123
auth kexuejia123
config rewrite
進入到ruby2容器,前往配置檔案修改叢集密碼:
docker exec -it ruby2 /bin/bash
apt-get update
apt-get install vim
# 查詢配置檔案client.rb所在目錄
find / -name 'client.rb'
# 進入client.rb所在目錄,然後執行
vi client.rb
將password那一項修改成你的密碼,我的就是 password = “kexuejia123”。
然後 ESC,wq 儲存退出。
然後前往spring boot的配置檔案配置:
# redis叢集相關
spring.redis.password=kexuejia123
spring.redis.database=0
spring.redis.cluster.nodes=127.0.0.1:7001,127.0.0.1:7002,127.0.0.1:7003,127.0.0.1:7004,127.0.0.1:7005,127.0.0.1:7006
spring.redis.timeout=6000ms
現在開啟服務,用postman呼叫介面,可以發現連線超時。引起的原因是 spring-boot-starter-data-redis 包在每次查詢節點的時候會將 執行cluster nodes後的ip和埠更新到 spring.redis.cluster.nodes 中,進而使得配置的 spring.redis.cluster.nodes 失效,讓我們來看看,如果執行 cluster nodes會返回什麼結果
返回的ip地址是在docker預設網段中的ip:port ,例如,當windows環境中去請求新的 spring.redis.cluster.nodes 中的 172.17.0.3:6379時候,就找不到172.17.0.3 這個 ip到底在哪裡,所以這裡必須得給windows一個指引,也就是向路由表裡面寫入一條路由。我們知道,docker在建立的時候,暴露了一張網絡卡給我們
看見一個名為:DockerNAT的網路介面卡就是docker 內部網段和宿主之間的橋樑了。
# 新增一條路由資訊,使得windows發出的172.17.0.0/16的包會丟到docker 中
route -p add 172.17.0.0 MASK 255.255.255.0 10.0.75.2
然後使用 route print -4 檢視當前的路由表資訊
發現已經新增進去了,然後 用 ping 命令檢視
可以 ping 通了
然後開啟專案和postman,測試登入介面:
到叢集節點檢視
已經插入進入了。然後再次發起請求:
使用redis叢集可以在實現無狀態的環境下做分散式session,分散式快取等操作,同時,基於docker實現也有利於快速進行環境部署與更新。星期天開始spring boot連線用docker搭建分散式資料庫 cockroachdb。cockroachdb是新一代資料庫 newsql的一種,有比較優秀的分散式擴充套件能力,也就和mysql一樣優秀的ACID機制。
在此感謝我身邊良好的工作氛圍和優秀的大佬們,給了我很多啟迪,讓我這種水平較差的新手有較多的採坑時間和學習時間。也給我生活上很多鼓勵和幫助。