在搭建redis集群时遇到了几个莫名其妙的错误,记录一下
(1).安装redist需要安装支持包,yum install gcc-c++
(2).redis安装包采取的是在线wget下载.若wget命令不存在,执行 yum -y install wget安装
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
(3).解压在当前目录(我的是家目录)
[root@admin ~]# tar -zxvf redis-4.0.9.tar.gz
(4).编译并安装 (redis安装程序是c语言编写,需要编译转换后才能安装)
[root@admin redis-4.0.9]# make && make PREFIX=/usr/local/redis install
--->1).&&连接两个命令,前面命令的返回值决定是否执行后面的命令
--->2).PREFIX(注意:大写)指定安装目录,若目录不存在,则自动创建
(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、1、2、3……16382、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'
借一张图说话: