项目学习记录-Redis集群搭建以及所遇到的问题

单个redis的安装与启动:项目学习记录-Redis的安装与启动
以及redis的数据类型与存储指令:项目学习记录-缓存数据类型与持久化

Redis集群

有多个redis节点构成的缓存结构。每个节点通过ping-pong机制通信,客户端只需要连上集群中的任意一个节点即可。

且每个redis节点的缓存数据都不相同,也不同担心其中一个节点蹦掉的问题。redis允许设置备份节点,来防止节点崩塌的问题。而且,redis集群存在通票容错机制确保redis节点不被误认为挂了,即当redis集群中,超过半数的节点ping某个节点不通时,才会认为该节点崩塌。

slot : 槽
redis集群一共有16384个哈希槽,redis cluster会根据节点的数量和服务器的性能分配这些槽,使得相应的槽负责相关的节点。即当客户端需要缓存数据时,cluster会拿缓存数据的key根据CRC16算法生成一个数值,再将这个数值对16384取余,得到的一个槽值,这个值就决定这个缓存数据会被缓存到哪个redis节点。

例如:
server1的槽为:0-5000
server2的槽为:5001-1000
server3的槽为:10001-16383
hello的key根据crc16算法的到数值对16384取余得500,所以存放到server1.
同理,hello2存放到server3.

集群的搭建

为了实现投票容错机制,且每个节点至少有一个备份节点。所以我们总共需要6个redis节点。
根据项目学习记录-Redis的安装与启动,我们已经存在一个单机版的redis节点。

  1. 将bin目录拷贝,并修改名字

    cp -rf bin redis01
  2. 修改其中热redis.conf配置
    – cluster-enabled为yes;
    – port为7001;
    – bind: [redis所在服务器IP] 127.0.0.1
    eg bind:192.168.25.133 127.0.0.1

  3. 创建redis-cluster目录,并将redis01复制六份,分别改名为redis01-06

    cp -rf redis01 redis06

    并修改每个文件中的redis.conf的port分别为7001-7006

  4. 再在redis-cluster目录下创建批处理启动多个redis

    vim start-all.sh
    cd redis01
    ./redis-server redis.conf
    cd ..
    cd redis02
    ./redis-server redis.conf
    cd ..
    cd redis03
    ./redis-server redis.conf
    cd ..
    cd redis04
    ./redis-server redis.conf
    cd ..
    cd redis05
    ./redis-server redis.conf
    cd ..
    cd redis06
    ./redis-server redis.conf

    然后 esc : wq 保存退出。

  5. 添加start-all的当前用户可执行权限

    chmod  u+x  start-all.sh
  6. 启动并检查
    – 启动 ./start-all.sh
    – 检查 ps -ef|grep reids
    项目学习记录-Redis集群搭建以及所遇到的问题_第1张图片

  7. 接着使用ruby脚本搭建集群
    i. 先进入redis的源代码目录,将后缀为rb的文件复制到redis-clustser中。
    这就是一个ruby的脚本,需要ruby的环境才能执行。

    ii. 先安装ruby环境
    yum install ruby
    yum install rubygems
    在安装第三方包,redis-3.0.0.gem
    gem install redis-3.0.0.gem
    【该命令会把gem安装到redis中】

    iii. 执行该脚本。
    进入redis-cluster目录,执行命令
    ./redis-trib.rb create –replicas 1 192.168.25.153:7001 192.168.25.153:7002 192.168.25.153:7003 192.168.25.153:7004 192.168.25.153:7005 192.168.25.153:7006
    relicas参数会根据后面的1计算:每个节点一个备份机的方式去分槽
    PS:其中ip按照你redis.conf配置的bind来。
    中间输入yes.
    项目学习记录-Redis集群搭建以及所遇到的问题_第2张图片
    三个M为主机,三个S为备份机。slot为所分他们的槽。
    【关闭防火墙:因为redis除了用到了你看到的这些7001-7006的端口还有用到了17001-17006的端口】

遇到的问题

  • 问题1:

在执行rb时: ./redis-trib.rb……
报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in
`call’: ERR Slot 0 is already busy (Redis::CommandError)

slot插槽被占用了(这是搭建集群前时,以前redis的旧数据和配置信息没有清理干净。)
解决方案是:
用redis-cli 登录到每个节点执行 flushall 和 cluster reset 就可以了。
./redis-cli.sh -h ip -p port (更换IP)

  • 问题2:

bind 参数
开始看了很多博文之类的,有说直接配置0.0.0.0(这个可以连接,但是会接受所以的连接请求,不安全)。
有说是需要绑定请求端的IP地址, 这个完全就连不上了。

自己试了才知道,正确的是配置redis所在服务器的IP地址。 如果服务器有客户端需要连此redis的话,要加配上127.0.0.1

bind redis服务端所在IP 127.0.0.1

其实还碰到了一些琐碎的问题,有的解决了,有的还没有解决。。很奇怪

  • 有一个属于网络问题,有一个虚拟机,能ping同其他虚拟机,也能ping通网关,但是其他虚拟机ping不通他,网络连接方式是使用NAT,也确定关了防火墙。

  • 在执行./redis-trib.rb……时,一直停在waiting for the cluster to join………..
    我查了,说是没有关防火墙的原因,可是确实都关了,用的ubuntu服务器,现在换成centos就可以了。

  • 还有开始在安装redis时,执行以下指令时,
    make install PREFIX=/usr/redis/
    报错:

    [root@bogon redis-3.2.11]# make install PREFIX =/usr/redis
    make: * empty variable name. Stop.
    原来是指令中间多了个空格 - -!

    make install PREFIX=/usr/redis

基本上就是这样了,其中bind这个配置着实是被误导的很久,试了很多都连不上!

总体上,觉得还是需要再细心些。

你可能感兴趣的:(JAVA,Redis,Project,Note)