![499c224586b57c51f3ca6430dc9c71e0.png](https://i-blog.csdnimg.cn/blog_migrate/cf7952506d1086d4e8fc311102aa4af7.jpeg)
到此,我们的 Redis 哨兵集群就结束了,本篇章是第九篇章,也是使用集群方式的实例一来实现php的轮询分流。
1、准备工作:
在我们上一篇章实现redis 哨兵集群的基础上开始,在服务器上部署php,这里就不使用 yum 一步步安装了,因为这不是本篇章主要内容,请大家按照这个地址https://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、先看下客户端请求数据的轮询结构图:
![d4cf5121f9c18ecd377813ce526a7c54.png](https://i-blog.csdnimg.cn/blog_migrate/393419a8af05f0ce1cd40443420a7311.jpeg)
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
![b5227fdbd81f3fc637d9fb61ba92c574.png](https://i-blog.csdnimg.cn/blog_migrate/0b17e7fcf5bbfa859cb6eff906e12ac6.png)
安装成功以后开启redis扩展
首先我们可以执行php-m来查看有php安装了哪些扩展
当我们安装成功以后就可以看到我们的redis扩展已经开启了如下图:
![09fe45bca1a41fec641b1237aa65a721.png](https://i-blog.csdnimg.cn/blog_migrate/b4a98b9f49f9ccb951ea8be02e66907b.jpeg)
篇外姿势就到这了。。。继续我们的主题。
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);
![d2ebaebfdea810197add45b916d7dd73.png](https://i-blog.csdnimg.cn/blog_migrate/4f6493fe2ef436203603f8f5668fb5be.jpeg)
- 循环遍历输出从节点信息
$slaves=[];
foreach ($slaveInfo as $val){
$slaves[]=['ip'=>$val[3],'port'=>$val[5]];
}
//var_dump($slaves);
![5262d5ab4fe57f7501c97f52e096f5f1.png](https://i-blog.csdnimg.cn/blog_migrate/36929931de4eaf57a396af807e09290e.jpeg)
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目录:所有操作都在这个目录里完成。
![a0f77083509d450aa5a1d13dc83bdc7d.png](https://i-blog.csdnimg.cn/blog_migrate/69dd1fcfd5525a5bb972ee59556f6808.png)
本篇文章是实力干货,在工作中需要使用docker部署redis哨兵集群,肯定能用到。所谓技不压身,希望有兴趣的踊跃学习,视频主要是讲解轮询分流实现的过程,大晚上了准备了这些。希望大家能学会东西才是我的初衷。最后还是那句话,如果觉得不错,请点击关注我的主页和我的专栏,谢谢。下个篇章我们聊聊百万高并发秒杀。请记得关注。