redis 一主三从三哨兵

2019-11-29

redis  一主三从三哨兵 每个从机和每个哨兵都是不一样的端口 先启用主机 在启动从机 (windows下)(主机可写可读)(从机只能读不能写)

复制三个redis文件夹(从机)(文件名redis+端口号):

     每个从机中需要复制 redis的启动exe文件和配置文件 (redis-server.exe , redis.windows.conf)

    redis.windows.conf 需要配置 

         port 6380    //设置从机的端口,不能和主机的端口相同

         slaveof  127.0.0.1  6379 //从机绑定主机

    bat文件启动从机: redis-server.exe redis.windows.conf

哨兵(复制3个文件夹)(文件名sentinel+端口号)

每个哨兵中复制 redis的启动exe文件和配置文件 (redis-server.exe ,sentinel.conf)

哨兵配置文件(sentinel.conf):

    bind 0.0.0.0 

    port 26379

    sentinel monitor seckill 127.0.0.1 6379 1

    sentinel down-after-milliseconds seckill 5000

    sentinel failover-timeout seckill 15000

    bat文件启动哨兵:redis-server.exe sentinel.conf --sentinel



哨兵在主服务当掉后,会从从服务中选取一个当成主服务

监控运行状态,如果master出现故障,将从slave中投票出一个master,继续对外服务

操作redis集群类;

class RedisSentinel

{

    public $redis;

    public $master;

    public $slaver;

    public function __construct()

    {

        $this->master = new \Redis();

        $this->slaves = new \Redis();

        $this->_connect();

    }

    private function _connect()

    {

        $redis = new \Redis();

        $host = '127.0.0.1';

        //链接sentinel服务,host为ip,port为端口

        $port = ['6379','6380'];

        foreach($port as $k=>$v){

            if($redis->connect($host,$v)){

                $this->redis=$redis;

                $master[] = $this->parseArrayResult($redis->rawCommand('SENTINEL','master','seckill'));

                $slaves = $redis->rawCommand('SENTINEL','slaves','seckill');

                $slavesIndex = array_rand($slaves);//获取数组的键

                $slaves = $this->parseArrayResult($slaves[$slavesIndex]);

                $this->parseArrayResult($this->slaves)

                break;

            }

        }

        //master是主服务,在其他的方法中引入后可直接调用;链接redis

        $this->master->$redis->connect($master['ip'],$master['port']);

        //slave是从服务

        $this->slaver->$redis->connect($slaves['ip'],$slaves['port']);

    }

    //这个方法可以将以上sentinel返回的信息解析为数组

    function parseArrayResult(array $data)

    {

        $result = array();

        $count = count($data);

        for ($i = 0; $i < $count;) {

            $record = $data[$i];

            if (is_array($record)) {

                $result[] = parseArrayResult($record);

                $i++;

            } else {

                $result[$record] = $data[$i + 1];

                $i += 2;

            }

        }

        return $result;

    }

    public function setRedisCahe($key,$value,$time=600)

    {

        $this->master->set($key,$value,$time);

    }

    public function getRedisCahe($key)

    {

        $this->slaver->get($key);

    }

}

{/if}