搭建Redis原生集群

912 阅读5分钟

一、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.gz
tar xvzf redis-3.0.1.tar.gz
cd redis-3.0.1/
make -j
#apt-get install tcl
make test
###将redis安装到/usr/local/redis上
#cd src && make PREFIX=/usr/local/redis install

2. 在/usr/local/目录下新建文件夹redis-cluster,并在redis-cluster目录下创建7001~7006文件夹.

cd /usr/local
mkdir redis-cluster
cd redis-cluster
mkdir 7001 7002 7003 7004 7005 7006
cp /usr/local/redis/ /usr/local/redis-cluster/7001 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7001/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7002 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7002/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7003 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7003/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7004 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7004/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7005 -r
cp /usr/local/redis-3.0.1/redis.conf  /usr/local/redis-cluster/7005/bin
cp /usr/local/redis/ /usr/local/redis-cluster/7006 -r
cp /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 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

4.然后在安装的根目录下写启动脚本和关闭服务脚本,以及链接cluster-node的ruby脚本。

4.1 安装ruby脚本支持

    因为官方原生的cluster是使用ruby脚本语言编写的,该执行文件在下载文件的src目录下的redis-trib.rb,通过扩展名即可知道他是ruby文件。

sudo apt-get install ruby
sudo apt-get install ruby gem

4.2 编写启动脚本

cd /usr/local/redis-cluster
sudo vim redis-cluster-start.sh

##redis-cluster-start.sh中按i进入插入模式
cd /usr/local/redis-cluster/7001/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7002/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7003/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7004/bin
./redis-server redis.conf
cd /usr/local/redis-cluster/7005/bin
./redis-server redis.conf
cd /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-cluster
sudo vim redis-cluster-stop.sh

##redis-cluster-start.sh中按i进入插入模式
cd /usr/local/redis-cluster/7001/bin
./redis-cli -p 7001 shutdown
cd /usr/local/redis-cluster/7002/bin
./redis-cli -p 7002 shutdown
cd /usr/local/redis-cluster/7003/bin
./redis-cli -p 7003 shutdown
cd /usr/local/redis-cluster/7004/bin
./redis-cli -p 7004 shutdown
cd /usr/local/redis-cluster/7005/bin
./redis-cli -p 7005 shutdown
cd /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:7006
M: 1984c27297c6ef50bbfcbd35c11b93cc40ba17e4 127.0.0.1:7001
   slots:0-5460 (5461 slots) master
M: 481e256be4c724f5a2c64a761e52b4be61ca45b4 127.0.0.1:7002
   slots:5461-10922 (5462 slots) master
M: b5b652fa02d9999861e66c843b01fd2700c02adf 127.0.0.1:7003
   slots:10923-16383 (5461 slots) master
S: 821ec823dc0c2d4f65319e84fe74157fb1014155 127.0.0.1:7004
   replicates 1984c27297c6ef50bbfcbd35c11b93cc40ba17e4
S: b3b8541b9520d707180d56a2fb3cf3ee6895ed10 127.0.0.1:7005
   replicates 481e256be4c724f5a2c64a761e52b4be61ca45b4
S: d2b437ca8b9007dcdb63ac16210f6540860361e3 127.0.0.1:7006
   replicates b5b652fa02d9999861e66c843b01fd2700c02adf
Can 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 value1
OK
127.0.0.1:7006>get key1
->Redirected to slot [2922] located at 127.0.0.1:7001
"value1"


二、Redis原生集群Redis-Cluster原理

Redis-Cluster架构图


架构简析:

  1. redis中的节点采用PING-PONG机制,是的彼此互联,内部使用二进制协议优化传输速度和带框。
  2. 节点的fail是通过急群众超过半数的节点检测失效时才失效,通过投票机制。
  3. 客户端与redis节点直连,不需要中间代理层,客户端只需要连接任何一个可用节点即可
  4. 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会根据节点数量大致均等的将哈希槽应映射到不同的节点上。

更多内容参考官网