到此,我們的 Redis 哨兵集群就結束了,本篇章是第九篇章,也是使用集群方式的實例一來實現php的輪詢分流。

1、準備工作:

在我們上一篇章實現redis 哨兵集群的基礎上開始,在伺服器上部署php,這裡就不使用 yum 一步步安裝了,因為這不是本篇章主要內容,請大家按照這個地址lnmp.org/install.html的安裝步驟一步步開始安裝,其中MySQL也一同安裝,為下個篇章的實例二做好準備。

版本:mysql5.6、php7.2

安裝過程大概需要一個小時左右的時間...

2、檢測php是否已安裝完成:

執行命令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

3、先看下客戶端請求數據的輪詢結構圖:

4、安裝redis擴展:

會不會有疑問,我們不是已經用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沒有怎麼辦?這裡就算給大家再普及點本篇章外的姿勢吧。

搞技術就是這樣,注意方式方法:首先我們的姿勢一定要對!!!,姿勢不對怎麼辦?那就來點實操長長見識??。

本篇章外的姿勢:

  • 執行安裝【再三強調注意自己的php版本】:

[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源:

因為我的系統是乾淨的系統,所以我們直接使用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擴展已經開啟了如下圖:

篇外姿勢就到這了。。。繼續我們的主題。

5、構建代碼:

擴展一下構建方法這裡我們選擇兩個步驟實現,第一步隨機【選擇哨兵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,通過ip和埠連接

$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、輪詢:

  • 通過上面的循環遍歷,開始選擇輪詢找我們的從節點 類RoundSlave.php

//節點選擇方法
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;
}
}

  • 用php來實現定時器 start.php

做到每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();

  • 創建開關執行程序 onOFF.php

return true;
//return false;
//true:開 默認是打開的
//false:關
注意:開關一旦開啟,程序將永遠執行下去,所以當你不在調試時,請更改這裡配置變成false,程序就會自動關閉

好了這個輪詢我們就做好了。下面是我一步步整合好經過測試沒有問題而發布的一段視頻,可以照我的方法,自己來構建下,同時本視頻中我在跟目錄新建了/www/lunxun目錄:所有操作都在這個目錄里完成。

視頻封面

07:21docker Redis 哨兵集群 輪詢分流

本篇文章是實力乾貨,在工作中需要使用docker部署redis哨兵集群,肯定能用到。所謂技不壓身,希望有興趣的踴躍學習,視頻主要是講解輪詢分流實現的過程,大晚上了準備了這些。希望大家能學會東西才是我的初衷。最後還是那句話,如果覺得不錯,請點擊關注我的主頁和我的專欄,謝謝。下個篇章我們聊聊百萬高並發秒殺。請記得關注。


推薦閱讀:
相关文章