Redis Cluster部署

Redis Cluster 分布式集群,牺牲了数据的强一致性,来保证数据的可用性。也就是所谓的Redis从一个单纯的NoSQL内存数据库变成了分布式NoSQL数据库,CAP(Consistency & Availability & Partition-Tolerancy)模型也从CP变成了AP,三者只能取其二。

redis安装

下载地址可以到官方下载或者下载本站地址

1
2
3
4
5
6
cd /home/work/soft/
wget https://yhv5.com/soft/redis-3.0.3.tar.gz
tar -zxvf redis-3.0.3.tar.gz
cd redis-3.0.3
configure --prefix=/home/work/redis
make && make install

配置修改

修改redis配置文件/home/work/redis/bin/redis.conf 如下内容

1
2
3
4
5
6
7
8
9
10
11
bind XXX.XXX.XXX.XXX #修改为自己的绑定IP地址
cluster-enabled yes #开启Cluster
dir /mnt/redis/rdb #rds数据落地文件路径
dbfilename dump.rdb #将内存数据刷入
pidfile /mnt/redis/pid/redis-XXXX.pid #路径可以自定义,将XXXX替换为对应端口
cluster-config-file nodes-XXXX.conf #这个配置文件不是要我们去配的,而是Redis运行时保存配置的文件,所以我们也不可以修改这个文件,将XXXX替换为我们的端口号。
cluster-node-timeout 15000 #集群超时时间:结点超时多久则认为它宕机了。
cluster-require-full-coverage no #槽是否全覆盖:默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
daemonize yes #守护进程模式
logfile "/mnt/redis/log/redis.log" #日志文件,路径可以自定义
port XXXX #监听端口,将XXXX替换为我们的端口

为保证集群的稳定性,数据冗余为1则至少需要3台Master和3台Slave(即一主对应一从),那么我们将开启6个端口来支持这6个redis服务(端口分别为6380-6385)。因此需要将redis配置拷贝6份,我们将配置也重命名为redis.conf.端口号,如图:
conf

启动服务

可以按照/home/work/redis/bin/redis.server /home/work/redis/bin/conf/redis.conf.xxx 方式来启动6个实例,也可以批量启动

1
for((i=0; i<6; i++));do /home/work/redis/bin/redis.server /home/work/redis/bin/conf/redis.conf.638$i ;done

为了方便我提供了一个快速启动的脚本(见文末附件),即可以用如下方式启动、重启、或者停止服务。

1
for((i=0; i<6; i++));do /home/work/redis/redis_control -p 638$i [start|stop|restart];done

start

如果执行顺利可以查看6个服务进程是否都已经启动。如果有问题可以按照日志进行排查(往往因为pid或log无权限写入,而导致启动失败)。

查看进程是否正常:

cluster

查看进程pid是否生成到对应文件:

pid

集群部署

上面操作完成后,6个实例之间并没有任何关联,现在需要用到redis-trib管理器,但它依赖于ruby,因此需要先安装ruby以及rubygems
安装ruby之前需要先安装开发包支持

1
2
3
4
5
6
7
yum install openssl* openssl-devel zlib-devel gcc gcc-c++ make autoconf readline-devel curl-devel expat-devel gettext-devel
cd /home/work/soft/
wget http://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz
tar zxvf ruby-2.0.0-p247.tar.gz
cd ruby-2.0.0-p247
./configure --enable-shared --enable-pthread --prefix=/home/work/ruby
make && make install

加入环境变量

1
2
echo "PATH=$PATH:/home/work/ruby/bin;export PATH" >> /etc/profile
source /etc/profile

下载rubygems

1
2
3
cd /home/work/soft/
wget https://rubygems.org/downloads/redis-3.2.1.gem
gem install redis-3.2.1.gem --local --no-rdoc --no-ri

创建集群命令

格式如:/home/work/soft/redis-3.0.3/src/redis-trib.rb create –replicas ip1:port1 ip2:port2 ….

1
/home/work/soft/redis-3.0.3/src/redis-trib.rb create --replicas 1 10.48.56.215:6380 10.48.56.215:6381 10.48.56.215:6382 10.48.56.215:6383 10.48.56.215:6384 10.48.56.215:6385

create2)查看集群节点:

1
/home/work/redis/bin/redis-cli -h 10.48.56.215 -p 6380 cluster nodes

status

添加数据

接下来我们向集群中添加一些数据,执行命令:

1
for((i=0; i<20; i++)); do /home/work/redis/bin/redis-cli -c -h 10.48.56.215 -p 6380 set yh_$i  $i ;done

连接集群

启动redis-cli时要加-c选项,不加-c选项如果查询到某个值不在该节点上会提示error

1
/home/work/redis/bin/redis-cli -h 10.48.56.215 -p 6380 -c

就能看到以错误形式显示出的MOVED重定向信息。info

向集群添加节点

现在我们向集群中增加2个节点,一个Master和一个Salve节点,端口分别为(6386和6387)

首先和刚才一样复制2份redis配置,如下:

addconf

接下来启动新增的2个redis服务:

addstart

查看进程pid已经写入成功:

addpid

现在我们将端口为6386的节点作为Master添加到集群中,执行命令如:

1
/home/work/soft/redis-3.0.3/src/redis-trib.rb add-node Newip:port MasterIP:port,这里我们选择了6380端口的Master.

addnode1

我们再次查看集群节点可以看到端口为6386的node已经成为了Master.

addstatus

接下来我们将端口为6387的作为Slave节点添加到端口为6386的Master下面,需要记录上图中的第一列中的MasterId执行命令如下:

1
/home/work/soft/redis-3.0.3/src/redis-trib.rb add-node --slave --master-id MasterId NewIP:port MasterIP:port

addslave

查看一下添加的节点:

slave

Resharding

接下来我们可以对集群中的slots重新分配,比如我们需要将端口为6380的Master中的5000slot分配给6386端口的Master,则可以执行如下命令:

1
/home/work/soft/redis-3.0.3/src/redis-trib.rb reshard ResIP:port DesIP:port

reshard

我们再次查询key为”yh_2”时发现已经重定向到了6386端口上。

regetkey

我们在来看下一下集群节点:

reshardresult

最后附上本文资源:redis启动脚本 redis-3.0.3 , rubygem

(The End)

坚持原创技术分享,您的支持将鼓励我继续创作!