一、Linux下集群搭建
系统环境:deepin/Ubuntu
redis版本:redis-3.0.1
节点:使用master-slave,搭建分布式,主节点和从节点各自至少需要3个节点,总共6个节点。
注:本文主要标注的是一台机器下搭建的伪分布式,通过端口进行模拟的redis集群。
1. 去官方网站下载redis-3.0.1.tar.gz或者通过一下的命令进行操作
wget http://download.redis.io/releases/redis-3.0.1.tar.gztar xvzf redis-3.0.1.tar.gzcd redis-3.0.1/make -j#apt-get install tclmake test###将redis安装到/usr/local/redis上#cd src && make PREFIX=/usr/local/redis install复制代码
2. 在/usr/local/目录下新建文件夹redis-cluster,并在redis-cluster目录下创建7001~7006文件夹.
cd /usr/localmkdir redis-clustercd redis-clustermkdir 7001 7002 7003 7004 7005 7006cp /usr/local/redis/ /usr/local/redis-cluster/7001 -rcp /usr/local/redis-3.0.1/redis.conf /usr/local/redis-cluster/7001/bincp /usr/local/redis/ /usr/local/redis-cluster/7002 -rcp /usr/local/redis-3.0.1/redis.conf /usr/local/redis-cluster/7002/bincp /usr/local/redis/ /usr/local/redis-cluster/7003 -rcp /usr/local/redis-3.0.1/redis.conf /usr/local/redis-cluster/7003/bincp /usr/local/redis/ /usr/local/redis-cluster/7004 -rcp /usr/local/redis-3.0.1/redis.conf /usr/local/redis-cluster/7004/bincp /usr/local/redis/ /usr/local/redis-cluster/7005 -rcp /usr/local/redis-3.0.1/redis.conf /usr/local/redis-cluster/7005/bincp /usr/local/redis/ /usr/local/redis-cluster/7006 -rcp /usr/local/redis-3.0.1/redis.conf /usr/local/redis-cluster/7006/bin复制代码
3. 将7001~7006目录下的bin/redis.conf配置文件打开,并修改其中的字段,以7001/bin/redis.config为例。下面是一个最少选项的集群的配置文件 : 注意如果使用的是单机测试,最好把cluster-config-file nodes.conf设置为对应的 端口 nodes-xxx.conf,还有就是 pid 设置为当前 目录下 pidfile ./redis.pid。
port 7001cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes复制代码
4.然后在安装的根目录下写启动脚本和关闭服务脚本,以及链接cluster-node的ruby脚本。
4.1 安装ruby脚本支持
因为官方原生的cluster是使用ruby脚本语言编写的,该执行文件在下载文件的src目录下的redis-trib.rb,通过扩展名即可知道他是ruby文件。
sudo apt-get install rubysudo apt-get install ruby gem复制代码
4.2 编写启动脚本
cd /usr/local/redis-clustersudo vim redis-cluster-start.sh##redis-cluster-start.sh中按i进入插入模式cd /usr/local/redis-cluster/7001/bin./redis-server redis.confcd /usr/local/redis-cluster/7002/bin./redis-server redis.confcd /usr/local/redis-cluster/7003/bin./redis-server redis.confcd /usr/local/redis-cluster/7004/bin./redis-server redis.confcd /usr/local/redis-cluster/7005/bin./redis-server redis.confcd /usr/local/redis-cluster/7006/bin./redis-server redis.conf##按esc进入命令模式:wq##给redis-cluster-start.sh赋予执行权限chmod u+x redis-cluster-start.sh复制代码
4.3 编写终止服务脚本
cd /usr/local/redis-clustersudo vim redis-cluster-stop.sh##redis-cluster-start.sh中按i进入插入模式cd /usr/local/redis-cluster/7001/bin./redis-cli -p 7001 shutdowncd /usr/local/redis-cluster/7002/bin./redis-cli -p 7002 shutdowncd /usr/local/redis-cluster/7003/bin./redis-cli -p 7003 shutdowncd /usr/local/redis-cluster/7004/bin./redis-cli -p 7004 shutdowncd /usr/local/redis-cluster/7005/bin./redis-cli -p 7005 shutdowncd /usr/local/redis-cluster/7006/bin./redis-cli -p 7006 shutdown##按esc进入命令模式:wq##给redis-cluster-start.sh赋予执行权限chmod u+x redis-cluster-stop.sh复制代码
5 启动服务并建立cluster-connection
./redis-cluster-start.sh~/redis-3.0.1/src# redis-trib.rb create --replicas 1 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006M: 1984c27297c6ef50bbfcbd35c11b93cc40ba17e4 127.0.0.1:7001 slots:0-5460 (5461 slots) masterM: 481e256be4c724f5a2c64a761e52b4be61ca45b4 127.0.0.1:7002 slots:5461-10922 (5462 slots) masterM: b5b652fa02d9999861e66c843b01fd2700c02adf 127.0.0.1:7003 slots:10923-16383 (5461 slots) masterS: 821ec823dc0c2d4f65319e84fe74157fb1014155 127.0.0.1:7004 replicates 1984c27297c6ef50bbfcbd35c11b93cc40ba17e4S: b3b8541b9520d707180d56a2fb3cf3ee6895ed10 127.0.0.1:7005 replicates 481e256be4c724f5a2c64a761e52b4be61ca45b4S: d2b437ca8b9007dcdb63ac16210f6540860361e3 127.0.0.1:7006 replicates b5b652fa02d9999861e66c843b01fd2700c02adfCan I set the above configuration? (type 'yes' to accept):[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.复制代码
6 检查和使用
原生cluster的好处就是client只需要连接上一个节点就能够使用cluster了,至于原理下篇再讲。
随意连接到某个节点.
cd /usr/local/redis-cluster/7001/bin./redis-cli -p 7006 -c##如果出现一下的内容则为配置完全127.0.0.1:7006>127.0.0.1:7006>set key1 value1OK127.0.0.1:7006>get key1->Redirected to slot [2922] located at 127.0.0.1:7001"value1"复制代码
二、Redis原生集群Redis-Cluster原理
Redis-Cluster架构图
架构简析:
- redis中的节点采用PING-PONG机制,是的彼此互联,内部使用二进制协议优化传输速度和带框。
- 节点的fail是通过急群众超过半数的节点检测失效时才失效,通过投票机制。
- 客户端与redis节点直连,不需要中间代理层,客户端只需要连接任何一个可用节点即可
- Redis-Cluster把所有的节点映射到[0-16383]区间个数为16384的slot(哈希槽)上,由Cluster负责维护node<->slot<->value.
原理简介:
redis集群内置16384个哈希槽,当需要在Redis集群内置中放置一个key-value时,redis先对key使用CRC16算法算出一个结果a,然后对a求16384的余数,这样每个key都会落在[0,16383]的哈希槽中,redis会根据节点数量大致均等的将哈希槽应映射到不同的节点上。
更多内容参考官网