到此,我们的 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 哨兵集群 轮询分流
本篇文章是实力干货,在工作中需要使用docker部署redis哨兵集群,肯定能用到。所谓技不压身,希望有兴趣的踊跃学习,视频主要是讲解轮询分流实现的过程,大晚上了准备了这些。希望大家能学会东西才是我的初衷。最后还是那句话,如果觉得不错,请点击关注我的主页和我的专栏,谢谢。下个篇章我们聊聊百万高并发秒杀。请记得关注。
Original url: Access
Created at: 2019-04-30 18:20:45
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论