Linux上安装Redis并搭建集群

在搭建redis集群时遇到了几个莫名其妙的错误,记录一下html

1.安装Redis

(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).启动

      

2.搭建Redis集群   

   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'

实例:

借一张图说话: