redis(二)集群部署详解
本文所有描述均为作者亲自操作后总结出来的,如有疑问可直接留言,将及时回复,如本文理解或描述有误的地方欢迎指出,将及时改正
本章主要描述redis集群的部署,若未搭建redis单机服务的朋友请移步redis(一)单机部署与应用
参考文档
redis官方集群指南:https://redis.io/topics/cluster-tutorial
redis官方集群规范:https://redis.io/topics/cluster-spec
redis中文集群指南:http://redisdoc.com/topic/cluster-tutorial.html
redis中文集群规范:http://redisdoc.com/topic/cluster-spec.html#cluster-spec
集群简介
redis 集群是一个可以在多个 redis 节点之间进行数据共享的设施(installation).
redis 集群有两点,一个是将数据分片存储,另外一个就是主从复制。一个 redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个。
例如:一个集群可以有三个哈希槽, 其中:
• 节点 A 负责处理 0 号至 5500 号哈希槽。
• 节点 B 负责处理 5501 号至 11000 号哈希槽。
• 节点 C 负责处理 11001 号至 16384 号哈希槽。
加入节点
若要加入新的机器节点D并为其指定900个哈希槽,那么只需要从节点A/B/C中拉取一定的槽移动到D节点即可,如:A节点中移出0-300号哈希槽至D节点,B节点移出5501-5801号哈希槽至D节点,C节点同样的移出11001-11301号哈希槽至D节点,这样就能完成哈希槽的分摊工作。
移除节点
若要移除节点A机器,同样的将哈希槽转移至B/C节点,然后再删除空白槽的节点机器即可。
注:经试验,改变哈希槽的归属不会造成节点阻塞,故不影响线上的功能使用,业务机器不会遇到任何异常。
集群环境
集群机器分配
要使redis集群正常工作至少需要3个master节点,若要实现集群的高可用,每个master节点至少配置一个slave节点,这里我将使用3个master和3个slave节点进行操作,集群规划如下:
总共6台虚拟机,分别为3台master和3台slave机器
单节点配置
注:按规划在6台机器中装入redis服务,且保证单机模式能够正常运行,并配置相应端口防火墙,建议在配置时先修改一个文件, 再互相拷贝至6台机器
集群节点描述
主机名 | IP | 服务端口(默认为6379) | 集群通信端口 | 主/从 |
---|---|---|---|---|
lenovo1 | 192.168.2.10 | 6010 | 16010 | Master |
lenovo3 | 192.168.2.30 | 6030 | 16030 | Master |
lenovo4 | 192.168.2.40 | 6040 | 16040 | Master |
h1 | 192.168.2.101 | 6101 | 16101 | Slave |
h2 | 192.168.2.102 | 6102 | 16102 | Slave |
h3 | 192.168.2.103 | 6103 | 16103 | Slave |
集群配置参数
配置选项 | 选项值 | 描述 |
---|---|---|
daemonize | yes | 是否作为守护进程运行,配置yes则产生pid文件 |
pidfile | /var/run/redis_6030.pid | 如开启了daemonize则需指定一个pid,默认为redis_6379.pid |
port | 6030 | 监听端口默认6793 |
database | 1 | 可用数据库数,默认为16,默认数据库存储在DB0号ID库中,无特殊要求建议设置一个数据库:database 1 |
cluster-enabled | yes | 打开reids集群 |
cluster-config-file | nodes-6030.conf | 集群配置文件启动自动生成不用认为干涉 |
cluster-node-timeout | 5000 | 节点互联超时时间,毫秒 |
appendonly | yes | 启用aof持久化方式 |
配置
以6030端口机器为例
-
复制redis.conf为对应端口.conf,如6030.conf
修改各机器端口为规划端口
-
防火墙配置
//#redis 此处比单机要多集群通信端口的配置 -A INPUT -p tcp -m state --state NEW -m tcp --dport 6030 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 16030 -j ACCEPT
-
使用如下命令启动节点(后续启动都是如此)
192.168.2.10 /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6010.conf 192.168.2.30 /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6030.conf 192.168.2.40 /home/lenovo/install/redis-3.2.9/bin/redis-server /home/lenovo/install/redis-3.2.9/6040.conf 192.168.2.101 /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6101.conf 192.168.2.102 /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6102.conf 192.168.2.103 /home/grid/redis-3.2.9/bin/redis-server /home/grid/redis-3.2.9/6103.conf
-
使用命令查看各个节点是否启动成功
ps -ef | grep redis
-
查看redis目录下自动生成的nodes-xxx.conf文件
nodes-xxx.conf自动生成文件,必须保证各机器上该文件的生成 -
此时各个节点启动后并未构成一个集群,下面我们将各个节点构成集群
,安装ruby 和 rubygems(注意需要ruby的版本在1.8.7以上)//yum安装 yum install ruby rubygems
ruby所有依赖文件在这里,有需要离线安装的朋友可参考,我以将ruby依赖包上传至redis集群ruby依赖包密码:f0fj
//离线安装步骤,yum安装方式的朋友直接跳过
[grid@h3 ~]$ mkdir ruby
[grid@h3 ~]$ cd ruby/
[grid@h3 ruby]$ rz //选中所有依赖包后上传
[root@h3 ruby]# rpm -iv *.rpm//使用root用户安装
软件包准备中...
ruby-libs-2.0.0.648-29.el7.x86_64
libyaml-0.1.4-11.el7_0.x86_64
ruby-irb-2.0.0.648-29.el7.noarch
ruby-2.0.0.648-29.el7.x86_64
rubygem-bigdecimal-1.2.0-29.el7.x86_64
rubygem-io-console-0.4.2-29.el7.x86_64
rubygem-json-1.7.7-29.el7.x86_64
rubygem-rdoc-4.0.0-29.el7.noarch
rubygems-2.0.14.1-29.el7.noarch
rubygem-psych-2.0.0-29.el7.x86_64
安装完成后查看ruby版本
[root@h3 ruby]# ruby –v
ruby 2.0.0p648 (2015-12-16) [x86_64-linux]
-
执行redis集群创建命令(在一个节点执行即可),将redis-trib.rb脚本文件复制到bin下并更换名称为redis-trib
[root@lenovo1 /]# cd /home/lenovo/install/redis-3.2.9/src [root@lenovo1 src]# cp redis-trib.rb ../bin/redis-trib [root@lenovo1 src]# cd ../bin/
使用redis-trib脚本程序的create命令创建集群,且复制节点为1,集群机器为这6台机器
[root@lenovo1 bin]# redis-trib create --replicas 1 192.168.2.10:6010
192.168.2.30:6030 192.168.2.40:6040 192.168.2.101:6101
192.168.2.102:6102 192.168.2.103:6103
但此时却报了如下异常
/usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in
`require': cannot load such file -- redis (LoadError)
from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require'
from /home/lenovo/install/redis-3.2.9/bin/redis-trib:25:in `<main>
纠结了会发现我们似乎漏了些什么东西,ruby装完了是干嘛的呢?
解决方案:安装redis与ruby交互的接口
//在线安装
[root@lenovo1 bin]# gem install redis
Fetching: redis-3.3.3.gem (100%)
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed
注:若需要离线安装的同学,我以将redis接口文件存放在ruby同级目录下,直接在该目录下执行如下命令即可进行安装
//离线安装-在线安装的直接跳过
[root@h1 ruby]# gem install redis-3.3.3.gem
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed
-
重新启动redis服务(使用步骤3方式指定conf启动,否则不会生成nodes-xxx.conf文件),然后再执行创建集群的命令,查看结果
却出现如下错误>>> Creating cluster [ERR] Sorry, can't connect to node 192.168.2.30:6030
沃ri啊,相信你是崩溃的,谁让我们都是搞事情的呢,出了事情就得去解决
再将所有防火墙打开,保证集群通信端口能互通,再次创建集群
再次执行创建集群的命令
若此时不是你规划的设置,请调整创建命令的机器顺序,默认前3个为主节点
创建集群成功
若启动出现如下错误,请将上一次创建集群失败的cluster-config-file文件删除,然后重新启动各节点
对应上句错误
-
集群启动几点保证
正确配置了配置文件,安装了ruby环境和ruby与redis的接口,保证启动后生成了nodes-xxx.conf文件
若在创建集群中出现如下错误:[ERR] Node 192.168.2.30:6030 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
则需要将上次启动生成的数据库文件及节点配置删除,或者修改6030.conf中的database数量
-
集群简单测试
使用redis-cli命令进入集群环境
若使用如下命令进入集群这时会出现如下错误./redis-cli –c –p 6030 Could not connect to Redis at 127.0.0.1:6030: Connection refused
主要原因是配置了6030.conf中的bind,但若不配置bind又将出现找不到节点错误,故下面加上-h参数
[root@lenovo3 bin]# ./redis-cli -c -h 192.168.2.30 -p 6030
-c是以集群方式登录;
-h后跟主机号 ;
-p后跟端口号。
若绑定了127.0.0.1则可以省略-h参数。不加-c则客户端不自动切换。
-
查看集群绑定的节点信息
[root@lenovo1 bin]# ./redis-cli -c -h 192.168.2.10 -p 6010 cluster nodes
-
集群使用
在30节点设置一个值
然后模拟30节点宕机后,然后再次查看所有节点信息
30节点宕机
继续在其他节点获取30宕机前的edu的值
30宕机后其自动重定向至该从节点102
再次关停102从节点,会发现该集群任何一个节点都将不提供服务
该集群停止服务
接下来尝试重新启动102从节点,看看能否继续提供服务
继续提供服务且未丢失数据 - 总结
由以上实验可以得出,当redis集群(3台)中的任何一台master机器停止服务后,若存在slave节点,则slave节点会直接顶替宕机的master并继续提供服务,若slave再次宕机,则整个集群停止提供服务,重启该slave后其服务继续执行,且未损失任何数据,说明redis将该缓存持久化在数据库中
redis集群部署配置就讲到这里,另外关于redis更高级的配置这里不做说明,大家可以自己花时间进行学习