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