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

redis(二)集群部署详解

2018-01-05 14:21 591 查看
         本文所有描述均为作者亲自操作后总结出来的,如有疑问可直接留言,将及时回复,如本文理解或描述有误的地方欢迎指出,将及时改正

本章主要描述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|

集群配置参数
配置选项选项值描述
daemonizeyes是否作为守护进程运行,配置yes则产生pid文件
pidfile/var/run/redis_6030.pid如开启了daemonize则需指定一个pid,默认为redis_6379.pid
port6030监听端口默认6793
database1可用数据库数,默认为16,默认数据库存储在DB0号ID库中,无特殊要求建议设置一个数据库:database
1
cluster-enabledyes打开reids集群
cluster-config-filenodes-6030.conf集群配置文件启动自动生成不用认为干涉
cluster-node-timeout5000节点互联超时时间,毫秒
appendonlyyes启用aof持久化方式
配置
以6030端口机器为例

复制redis.conf为对应端口.conf,如6030.conf

修改各机器端口为规划端口

修改配置-2

修改配置-3

修改配置-4

防火墙配置

//#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啊,相信你是崩溃的,谁让我们都是搞事情的呢,出了事情就得去解决

修改此处所有节点机器的ip值
再将所有防火墙打开,保证集群通信端口能互通,再次创建集群

再次执行创建集群的命令
若此时不是你规划的设置,请调整创建命令的机器顺序,默认前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更高级的配置这里不做说明,大家可以自己花时间进行学习

作者:阿郎_
链接:https://www.jianshu.com/p/cd56880aeed3
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: