到此,我们的 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 搭建集群了吗?怎么还要安装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扩展已经开启了如下图:
docker redis 配置文件,
扩展一下构建方法这里我们选择两个步骤实现,第一步随机【选择哨兵Sentinel】、第二步轮询【选择从节点Slave】
准备三个php 文件:
RoundSlave.php:作用轮询
start.php:开始执行的主题
onOFF.php:代码执行开关
docker启动redis镜像、这里我们打开四个终端,第一个是用来在宿主机部署代码、第二个是用来检测日志、第三个用来执行代码的开关、第四个是用来在 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,程序就会自动关闭
docker mysql集群、好了这个轮询我们就做好了。下面是我一步步整合好经过测试没有问题而发布的一段视频,可以照我的方法,自己来构建下,同时本视频中我在跟目录新建了/www/lunxun目录:所有操作都在这个目录里完成。
docker Redis 哨兵集群 轮询分流https://www.zhihu.com/video/1099853632677171200本篇文章是实力干货,在工作中需要使用docker部署redis哨兵集群,肯定能用到。所谓技不压身,希望有兴趣的踊跃学习,视频主要是讲解轮询分流实现的过程,大晚上了准备了这些。希望大家能学会东西才是我的初衷。最后还是那句话,如果觉得不错,请点击关注我的主页和我的专栏,谢谢。下个篇章我们聊聊百万高并发秒杀。请记得关注。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态