Redis Cluster筆記

 
 Redis Cluster 3.0搭建與使用

 介紹:
   特性:使用數據分片(sharding)而非一致性哈希(consistency hashing)來實現:
        一個 Redis 集羣包含 16384 個哈希槽(hash slot),數據庫中的每一個鍵都屬於這16384個哈希槽的其中一個,
        使用公式 CRC16(key) % 16384 來計算鍵 key 屬於哪一個槽,其中 CRC16(key)語句用於計算鍵 key 的 CRC16 校驗和 

        舉例:一個集羣中三主節點,如何分配哈希槽
           節點A負責處理0號 至 5500號哈希槽
           節點B負責處理5501 至 11000號哈希槽
           節點C負責處理11001  至 16384 號哈希槽
           
        注意:其中的A B C 均可以有N個從,因此當A掛掉後 A的slave自動轉換爲master ,A的全部slave所有掛掉 集羣中止服務
        
   優勢: 
    1. 一個能夠在多個節點之間進行數據共享的方案;
    
    2. 經過分區(partition)來提供必定程度的可用性(availability)即便集羣中有一部分節點失效或者沒法進行通信, 集羣也能夠繼續處理命令請求。
    
    
   缺點:
    1. 不支持那些須要同時處理多個鍵的 Redis 命令, 由於執行這些命令須要在多個 Redis 節點之間移動數據, 
    而且在高負載的狀況下, 這些命令將下降 Redis 集羣的性能, 並致使不可預測的行爲;
 
  
   
    Redis Cluster 環境搭建

    一. 下載redis
        wget http://download.redis.io/releases/redis-3.0.0.tar.gz
   
    二. 解壓,安裝
        tar zxvf redis-3.0.0.tar.gz                       
        cd redis-3.0.0
        make && make install
  
     三. 配置文件處理
         mkdir /usr/local/redis/7000 /usr/local/redis/7001 /usr/local/redis/7002 /usr/local/redis/7003 /usr/local/redis/7004 /usr/local/redis/7005
         cp /redis_install_dir/redis.conf  /usr/local/redis/7000/redis.conf
         cp /redis_install_dir/redis.conf  /usr/local/redis/7001/redis.conf
         cp /redis_install_dir/redis.conf  /usr/local/redis/7002/redis.conf
         cp /redis_install_dir/redis.conf  /usr/local/redis/7003/redis.conf
         cp /redis_install_dir/redis.conf  /usr/local/redis/7004/redis.conf
         cp /redis_install_dir/redis.conf  /usr/local/redis/7005/redis.conf 
         vi /usr/local/redis/7000/redis.conf
            port 7000 
            daemonize yes 
            cluster-enabled yes   ---用於開實例的集羣模式
            cluster-config-file nodes.conf 
            cluster-node-timeout 5000 
            appendonly yes
         
         vi /usr/local/redis/7001/redis.conf
         .......
     
     四。啓動redis
        [root@localhost redis]#  /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
        [root@localhost redis]#  /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
        [root@localhost redis]#  /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
        [root@localhost redis]#  /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
        [root@localhost redis]#  /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
        [root@localhost redis]#  /usr/local/redis/src/redis-server /usr/local/redis/redis.conf &
      
        [root@localhost redis]# ps -ef|grep redis
        root      4341     1  0 13:01 ?        00:00:00 /usr/local/redis/src/redis-server 10.100.100.82:7001 [cluster]
        root      4344  4103  0 13:02 pts/5    00:00:00 /usr/local/redis/src/redis-server 10.100.100.82:7002 [cluster]
        root      4347  4103  0 13:02 pts/5    00:00:00 /usr/local/redis/src/redis-server 10.100.100.82:7003 [cluster]
        root      4350  4103  0 13:02 pts/5    00:00:00 /usr/local/redis/src/redis-server 10.100.100.82:7004 [cluster]
        root      4353  4103  0 13:02 pts/5    00:00:00 /usr/local/redis/src/redis-server 10.100.100.82:7005 [cluster]
        root      4356  4103  0 13:02 pts/5    00:00:00 /usr/local/redis/src/redis-server 10.100.100.82:7000 [cluster]
           
           
     五.執行命令建立集羣,首先安裝依賴,不然建立集羣失敗。
       [root@localhost redis]# yum install ruby rubygems -y
    
       安裝gem-redis
        wget https://rubygems.global.ssl.fastly.net/gems/redis-3.2.2.gem --no-check-certificate
        gem install redis-3.2.2.gem  
       [root@localhost redis]# cp redis/src/redis-trib.rb /usr/local/bin/redis-trib 
   
      六.建立集羣
        [root@localhost redis]# /usr/local/redis/src/redis-trib.rb create --replicas 1 10.100.100.82:7000 10.100.100.82:7001 10.100.100.82:7002 10.100.100.82:7003 10.100.100.82:7004 10.100.100.82:7005 
              命令的意義以下: 
              set-timeout     host:port milliseconds
              add-node        new_host:new_port existing_host:existing_port
                              --master-id <arg>
                              --slave
              fix             host:port
              help            (show this help)
              del-node        host:port node_id
              import          host:port
                              --from <arg>
              check           host:port
              call            host:port command arg arg .. arg
              create          host1:port1 ... hostN:portN
                              --replicas <arg>
              reshard         host:port
                              --yes
                              --to <arg>
                              --from <arg>
                              --slots <arg>
                              
                 
             選項 --replicas 1 表示咱們但願爲集羣中的每一個主節點建立一個從節點。
                    以後跟着的其餘參數則是實例的地址列表, 咱們但願程序使用這些地址所指示的實例來建立新集羣。
              簡單來講, 以上命令的意思就是讓 redis-trib 程序建立一個包含三個主節點和三個從節點的集羣。
              
      
               輸入 yes 並按下回車確認以後, 集羣就會將配置應用到各個節點, 並鏈接起(join)各個節點 —— 也便是, 讓各個節點開始互相通信:
       
       
      七。測試
      [root@localhost redis-3.2.4]# /usr/local/redis-3.2.4/src/redis-cli -c -h 10.100.100.82 -p 7006
            10.100.100.82:7006> set names shunxiao
            -> Redirected to slot [6659] located at 10.100.100.82:7002
            OK
            10.100.100.82:7002> get names
            "shunxiao"
            10.100.100.82:7002> exit
      [root@localhost redis-3.2.4]# /usr/local/redis-3.2.4/src/redis-cli -c -h 10.100.100.82 -p 7001
            10.100.100.82:7001> get names
            -> Redirected to slot [6659] located at 10.100.100.82:7002
            "shunxiao"
            10.100.100.82:7002> exit
    
      八。狀態
       [root@redis-server ~]# ps -ef | grep 7000
        root      4168     1  0 11:49 ?        00:00:03 redis-server *:7000 [cluster]
        root      4385  4361  0 12:39 pts/3    00:00:00 grep 7000
        [root@redis-server ~]# kill 4168

       [root@redis-server ~]# redis-cli -c -p 7001 cluster nodes
            2d03b862083ee1b1785dba5db2987739cf3a80eb 127.0.0.1:7001 myself,master - 0 0 2 connected 5461-10922
            0456869a2c2359c3e06e065a09de86df2e3135ac 127.0.0.1:7002 master - 0 1428295271619 3 connected 10923-16383
            37b251500385929d5c54a005809377681b95ca90 127.0.0.1:7003 master - 0 1428295270603 7 connected 0-5460
            e2e2e692c40fc34f700762d1fe3a8df94816a062 127.0.0.1:7004 slave 2d03b862083ee1b1785dba5db2987739cf3a80eb 0 1428295272642 5 connected
            2774f156af482b4f76a5c0bda8ec561a8a1719c2 127.0.0.1:7000 master,fail - 1428295159553 1428295157205 1 disconnected       注意這裏 已經中止服務
            9923235f8f2b2587407350b1d8b887a7a59de8db 127.0.0.1:7005 slave 0456869a2c2359c3e06e065a09de86df2e3135ac 0 1428295269587 6 connected
       
       
   
   
   好了服務端已經妥妥的如今開始客戶端  今天採用: ngx-lua鏈接Redis Cluster  準備材料:   下載   https://github.com/cuiweixie/lua-resty-redis-cluster編譯so擴展文件:1. 進入到luajit建立test目錄   [root@www luajit]#cd /usr/local/openresty/luajit   [root@www luajit]#mkdir test   2. 將redis_slot.c文件移動到test目錄    [root@www luajit]#mv /root/lua-resty-redis-cluster/redis_slot.c ./test3. ldd命令用於打印程序或者庫文件所依賴的共享庫列表。    [root@www luajit]#  ldd  lib/libluajit-5.1.so        linux-vdso.so.1 =>  (0x00007ffff0b29000)        libm.so.6 => /lib64/libm.so.6 (0x00007f9ca1d34000)        libdl.so.2 => /lib64/libdl.so.2 (0x00007f9ca1b30000)        libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f9ca1919000)        libc.so.6 => /lib64/libc.so.6 (0x00007f9ca1585000)        /lib64/ld-linux-x86-64.so.2 (0x00007f9ca2235000)   4.編譯  [root@www luajit]# gcc -fPIC -c ./test/redis_slot.c -o ./test/redis_slot.o -L ../ -lluajit-5.1 -I ./include/luajit-2.1/        參數說明:            -c  只是編譯不連接,生成目標文件」.o"             -S  只是編譯不彙編,生成彙編代碼               -E  只進行預編譯,不作其餘處理                 -g  在可執行程序中包含標準調試信息              -o file 把輸出文件輸出到file裏               -v  打印出編譯器內部編譯各過程的命令行信息和編譯器的版本             -I dir  在頭文件的搜索路徑列表中添加dir目錄   (即: -I ./include/luajit-2.1/ 表示頭文件的搜索路徑 )            -L dir  在庫文件的搜索路徑列表中添加dir目錄  (即:  -L ../  表示要鏈接的庫在上級目錄中)            -static   連接靜態庫                  -l   鏈接名爲library的庫文件  (即: 編譯器查找 名字爲 libluajit-5.1.so  的 動態鏈接庫)            -fPIC  表示編譯爲位置獨立的代碼,不用此選項的話編譯後的代碼是位置相關的,因此動態載入時是經過代碼拷貝的方式來知足不一樣進程的須要,而不能達到真正代碼段共享的目的。            -shared  該選項指定生成動態鏈接庫(讓鏈接器生成T類型的導出符號表,有時候也生成弱鏈接W類型的導出符號),不用該標誌外部程序沒法鏈接。至關於一個可執行文件     5.加入到共享庫列表  [root@www luajit]# gcc -shared redis_slot.o -o libluaredis.so    注意:常見問題    第一點:引入so文件的名字 改爲 上面第五步生成的so文件的名字    local clib = load_shared_lib("libluaredis.so")      第二點: 加載so文件的位置   lua_package_cpath "/usr/local/openresty/lualib/?.so;/usr/local/openresty/luajit/test/?.so"; 
   
   
相關文章
相關標籤/搜索