您的位置:首页 > 数据库 > Redis

Redis集群Redis-Cluster安装

2017-01-09 20:51 399 查看
本文介绍Redis官方集群方案Redis Cluster的安装方式[b],基于3.2.3,亲测成功。[/b]

规划

redis部署的版本
redis-3.2.3

与大多数分布式中间件一样,redis的cluster也是依赖选举算法来保证集群的高可用,所以类似ZK一样,一般是奇数个节点(可以允许N/2以下的节点失效),再考虑到每个节点做Master-Slave互为备份,所以一个redis cluster集群最少也得6个节点。
安装6个实例,86的三个实例为主master,87的三个实例为从slave。
192.25.103.86:7001   master1
192.25.103.86:7002   master2
192.25.103.86:7003   master3
192.25.103.87:7004   slave1
192.25.103.87:7005   slave2
192.25.103.87:7006   slave3



一、安装Redis
1、编译Redis
cd /usr/local/
wget http://download.redis.io/releases/redis-3.2.3.tar.gz
tar xzf redis-3.2.3.tar.gz
cd redis-3.2.3
make

2、准备Redis

2.1、安装tcl8.6.1
不然会报You need tcl 8.5 or newer in order to run the Redis test错误。
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz tar xzvf tcl8.6.1-src.tar.gz
cd ./tcl8.6.1/unix/
./configure
make && make install

2.2、测试编译
make test

2.3、可执行命令
cp /usr/local/redis-3.2.3/src/redis-server /usr/local/bin
cp /usr/local/redis-3.2.3/src/redis-cli /usr/local/bin
cp /usr/local/redis-3.2.3/src/redis-trib.rb /usr/local/bin

2.4、准备通用配置文件
创建Redis集群专用目录
cd /usr/local/
mkdir redis_cluster
cd redis_cluster
复制配置文件到该目录
cp /usr/local/redis-3.2.3/redis.conf ./
修改配置文件中的下面选项

vi redis.conf
port 7000
daemonize yes
cluster-enabled yes
pidfile /var/run/redis7000.pid
cluster-config-file 7000/nodes.conf
cluster-node-timeout 5000   # 允许"失联"的最大毫秒数
cluster-require-full-coverage no # 默认是yes,只要有结点宕机导致16384个槽没全被覆盖,整个集群就全部停止服务,所以一定要改为no
dbfilename dump7000.rdb
logfile redis7000.log

protected-mode是3.2.0新增的配置项,默认值为yes,限制从其它机器登录Redis server,而只能从127.0.0.1登录。为保证redis-trib.rb工具的正常运行,需要设置为no,完成后可以改回yes,但每次使用redis-trib.rb都需要改回为no。要想从非127.0.0.1访问也需要改为no。
如果不配置该项目,对应的Redis实例不能被外部访问到。
即telnet 192.25.103.86 7001或redis-trib.rb check 192.25.103.86:7001命令无效。

注释绑定本机
# bind 127.0.0.1
关闭保护模式
protected-mode no
这两部不做,稍后会出现以下错误,3.2.0版本以后增加了安全性控制。
[ERR] Sorry, can't connect to node 192.25.103.87:7004

2.5、配置各实例
mkdir 7001一直到mkdir 7006。
cp redis.conf 7001/redis7001.conf
然后修改port、cluster-config-file、pidfile、dbfilename和logfile。

2.6、设置自启动脚本
cp /usr/local/redis-3.2.3/utils/redis_init_script /etc/init.d/redis7001
vi /etc/init.d/redis7001
修改如下部分
REDISPORT=7001
EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PIDFILE=/var/run/redis${REDISPORT}.pid
CONF="/usr/local/redis_cluster/${REDISPORT}/redis${REDISPORT}.conf"

2.7、操作命令
/etc/init.d/redis7001 start
/etc/init.d/redis7001 stop
运行后在每个节点的目录下可以看到新增了 nodes.conf 配置,第一个字段就是NodeId, 之后的 cluster 环境中唯一的标识该节点实例。
用以下两个命令查看进程和端口
ps -ef | grep redis
netstat -pan | grep 7001

每一个 redis cluster 节点都至少需要两个 tcp 连接,一个是用于为 client 服务的监听端口,如7001,另一个则用于为 cluster 节点通信提供的通道cluster bus,如:7001+10000 = 17001。
cluster 节点之间传输的协议为 binary protocol,主要用于 故障检测,配置更新,故障转移授权等等。
Redis Cluster 并没有采用一致性 hash 算法来对 data 进行 sharding,而是采用了简单的 hash slot 机制来实现 -- 计算给定 key 的 hash slot 槽位 -- CRC16(key) % 16384。
Redis Cluster 支持 master-slave 模型来实现高可用性,一个节点退出,可以再次选举出该节点的某一个 slave 节点作为新的 master 节点来服务;

二、安装Redis Cluster
1、Ruby的Redis支持
yum install ruby
yum install rubygems
gem install redis

2、测试Ruby命令
redis-trib.rb check 192.25.103.86:7001

3、创建集群
将86机器上的三个主节点构成集群
redis-trib.rb  create 192.25.103.86:7001 192.25.103.86:7002 192.25.103.86:7003
redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下,是基于redis提供的集群命令封装成简单、便捷、实用的操作工具。

4、为主节点指定从节点
redis-trib.rb add-node --slave --master-id 574812f6fde1477545cc6dd0141791e5b9895753 192.25.103.87:7004 192.25.103.86:7001
redis-trib.rb add-node --slave --master-id 5dfdb3be971e1f019bc1f8e241a17d5ce01575fe 192.25.103.87:7005 192.25.103.86:7002
redis-trib.rb add-node --slave --master-id bfd7c57f355220214081f351f92e7989eb23bcbd 192.25.103.87:7006 192.25.103.86:7003
注:
master-id是从节点对应的主节点id,在7001/nodes.conf中查看
第一个节点参数(ip:port)是增加的从节点
第二个节点参数(ip:port)是已经在集群内的任意一个节点

5、客户端登录验证
redis-cli -p 7001
目前该版本默认打命令时会进行补全操作,:set nohints。
info  #看当前节点信息
cluster info  #看集群总体信息
cluster nodes  #看集群状态
cluster slots  #看集群中slots的分部

6、查看集群状态
跟上任意一个节点的ip和port
redis-trib.rb info 192.25.103.86:7001
会把所有的master信息输出,包括这个master上有几个缓存key,有几个slave,所有master上的keys合计,以及平均每个slot上有多少key。
redis-trib.rb check 192.25.103.86:7001
哪些端口的节点是master,哪些端口的节点是slave。

7、重新启动
目前redis-trib的功能还比较弱,需要重启集群的话先手动kill掉各个进程,然后重新启动。以下是批量杀进程。
ps -ef | grep redis | awk '{print $2}' | xargs kill

8、重新分配节点
redis-cluster把整个集群的存储空间划分为16384个slot,当6个节点分为3主3从时,相当于整个cluster中有3组HA的节点,3个master会平均分摊所有slot,每次向cluster中的key做操作时,redis会对key值做CRC32算法处理,得到一个数值,然后再对16384取模,通过余数判断该缓存项应该落在哪个slot上,确定了slot,也就确定了保存在哪个master节点上,当cluster扩容或删除节点时,只需要将slot重新分配即可。

redis-trib.rb reshard 192.25.103.86:7001   //只要是有效节点即可,下面是交互过程
How many slots do you want to move (from 1 to 16384)? 1000 //设置slot数1000
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点node id
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:all //表示全部节点重新洗牌
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分
可以把分配的过程理解成打扑克牌,all表示大家重新洗牌;输入某个主节点的node id,然后在输入done的话,就好比从某个节点抽牌。
第一个交互询问,填写多少slot移动时,如果填成16384,则将所有slot都移动到一个固定节点上,会导致更加不均衡。建议每次移动500~1000,这样对线上的影响比较小。

8dd9

redis-trib.rb rebalance 192.25.103.87:7001 --auto-weights
做一次均衡,简单点可以只指定两个参数:“192.168.0.31:6379”为集群中已知的任何一个节点,参数“-auto-weights”表示自动权重。

9、删除节点
第一个参数只要是有效节点即可,第二个参数才是真正要删除的NodeId
./redis-trib.rb del-node 192.25.103.86:7001 88e16f91609c03277f2ee6ce5285932f58c221c1
只有slave节点和空的master节点可以删除,如果master非空,先用reshard把上面的slot移动到其它node后再删除,如果有一组master-slave节点,将master上所有slot移到其它节点,然后将master删除,剩下的slave会另寻他主,变成其它master的slave。
删除节点不仅仅是从cluster中将这个节点移除,还会直接将目标节点的redis服务停止。

如果报
Increased maximum number of open files to 10032 (it was originally set to 1024).
ulimit -Hn看数字
ulimit -n 65535设置成65535 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis 集群