redis哨兵主從自動切換


1、先配置redis主從,在從服務器上配置成為主服務器的從機

slaveof 120.26.192.1 1000 #主服務器的IP和端口
masterauth "123456" #連接密碼

  為了后面的自動切換能成功,我們在主服務器也配置好連接從服務器的密碼

masterauth "123456"

  重啟之后可以看見是否建立了關系

127.0.0.1:1000> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=121.19.2.1,port=1000,state=online,offset=895886222,lag=1
master_replid:932ba59e06f5481dff1c3ac62ab7458e0ea0aa57
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:895886415
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:894837840
repl_backlog_histlen:1048576

 

2、配置哨兵 sentinel.conf

  

port 26379  
daemonize yes sentinel monitor mymaster
192.168.251.129 6380 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 logfile "/var/log/sentinel_log.log"
sentinel auth-pass mymaster 12345#密碼 注釋:
1. port :當前Sentinel服務運行的端口 2. dir : Sentinel服務運行時使用的臨時文件夾 3 sentinel monitor mymaster 192.168.251.129 6380 2:Sentinel去監視一個名為master的主redis實例,這個主實例的IP地址為本機地址192.168.1.103,端口號為6379,而將這個主實例判斷為失效至少需要2個 Sentinel進程的同意,只要同意Sentinel的數量不達標,自動failover就不會執行 4. sentinel down-after-milliseconds mymaster 300000:指定了Sentinel認為Redis實例已經失效所需的毫秒數。當實例超過該時間沒有返回PING,或者直接返回錯誤,那么Sentinel將這個實例標記為主觀下線。只有一個 Sentinel進程將實例標記為主觀下線並不一定會引起實例的自動故障遷移:只有在足夠數量的Sentinel都將一個實例標記為主觀下線之后,實例才會被標記為客觀下線,這時自動故障遷移才會執行 5. sentinel parallel-syncs mymaster 1:指定了在執行故障轉移時,最多可以有多少個從Redis實例在同步新的主實例,在從Redis實例較多的情況下這個數字越小,同步的時間越長,完成故障轉移所需的時間就越長 6. sentinel failover-timeout mymaster 180000:如果在該時間(ms)內未能完成failover操作,則認為該failover失敗

  在主從服務器上都配置好,配置可以一樣的,然后啟動哨兵

  

redis-sentinel sentinel.conf

  

  通過手動關閉主服務器上的redis,看是否自動切換,如果成功就證明生效。開始配置客戶端。

 

3、用的是TP5框架,改寫框架自帶的redis類 thinkphp/library/think/cache/driver/Redis.php

//兩台服務器都配置好了監控哨兵
//主從配置要設置好密碼,兩變密碼最好一致,因為切換的時候要密碼驗證
    protected $sentinel = array(
        array(
            'host'       => '116.62.111.1',
            // redis端口
            'port'       => 1940,
            // 密碼
            'password'   => '123redis',
            'select'     => 0,
            'timeout'    => 1,
            'expire' => 10000,
            'persistent' => false,
            'prefix'     => 'subs',
            'serialize'  => true,
        ),
        array(
            'host'       => '116.62.111.2',
            // redis端口
            'port'       => 1940,
            // 密碼
            'password'   => '123redis',
            'select'     => 0,
            'timeout'    => 1,
            'expire' => 10000,
            'persistent' => false,
            'prefix'     => 'subs',
            'serialize'  => true,
        ),

    );

 

2、初始化redis的鏈接配置,通過鏈接哨兵來獲取當前的主從服務器的信息,保證每次都是讀的主服務器

 foreach ($this->sentinel as $sentinel){
                try{
                   
                    $this->handler->connect($sentinel['host'], $sentinel['port'], $this->options['timeout']);
                    
                    if ('' != $sentinel['password']) {
                        $this->handler->auth($sentinel['password']);
                    }
                    break;
                }catch (\Exception $e){
                    continue;
                }
            }

3、測試只要一台服務器死,另外一台從幾會自動切換成主機,把死的機子重啟之后又會自動變成從機,自動同步關聯。  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM