技术博客

Redis教程,Redis集群搭建与Spring-data-redis的使用(集群搭建篇)

信息发布:soゝso 发布日期:2016-12-23 11:45 热度:2498 分享到:

Redis教程  ,  Redis  集群搭建系列:

  1. Redis教程,Redis集群搭建与Spring-data-redis的使用(介绍篇)
  2. Redis教程,Redis集群搭建与Spring-data-redis的使用(集群搭建篇)
  3. Redis教程,Redis集群搭建与Spring-data-redis的使用(Spring-data-redis使用篇)

前面介绍了Redis集群Redis 集群一些状态,接下来我们要安装Redis集群了。 具体Redis-Cluster介绍请看上一篇:Redis教程,Redis 集群搭建(介绍篇)

Redis集群安装

安装  Redis  集群的过程中,可能会遇到一些问题,我遇到的坑我都会说一遍怎么解决的,也会说一些Redis集群过程中注意事项。

1.环境安装准备。

最好是有2台机器,  Redis  集群最少准备6个点,那样就可以每一台机器3个节点,创建出3 master 和3 salve 环境。但是我由于资源有限,那么我就一台Linux CentOS 64 位。

还有,我演示的  Redis  版本是3.03 ,集群的方式是Cluster,具体Redis-Cluster介绍请看上一篇:Redis教程,Redis 集群搭建(介绍篇),如果想了解Redis更多,后面我也会发布中文的Redis简介,到时候链接地址会展现在这里。好吧废话不多说,开搞。

2.下载Redis安装包和解压缩

#进入local
cd /usr/local/
#创建一个redis_cluster文件夹,你可以创建redis也可以。
mkdir redis_cluster
#进去redis_cluster文件夹
cd redis_cluster
#下载Redis 3.03安装包
wget http://download.redis.io/releases/redis-3.0.3.tar.gz
#解压Redis 3.03安装包
tar -zxvf redis-3.0.3.tar.gz
#重命名为redis
mv redis-3.0.3  redis

3.编译&安装Redis

#进入redis
cd redis
#编辑安装
make && make install

这里需要jemalloc 的支持,如果报找不到jemalloc 。错误大概如下,我没有出错过。

make[1]: Entering directory `/redis/src'
CC adlist.o
In file included from adlist.c:34:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"
make[1]: *** [adlist.o] Error 1
make[1]: Leaving directory `/redis/src'
make: *** [all] Error 2

 原因是没有安装jemalloc 内存分配器,可以安装 jemalloc 或直接输入make MALLOC=libc  && make install (未尝试)。

4.创建Redis节点

我们开篇提到,要6个节点,那么我们现在来创建6个  Redis  节点用来集群。

#进入集群安装目录
cd /usr/local/redis_cluster
#创建6个节点,如果是有几台服务器,可以分开装
mkdir 10000 10001 10002 10003 10004 10005
#复制到每个节点目录
cp redis 10000
cp redis 10001
cp redis 10002
cp redis 10003
cp redis 10004
cp redis 10005

5.复制和修改每个节点的redis.conf 配置文件

5.1 单独复制一份redis.conf 出来到每个节点目录里,方便使用,并且不动原来的配置文件,因为集群的配置和单点的配置不一样。
#复制一份10000节点文件下的一个redis.conf 复制到每个节点
cp 10000/redis/redis.conf 10000
cp 10000/redis/redis.conf 10001
cp 10000/redis/redis.conf 10002
cp 10000/redis/redis.conf 10003
cp 10000/redis/redis.conf 10004
cp 10000/redis/redis.conf 10005

5.2 修改每个配置文件的配置。你可以 把5.1的步骤放到 5.2 步骤之后,但是还是要每个改一遍,自己看着弄。

下面是集群的配置信息,每项对应的含义都有说明白,不懂就照样配置即可,ip 一项请参考解释配置。要不然集群你可能要重新配置了。

daemonize    yes                        //redis后台运行
pidfile  /var/run/redis_ 10000.pid    	//pidfile文件对应10000
port  10000                             //端口10000
cluster-enabled  yes                    //开启集群  把注释#去掉
cluster-config-file  nodes_10000.conf   //集群的配置  配置文件首次启动自动生成
cluster-node-timeout  5000            	//请求超时  设置5秒够了
appendonly  yes                         //aof日志开启  有需要就开启,它会每次写操作都记录一条日志
bind	127.0.0.1 			//这里要注意了,如果你只想在本机访问用127.0.0.1 ,如果是局域网,请配置内网ip,如果想外网请配置外网ip
vi 10000/redis/redis.conf 
vi 10001/redis/redis.conf 
#....省略了,每个文件都要修改成上面的属性。有就修改,没有就添加

6.启动Redis 全部节点

#进入集群目录
cd /usr/local/redis_cluster
#逐一启动
./10000/redis/src/redis-server 10000/redis.conf
./10001/redis/src/redis-server 10001/redis.conf
./10002/redis/src/redis-server 10002/redis.conf
./10003/redis/src/redis-server 10003/redis.conf 
./10004/redis/src/redis-server 10004/redis.conf
./10005/redis/src/redis-server 10005/redis.conf 

检查看下是否启动成功。用命令 ps -ef|grep redis  或者ps -aux|grep redis   可以看到启动的节点。如果是多台机器集群,记得关闭防火墙,或者设置这些端口能够访问。

root     31518  0.1  0.0 141540  4664 ?        Ssl  09:54   0:54 ./10000/redis/src/redis-server 127.0.0.1:10000 [cluster]
root     31583  0.1  0.0 141540  4596 ?        Ssl  09:56   0:54 ./10001/redis/src/redis-server 127.0.0.1:10001 [cluster]
root     31601  0.1  0.0 137444  4124 ?        Ssl  09:56   0:53 ./10002/redis/src/redis-server 127.0.0.1:10002 [cluster]
root     31619  0.1  0.0 141540  4588 ?        Ssl  09:56   0:53 ./10003/redis/src/redis-server 127.0.0.1:10003 [cluster]
root     31637  0.1  0.0 137444  4128 ?        Ssl  09:56   0:52 ./10004/redis/src/redis-server 127.0.0.1:10004 [cluster]
root     31656  0.1  0.0 137444  4120 ?        Ssl  09:56   0:52 ./10005/redis/src/redis-server 127.0.0.1:10005 [cluster]

如上,表示启动成功。如果只有1个点,或者6个点没有全部启动成功。那么你找到这个点,把这个  redis  节点点里的redis.conf  文件中的daemonize yes 项修改为no ,也就是daemonize no 不在后台启动就能看到启动的错误信息。然后启动看错误日志。下面以10001 启动不起来为例。

#进入集群目录
cd /usr/local/redis_cluster
#编辑启动不起来的 10001节点配置文件
vi 10001/redis.conf 
#找到daemonize项,修改为no。
#保存
:wq
#重启看错误
./10000/redis/src/redis-server 10000/redis.conf

这里的异常信息,我没保存,一般有2种异常,配置文件配错了,导致Redis解析失败不认识。另外一种是文件占用,请确认下这个节点的配置文件是否遵循了 5.2 说明的修改,别和其他节点公用一个文件,有这2个文件分别是:redis_ 10000.pid redis_ 10000.pid ,我搭建的过程中是nodes_10000.conf 文件没有加端口,导致文件占用。

7.创建集群

前面已经准备好了搭建集群的redis cluster 6个节点,接下来我们要把这些节点都串连起来搭建集群。

官方提供了一个工具:redis-trib.rb  ,如果没有安装请先安装。它是用ruby 写的一个程序,所以我们还得安装ruby 。如果是多台机器,要都重复一遍。

#安装ruby
yum -y install ruby ruby-devel rubygems rpm-build

再用 gem 这个命令来安装 redis 对外提供的集群接口。

gem install redis    #这里需要等一会,需要点时间

提示以下信息表示成功。

Usage: redis-trib <command> <options> <arguments ...>

  reshard        host:port
                  --to <arg>
                  --yes
                  --slots <arg>
                  --from <arg>
  check          host:port
  call            host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  add-node        new_host:new_port existing_host:existing_port
                  --master-id <arg>
                  --slave
  del-node        host:port node_id
  fix            host:port
  import          host:port
                  --from <arg>
  help            (show this help)
  create          host1:port1 ... hostN:portN
                  --replicas <arg>

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

再次 用命令 ps -ef|grep redis  或者ps -aux|grep redis  确认所有的Redis节点已经全部启动。

开始集群,我们用create 命令来创建Redis -cluster集群,如下运行:

/usr/local/redis_cluster/10000/redis/src/redis-trib.rb  create  --replicas  1  127.0.0.1:10000  127.0.0.1:10001  127.0.0.1:10002  127.0.0.1:10003  127.0.0.1:10004  127.0.0.1:10005

说明:--replicas  1  表示 自动为每一个master 节点分配一个slave 节点    上面有6个节点,程序会按照一定规则生成 3个master (主),3个slave (从) 。

再次提醒,如果这里创建失败,请检查Redis 失败的节点是否启动成功。是多台机器集群检查是否有防火墙。

这里不提示失败的话有一条信息出现:

Can I set the above configuration? (type 'yes' to accept): yes

请输入 yes

然后会出现: Waiting for the cluster to join.......... ,可能需要等一会。

8.我们来测试Redis-cluster

./10000/redis/src/redis-cli -p 10000 -h 127.0.0.1(如果是127.0.0.1 可以不输入)

进去后测试数据:

set sayhi sojson
set sojson sojson.com
get sojson

多测试一些数据,你会发现前面的ip端口会变化。是因为  Redis  有16383 slot 组成,分布到多个节点上,根据你存入数据的hash 值来匹配到对应的slot 节点上。

容灾测试:

停止1个master 再来测试,你会发现还是可以使用,当你停止掉2个master的时候,那就是cluster is down  ,集群不可用了,所以集群健不健康,是看down 掉的是否超过一半的master 。所以我们一般配置到多台服务器上去,就是为了容灾。建议自己多测试。kill 掉节点然后测试是否可用

补充:查看集群的状态,可以随便链接一个节点输入“ cluster info  ” 就可以看到详细信息。

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_sent:221908
cluster_stats_messages_received:221908

后面会以  spring-data-redis   来实现  Java  对  Redis  集群的操作。这篇  Redis  集群安装篇到此结束。

Redis Cluster 再次安装出现的异常

今天补充一下一个异常,当你Redis Cluster 集群在集群一次,比如IP地址要变化或者什么的,你再次集群的时候你会发现一个异常:

Node 127.0.0.1:10001 is not empty. Either the nodealready knows other nodes (check with CLUSTER NODES) or contains some key in database 0. 

这个时候你需要把开始生成的nodes_*.conf appendonly.aof dump.rdb  文件删除,再次集群就可以了。


本文主题

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

¥我需要走的更远,点击我 赞助。 如果还有疑问,点击我加群,为你提供最好的解答。


工具导航地图