Redis集群搭建

Redis集群搭建实践篇

Posted by BY annie dong on September 10, 2017

这已经是老话题了,实践…


安装redis

MAC: brew intall redis

创建节点

Redis支持集群最小的单位为6个实例,3个主节点,3个从节点

  1. 找到redis.conf目录
  2. mkdir /usr/local/redis_cluster
  3. cd /usr/local/redis_cluster
  4. mkdir 7000 7001 7002 7003 7004 7005
  5. 复制redis.config到集群:
    cp redis.conf /usr/local/redis_cluster/7000
    cp redis.conf /usr/local/redis_cluster/7001
    cp redis.conf /usr/local/redis_cluster/7002
    cp redis.conf /usr/local/redis_cluster/7003
    cp redis.conf /usr/local/redis_cluster/7004
    cp redis.conf /usr/local/redis_cluster/7005
    
  6. vim /usr/local/redis_cluster/7000, 修改redis.conf
    port                  7000                        //端口7000,7002,7003        
    bind                  本机ip                      //默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
    daemonize             yes                         //redis后台运行
    pidfile               /var/run/redis_7000.pid     //pidfile文件对应7000,7001,7002
    cluster-enabled       yes                         //开启集群,把注释#去掉
    cluster-config-file   nodes_7000.conf             //集群的配置,配置文件首次启动自动生成 7000,7001,7002
    cluster-node-timeout  15000                       //请求超时,默认15秒,可自行设置
    appendonly            yes                         //aof日志开启,有需要就开启,它会每次写操作都记录一条日志 
    
  7. 启动redis:
    redis-server /usr/local/redis_cluster/7000/redis.conf
    redis-server /usr/local/redis_cluster/7001/redis.conf
    redis-server /usr/local/redis_cluster/7002/redis.conf
    redis-server /usr/local/redis_cluster/7003/redis.conf
    redis-server /usr/local/redis_cluster/7004/redis.conf
    redis-server /usr/local/redis_cluster/7005/redis.conf
    
  8. 检查所有启动的redis:
    ps -ef | grep redis
      510 88153     1   0 10:29AM ??         0:02.43 redis-server 127.0.0.1:7000 [cluster]
      510 88157     1   0 10:29AM ??         0:02.45 redis-server 127.0.0.1:7001 [cluster]
      510 88160     1   0 10:29AM ??         0:02.44 redis-server 127.0.0.1:7003 [cluster]
      510 88163     1   0 10:29AM ??         0:02.44 redis-server 127.0.0.1:7002 [cluster]
      510 88166     1   0 10:29AM ??         0:02.43 redis-server 127.0.0.1:7004 [cluster]
      510 88170     1   0 10:29AM ??         0:02.46 redis-server 127.0.0.1:7005 [cluster]
    

准备集群运行环境,安装ruby & redis gem

  1. brew intall ruby
  2. gem install redis

搭建集群

  1. github上redis源码 中的 src/redis-trib.rb 下载下来
  2. 启动集群
    > redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    127.0.0.1:7000
    127.0.0.1:7001
    127.0.0.1:7002
    Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
    Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
    Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 127.0.0.1:7000
    slots:0-5460 (5461 slots) master
    M: 0f7e82858c0c5d97e84f879355c23296c762164d 127.0.0.1:7001
    slots:5461-10922 (5462 slots) master
    M: b736c44b26ccd082db034cf2c15c5f096b723da3 127.0.0.1:7002
    slots:10923-16383 (5461 slots) master
    S: 2e00e2a22b884d529b10e1bc0cb486c864460a28 127.0.0.1:7003
    replicates b736c44b26ccd082db034cf2c15c5f096b723da3
    S: a9ae205db711e564eb26068fbe6ad6cf8dea8f78 127.0.0.1:7004
    replicates 7475b059da1b7e21bcc0c2451aa8525d3f3feb63
    S: d1b2014342b132f111652debab6ddee6c2768828 127.0.0.1:7005
    replicates 0f7e82858c0c5d97e84f879355c23296c762164d
    Can I set the above configuration? (type 'yes' to accept): yes
    >>> Nodes configuration updated
    >>> Assign a different config epoch to each node
    >>> Sending CLUSTER MEET messages to join the cluster
    Waiting for the cluster to join...
    >>> Performing Cluster Check (using node 127.0.0.1:7000)
    M: 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 127.0.0.1:7000
    slots:0-5460 (5461 slots) master
    1 additional replica(s)
    M: 0f7e82858c0c5d97e84f879355c23296c762164d 127.0.0.1:7001
    slots:5461-10922 (5462 slots) master
    1 additional replica(s)
    S: d1b2014342b132f111652debab6ddee6c2768828 127.0.0.1:7005
    slots: (0 slots) slave
    replicates 0f7e82858c0c5d97e84f879355c23296c762164d
    M: b736c44b26ccd082db034cf2c15c5f096b723da3 127.0.0.1:7002
    slots:10923-16383 (5461 slots) master
    1 additional replica(s)
    S: 2e00e2a22b884d529b10e1bc0cb486c864460a28 127.0.0.1:7003
    slots: (0 slots) slave
    replicates b736c44b26ccd082db034cf2c15c5f096b723da3
    S: a9ae205db711e564eb26068fbe6ad6cf8dea8f78 127.0.0.1:7004
    slots: (0 slots) slave
    replicates 7475b059da1b7e21bcc0c2451aa8525d3f3feb63
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    

检查集群是否运行正常

> redis-cli -h 127.0.0.1 -c -p 7002
127.0.0.1:7002> set test abc
-> Redirected to slot [6918] located at 127.0.0.1:7001
OK
127.0.0.1:7001>
redis-cli -h 127.0.0.1 -c -p 7005
127.0.0.1:7005> get test
-> Redirected to slot [6918] located at 127.0.0.1:7001
"abc"
127.0.0.1:7001>

redis-trib 集群工具

redis-trib.rb 还提供很多功能

> redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>

  create          host1:port1 ... hostN:portN
                  --replicas <arg>
  check           host:port
  info            host:port
  fix             host:port
                  --timeout <arg>
  reshard         host:port
                  --from <arg>
                  --to <arg>
                  --slots <arg>
                  --yes
                  --timeout <arg>
                  --pipeline <arg>
  rebalance       host:port
                  --weight <arg>
                  --auto-weights
                  --use-empty-masters
                  --timeout <arg>
                  --simulate
                  --pipeline <arg>
                  --threshold <arg>
  add-node        new_host:new_port existing_host:existing_port
                  --slave
                  --master-id <arg>
  del-node        host:port node_id
  set-timeout     host:port milliseconds
  call            host:port command arg arg .. arg
  import          host:port
                  --from <arg>
                  --copy
                  --replace
  help            (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
> redis-trib.rb check 127.0.0.1:7005
>>> Performing Cluster Check (using node 127.0.0.1:7005)
S: d1b2014342b132f111652debab6ddee6c2768828 127.0.0.1:7005
   slots: (0 slots) slave
   replicates 0f7e82858c0c5d97e84f879355c23296c762164d
M: 7475b059da1b7e21bcc0c2451aa8525d3f3feb63 127.0.0.1:7000
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: a9ae205db711e564eb26068fbe6ad6cf8dea8f78 127.0.0.1:7004
   slots: (0 slots) slave
   replicates 7475b059da1b7e21bcc0c2451aa8525d3f3feb63
S: 2e00e2a22b884d529b10e1bc0cb486c864460a28 127.0.0.1:7003
   slots: (0 slots) slave
   replicates b736c44b26ccd082db034cf2c15c5f096b723da3
M: 0f7e82858c0c5d97e84f879355c23296c762164d 127.0.0.1:7001
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: b736c44b26ccd082db034cf2c15c5f096b723da3 127.0.0.1:7002
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

redis集群的关闭与启动

  1. touch ~/bin/redis-start-all
  2. vim ~/bin/redis-all加入内容
#!/bin/sh
redisAllStop(){
  echo "stopping all redis..."
  pkill -9 redis
  echo "stopped all redis"
}

redisAllStart() {
  echo "starting all redis..."
  redis-server /usr/local/redis_cluster/7000/redis.conf
  echo "started redis 127.0.0.1:7000"
  redis-server /usr/local/redis_cluster/7001/redis.conf
  echo "started redis 127.0.0.1:7001"
  redis-server /usr/local/redis_cluster/7002/redis.conf
  echo "started redis 127.0.0.1:7002"
  redis-server /usr/local/redis_cluster/7003/redis.conf
  echo "started redis 127.0.0.1:7003"
  redis-server /usr/local/redis_cluster/7004/redis.conf
  echo "started redis 127.0.0.1:7004"
  redis-server /usr/local/redis_cluster/7005/redis.conf
  echo "started redis 127.0.0.1:7005"
}

if [ -n $1 ]&&[ "$1" == "stop" ]
then
  redisAllStop
  exit
fi
if [ -n $1 ]&&[ "$1" == "start" ]
then
  redisAllStart
  exit
fi    
  1. redis-all start开启集群, redis-all stop 关闭集群

多台node上redis集群

这个例子都是在一台node上搭建的,如果你需要在多个node上搭建,只需要把redis.config里面bind的本机ip变成所有node可以通讯的ip, 然后在每台node上启动对应的redis实例,最后在其中一台node上通过redis-trib create来创建集群就可以了