1. 程式人生 > 實用技巧 >Redis主從哨兵容器配置

Redis主從哨兵容器配置

主要測試下容器的主從如何搭建,主要使用一臺虛擬機器,部署三個容器,構成主從結構

一、部署的結構: 主:172.17.0.26379->6379 從1:對映埠 6380 -> 6379 從2:對映埠6381 -> 6379 二、拉取Redis容器映象
docker pull redis

三、下載Redis官方配置檔案,並修改,作為容器配置檔案的掛在(容器中服務配置,需要在主機上掛載)
 wget http://download.redis.io/redis-stable/redis.conf

主配置:

# 註釋這一行,表示Redis可以接受任意ip的連線
# bind 
127.0.0.1 # 關閉保護模式,如果開啟則需要配置 bind ip或者設定密碼才能訪問 protected-mode no # 讓redis服務後臺執行 ,容器部署的話這個需要設定成前臺訪問,否則容器不能正常啟動,即為no daemonize no # 設定密碼(可選,如果這裡開啟了密碼要求,slave的配置裡就要加這個密碼. 只是練習配置,就不使用密碼認證了) # requirepass masterpassword # 配置日誌路徑,為了便於排查問題,指定redis的日誌檔案目錄,這個目錄必須存在否則容器不能啟動 logfile "/data/redis.log"

從配置:

# 註釋這一行,表示Redis可以接受任意ip的連線
# bind 
127.0.0.1 # 關閉保護模式 protected-mode no # yes是讓redis服務後臺執行 daemonize no # 設定密碼(可選,如果這裡開啟了密碼要求,slave的配置裡就要加這個密碼) requirepass masterpassword # 設定主庫的密碼,用於認證,如果主庫開啟了requirepass選項這裡就必須填相應的密碼 masterauth <master-password> # 設定master的IP和埠號,redis配置檔案中的預設埠號是6379 # 低版本的redis這裡會是slaveof,我這個版本用的是replica # 這裡設定master容器內部的IP,使用docker inspect redis
-1 | grep IPAddress ,找到容器IP replicaof 172.17.0.2 6379 # 配置日誌路徑,為了便於排查問題,指定redis的日誌檔案目錄,必須存在 logfile "/data/redis.log"

四、啟動映象,並指定啟動的配置檔案

docker run -it --name redis-1 --privileged=true -v /data/redis/redis-1/redis.conf:/etc/redis.conf -v /root/docker/redis/data:/data -d -p 6379:6379 redis   redis-server  /etc/redis.conf  

docker run -it --name redis-2 --privileged=true -v /data/redis/redis-2/redis.conf:/etc/redis.conf -v /root/docker/redis/data:/data -d -p 6380:6379 redis   redis-server  /etc/redis.conf

docker run -it --name redis-3 --privileged=true -v /data/redis/redis-3/redis.conf:/etc/redis.conf -v /root/docker/redis/data:/data -d -p 6381:6379 redis   redis-server  /etc/redis.conf  

解釋:
  1. --name 指定容器的名稱 redis-2
  2. --privileged=true,將外部的root許可權,賦予容器使用者,否則容器中有些許可權不能執行
  3. -v /data/redis/redis-3/redis.conf:/etc/redis.conf ,掛在宿主機上的配置到容器中
  4. -v /root/docker/redis/data:/data ,掛在容器的資料檔案到宿主機上
  5. -p 6380:6379 指定埠對映到宿主機的埠6380,那外部訪問這個redis需要通過6380
  6. 容器啟動後執行redis配置檔案載入:redis-server/etc/redis.conf(容器中配置檔案的位置),這個命令容器啟動以後登陸到容器中執行不生效,不知道具體問題

五、登陸到容器中驗證

docker exec -it redis-1 bash
redis-cli
info
info replication ( 主顯示role:master ,從顯示role:slave)
在master上執行 set name  wang , 從中檢視是否可以同步,如果有資料,則主從搭建成功

六、問題整理 1)解決容器中無許可權問題 容器啟動的時候新增引數:--privileged=true 2)容器啟無異常日誌,但是容器啟動失敗 因為容器是後臺啟動,如果redis也設定後臺啟動,則容器就會啟動失敗,檢視redis配置,是否關閉了後臺啟動:daemonize no 3)redis啟動後不能遠端訪問
啟動後提示-並且外網不能訪問redis:
docker redis WARNING: IPv4 forwarding is disabled. Networking will not work.

解決:

vi /etc/sysctl.conf
net.ipv4.ip_forward=1 #新增這段程式碼
systemctl restart network && systemctl restart docker #重啟network服務
sysctl net.ipv4.ip_forward #檢視是否修改成功 (備註:返回1,就是成功)
4)檢視自己的配置是否生效(自己開始的時候在容器內部執行這個命令不生效,找了很久都不知道具體原因:redis-server/etc/redis.conf) 登陸到redis-cli執行以下命令,看看是否是我們設定的配置 CONFIG GET replicaof CONFIG GET protected-mode 5)宿主機配置檔案修改 掛在的宿主機上的配置檔案每次修改後重啟容器中配置檔案可以重新整理,並生效 六、新增三臺哨兵作為切換 1)下載哨兵配置
wget http://download.redis.io/redis-stable/sentinel.conf
修改配置檔案:
# 讓sentinel服務後臺執行
daemonize no

# 修改日誌檔案的路徑
logfile "/data/sentinel.log"

# 修改監控的主redis伺服器
# 最後一個2表示,兩臺機器判定主被動下線後,就進行failover(故障轉移) 
# mymaster 為哨兵中 主的名稱(自己起的名字) ,IP 和埠是容器的IP和啟動的redis埠
# 可以有多個sentinel monitor 即監控多個master,這個iP和埠是宿主機對外的主redis的IP和埠,以便對外可以訪問
sentinel monitor mymaster 35.236.172.131 6379 2

2) 啟動哨兵容器

docker run -it --name sentinel-1 --privileged=true -v /data/redis/sentinel-1/sentinel.conf:/etc/sentinel.conf   -d -p 26381:26379 redis    redis-sentinel   /etc/sentinel.conf


docker run -it --name sentinel-2 --privileged=true -v /data/redis/sentinel-1/sentinel.conf:/etc/sentinel.conf   -d -p 26381:26379 redis    redis-sentinel   /etc/sentinel.conf

docker run -it --name sentinel-3  --privileged=true -v /data/redis/sentinel-1/sentinel.conf:/etc/sentinel.conf   -d -p 26381:26379 redis    redis-sentinel   /etc/sentinel.conf

3)檢視哨兵狀態

登陸到容器中檢視日誌可以檢視哨兵監聽情況: tail -f -n 300  /data/sentinel.log
哨兵節點上執行:
redis-cli -h localhost -p   26379
info Sentinel
sentinel master mymaster
4)測試主從切換 停掉主redis的容器:docker stop redis-1 檢視哨兵日誌會切換主節點的容器為其他節點 啟動主redis的容器,則主變成了slave節點 5)Jedis客戶端連線哨兵測試
public class AppTest
{


    public static void testSentinel() {
        String masterName = "mymaster";
        Set<String> sentinels = new HashSet<>();
        sentinels.add("192.168.112.131:26379");
        sentinels.add("192.168.112.131:26380");
        sentinels.add("192.168.112.131:26381");

        //通過sentinel來拿到master然後進行連結
        JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels); 
        Jedis jedis = pool.getResource();
        jedis.set("name", "wang" );
        String keys1 = jedis.get("name") ;
        System.out.println( keys1);
        pool.close();
    }


    public static void main(String[] args) {
        testSentinel();
    }
}
文章參考:https://www.cnblogs.com/kismetv/p/9609938.html redis做分散式操作->redisson地址:https://github.com/redisson/redisson/wiki