zoukankan      html  css  js  c++  java
  • 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 ./test

    3. 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";
     





  • 相关阅读:
    第二十天笔记
    第十九天笔记
    第十七天笔记
    第十五天笔记
    第十六天笔记
    第十二天笔记
    数字三角形
    最大子段和与最大子矩阵和
    分组背包
    二维背包
  • 原文地址:https://www.cnblogs.com/sixiong/p/6003897.html
Copyright © 2011-2022 走看看