Linux上安装Redis并搭建集群

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

1.安装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).修改下启动脚本 

              Linux上安装Redis并搭建集群_第1张图片  

 Linux上安装Redis并搭建集群_第2张图片

 

#chkconfig 2345 10 90  添加对chkconfig的支持,2345表示服务允许启动的级别是2,3,4,5;10和90用于设置服务的启动顺序和关闭顺序。数值小的先执行,数值大的后执行。取值范围在0~99.

EXEC和CLIEXEC分别表示redis服务器后端启动和前端启动的应用程序路径。CONF指的是程序配置文件的路径       

(7).配置环境变量并开启redis防火墙端口  

(8).启动

   Linux上安装Redis并搭建集群_第3张图片   

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配置文件

         Linux上安装Redis并搭建集群_第4张图片

同理,同上修改其他文件夹的节点配置文件 (也可以复制解压缩文件中的src下面的7个启动文件到/usr/local/redis-cluster/bin目录中, 以后可以在bin目录中启动)

    3.各个节点配置完成,开始启动服务

Linux上安装Redis并搭建集群_第5张图片

启动服务用的是redis解压包下的src目录中的redis-server启动

Linux上安装Redis并搭建集群_第6张图片

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

Linux上安装Redis并搭建集群_第7张图片

Linux上安装Redis并搭建集群_第8张图片

创建集群命令中 --replicas 1,1其实代表的是一个比例,就是主节点数/从节点数的比例。slot对于Redis集群而言,一个存放数据的地方,对应一个槽。对于每一个Master而言,会存在一个slot的范围,而Slave则没有。在Redis集群中,依然是Master可以读、写,而Slave只读。数据的写入,实际上是分布的存储在slot中。

7.数据测试

        登录集群客户端,-c标识以集群方式登录

        redis-cli -h 10.0.192.64 -p 7001 -c

Linux上安装Redis并搭建集群_第9张图片

 

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

Linux上安装Redis并搭建集群_第10张图片

进入任意节点执行 cluster nodes 命令,可以看到7007已经作为主节点添加到集群中了,但是没有分配哈希槽,没有分配哈希槽表示没有存储数据的能力。

Linux上安装Redis并搭建集群_第11张图片

重新分配哈希槽

# ./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'

实例:

借一张图说话:

 

你可能感兴趣的:(Linux)