redis哨兵

1. 主从复制
------------------------------------------
    操作步骤:
     1.先将linux虚拟机关闭,之后克隆一个。
     2.启动两个虚拟机:master(主)和slave(从)
     3. 在slave(从)中配置一下ip地址
        # ifconfig eth0 192.168.128.229
        # ping 一下看看通不通。
     4. 配置从机
        进入:配置文件
            slaveof  192.168.128.228 6379   //配置连接主机的Redis的ip和端口
            masterauth 密码  //配置连接密码
        
            最后启动slave(从)机的Redis服务。
        
     其他:可以通过info命令中的role属性查看自己角色是master、slave

2. 哨兵
------------------------------------------
                操作步骤:
       1.创建sentinel.conf 文件
                   2.文件内容
            port 6390
            bind 127.0.0.1

                        sentinel monitor mymaster 127.0.0.1 6380 1
                        sentinel down-after-milliseconds mymaster 5000
                        sentinel failover-timeout mymaster 15000
                        sentinel auth-pass mymaster 123456
                        protected-mode yes


           /**
          1. port :当前Sentinel服务运行的端口
                      2.sentinel monitor mymaster 127.0.0.1 6379 2:Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
                      3.sentinel down-after-milliseconds mymaster 5000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
                      4.sentinel parallel-syncs mymaster 1:指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
                      5.sentinel failover-timeout mymaster 15000:如果在该时间(ms)内未能完成failover操作,则认为该failover失败
                       **/

                   3.启动
             方法一
                               redis-sentinel redis-sentinel-26379.conf
                         方法二
                               redis-server.exe sentinel.conf --sentinel


 
              port :当前Sentinel服务运行的端口

              bind 127.0.0.1

                          sentinel monitor mymaster 127.0.0.1 6379 2
            Sentinel去监视一个名为mymaster的主redis实例,这个主实例的IP地址为本机地址127.0.0.1,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
                                  # 哨兵监听的主服务器 后面的2表示主机挂掉以后进行投票,只需要1票就可以从机变主机

              sentinel down-after-milliseconds mymaster 5000
            指定了Sentinel认为Redis实例已经失效所需的毫秒数。当 实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
                                  # 5s内mymaster无响应,则认为mymaster宕机了

              sentinel parallel-syncs mymaster 1
            指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
            # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步

                          sentinel failover-timeout mymaster 15000
            如果在该时间(ms)内未能完成failover操作,则认为该failover失败
            #如果15秒后,mysater仍没启动过来,则启动failover

            

                          sentinel auth-pass mymaster 123456
            # 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码,没有的话不用设置

              protected-mode yes

 

 


/*入口*/
    public function index()
    {
        $redis = new \Redis();
        $redis->connect('127.0.0.1','6390') or die('Can not Content Redis!');
        $redis->auth('123456');
        
        //获取主库列表及其状态信息
        $result = $redis->rawCommand('SENTINEL', 'masters');
        ///dump($result);
        $arrayData = $this->parseArrayResult($result);
        dump($arrayData);
        //根据所配置的主库redis名称获取对应的信息
        //master_name应该由运维告知(也可以由上一步的信息中获取)
        //$result = $redis->rawCommand('SENTINEL', 'master', $master_name);
        $result = $redis->rawCommand('SENTINEL', 'master', $arrayData[0]['name']);
        $arrayData = $this->parseArrayResult($result);
        dump($arrayData);
        
        //根据所配置的主库redis名称获取其对应从库列表及其信息
        $result = $redis->rawCommand('SENTINEL', 'slaves', 'mymaster');
        $arrayData = $this->parseArrayResult($result);
        dump($arrayData);
        
        die;
        
    }
    
    //这个方法可以将以上sentinel返回的信息解析为数组
private function parseArrayResult(array $data)
{
    $result = array();
    $count = count($data);
    for ($i = 0; $i < $count;) {
        $record = $data[$i];
        if (is_array($record)) {
            $result[] = $this->parseArrayResult($record);
            $i++;
        } else {
            $result[$record] = $data[$i + 1];
            $i += 2;
        }
    }
    return $result;
}

 

 

以下PHP部分代码:
//可能用到的部分命令,其他可以去官方文档查看

//获取主库列表及其状态信息
$result = $redis->rawCommand('SENTINEL', 'masters');

//根据所配置的主库redis名称获取对应的信息
//master_name应该由运维告知(也可以由上一步的信息中获取)
$result = $redis->rawCommand('SENTINEL', 'master', $master_name);

//根据所配置的主库redis名称获取其对应从库列表及其信息
$result = redis->rawCommand('SENTINEL', 'slaves', $master_name);

//获取特定名称的redis主库地址
$result = $redis->rawCommand('SENTINEL', 'get-master-addr-by-name', $master_name)

//这个方法可以将以上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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值