redis30以上版本集群安装.docx
《redis30以上版本集群安装.docx》由会员分享,可在线阅读,更多相关《redis30以上版本集群安装.docx(27页珍藏版)》请在冰豆网上搜索。
redis30以上版本集群安装
1、Redis集群安装方法
1、环境介绍
操作系统版本:
centos7[CentOSLinuxrelease7.0.1406(Core)]
详细版本信息:
Linuxversion3.10.0-123.el7.x86_64(builder@kbuilder.dev.centos.org)(gccversion4.8.220140120(RedHat4.8.2-16)(GCC))#1SMPMonJun3012:
09:
22UTC2014
【查看系统命令:
cat/proc/version或者cat/etc/redhat-release或者uname-a】
Redis版本:
redis-3.0.6
Ruby安装包:
参考网址:
安装步骤:
1、下载redis。
官网下载3.0.6版本,之前2.几的版本不支持集群模式,最新版本3.2支持集群模式,但是目前并不稳定,因此建议使用3.0.6版本redis。
目前redis3.0以上版本暂无支持windows系统客户端。
下载地址:
2、下载之后,会得到一个名字为redis-3.0.6.tar.gz的压缩文件,可以在本地解压,也可以传至linux上解压文件,前提是你的linux操作系统有ftp且已安装解压文件包。
3、如果已经是当前目录,则直接解压文件,如果不是当前目录,要将redis压缩包移动至目标目录,使用如下命令移动文件:
mvredis-3.0.0-rc2.tar.gz /ftp/private/redis-3.0/
4、进入目标文件夹,即redis压缩包所在的文件夹,本人使用文件夹为/ftp/private/redis-3.0/,同时解压redis的压缩包,进入目录和解压命令如下:
Cd/ftp/private/redis-3.0/
tar -zxvf redis-3.0.0-rc2.tar.gz
5、解压完成之后,将在当前目录生成一个redis-3.0.6文件夹,进入该文件夹,将看到如下文件目录:
cdredis-3.0.6
执行编译命令,将看到如下图效果【必须在redis-3.0.6文件夹下执行该命令,该命令是编译源文件命令】:
make
执行编译命令,将看到如下图效果【makeinstall命令是安装软件命令】:
makeinstall
执行完上述命令,进入src目录,将看到redis的服务启动文件redis-server,同时还有客户端文件redis-cli:
cd/ftp/private/redis-3.0/redis-3.0.6/src
执行命令./redis-server将看到下图效果,看到如下图的效果表示你的单个redis服务安装编译正常:
./redis-server
至此完成单个redis服务的安装,同时可以测试redis是否正常,输入./redis-cli,如下图效果。
看到上图表示redis的存取正常,可以正常使用。
2、集群环境的搭建:
Redis集群环境搭建中,建议最好将所有的redis集群节点的版本统一,否则容易出现无法解决的错误或者bug。
首先创建集群需要的目录[改目录可以自定义,规划自己的服务器存放路径]:
mkdir-p/ftp/private/redis-3.0
将刚才编译完成的redis文件夹拷贝至当前文件夹,如果是一个机器放多个redis服务,可以复制多个在当前文件夹下,如果是不同机器部署的redis集群,则只需拷贝一个即可【本人使用的为一个机器部署多个节点】:
cp-rredis-3.0.6redis-3.0.6-9001
复制完成后的目录如下,其中每个文件最后四位为当前redis使用的端口:
复制完成之后,修改redis配置文件,即redis-3.0.6目录下的redis.conf,该文件包含了所有的redis的配置信息和样例说明,主要的几个配置地方如下:
port9001#使用端口
daemonizeyes#是否在后台执行,yes:
后台运行;no:
不是后台运行(老版本默认)
cluster-enabledyes#是否使用集群,yes使用,no不使用
cluster-config-filenodes.conf#集群的初始化文件存放位置
cluster-node-timeout5000#集群节点超时时间
appendonlyno#默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。
但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,AppendOnlyFile是另一种持久化方式,可以提供更好的持久化特性。
Redis会把每次写入的数据在接收后都写入appendonly.aof文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。
Yes为使用持久化,no为不使用持久化。
修改完成之后,将配置文件复制N分,N为你的节点个数,复制的目标目录为redis的运行文件src目录下,也可以自己规划配置文件路径,放在自己想要放置的目录,命令如下:
cpredis.conf/ftp/private/redis-3.0/redis-3.0.6-9001/src/redis.conf
cpredis.conf/ftp/private/redis-3.0/redis-3.0.6-9002/src/redis.conf
cpredis.conf/ftp/private/redis-3.0/redis-3.0.6-9003/src/redis.conf
然后分别启动所有的redis实例【注释:
如果你的每台机器都包含多个节点,则需要分别修改redis.Conf的端口port配置,如果是不同机器则无需修改端口,可以全部节点使用同一个端口】,启动方式为,进入redis实例的src目录下,然后分别运行如下命令:
./redis-server./redis.conf
如果你的redis.conf和redis-server不在同一目录则后面使用全路径,假设我的配置文件在var下,命令如下:
./redis-server/var/redis.conf
由于上面配置了redis在后台运行,所以启动完redis之后,将不会显示单击运行效果图,如果要验证
启动是否成功,则可以在src目录下执行如下命令[9001为你启动的实例所用端口号]:
./redis-cli-p9001
出现上图效果表示启动成功。
分别将所有的节点启动完成之后,执行如下命令可查看redis-server运行情况,出现下图说明运行正常:
ps -ef|grep redis
然后进入集群中一个redis节点的src目录下,运行如下命令创建集群,其中127.0.0.1需要换成你的服务器ip地址【由于我是本地安装集群,因此使用127.0.0.1。
create表示创建一个新的集群,replicas1表示指定集群中的副本集为1】:
./redis-trib.rb create --replicas 1 127.0.0.1:
9001 127.0.0.1:
9002 127.0.0.1:
9003
出现上图效果,说明集群启动成功。
如果你没有外网安装可以先到 https:
//rubygems.org/gems/redis 下载,然后离线安装。
sudogeminstallredis-3.0.7.gem--local
需要注意的是执行 redis-trib.rb命令需要ruby的支持,如果在线安装可以执行:
yum-yinstallruby
3、集群基本操作
查看目前集群中的状态,如下命令查看目前集群中的所有节点:
clusternodes
向集群中新加入一个节点:
./redis-trib.rbadd-node127.0.0.1:
9004127.0.0.1:
9001
第一个参数是要加入的节点,第二个参数是集群中已有的节点。
./redis-trib.rbadd-node--slave127.0.0.1:
9005127.0.0.1:
9001
第一个参数为从节点,第二个参数为主节点。
./redis-trib.rbdel-node127.0.0.1:
9001'cbb01bdfdc265b190496956354d84aaae6e7d54d'
这里要注意一下,第一个参数是集群中的任何一个主节点地址,而第二个参数是要删除节点的ID,这个ID如果你不知道的话,可以通过clusternodes命令查看。
还有一点就是要删除的节点必须是空的,也就是不能缓存任何数据,否则会删除不成功。
对于非空节点,在删除之前需要重新分片,将缓存的数据转移到别的节点。
如何重新分片:
我们先给某个节点做点数据:
./redis-cli-c-p9001
127.0.0.1:
9001>settestkey001testvalue001
->Redirectedtoslot[12786]locatedat127.0.0.1:
9003
OK
127.0.0.1:
9003>
现在9003上已经有数据了,我们尝试删除一下:
./redis-trib.rbdel-node127.0.0.1:
9001'78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'
>>>Removingnode78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3fromcluster127.0.0.1:
9001
Connectingtonode127.0.0.1:
9001:
OK
Connectingtonode127.0.0.1:
9002:
OK
Connectingtonode127.0.0.1:
9003:
OK
[ERR]Node127.0.0.1:
9003isnotempty!
Resharddataawayandtryagain.
没有删除成功,我们来重新分片,把9003上的数据转移:
./redis-trib.rbreshard127.0.0.1:
9003
然后输出了很多信息,很多数值和ID都可以从这段信息中找到。
Howmanyslotsdoyouwanttomove(from1to16384)?
5461
会问你要移动多少个哈希槽,我们把9003上的所有哈希槽都移走,5461这个数字可以从终端上看到,或许你的实际情况不是这个数字。
WhatisthereceivingnodeID?
4d2e0a8360795ce7ce8381c68746034aeba3c9b9
然后问你你要把这些哈希槽移到哪儿去,我指定了9001的节点ID。
PleaseenterallthesourcenodeIDs.
Type'all'touseallthenodesassourcenodesforthehashslots.
Type'done'onceyouenteredallthesourcenodesIDs.
Sourcenode#1:
78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3
Sourcenode#2:
done
之后,redis列出了重新分片计划,最后问你
Doyouwanttoproceedwiththeproposedreshardplan(yes/no)?
yes
执行完成后,我们看看9003上还有没有key:
./redis-cli-p9003
127.0.0.1:
9003>keys*
(emptylistorset)
127.0.0.1:
9003>
再看看9001上是不是有这个key了
./redis-cli-p9001
127.0.0.1:
9001>keys*
1)"testkey001"
127.0.0.1:
9001>
没错,果然转移过来了。
最后我们试试能不能把9003删除:
./redis-trib.rbdel-node127.0.0.1:
9001'78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3'
>>>Removingnode78ec1fd6647b79627d7c29bb2b22d04a4a6c43b3fromcluster127.0.0.1:
9001
Connectingtonode127.0.0.1:
9001:
OK
Connectingtonode127.0.0.1:
9002:
OK
Connectingtonode127.0.0.1:
9003:
OK
>>>SendingCLUSTERFORGETmessagestothecluster...
>>>SHUTDOWNthenode.
./redis-cli-p9003
CouldnotconnecttoRedisat127.0.0.1:
9003:
Connectionrefused
notconnected>
看到上面结果表示已成功移除redis.
官方是推荐使用redis-trib.rbfix来修复集群….…. 通过clusternodes看到7001这个节点被干掉了…那么
./redis-trib.rbfix127.0.0.1:
9001
修复完成后再用check命令检查下是否正确
./redis-trib.rbcheck127.0.0.1:
9001
只要输入任意集群中节点即可,会自动检查所有相关节点。
可以查看相应的输出看下是否是每个Master都有了slots,如果分布不均匀那可以使用下面的方式重新分配slot:
./redis-trib.rbreshard127.0.0.1:
7001
集群
CLUSTERINFO打印集群的信息
CLUSTERNODES列出集群当前已知的所有节点(node),以及这些节点的相关信息。
节点
CLUSTERMEET将ip和port所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTERFORGET从集群中移除node_id指定的节点。
CLUSTERREPLICATE将当前节点设置为node_id指定的节点的从节点。
CLUSTERSAVECONFIG将节点的配置文件保存到硬盘里面。
槽(slot)
CLUSTERADDSLOTS[slot...]将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTERDELSLOTS[slot...]移除一个或多个槽对当前节点的指派。
CLUSTERFLUSHSLOTS移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTERSETSLOTNODE将槽slot指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTERSETSLOTMIGRATING将本节点的槽slot迁移到node_id指定的节点中。
CLUSTERSETSLOTIMPORTING从node_id指定的节点中导入槽slot到本节点。
CLUSTERSETSLOTSTABLE取消对槽slot的导入(import)或者迁移(migrate)。
键
CLUSTERKEYSLOT计算键key应该被放置在哪个槽上。
CLUSTERCOUNTKEYSINSLOT返回槽slot目前包含的键值对数量。
CLUSTERGETKEYSINSLOT返回count个slot槽中的键。
二、安装过程容易出现的错误:
编译redis文件的时候,执行报错,修改redis文件的执行权限,命令如下:
chmod-R777[文件名]
执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:
/usr/bin/env:
ruby:
No such file or directory
所以需要安装ruby的环境,这里推荐使用yum install ruby安装
执行命令:
yum install ruby--服务器能联网命令
然后再执行第6步的创建集群命令,还会报错,提示缺少rubygems组件,使用yum安装
错误内容:
./redis-trib.rb:
24:
in `require':
no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:
24
执行命令:
yum install rubygems--服务器能联网命令
再次执行第6步的命令,还会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem安装
错误内容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
31:
in`gem_original_require':
nosuchfiletoload--redis(LoadError)
from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:
31:
in`require'
from./redis-trib.rb:
25
执行命令:
geminstallredis
错误内容:
[ERR]Node172.168.63.202:
7001isnotempty.Eitherthenodealreadyknowsothernodes(checkwithCLUSTERNODES)orcontainssome keyindatabase0.
解决方法:
1)、将需要新增的节点下aof、rdb等本地备份文件删除;
2)、同时将新Node的集群配置文件删除,即:
删除你redis.conf里面cluster-config-file所在的文件【即nodes.conf】;
3)、再次添加新节点如果还是报错,则登录新节点./redis-cli–hx–p对数据库进行清除:
127.0.0.1:
7001> flushdb #清空当前数据库
三、Redis3.0以上版本具体的配置项详解:
#redis.conf
#Redisconfigurationfileexample.
#./redis-server/path/to/redis.conf
##################################INCLUDES###################################
#这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。
#include/path/to/local.conf
#include/path/to/other.conf
################################GENERAL#####################################
#是否在后台执行,yes:
后台运行;no:
不是后台运行(老版本默认)
daemonizeyes
#3.2里的参数,是否开启保护模式,默认开启。
要是配置里没有指定bind和密码。
开启该参数后,redis只会本地进行访问,拒绝外部访问。
要是开启了密码 和bind,可以开启。
否 则最好关闭,设置为no。
protected-modeyes
#redis的进程文件
pidfile/var/run/redis/redis-server.pid
#redis监听的端口号。
port6379
#此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度,当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值,默认是511,而Linux的默认参数值是128。
当系统并发量大并且客户端速度缓慢的时候,可以将这二个参数一起参考设定。
该内核参数默认值一般是128,对于负载很大的服务程序来说大大的不够。
一般会将它修改为2048或者更大。
在/etc/sysctl.conf中添加:
net.core.somaxconn=2048,然后在终端中执行sysctl-p。
tcp-backlog511
#指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求
bind127.0.0.1
#配置unixsocket来让redis支持监听本地连接。
#unixsocket/var/run/redis/redis.sock
#配置unixsocket使用文件的权限#
unixsocketperm700
#此参数为设置客户端空闲超过timeout,服务端会断开连接,为0则服务端不会主动断开连接,不能小于0。
timeout0
#tcpkeepalive参数。
如果设置不为0,就使用配置tcp的SO_KEEPALIVE值,使用keepalive有两个好处:
检测挂掉的对端。
降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。
在Linux内核中,设置了keepalive,redis会定时给对端发送ack。
检测到对端关闭需要两倍的设置值。
tcp-keepalive0
#指定了服务端日志的级别。
级别包括:
debug(很多信息,方便开发、测试),verbose(许多有用的信息,但是没有debug级别信息多),notice(适当的日志级别,适合生产环境),warn(只有非常重要的信息)loglevelnotice
#指定了记录日志的文件。
空字符串的话,日志会打印到标准输出设备。
后台运行的redis标准输出是/dev/null。
logfile/var/log/redis/redis-server.log
#是否打开记录syslog功能
#syslog-enabledno
#syslog的标识符。
#syslog-identredis
#日志的来源、设备
#syslog-facilitylocal0
#数据库的数量,默认使用的数据库是DB0。
可以通过”SELECT“命令选择一个
dbdatabases16
##