一、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
弹出如下命令即安装成功
2、创建节点目录
mkdir /usr/local/redis-cluster 在/usr/local目录下创建redis-cluster用来存储节点信息
mkdir /usr/local/redis-cluster/ 7000 在redis-cluster下以次创建7000-7005
mkdir /usr/local/redis-cluster/ 7001
mkdir /usr/local/redis-cluster/ 7002
mkdir /usr/local/redis-cluster/ 7003
mkdir /usr/local/redis-cluster/ 7004
mkdir /usr/local/redis-cluster/ 7005
mkdir /usr/local/redis-cluster/ conf 创建conf文件夹用来存储配置文件
mkdir /usr/local/redis-cluster/ log 创建log文件夹用来存储log文件
创建成功后如下
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"
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实例的启动情况,正常启动如下图
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
再执行创建命令,成功,如下:
输入yes,完成配置。如下图
至此,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中文就是集群的意思。
查看哪些节点是master,哪些节点是slave,主从关系,以及每个节点有多少个slot(槽)
除了check参数外,还有一个常用的参数info,命令如下
./redis-trib.rb info 127.0.0.1:7000
它会把所有的master信息输出,包括这个master上有几个缓存key,有几个slave,所有master上的keys合计,以及平均每个slot上有多少个key,想要了解更多redis-trib脚本的其他参数,可以用
./redis-trib.rb help
上面已经多次出现了slot,解释一下这个的概念
如上图,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执行
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节点。