精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Redis高可用性之Failover過(guò)渡方案

運(yùn)維 系統(tǒng)運(yùn)維 Redis
從Redis官方路線圖來(lái)看,大概會(huì)在Redis3.0左右正式支持Cluster。不過(guò)即便是樂(lè)觀的估計(jì),至少也得等幾個(gè)月的時(shí)間,為了讓我的應(yīng)用在這段時(shí)間內(nèi)能保持高可用性,我以主從服務(wù)器為基礎(chǔ)實(shí)現(xiàn)了一個(gè)Failover過(guò)渡方案。

從Redis官方路線圖來(lái)看,大概會(huì)在Redis3.0左右正式支持Cluster。不過(guò)即便是樂(lè)觀的估計(jì),至少也得等幾個(gè)月的時(shí)間,為了讓我的應(yīng)用在這段時(shí)間內(nèi)能保持高可用性,我以主從服務(wù)器為基礎(chǔ)實(shí)現(xiàn)了一個(gè)Failover過(guò)渡方案。

 

從理論上解釋?zhuān)坏┲鞣?wù)器下線,可以在從服務(wù)器里挑選出新的主服務(wù)器,同時(shí)重新設(shè)置主從關(guān)系,并且當(dāng)下線服務(wù)器重新上線后能自動(dòng)加入到主從關(guān)系中去,內(nèi)容如下:

<?php

class RedisFailover
{
    public $config = array();
    public $map    = array();

    const CONFIG_FILE = 'config.php';
    const MAP_FILE    = 'map.php';

    public function __construct()
    {
        $config = include self::CONFIG_FILE;

        foreach ((array)$config as $name => $nodes) {
            foreach ($nodes as $node) {
                $node = new RedisNode($node['host'], $node['port']);

                if ($node->isValid()) {
                    $this->config[$name][] = $node;
                }
            }

            if (empty($this->config[$name])) {
                throw new Exception('Invalid config.');
            }

            $this->map[$name] = $this->config[$name][0];
        }

        if (file_exists(self::MAP_FILE)) {
            $map = include self::MAP_FILE;

            foreach ((array)$map as $name => $node) {
                $node = new RedisNode($node['host'], $node['port']);

                $this->map[$name] = $node;
            }
        }
    }

    public function run()
    {
        $set_nodes_master = function($nodes, $master) {
            foreach ($nodes as $node) {
                $node->setMaster($master->host, $master->port);
            }
        };

        foreach ($this->config as $name => $nodes) {
            $is_master_valid = false;

            foreach ($nodes as $node) {
                if ($node == $this->map[$name]) {
                    $is_master_valid = true;

                    break;
                }
            }

            if ($is_master_valid) {
                $set_nodes_master($nodes, $this->map[$name]);

                continue;
            }

            foreach ($nodes as $node) {
                $master = $node->getMaster();

                if (empty($master)) {
                    continue;
                }

                if ($master['master_host'] != $this->map[$name]->host) {
                    continue;
                }

                if ($master['master_port'] != $this->map[$name]->port) {
                    continue;
                }

                if ($master['master_sync_in_progress']) {
                    continue;
                }

                $node->clearMaster();

                $set_nodes_master($nodes, $node);

                $this->map[$name] = $node;

                break;
            }
        }

        $map = array();

        foreach ($this->map as $name => $node) {
            $map[$name] = array(
                'host' => $node->host, 'port' => $node->port
            );
        }

        $content = '<?php return ' . var_export($map, true) . '; ?>';

        file_put_contents(self::MAP_FILE, $content);
    }
}

class RedisNode
{
    public $host;
    public $port;

    const CLI = '/usr/local/bin/redis-cli';

    public function __construct($host, $port)
    {
        $this->host = $host;
        $this->port = $port;
    }

    public function setMaster($host, $port)
    {
        if ($this->host != $host || $this->port != $port) {
            return $this->execute("SLAVEOF {$host} {$port}") == 'OK';
        }

        return false;
    }

    public function getMaster()
    {
        $result = array();

        $this->execute('INFO', $rows);

        foreach ($rows as $row) {
            if (preg_match('/^master_/', $row)) {
                list($key, $value) = explode(':', $row);

                $result[$key] = $value;
            }
        }

        return $result;
    }

    public function clearMaster()
    {
        return $this->execute('SLAVEOF NO ONE') == 'OK';
    }

    public function isValid()
    {
        return $this->execute('PING') == 'PONG';
    }

    public function execute($command, &$output = null)
    {
        return exec(
            self::CLI . " -h {$this->host} -p {$this->port} {$command}", $output
        );
    }
}

?>

其中提到了兩個(gè)文件,先說(shuō)一下config.php:

<?php

return array(
    'redis_foo' => array(
        array('host' => '192.168.0.1', 'port' => '6379'),
        array('host' => '192.168.0.2', 'port' => '6379'),
        array('host' => '192.168.0.3', 'port' => '6379'),
    ),
);

?>

說(shuō)明:每個(gè)別名對(duì)應(yīng)一組服務(wù)器,在這組服務(wù)器中,有一個(gè)是主服務(wù)器,其余都是從服務(wù)器,主從關(guān)系不要在配置文件里硬編碼,而應(yīng)該通過(guò)SLAVEOF命令動(dòng)態(tài)設(shè)定。

再說(shuō)一下map.php文件,內(nèi)容如下:

<?php

return array (
    'redis_foo' => array (
        'host' => '192.168.0.1', 'port' => '6379'
    ),
);

?>

說(shuō)明:別名對(duì)應(yīng)的是當(dāng)前有效的服務(wù)器。需要注意的是這個(gè)文件是自動(dòng)生成的!程序在使用Redis的時(shí)候,都配置成別名的形式,具體的host,port通過(guò)此文件映射獲得。

明白了以上代碼之后,運(yùn)行就很簡(jiǎn)單了:

<?php

$failover = new RedisFailover();
$failover->run();

?>

說(shuō)明:實(shí)際部署時(shí),最嚴(yán)格的方式是以守護(hù)進(jìn)程的方式來(lái)執(zhí)行,不過(guò)如果要求不是很苛刻的話,CRON就夠了。測(cè)試時(shí)可以手動(dòng)殺掉主服務(wù)器進(jìn)程,再通過(guò)INFO查看效果。

再補(bǔ)充一些命令行用法的相關(guān)說(shuō)明,本文都是使用redis-cli來(lái)發(fā)送命令的,通常這也是最佳選擇,不過(guò)如果因?yàn)槟承┰虿荒苁褂胷edis-cli的話,也可以使用nc(netcat)命令按照Redis協(xié)議實(shí)現(xiàn)一個(gè)簡(jiǎn)單的客戶(hù)端工具,比如說(shuō)PING命令可以這樣實(shí)現(xiàn):

shell> (echo -en "PING\r\n"; sleep 1) | nc localhost 6379

說(shuō)明:之所以需要sleep一下是因?yàn)镽edis的請(qǐng)求響應(yīng)機(jī)制是Pipelining方式的。

既然說(shuō)到這里了,就再?lài)Z十塊錢(qián)兒的,通常,我們可以使用telnet命令和服務(wù)交互,但是telnet有一點(diǎn)非常不爽的是命令行不支持上下鍵歷史,還好可以借助rlwrap來(lái)達(dá)成這個(gè)目的,視操作系統(tǒng),可以很容易的用APT或YUM來(lái)安裝,運(yùn)行也很簡(jiǎn)單:

shell> rlwrap telnet localhost 6379

說(shuō)明:通過(guò)使用rlwrap,不僅支持上下鍵歷史,而且連Ctrl+r搜索也一并支持了,強(qiáng)!

在Redis Cluster釋出前,希望這個(gè)腳本能幫到你,其實(shí)其他的服務(wù)也可以使用類(lèi)似的方案,比如MySQL,不過(guò)復(fù)雜性會(huì)加大很多,好在已經(jīng)有類(lèi)似MHA之類(lèi)的方案了。

【編輯推薦】

  1. 緩存大量小文件?Redis是首選!
  2. Redis能干啥?細(xì)看11種Web應(yīng)用場(chǎng)景
  3. 主流NoSQL數(shù)據(jù)庫(kù)之Redis全面評(píng)測(cè)

 

責(zé)任編輯:Yeva 來(lái)源: huoding.com
相關(guān)推薦

2024-02-27 09:48:25

Redis集群數(shù)據(jù)庫(kù)

2012-09-04 13:43:31

SQL Server

2013-08-28 10:30:39

vSphere

2018-05-25 09:31:00

數(shù)據(jù)存儲(chǔ)高可用

2009-07-09 10:25:16

2010-12-31 14:36:15

ExchangeSer

2012-07-04 11:21:07

OpenStack

2011-08-25 15:42:49

2024-12-11 08:35:55

2024-08-13 15:42:19

2010-07-28 10:22:44

DB2 9.5

2009-02-26 16:59:36

VMware虛擬化虛擬機(jī)

2018-06-21 08:23:35

云存儲(chǔ)高可用應(yīng)用

2013-12-04 09:52:50

hadoop

2012-02-22 10:13:43

虛擬化桌面虛擬化VMware View

2010-06-03 15:23:48

2009-09-03 13:44:27

RHEL服務(wù)器RHEL成功應(yīng)用

2010-09-14 08:55:55

SQL Server

2009-07-07 23:14:00

高可用性SQL Server

2010-07-06 17:42:46

SQL Server
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

a级黄色片免费| 国产精品视频久久| 亚洲欧美综合视频| 色资源二区在线视频| 久久亚洲精精品中文字幕早川悠里 | 国产精品色悠悠| 精国产品一区二区三区a片| 亚洲欧洲免费| 91精品国产91久久久久久一区二区 | 日韩理论视频| 亚洲视频免费在线| 蜜桃麻豆www久久国产精品| 国产伦理吴梦梦伦理| 中文国产一区| 久久精品国产视频| 爱爱的免费视频| 一区二区三区四区精品视频| 欧洲视频一区二区| 国产美女在线一区| 老司机福利在线视频| www国产精品av| 97人人模人人爽视频一区二区 | 亚洲专区在线| 欧美极品欧美精品欧美视频 | 天天干天天爽天天操| 久久激情五月激情| 日本免费久久高清视频| 久久久久久久久久久久久久免费看 | 最近中文字幕2019免费| 久久久久久久穴| 国产 日韩 欧美| 欧美在线视频全部完| 日韩av中文字幕第一页| 91精选在线| 中文字幕在线不卡一区| 日韩av不卡在线播放| 无码h黄肉3d动漫在线观看| 国产一区二区三区不卡在线观看| 国产精品激情av在线播放| 国产乡下妇女做爰视频| 欧美成熟视频| 久久亚洲欧美日韩精品专区| 日本不卡一区视频| 精品国产午夜| 国产午夜精品视频免费不卡69堂| 国产国语老龄妇女a片| 国产亚洲观看| 日韩一级黄色大片| 精品国产午夜福利在线观看| 伊人国产精品| 91精品免费观看| 中文字幕一区久久| 国产精品日本一区二区三区在线| 欧美另类videos死尸| 九九热免费在线观看| 日本黄色成人| 91精品婷婷国产综合久久性色 | 99这里只有精品| 国产激情美女久久久久久吹潮| 国产特级黄色片| 国产美女在线精品| 91久久精品www人人做人人爽| 国产精品一级二级| 国产一级精品在线| 国产传媒一区| 亚洲色图另类小说| 国产亚洲人成网站| 亚洲日本精品国产第一区| 网友自拍视频在线| 亚洲欧美视频一区| www.18av.com| 波多野结衣视频一区二区| 欧美日韩国产精品一区| 麻豆av免费在线| 中文日产幕无线码一区二区| 在线免费观看日韩欧美| 老司机久久精品| 波多野结衣欧美| 亚洲欧美成人网| 少妇视频在线播放| 综合激情在线| 欧美性受xxxx黑人猛交| 波多野结衣绝顶大高潮| 国产在线乱码一区二区三区| 国产精品v欧美精品∨日韩| 日本一级在线观看| 国产精品久久久久影视| 99久久久精品视频| 国产精欧美一区二区三区蓝颜男同| 91福利小视频| 亚洲少妇一区二区| 久久99久久人婷婷精品综合 | 青春草免费视频| 999在线观看精品免费不卡网站| 日产精品99久久久久久| 国产精品无码在线播放| 91麻豆国产在线观看| 在线一区日本视频| 日本不卡1234视频| 欧美另类久久久品| aaaaa一级片| 911久久香蕉国产线看观看| 91国语精品自产拍在线观看性色 | 欧洲亚洲一区| 五月婷婷视频在线观看| 日韩欧亚中文在线| 麻豆免费在线观看视频| 国产一区二区三区电影在线观看| 久久成年人免费电影| 久久亚洲精品石原莉奈| 国产成人免费视| 视频一区二区在线| av免费不卡国产观看| 在线不卡中文字幕| 香蕉视频久久久| 亚洲精品1区2区| 亚洲综合自拍一区| 婷婷免费在线视频| 在线观看日韩电影| a级在线观看视频| 欧美亚韩一区| 成人免费自拍视频| 国产高清在线看| 精品福利免费观看| 久草福利在线观看| 99久久精品网站| 国产精品va在线播放我和闺蜜| 免费av网站观看| 综合av第一页| 色婷婷综合网站| 精品国产91| 日本精品一区二区三区在线播放视频 | 亚洲爆乳无码精品aaa片蜜桃| 草民电影神马电影一区二区| 亚洲精品小视频| 日韩熟女精品一区二区三区| 国产精品69毛片高清亚洲| 一区二区精品在线观看| 韩日精品一区| 伊人av综合网| 国产免费一区二区三区四区五区| a级高清视频欧美日韩| 精品久久久久久无码中文野结衣| 国内精品视频| 麻豆一区二区在线观看| 91精品视频免费在线观看| 欧美激情一区二区三区蜜桃视频 | 99re这里只有精品首页| 三上悠亚久久精品| 加勒比色综合久久久久久久久 | 少妇熟女一区二区| 国产aⅴ精品一区二区四区| 久久亚洲综合国产精品99麻豆精品福利 | 日本少妇高潮喷水xxxxxxx| 久久久久看片| 午夜精品一区二区三区四区| 福利一区视频| 久久中文字幕在线视频| 最近中文字幕在线免费观看| 国产欧美日韩在线| 色免费在线视频| 68国产成人综合久久精品| 91沈先生在线观看| 午夜dj在线观看高清视频完整版| 亚洲第一级黄色片| 亚洲va在线观看| 国产女同互慰高潮91漫画| 天天视频天天爽| 亚洲成人tv| 国产精品一区二区免费| free性护士videos欧美| 精品视频在线播放免| 亚洲第一区av| 亚洲人成网站精品片在线观看| 国产精品偷伦视频免费观看了| 亚洲黄色三级| 水蜜桃亚洲一二三四在线| 国产精品1区| 久久久天堂国产精品女人| 你懂的在线观看视频网站| 欧美日韩成人综合天天影院| 欧美极品aaaaabbbbb| 97se亚洲国产综合自在线观| 日本www.色| 欧美一区二区三区久久精品茉莉花| yellow视频在线观看一区二区| 色偷偷色偷偷色偷偷在线视频| 在线日韩av观看| 精品国产18久久久久久| 欧美性videos高清精品| 国产精品suv一区二区88| 懂色av噜噜一区二区三区av| 116极品美女午夜一级| 视频在线不卡免费观看| 国产精品theporn88| 懂色aⅴ精品一区二区三区| 久久99精品久久久久久青青91| 偷拍自拍在线视频| 欧美丝袜丝nylons| 日本五十路女优| 国产精品国产三级国产三级人妇 | 日本韩国在线观看| 欧美伊人精品成人久久综合97| 久久精品第一页| 中文在线资源观看网站视频免费不卡 | 91网站视频在线观看| 久久6免费视频| 新狼窝色av性久久久久久| 天天爱天天做天天操| 啪啪激情综合网| 亚洲一区二区三区香蕉| 免费成人直播| 久久久亚洲福利精品午夜| 日本精品一区二区三区在线播放| 日韩av影视综合网| 在线观看免费观看在线| 欧美日韩午夜视频在线观看| 国产va在线播放| 国产精品婷婷午夜在线观看| 国产麻豆xxxvideo实拍| 国产a精品视频| 亚洲午夜激情影院| 日韩高清国产一区在线| 久久这里只有精品23| 中文字幕一区二区三三| 综合久久国产| 成人三级视频| 欧美日韩综合网| 日本成人7777| 国产精品一区二区av| caoporn成人免费视频在线| 91在线观看免费高清| 国产91欧美| 国产精品国产亚洲伊人久久| 一区二区三区电影大全| 97视频免费在线看| 成人免费高清观看| 欧美激情区在线播放| 成人直播在线| 久热在线中文字幕色999舞| 日本不卡三区| 最近中文字幕日韩精品| 永久免费av在线| 深夜福利日韩在线看| 99reav在线| 日日骚av一区| 免费的黄网站在线观看| 日韩午夜在线视频| 免费黄色电影在线观看| 久久综合88中文色鬼| 羞羞的网站在线观看| 欧美猛交ⅹxxx乱大交视频| 青草av在线| 国产69精品99久久久久久宅男| av在线不卡免费| 97热在线精品视频在线观看| 黄毛片在线观看| 日产日韩在线亚洲欧美| 主播大秀视频在线观看一区二区| 国产精品福利久久久| 国产a亚洲精品| 91视频免费网站| 亚洲亚洲一区二区三区| 国产精品初高中精品久久| 国产福利一区二区精品秒拍| 精品一区二区国产| 欧美色爱综合| 成年人三级视频| 激情五月***国产精品| 亚洲欧洲日产国码无码久久99| 日韩福利视频网| 色网站在线视频| 成人网页在线观看| 国产成人av一区二区三区不卡| 国产精品女主播av| 欧美成人一二三区| 欧美午夜精品伦理| 中文字幕+乱码+中文字幕明步| 欧美一级搡bbbb搡bbbb| 欧美一区二区三区黄片| 亚洲一区二区国产| 国产二区三区在线| 久久琪琪电影院| 国产资源一区| 国产精品二区三区| 深夜福利久久| 欧美一级黄色录像片| 国产欧美69| 在线看免费毛片| 99在线精品一区二区三区| 我要看一级黄色录像| 香蕉久久一区二区不卡无毒影院| 探花国产精品一区二区| 日韩欧美一区在线观看| 欧美午夜黄色| 九九热r在线视频精品| 成人免费无遮挡| 999热视频在线观看| 免费观看不卡av| 成年在线观看视频| 肉色丝袜一区二区| 免费日本黄色网址| 日韩一区有码在线| 狠狠人妻久久久久久综合| 欧美一级片在线观看| 国产精品一区二区婷婷| 欧美激情中文网| 96sao精品免费视频观看| 欧美婷婷久久| 在线国产欧美| 91热视频在线观看| 国产日韩精品一区二区三区| 日韩av在线电影| 欧美一区午夜视频在线观看| 成人免费一区二区三区视频网站| 欧美黑人xxxx| 国产高清视频一区二区| 天堂资源在线亚洲资源| 亚洲一区国产一区| 午夜视频在线免费看| 亚洲特级片在线| 姑娘第5集在线观看免费好剧| 日韩电影中文字幕在线| 美女精品导航| 99爱精品视频| 亚洲91久久| 蜜桃福利午夜精品一区| 国产精品久久久久久妇女6080| 一区二区三区福利视频| 精品人在线二区三区| av大大超碰在线| 亚洲一区二区三区视频播放| 日韩精品永久网址| 亚洲人成色77777| 国产日韩欧美a| 波多野结衣一区二区三区四区| 国产视频亚洲精品| 三级中文字幕在线观看| 精品综合在线| 国产农村妇女精品一区二区| 少妇激情一区二区三区视频| 亚洲午夜久久久久| 欧美 日韩 国产 在线| 久久久久中文字幕| 超碰地址久久| 国产91美女视频| 久久品道一品道久久精品| av网站中文字幕| 一区二区三区精品99久久| 色综合一本到久久亚洲91| 色一情一乱一伦一区二区三区丨| 日本中文一区二区三区| 国产精品久久久视频| 欧美吞精做爰啪啪高潮| 日韩精品成人av| 亚洲aⅴ男人的天堂在线观看| 一区二区三区毛片免费| 亚洲精品久久久久久| 亚洲v精品v日韩v欧美v专区| 手机看片福利在线| 情事1991在线| 日韩精品免费一区二区在线观看| 日韩欧美国产片| 亚洲精品免费一二三区| 后进极品白嫩翘臀在线视频| 97在线视频一区| 国产精品一区二区三区av麻| 免费黄色一级网站| 《视频一区视频二区| 性一交一乱一伧老太| 7m精品福利视频导航| 国产精品一区二区av日韩在线| 在线免费看v片| 午夜精品爽啪视频| 成年人在线看| yy111111少妇影院日韩夜片| 亚洲理论在线| 一级黄色片网址| 欧美一级理论性理论a| 国产精品25p| 亚洲欧洲日夜超级视频| 成人黄色国产精品网站大全在线免费观看| 国偷自拍第113页| 久久精品99无色码中文字幕 | 91国内外精品自在线播放| 久久免费视频2| 91在线观看高清| 国产精品欧美久久久久天天影视| 久久久亚洲欧洲日产国码aⅴ| 国产一区二区三区四区| 国产精品一区二区在线免费观看| 色综合久久久久久久久| fc2ppv国产精品久久| 久久伊人一区| 国产福利不卡视频| 欧美超碰在线观看| 色综合久久久888| 成人在线免费小视频| 亚洲一区二区三区黄色| 欧美日韩成人综合天天影院 |