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