<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 100  文章 - 50  trackbacks - 0
    <2015年10月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    收藏夾

    我收藏的一些文章!

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    集群技術是構建高性能網站架構的重要手段,試想在網站承受高并發訪問壓力的同時,還需要從海量數據中查詢出滿足條件的數據,并快速響應,我們必然想到的是將數據進行切片,把數據根據某種規則放入多個不同的服務器節點,來降低單節點服務器的壓力。

    上一篇我們講到了 Redis 的主從復制技術,當實現了多節點的 master-slave 后,我們也可以把它叫做集群,但我們今天要講的集群主要是利用切片技術來組建的集群。

    集群要實現的目的是要將不同的 key 分散放置到不同的 redis 節點,這里我們需要一個規則或者算法,通常的做法是獲取 key 的哈希值,然后根據節點數來求模,但這種做法有其明顯的弊端,當我們需要增加或減少一個節點時,會造成大量的 key 無法命中,這種比例是相當高的,所以就有人提出了一致性哈希的概念。

    一致性哈希有四個重要特征:

    均衡性:也有人把它定義為平衡性,是指哈希的結果能夠盡可能分布到所有的節點中去,這樣可以有效的利用每個節點上的資源。

    單調性:對于單調性有很多翻譯讓我非常的不解,而我想要的是當節點數量變化時哈希的結果應盡可能的保護已分配的內容不會被重新分派到新的節點。

    分散性和負載:這兩個其實是差不多的意思,就是要求一致性哈希算法對 key 哈希應盡可能的避免重復。

    但一致性哈希不是我們今天要介紹的重點,因為 Redis 引入另一種哈希槽(hash slot)的概念。

    Redis 集群中內置了 16384 個哈希槽,當需要在 Redis 集群中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然后把結果對 16384 求余數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點。

    使用哈希槽的好處就在于可以方便的添加或移除節點。

    當需要增加節點時,只需要把其他節點的某些哈希槽挪到新節點就可以了;

    當需要移除節點時,只需要把移除節點上的哈希槽挪到其他節點就行了;

    內部機制,與我何干,對于我們來說,在新增或移除節點的時候不要讓我們先停掉所有的 redis 服務我就謝天謝地了,這點它做到了。

    下面我們就開始動手搭建一個 redis 集群來體驗一下。

    因為我們要啟動多個 redis 實例,雖然我們可以直接通過命令行來啟動,但始終是不怎么方便的,所以我們先來新建三個實例目錄,分別是9001,9002,9003,目錄名就是 redis 實例的端口號。

    我這里已經建好了目錄,然后我們把以前編譯過和修改過的 redis-server、redis.conf這兩個文件分別拷貝到這三個目錄里面,拷貝完之后就像這樣子了:

    我們打開 redis.conf 文件,為了簡單起見,我們只保留下面幾個配置項:

    daemonize yes
    port 9001
    cluster-enabled yes
    cluster-config-file nodes.conf
    cluster-node-timeout 5000
    appendonly yes

    注意:port 要修改成對應目錄的名字,也就是每個實例要有不同的端口。

    下面我們分別啟動這三個實例:

    zhaoguihuadediannao:~ zhaogh$ cd applications/dev/redis-cluster

    zhaoguihuadediannao:redis-cluster zhaogh$ cd 9001

    zhaoguihuadediannao:9001 zhaogh$ ./redis-server ./redis.conf

    zhaoguihuadediannao:9003 zhaogh$ cd ../9002

    zhaoguihuadediannao:9002 zhaogh$ ./redis-server ./redis.conf

    zhaoguihuadediannao:9002 zhaogh$ cd ../9003

    zhaoguihuadediannao:9003 zhaogh$ ./redis-server ./redis.conf

    zhaoguihuadediannao:9003 zhaogh$ 

    接下來我們來創建集群,讓三個實例互相通訊:

    zhaoguihuadediannao:src zhaogh$ ./redis-trib.rb create --replicas 0 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003

    >>> Creating cluster

    Connecting to node 127.0.0.1:9001: OK

    Connecting to node 127.0.0.1:9002: OK

    Connecting to node 127.0.0.1:9003: OK

    >>> Performing hash slots allocation on 3 nodes...

    Using 3 masters:

    127.0.0.1:9001

    127.0.0.1:9002

    127.0.0.1:9003

    M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

       slots:0-5460 (5461 slots) master

    M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

       slots:5461-10922 (5462 slots) master

    M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

       slots:10923-16383 (5461 slots) master

    Can I set the above configuration? (type 'yes' to accept): yes

    >>> Nodes configuration updated

    >>> Assign a different config epoch to each node

    >>> Sending CLUSTER MEET messages to join the cluster

    Waiting for the cluster to join..

    >>> Performing Cluster Check (using node 127.0.0.1:9001)

    M: 92c9912cb1ccf657c886ecd839dd32c66efd8762 127.0.0.1:9001

       slots:0-5460 (5461 slots) master

    M: b6d46fcb8b0e6ee373b09a4f2cbcec744d1a259b 127.0.0.1:9002

       slots:5461-10922 (5462 slots) master

    M: 44ab30c7c589ffb15b9b04dd827c72cfaeedacb2 127.0.0.1:9003

       slots:10923-16383 (5461 slots) master

    [OK] All nodes agree about slots configuration.

    >>> Check for open slots...

    >>> Check slots coverage...

    [OK] All 16384 slots covered.

    zhaoguihuadediannao:src zhaogh$ 

    需要注意的是執行 redis-trib.rb 命令需要 ruby 的支持,如果你沒有安裝可以先到 https://rubygems.org/gems/redis 下載,然后離線安裝。

    sudo gem install redis-3.0.7.gem --local

    下面我們用 redis 自帶的客戶端測試一下:

    zhaoguihuadediannao:src zhaogh$ ./redis-cli -c -p 9001

    127.0.0.1:9001> get testkey001

    -> Redirected to slot [12786] located at 127.0.0.1:9003

    (nil)

    127.0.0.1:9003> set testkey002 testvalue002

    -> Redirected to slot [401] located at 127.0.0.1:9001

    OK

    127.0.0.1:9001> get testkey002

    "testvalue002"

    127.0.0.1:9001> set testkey003 testvalue003

    OK

    127.0.0.1:9001> 

    可以看到,雖然我們第一次連接的是9001端口,當我們去獲取 testkey001 的時候,redis cluster 自動幫我們重定向到 9003 。

    當我們在 9003 設置 testkey002 時,redis cluster 又重定向到 9001 。

    posted on 2015-10-14 10:26 fly 閱讀(220) 評論(0)  編輯  收藏 所屬分類: J2EE-負載均衡
    主站蜘蛛池模板: 亚洲精品中文字幕乱码影院| 亚洲免费综合色在线视频| 亚洲午夜无码久久久久| 国产青草视频在线观看免费影院| 国产免费观看视频| 亚洲精品无码专区2| 中文字幕亚洲不卡在线亚瑟| 婷婷亚洲久悠悠色悠在线播放| 亚洲第一第二第三第四第五第六| 你懂得的在线观看免费视频| 成人毛片18女人毛片免费| 亚洲国产精品成人久久| 亚洲国产综合AV在线观看| 日本一道本不卡免费 | 国产精品亚洲а∨天堂2021| 国产无遮挡无码视频免费软件| 岛国av无码免费无禁网站| 亚洲av日韩av激情亚洲| 国产午夜亚洲精品不卡| 波多野结衣免费在线观看| 亚洲国产精品一区二区成人片国内| 一区二区三区精品高清视频免费在线播放 | 十八禁无码免费网站| 久久精品国产亚洲AV不卡| 国产成人亚洲综合在线| 69式互添免费视频| 亚洲Av无码精品色午夜| 一级做性色a爰片久久毛片免费| 成年女人毛片免费播放人| 亚洲精品偷拍无码不卡av| 免费无码又爽又刺激网站| 亚洲成A人片在线观看无码3D | 无码天堂va亚洲va在线va| 欧美在线看片A免费观看| 噜噜噜亚洲色成人网站∨| 日本免费久久久久久久网站| 国产亚洲3p无码一区二区| 一级毛片aaaaaa视频免费看| 国产一级淫片免费播放| 国产精品无码亚洲一区二区三区| 97无码免费人妻超级碰碰碰碰|