在搭建redis集群时遇到了几个莫名其妙的错误,记录一下html
(1).安装redist须要安装支持包,yum install gcc-c++前端
(2).redis安装包采起的是在线wget下载.若wget命令不存在,执行 yum -y install wget安装 java
wget http://download.redis.io/releases/redis-4.0.9.tar.gz node
(3).解压在当前目录(个人是家目录)c++
[root@admin ~]# tar -zxvf redis-4.0.9.tar.gz redis
(4).编译并安装 (redis安装程序是c语言编写,须要编译转换后才能安装)算法
[root@admin redis-4.0.9]# make && make PREFIX=/usr/local/redis installvim
--->1).&&链接两个命令,前面命令的返回值决定是否执行后面的命令后端
--->2).PREFIX(注意:大写)指定安装目录,若目录不存在,则自动建立centos
(5).复制配置文件并修改
复制安装包下 redis.conf 到 目录/usr/local/redis下,并更名 6379.conf (改不改没影响)
vim 6379.conf
修改: bind 127.0.0.1 ---->bind 本身ip
daemonize no no---->yes
protected-mode yes yes---->no
(6).修改下启动脚本
#chkconfig 2345 10 90 添加对chkconfig的支持,2345表示服务容许启动的级别是2,3,4,5;10和90用于设置服务的启动顺序和关闭顺序。数值小的先执行,数值大的后执行。取值范围在0~99.
EXEC和CLIEXEC分别表示redis服务器后端启动和前端启动的应用程序路径。CONF指的是程序配置文件的路径
(7).配置环境变量并开启redis防火墙端口
(8).启动
1.建立集群节点文件目录
在/usr/local/redis-cluster目录下建立 7001 7002 7003 7004 7005 7006目录文件
mkdir 7001 7002 7003 7004 7005 7006
2.复制配置文件
从已经安装的redis中,复制redis.conf文件到上面的6个文件目录
cp redis.conf /usr/local/redis-cluster/7001/7001.conf
修改redis配置文件
同理,同上修改其余文件夹的节点配置文件 (也能够复制解压缩文件中的src下面的7个启动文件到/usr/local/redis-cluster/bin目录中, 之后能够在bin目录中启动)
3.各个节点配置完成,开始启动服务
启动服务用的是redis解压包下的src目录中的redis-server启动
4.执行redis的建立集群命令建立集群(注意ip地址和端口号)
启动集群用的是 redis解压包下的src目录中的 redis-trib.rb启动
运行建立命令,你会发现报错,提示须要安装ruby相关的内容
5.安装ruby相关环境和包
(1).安装ruby环境
yum install ruby
yum install rubygems
(2).安装ruby包 (在这步,遇到了各类的坑)
安装命令: gem install redis
报错: redis requires Ruby version >= 2.2.2的报错,查了资料发现是Centos默认支持 ruby 到 2.0.0,可 gem 安装redis须要最低是2.2.2
查找相关的解决方案,大部分是这样解决的—> 解决方案 ,好吧,运行这种解决方案,在执行安装命令rvm install 2.3.3时,报错:No fallback URL could be found, try increasing timeout with: 找了 网上的各类相 关的解决方案,依旧报这个错误,因而放弃这种解决方案。
找到一篇博文,是直接下载安装包进行安装 —>https://blog.whsir.com/post-2659.html (可行)
执行的命令:
① 卸载当前ruby(当前使用centos系统)
yum remove ruby
② 下载ruby稳定版
cd /usr/local/rvm/rubies
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
③ 安装ruby
tar zxvf ruby-2.5.1.tar.gz
cd ruby-2.5.1
./configure --prefix=/usr/local/rvm
make && make install
④ 查看安装后的版本
/usr/local/rvm/bin/ruby -v
⑤ 镜像加速
此时使用gem install redis不会报错了,可是你会发现很慢,为了更快速的安装,这里使用国内的镜像(https://gems.ruby-china.com/) 执行若报错,https改成http
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/
gem sources -l
出现异常:/usr/bin/gem: No such file or directory
解决方案:ln -s /usr/local/rvm/bin/gem /usr/bin/gem
⑥ 安装
gem install redis
6. 再次执行建立集群的命令
./redis-trib.rb create --replicas 1 10.0.192.64:7001 10.0.192.64:7002 10.0.192.64:7003 10.0.192.64:7004 10.0.192.64:7005 10.0.192.64:7006
建立集群命令中 --replicas 1,1其实表明的是一个比例,就是主节点数/从节点数的比例。slot对于Redis集群而言,一个存放数据的地方,对应一个槽。对于每个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master能够读、写,而Slave只读。数据的写入,其实是分布的存储在slot中。
7.数据测试
登陆集群客户端,-c标识以集群方式登陆
redis-cli -h 10.0.192.64 -p 7001 -c
redis cluster在设计的时候,就考虑到了去中心化,去中间件,也就是说,集群中的每一个节点都是平等的关系,都是对等的,每一个节点都保存各自的数据和整个集群的状态。每一个节点都和其余全部节点链接,并且这些链接保持活跃,这样就保证了咱们只须要链接集群中的任意一个节点,就能够获取到其余节点的数据。
Redis集群并无使用传统的一致性哈希来分配数据,而是采用另一种叫作哈希槽(hash slot)的方式来分配的,一致性哈希对向集群中新增和删除实例的支持很好,可是哈希槽对向集群新增实例或者删除实例的话,须要额外的操做,须要手动的将slot从新平均的分配到新集群的实例中。
Redis 集群会把数据存在一个master节点,而后在这个master和其对应的salve之间进行数据同步。当读取数据时,也根据一致性哈希算法到对应的master节点获取数据。只有当一个master 挂掉以后,才会启动一个对应的salve节点,充当master。
须要注意的是:必需要3个或以上的主节点,不然在建立集群时会失败,而且当存活的主节点数小于总节点数的一半时,整个集群就没法提供服务了。
Redis Cluster中有一个16384长度的槽的概念,他们的编号为0、一、二、3……1638二、16383。这个槽是一个虚拟的槽,并非真正存在的。正常工做的时候,Redis Cluster中的每一个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪一个Master节点负责哪一个槽,这是能够由用户指定的,也能够在初始化的时候自动生成(redis-trib.rb脚本)。这里值得一提的是,在Redis Cluster中,只有Master才拥有槽的全部权,若是是某个Master的slave,这个slave只负责槽的使用,可是没有全部权。
8.集群添加节点
将7001文件 复制一份改成7007,而后修改7007.conf文件端口号也改成7007。redis实例添加到集群以前,必定要确保这个redis实例没有存储过数据,也不能持久化的数据文件,不然在添加的时候会报错的!
# ./redis-trib.rb add-node new_ip:new_port exist_ip:exist_port ./redis-trib.rb add-node 10.0.192.64:7008 10.0.192.64:7007
进入任意节点执行 cluster nodes 命令,能够看到7007已经做为主节点添加到集群中了,可是没有分配哈希槽,没有分配哈希槽表示没有存储数据的能力。
从新分配哈希槽
# ./redis-trib.rb reshard new_ip:new_port ./redis-trib.rb reshard 10.0.192.64:7007
9.集群删除节点(添加节点反着执行)
将节点中的哈希槽从新分配(主节点有这步)
删除节点
./redis-trib.rb del-node ip:port 'node-id'
实例:
借一张图说话: