到此,我們的 Redis 哨兵集羣就結束了,本篇章是第九篇章,也是使用集羣方式的實例一來實現php的輪詢分流。
在我們上一篇章實現redis 哨兵集羣的基礎上開始,在伺服器上部署php,這裡就不使用 yum 一步步安裝了,因為這不是本篇章主要內容,請大家按照這個地址https://lnmp.org/install.html的安裝步驟一步步開始安裝,其中MySQL也一同安裝,為下個篇章的實例二做好準備。
版本:mysql5.6、php7.2
安裝過程大概需要一個小時左右的時間...
執行命令php -v 會看到以下結果: PHP 7.2.6 (cli) (built: Apr 9 2019 23:55:32) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
會不會有疑問,我們不是已經用docker 搭建集羣了嗎?怎麼還要安裝redis擴展呢?是因為我們執行我們的代碼案例是在宿主機而不是在docker容器裏,所以要在宿主機安裝php擴展和redis擴展。
安裝redis擴展很簡單,跟著我一起做就OK了。
使用git來獲取phpredis包,至於放在哪裡自己決定,執行以下命令來獲取
[root@instance-rttngj1u download]# git clone https://github.com/phpredis/phpredis.git
下載完畢後進入到壓縮包
[root@instance-rttngj1u download]# cd phpredis/
注意:在開始編譯之前,如果不確定自己的php安裝路徑,請執行which php然後再確認自己的php版本可以執行 php -v 來查看。在確定好php的安裝路徑後
執行下面的命令:
[root@instance-rttngj1u /]# which php /usr/bin/php [root@instance-rttngj1u /]# /usr/bin/phpize7.2 -bash: /usr/bin/phpize7.2: 沒有那個文件或目錄 如果我們發現沒有phpize7.2沒有怎麼辦?這裡就算給大家再普及點本篇章外的姿勢吧。
本篇章外的姿勢:
[root@instance-rttngj1u bin]# sudo yum install php7.2-dev 已載入插件:langpacks, versionlock baidu-bcm .... | 2.5 kB 00:00:00 | 3.5 kB 00:00:00
因為我的系統是乾淨的系統,所以我們直接使用yum來安裝redis [root@instance-rttngj1u ~]# yum install -y redis
[root@instance-rttngj1u bin]# sudo yum update 更新完成以後再執行第一步的代碼,確保無誤。
安裝gcc依賴包 [root@instance-rttngj1u bin]# yum -y install gcc gcc-c++ libxml2-devel m4 autoconf pcre-devel make cmake bison
[root@instance-rttngj1u bin]# find phpi* phpize 這個時候我就會發現有phpize了,注意前面剛剛我們執行的是/usr/bin/phpize7.2 這裡沒有7.2,不要奇怪 相信自己安裝的是對的 繼續執行指令 [root@instance-rttngj1u phpredis]# /usr/bin/phpize 如果出現以下錯誤找不到config.m4 Cannot find config.m4. Make sure that you run /usr/bin/phpize in the top level source directory of the module
沒關係 我們全局找下執行指令 [root@instance-rttngj1u /]# find -name config.m4 ./home/wwwroot/default/phpmyadmin/vendor/twig/twig/ext/twig/config.m4 ./download/phpredis/config.m4 當然你們找到的可能跟我的路徑不一樣,得注意下 然後copy到我們要執行的phpize同級目錄下 [root@instance-rttngj1u /]# cp /home/wwwroot/default/phpmyadmin/vendor/twig/twig/ext/twig/config.m4 /download/phpredis/ 進入到phpredis目錄再執行phpize [root@instance-rttngj1u phpredis]# /usr/bin/phpize Configuring for: PHP Api Version: 20170718 Zend Module Api No: 20170718 Zend Extension Api No: 320170718 執行指令生成MakeFile [root@instance-rttngj1u phpredis]# ./configure --with-php-config=/usr/local/php/bin/php-config 最後一步執行安裝 [root@instance-rttngj1u phpredis]# make && make install 把擴展加入到php的配置當中去 修改php.ini
安裝成功以後開啟redis擴展 首先我們可以執行php-m來查看有php安裝了哪些擴展 當我們安裝成功以後就可以看到我們的redis擴展已經開啟瞭如下圖:
擴展一下構建方法這裡我們選擇兩個步驟實現,第一步隨機【選擇哨兵Sentinel】、第二步輪詢【選擇從節點Slave】
準備三個php 文件:
RoundSlave.php:作用輪詢
start.php:開始執行的主題
onOFF.php:代碼執行開關
這裡我們打開四個終端,第一個是用來在宿主機部署代碼、第二個是用來檢測日誌、第三個用來執行代碼的開關、第四個是用來在 Docker 容器 master 主機點設置 redis 緩存存儲值。以下是具體步驟:
首選做好準備工作:準備好四個終端、在第一個終端建立三個php文件:
1、隨機訪問一個節點:
include RoundSlave.php; $sentinel = [ [ip => 106.12.212.131,port => 22536], [ip => 106.12.212.131,port => 22537], [ip => 106.12.212.131,port => 22538] ];
$getSentinel = $sentinel[array_rand($sentinel)];
$redis = new Redis(); $redis->connect($getSentinel[ip],$getSentinel[port]);
$slaveInfo = $redis->rawCommand(SENTINEL,slaves,mymaster); //var_dump($slaveInfo);
$slaves=[]; foreach ($slaveInfo as $val){ $slaves[]=[ip=>$val[3],port=>$val[5]]; } //var_dump($slaves);
2、輪詢:
//節點選擇方法 class RoundSlave { static $lastI = 0; //檢測輪詢次數 static $num = 0; public function select($list){ $currentI = self::$lastI; $value=$list[$currentI]; //在部署哨兵集羣時,從幾點的鍵值+1不能大於從節點總數 if($currentI+1 > count($list)-1){ self::$lastI=0; }else{ self::$lastI++; } $setNum = self::$num++; //存入日誌 file_put_contents(log.log,$setNum); return $value; } }
做到每3秒執行一次函數,該函數主要是用來控制,定時器是否生效,一旦生效,定時器永遠執行下去,我們的目的 是用來模擬客戶端來訪問我們的 redis 數據資源。請看下面的代碼
//設置程序的執行時間沒有限制 set_time_limit(0); //5秒鐘執行一次 $sleep_time = 3; //引用程序執行開關 $switch = include onOFF.php; //邏輯處理執行 while($switch){ $switch = include onOFF.php; $slave=(new RoundSlave())->select($slaves); try{ $redis=new Redis(); $redis->connect($slave[ip],$slave[port]); var_dump(date("Y-m-d",time()),$slave,$redis->get(dos)); }catch (RedisException $e){ var_dump($e->getMessage()); } //等待時間,循環進行下一次操作。 sleep($sleep_time); } exit();
return true; //return false; //true:開 默認是打開的 //false:關 注意:開關一旦開啟,程序將永遠執行下去,所以當你不在調試時,請更改這裡配置變成false,程序就會自動關閉
好了這個輪詢我們就做好了。下面是我一步步整合好經過測試沒有問題而發布的一段視頻,可以照我的方法,自己來構建下,同時本視頻中我在跟目錄新建了/www/lunxun目錄:所有操作都在這個目錄裏完成。
本篇文章是實力乾貨,在工作中需要使用docker部署redis哨兵集羣,肯定能用到。所謂技不壓身,希望有興趣的踴躍學習,視頻主要是講解輪詢分流實現的過程,大晚上了準備了這些。希望大家能學會東西纔是我的初衷。最後還是那句話,如果覺得不錯,請點擊關注我的主頁和我的專欄,謝謝。下個篇章我們聊聊百萬高並發秒殺。請記得關注。