Redis集群环境搭建-cluster模式

一、Redis的集群方式使用slaveof命令和哨兵模式,会产生中心化的问题,即客户端所有的写请求都由master节点处理,并且master节点只有一个,这个节点处理了写请求和复制数据到slave节点的功能,致使master节点很容易崩溃掉,最好的方式就是使用多个master节点来搭建集群。

二、

1、安装Redis

将redis-3.2.1.tar.gz安装包放到 /usr/local目录下

tar -zxvf redis-3.2.1.tar.gz         解压安装包

ll                                                    查看解压出的Redis文件夹

cd redis-3.2.1/                             进入解压出的Redis文件夹

make                                            编译

cd src/                                           进入src目录

make install                                 安装Redis

弹出如下命令即安装成功

Redis集群环境搭建-cluster模式_第1张图片

2、创建节点目录

mkdir /usr/local/redis-cluster                       在/usr/local目录下创建redis-cluster用来存储节点信息

mkdir /usr/local/redis-cluster7000            在redis-cluster下以次创建7000-7005

mkdir /usr/local/redis-cluster7001

mkdir /usr/local/redis-cluster7002

mkdir /usr/local/redis-cluster7003

mkdir /usr/local/redis-cluster7004

mkdir /usr/local/redis-cluster7005

mkdir /usr/local/redis-clusterconf              创建conf文件夹用来存储配置文件

mkdir /usr/local/redis-clusterlog                 创建log文件夹用来存储log文件

创建成功后如下

Redis集群环境搭建-cluster模式_第2张图片

3、编辑配置文件

在conf目录下新建redis-base.conf配置文件,这个是6个redis都用到的且相同的配置,故抽离出来了,这个文件是redis安装目录下的redis.conf的备份,将每个节点的配置文件中的配置项都删除掉或注释掉了,这样让这些配置项只在节点的配置文件中进行配置。最后,修改# cluster-enabled yes,去掉注释#,开启集群;修改daemonize no为yes,开启守护进程,使redis在后台运行;注释bind配置,要不然在宿主机使用jedis客户端连接虚拟机上的redis集群失败,修改protected-mode配置为no,否则需要配置连接密码,并每次连接的时候都需要在代码里设置上密码,这样配置则不需要了,可直接用宿主机访问redis集群。

在conf目录下新建redis-7000.conf配置文件,内容如下

include /usr/local/redis-cluster/conf/redis-base.conf
pidfile /usr/local/redis-cluster/7000/redis-7000.pid
port 7000
dbfilename dump-7000.rdb
dir /usr/local/redis-cluster/7000
cluster-config-file nodes-7000.conf
appendfilename "appendonly-7000.aof"

同样新建7001.conf-7005.conf文件,只不过将7000都换成对应内容。

4、依次开启6个redis实例

进入到redis的安装目录

cd /usr/local/redis-3.2.1/src/

启动7000 Redis实例

./redis-server /usr/local/redis-cluster/conf/redis-7000.conf 

依次启动其他5个实例

[root@livecd src]# cd /usr/local/redis-3.2.1/src/
[root@livecd src]# ./redis-server /usr/local/redis-cluster/conf/redis-7000.conf 
[root@livecd src]# ./redis-server /usr/local/redis-cluster/conf/redis-7001.conf 
[root@livecd src]# ./redis-server /usr/local/redis-cluster/conf/redis-7002.conf 
[root@livecd src]# ./redis-server /usr/local/redis-cluster/conf/redis-7003.conf 
[root@livecd src]# ./redis-server /usr/local/redis-cluster/conf/redis-7004.conf 
[root@livecd src]# ./redis-server /usr/local/redis-cluster/conf/redis-7005.conf

使用ps -ef | grep redis命令查看6个redis实例的启动情况,正常启动如下图

Redis集群环境搭建-cluster模式_第3张图片

5、执行集群创建命令,创建集群

进入到redis的安装目录

cd /usr/local/redis-3.2.1/src/

创建Redis集群

./redis-trib.rb  create --replicas 1 192.168.186.128:7000 192.168.186.128:7001 192.168.186.128:7002 192.168.186.128:7003 192.168.186.128:7004 192.168.186.128:7005

很多帖子中使用下面的命令

./redis-trib.rb  create --replicas 1 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

虽然这个命令确实可以在本地创建成功集群,但是!!!这样做会致使宿主机使用Jedis连接虚拟机的集群时,报错:Too many cluster redirections redis。把这个命令中的ip换成虚拟机的IP就可以成功避免这个错误!!

报错:/usr/bin/env: ruby: No such file or directory 意思是没有安装ruby模块,那就安装上ruby模块(这样的安装方式需要网络能,要不然长时间没反应,网络畅通的话,1分钟就安装上了)

yum install ruby

再执行创建命令,报错:
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24 意思是缺少提示缺少rubygems组件,使用yum安装

yum install rubygems

再执行创建命令,报错:
/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 意思是缺少redis和ruby接口,使用gem安装

 gem install redis

再执行创建命令,成功,如下:

Redis集群环境搭建-cluster模式_第4张图片

输入yes,完成配置。如下图

Redis集群环境搭建-cluster模式_第5张图片

至此,6个Redis的集群环境搭建成功。从上面的输出看,7000是master对应的slave是7003,7001是master对应的slave是7004,7002是master对应的slave是7005。解释一下创建集群的命令 replicas 1 的意思是,为每个节点创建一个副本(即:slave),这就导致了形成了3个master和3个slave。另外,利用redis-trib创建cluster的操作,只需要一次即可,假设系统关机,把所有6个节点全都关闭后,下次重启后,即自动进入cluster模式,不用再使用redis-trib.rb create。

使用ps -ef | grep redis 查看集群运行情况,会发现最后面会多了cluster的标注,cluster中文就是集群的意思。

Redis集群环境搭建-cluster模式_第6张图片

进入到redis的安装目录的src目录/usr/local/redis-3.2.1/src执行
./redis-trib.rb check 127.0.0.1:7000
Redis集群环境搭建-cluster模式_第7张图片

查看哪些节点是master,哪些节点是slave,主从关系,以及每个节点有多少个slot(槽)

除了check参数外,还有一个常用的参数info,命令如下

./redis-trib.rb info 127.0.0.1:7000

Redis集群环境搭建-cluster模式_第8张图片

它会把所有的master信息输出,包括这个master上有几个缓存key,有几个slave,所有master上的keys合计,以及平均每个slot上有多少个key,想要了解更多redis-trib脚本的其他参数,可以用

./redis-trib.rb help

上面已经多次出现了slot,解释一下这个的概念

Redis集群环境搭建-cluster模式_第9张图片

如上图,redis-cluster把整个集群的存储空间划分为16384个slot(译为:插槽?),当6个节点分为3主3从时,相当于整个cluster中有3组HA的节点,3个master会平均分摊所有slot,每次向cluster中的key做操作时(比如:读取/写入缓存),redis会对key值做CRC32算法处理,得到一个数值,然后再对16384取模,通过余数判断该缓存项应该落在哪个slot上,确定了slot,也就确定了保存在哪个master节点上,当cluster扩容或删除节点时,只需要将slot重新分配即可(即:把部分slot从一些节点移动到其它节点)。

6、redis-cli客户端操作

进入到redis的安装目录的src目录/usr/local/redis-3.2.1/src执行

./redis-cli -c -h localhost -p 7000
参数-c,表示进入cluster模式,添加一个缓存:
localhost:7000> set user1 jimmy
-> Redirected to slot [8106] located at 127.0.0.1:7001
OK
127.0.0.1:7001> 
从第二行的输出,可以看出user1这个缓存通过计算后,落在了8106这个slot上,并且这个slot属于7001这个master节点。
至此,咱们的redis集群就介绍完毕。

你可能感兴趣的:(Redis)