1:redis cluster的现状
目前redis支持的cluster特性(已亲测):
1):节点自动发现
2):slave->master选举,集群容错
3):Hotresharding:在线分片
4):进群管理:cluster xxx
5):基于配置(nodes-port.conf)的集群管理
6):ASK转向/MOVED 转向机制.
2:redis cluster 架构
redis-cluster架构图
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value2) redis-cluster
选举:容错
(1)领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉.
(2):什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN Thecluster is down)错误 a:如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态. b:如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态.
虚拟机环境:
要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如下
127.0.0.1:7000
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
1:上传redis
下载地址:http://download.redis.io/releases/redis-3.2.1.tar.gz
必须为3.0以上版本(支持rediscluser)
文件位置: caches/redis3.0/redis-3.2.1.tar.gz
2:上传服务器,解压,编译
或者直接下载,如果下载失败,请按第一步上传后下载
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-3.2.1.tar.gz
$ cd redis-3.2.1
$ make
$ make install
以下提示:则服务安装成功
3:创建集群需要的目录
[/]表示根目录
以下操作命令在根目录下(否则路径会出问题)
mkdir-p root/caches/cluster
cdroot/caches/cluster
mkdir7000
mkdir7001
mkdir7002
mkdir7003
mkdir7004
mkdir7005
4:修改配置文件redis.conf
cpredis.conf /usr.local/cluster
viredis.conf
##修改配置文件中的下面选项
port7000
daemonizeyes
cluster-enabledyes
cluster-config-filenodes.conf
cluster-node-timeout5000
appendonlyyes
dir//usr/local/cluster/ 设置快照dump.rdb在集群中
其他配置项
TCP listen()10000
TCP监听的最大容纳数量,在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。Linux 内核会把这个值缩小成/proc/sys/net/core/somaxconn对应的值,要提升并发量需要修改这两个值才能达到目的
bind 127.0.0.1 bind 192.168.1.100 |
绑定redis服务器网卡IP,默认为127.0.0.1,即本地回环地址。这样的话,访问redis服务只能通过本机的客户端连接,而无法通过远程连接。如果bind选项为空的话,那会接受所有来自于可用网络接口的连接。如上配置,绑定一个127.0.0.1的本机地址和192.168.1.100的外网地址。
protected-mode yes
保护模式,默认是开启状态,只允许本地客户端连接, 可以设置密码或添加bind来连接
tcp-keepalive 300
单位是秒,表示将周期性的使用SO_KEEPALIVE检测客户端是否还处于健康状态,避免服务器一直阻塞,官方给出的建议值是300s,如果设置为0,则不会周期性的检测
maxclients 10000
设置客户端最大并发连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件
描述符数-32(redis server自身会使用一些),如果设置 maxclients为0
表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clientsreached错误信息
首先按ESC键回到命令模式,输入: 进入末行,然后输入:w保存即可,也可以输入:wq!保存文件并退出。
##修改完redis.conf配置文件中的这些配置项之后把这个配置文件分别拷贝到7000/7001/7002/7003/7004/7005目录下面
cp/caches/cluster/redis.conf /caches/cluster/7000
cp/caches/cluster/redis.conf /caches/cluster/7001
cp/caches/cluster/redis.conf /caches/cluster/7002
cp/caches/cluster/redis.conf /caches/cluster/7003
cp/caches/cluster/redis.conf /caches/cluster/7004
cp/caches/cluster/redis.conf /caches/cluster/7005
##注意:拷贝完成之后要修改7001/7002/7003/7004/7005目录下面redis.conf文件中的port参数,分别改为对应的文件夹的名称
[root@SZD-L0073672 7003]# cd ../7004
[root@SZD-L0073672 7004]#
[root@SZD-L0073672 7004]# vi redis.conf
找到对应的 port 7004 按i 进入到插入状态
修改后按ESC退出到命令模式
按 : 跳到文档末行 输入 wq! (保存并退出 到系统路径里)
5:分别启动这6个redis实例
cd/usr/local/cluster/7000 redis-server redis.conf
cd/usr/local/cluster/7001 redis-server redis.conf
cd/usr/local/cluster/7002 redis-server redis.conf
cd/usr/local/cluster/7003 redis-server redis.conf
cd/usr/local/cluster/7004 redis-server redis.conf
cd/usr/local/cluster/7005 redis-server redis.conf
##启动之后使用命令查看redis的启动情况
ps-ef|grep redis
如下显示则说明启动成功
6.升级ruby 安装gem
检查ruby 版本:
#ruby -v
ruby 1.8.7(2013-06-27 patchlevel 374) [x86_64-linux]
是否安装rubygems:
# rpm -qa|grep ruby
ruby-rdoc-1.8.7.374-2.el5
ruby-1.8.7.374-2.el5
ruby-devel-1.8.7.374-2.el5
ruby-devel-1.8.7.374-2.el5
ruby-mode-1.8.5-24.el5
ruby-irb-1.8.7.374-2.el5
ruby-libs-1.8.7.374-2.el5
ruby-libs-1.8.7.374-2.el5
rubygems-1.3.7-1.el5
如果没有
安装gem 需要ruby的版本在1.8.7 以上,默认的centos5 上都是1.8.5 版本,所以首先你的升级你的ruby ,rpm -ivh
http://yum.puppetlabs.com/el/5/products/x86_64/puppetlabs-release-5-6.noarch.rpm
yum install ruby ruby-devel rubygems rpm-build
7.gem 安装redis ruby 接口
gem install redis
此时巨坑,会报巨多的错误
比如
再比如:
纠结良久之后 参考网址:https://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem
再次执行第步的命令,还会报错,提示不能加载redis,是因为缺少redis的接口
错误内容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in`gem_original_require': no such file to load -- redis (LoadError)
from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
gem install redis
这里可能无法安装,因为无法连接gem服务器:
[@zw_22_90 src]# gem install redis --version3.0.0
ERROR: Could not find a valid gem 'redis' (=3.0.0) in any repository
ERROR: While executing gem ...(Gem::RemoteFetcher::FetchError)
需要手工下载并安装:
wgethttps://rubygems.global.ssl.fastly.net/gems/redis-3.2.1.gem
gem install -l ./redis-3.2.1.gem
因为种种原因,此时gem文件仍旧无法下载,至于原因就不深究了
解决方案:
1. 网址请求头:https更换为http
2. 在windows本地下载redis-3.2.1.gem 上传到主机环境中再安装
gem install -1 ./redis-3.2.1.gem
8:执行redis的创建集群命令创建集群
#redis-trib.rb的create子命令构建 #--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点#节点角色由顺序决定,先master之后是slave
创建方式:
cd/usr/local/redis3.0/src ./redis-trib.rb create --replicas 1 127.0.0.1:7000127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
错误笔记备注
8.1执行上面的命令的时候会报错,因为是执行的ruby的脚本,需要ruby的环境
错误内容:/usr/bin/env:ruby: No such file or directory 所以需要安装ruby的环境,这里推荐使用yum install ruby安装
yum installruby
8.2然后再执行第6步的创建集群命令,还会报错,提示缺少rubygems组件,使用yum安装 错误内容: ./redis-trib.rb:24:in `require':no such file to load -- rubygems (LoadError) from ./redis-trib.rb:24
yum installrubygems
8.3再次执行第8步的命令,还会报错,提示不能加载redis,是因为缺少redis和ruby的接口,使用gem 安装错误内容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in
`gem_original_require':no such file to load -- redis (LoadError) from/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from./redis-trib.rb:25
gem install redis
8.4 再次执行第8步的命令,正常执行 输入yes,然后配置完成。
注意观察 主从的配置: 默认是前三个节点 7000 7001 7002 是主, 后3个节点 7003 7004 7005 是从 如果是部署在不同的服务器,请根据主从分部规则,分开在不同的服务器
至此,集群搭建成功
9: 使用redis-cli命令进入集群环境
redis-cli -c -p 7000
结果: 127.0.0.1:7000> ping
PONG
三:测试篇
1.检查集群的状态
#redis-trib.rb的check子命令构建 #ip:port可以是集群的任意节点
./redis-trib.rb check 1 127.0.0.1:7000 最后输出如下信息,没有任何警告或错误,表示集群启动成功并处于ok状态