Linux系统5分钟快速搭建redis集群

  • 单个redis安装
    # 下载redis4.0.10
    wget http://download.redis.io/releases/redis-4.0.10.tar.gz
    # 解压(解压后生成目录redis-4.0.10)
    solid@test1:~/fyj$ tar zxvf redis-4.0.10.tar.gz
    
    # 使用cd命令进入到redis-4.0.10文件夹下
    # 执行make命令
    solid@test1:~/fyj/redis/redis-4.0.10$ make
    
    # 将redis安装到/home/solid/fyj/redis文件夹下 成功后该文件夹下会生成bin目录
    solid@test1:~/fyj/redis/redis-4.0.10$ PREFIX=/home/solid/fyj/redis make install
    
    # 安装成功后 默认安装文件夹/home/solid/fyj/redis下会生成redis.conf文件 如果没有则从解压后的redisredis-4.0.10拷贝出来
    # redis.conf文件内容
    ###
    bind 172.16.10.29
    port 7000
    daemonize yes # 设置是否后台启动 Redis,默认no,正常都需要以服务形式启动 Redis,所以这里设置为yes。
    appendonly yes  #开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中
    appendfsync always  #每次有写操作的时候都同步
    logfile /data/redis/logs/redis.log #redis服务日志
    pidfile /var/run/redis_7000.pid  #pidfile文件对应7000,7001,7002
    ###
    
    # 启动redis服务,根据/home/solid/fyj/redis/redis.conf的配置
    solid@test1:~/fyj/redis/bin$ ./redis-server /home/solid/fyj/redis/redis.conf 
    # 测试服务是否开启成功
    netstat -anp | grep 7000
    
    # 测试redis是否可用
    solid@test1:~/fyj/redis/bin$ ./redis-cli -h 172.16.10.29 -p 7000
    172.16.10.29:7000> set name fyj
    OK
    172.16.10.29:7000> get name
    "fyj"
    172.16.10.29:7000> 
    
    # 关闭redis服务
    solid@test1:~/fyj/redis/bin$ ./redis-cli -h 172.16.10.29 -p 7000 shutdown
    # 测试服务是否关闭
    netstat -anp | grep 7000
    # 通过 netstat 可以看出来端口已经是TIME_WAIT状态了
  • redis集群
    #同一个服务器创建六个节点,模拟集群 端口号为7001-1006
    # 建立如下目录结构:
    solid@test1:~/fyj/redis/bin$ mkdir -p /home/solid/fyj/redis/redis-cluster/{7001,7002,7003,7004,7005,7006}
    # 分别进入每个端口目录创建配置文件:
    cd /home/solid/fyj/redis/redis-cluster/7001 && touch redis.conf
    
    # 端口7001-7006与目录对应
    port 7001   
    #默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群
    bind 172.16.10.29 
    #redis后台运行
    daemonize yes   
    #开启集群
    cluster-enabled yes  
    #集群的配置,配置文件首次启动自动生成 7001-7006  
    cluster-config-file /home/solid/fyj/redis/conf/nodes_7001.conf  
    #请求超时,默认15秒,可自行设置
    cluster-node-timeout 8000
    #开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中
    appendonly yes  
    #每次有写操作的时候都同步
    appendfsync always  
    #redis服务日志
    logfile /home/solid/fyj/redis/logs/redis.log
    #pidfile文件对应7001-7006
    pidfile /var/run/redis_7001.pid  
    
    #redis.conf文件内容
    ###
    port 7001
    bind 172.16.10.29
    daemonize yes
    cluster-enabled yes
    cluster-config-file /home/solid/fyj/redis/conf/nodes_7001.conf
    cluster-node-timeout 8000
    appendonly yes
    appendfsync always
    logfile /home/solid/fyj/redis/logs/redis.log
    pidfile /var/run/redis_7001.pid  
    ###
    
    # 可以在每个服务器上写一个启动脚本start-redis.sh:
    for((i=1;i<=6;i++)); 
    do /home/solid/fyj/redis/bin/redis-server /home/solid/fyj/redis/redis-cluster/700$i/redis.conf; 
    done
    
    #关闭服务脚本shutdown-redis.sh
    for((i=1;i<=6;i++));
    do /home/solid/fyj/redis/bin/redis-cli -c -h 172.16.10.29 -p 700$i shutdown;
    done
    
    #如果脚本执行失败显示Permission denied,则执行命令chmod 777 start-redis.sh赋予权限
    solid@test1:~/fyj/redis/bin$ ./start-redis.sh 
    #六个服务开启成功
    
    #关闭六个服务
    solid@test1:~/fyj/redis/bin$ ./shutdown-redis.sh 
    
    #创建集群
    #注意:在任意一台上运行 不要在每台机器上都运行,一台就够了 
    #Redis 官方提供了 redis-trib.rb 这个工具,就在解压目录的 src 目录中 
    solid@test1:~/fyj/redis/redis-4.0.10/src$ cd /home/solid/fyj/redis/redis-4.0.10/src
    
    #--replicas  1 代表每个master有一个slave
    ./redis-trib.rb create --replicas 1 172.16.10.29:7001 172.16.10.29:7002 172.16.10.29:7003 172.16.10.29:7004 172.16.10.29:7005 172.16.10.29:7006
    
    #如果遇到一下错误
    rubygems: cannot load such file -- redis (LoadError)
    #解决:执行gem install redis命令
    solid@test1:~/fyj/redis/redis-4.0.10/src$ gem install redis
    
    # 如果遇到以下错误
    [ERR] Node 172.16.10.29:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
    # 解决:将每个节点进行flushdb
    solid@test1:~/fyj/redis/bin$ ./redis-cli -h 172.16.10.29 -p 7001
    172.16.10.29:7001> flushdb
    OK
    172.16.10.29:7001> quit
    每一个节点都执行一次
    
    # 敲完这个命令后会提示是否按照默认的推荐方式配置集群主从,一般选yes就行了
    # 推荐了3个masters,3个从节点
    >>> Creating cluster
    >>> Performing hash slots allocation on 6 nodes...
    Using 3 masters:
    172.16.10.29:7001
    172.16.10.29:7002
    172.16.10.29:7003
    Adding replica 172.16.10.29:7005 to 172.16.10.29:7001
    Adding replica 172.16.10.29:7006 to 172.16.10.29:7002
    Adding replica 172.16.10.29:7004 to 172.16.10.29:7003
    >>> Trying to optimize slaves allocation for anti-affinity
    [WARNING] Some slaves are in the same host as their master
    M: cee38fbe017b942fdaf4051316916fe4ee11b04f 172.16.10.29:7001
       slots:0-5460,5798 (5462 slots) master
    M: c162a6a6b507eeb669d673f83f85744b6d4c4b58 172.16.10.29:7002
       slots:5461-10922 (5462 slots) master
    M: f0e15582ec68375f521a90c455858d7bfe43f7c6 172.16.10.29:7003
       slots:5798,10923-16383 (5462 slots) master
    S: 17d2aeab147108bb94b9fd0809a74372b42d9ca0 172.16.10.29:7004
       replicates c162a6a6b507eeb669d673f83f85744b6d4c4b58
    S: 882a3f1568c7d973f013c810631b603fff94a63d 172.16.10.29:7005
       replicates f0e15582ec68375f521a90c455858d7bfe43f7c6
    S: ac13426a9c392ece56e71390c85b98d0d7e13e14 172.16.10.29:7006
       replicates cee38fbe017b942fdaf4051316916fe4ee11b04f
    Can I set the above configuration? (type 'yes' to accept): yes
    
    #如果遇到以下错误
    ERR Slot 5798 is already busy (Redis::CommandError)
    
    #解决:这是由于之前创建集群没有成功,需要将nodes.conf和dir里面的文件全部删除。
    find / -name "nodes-7001.conf"
    #将nodes-700*.conf文件删除,重启六个redis实例
    
    >>> 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 172.16.10.29:7001)
    M: 38ecd880fabbb6082e6d167828b827383a1bdb24 172.16.10.29:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: ad99c1a5c1887d719edcf20d57501744e2d0558b 172.16.10.29:7002
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: ab0fa7a0c6b807024f6a1411e1ef2565f74be8cb 172.16.10.29:7006
       slots: (0 slots) slave
       replicates 519420f386391cc5fa92f560d427ac632b15f41f
    M: 519420f386391cc5fa92f560d427ac632b15f41f 172.16.10.29:7003
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 99f3233040dadc18cf7f988e35d7ba7a1bcb338f 172.16.10.29:7005
       slots: (0 slots) slave
       replicates ad99c1a5c1887d719edcf20d57501744e2d0558b
    S: fca683c7397a370f574ceaf277a0094a87264309 172.16.10.29:7004
       slots: (0 slots) slave
       replicates 38ecd880fabbb6082e6d167828b827383a1bdb24
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    #至此,集群创建完成
    
    #参数 -C 可连接到集群
    solid@test1:~/fyj/redis/bin$ ./redis-cli -c -p 7001 -h 172.16.10.29
    172.16.10.29:7001> 
  • 集群添加一个主节点
    #我们新建两个服务,按照之前搭建的集群方式新增俩个节点:(一主一从 master、slave)。
    #Mater:7007 slave:7008
    #创建7007/7008文件夹。拷贝redis.conf文件到对于的7007,7008目录下 ,再进行修改配置文件。
    #启动7007和7008俩个服务并查看服务状态。
    
    #添加一个主节点
    # 步骤一:使用add-node命令:绿色为新增节点,红色为已知存在节点
    solid@test1:~/fyj/redis/redis-4.0.10/src$ ./redis-trib.rb add-node 172.16.10.29:7007 172.16.10.29:7001
    >>> Adding node 172.16.10.29:7007 to cluster 172.16.10.29:7001
    >>> Performing Cluster Check (using node 172.16.10.29:7001)
    M: 38ecd880fabbb6082e6d167828b827383a1bdb24 172.16.10.29:7001
       slots:0-5460 (5461 slots) master
       1 additional replica(s)
    M: ad99c1a5c1887d719edcf20d57501744e2d0558b 172.16.10.29:7002
       slots:5461-10922 (5462 slots) master
       1 additional replica(s)
    S: ab0fa7a0c6b807024f6a1411e1ef2565f74be8cb 172.16.10.29:7006
       slots: (0 slots) slave
       replicates 519420f386391cc5fa92f560d427ac632b15f41f
    M: 519420f386391cc5fa92f560d427ac632b15f41f 172.16.10.29:7003
       slots:10923-16383 (5461 slots) master
       1 additional replica(s)
    S: 99f3233040dadc18cf7f988e35d7ba7a1bcb338f 172.16.10.29:7005
       slots: (0 slots) slave
       replicates ad99c1a5c1887d719edcf20d57501744e2d0558b
    S: fca683c7397a370f574ceaf277a0094a87264309 172.16.10.29:7004
       slots: (0 slots) slave
       replicates 38ecd880fabbb6082e6d167828b827383a1bdb24
    [OK] All nodes agree about slots configuration.
    >>> Check for open slots...
    >>> Check slots coverage...
    [OK] All 16384 slots covered.
    >>> Send CLUSTER MEET to node 172.16.10.29:7007 to make it join the cluster.
    [OK] New node added correctly.
    
    # 注意:当添加节点成功以后,新增的节点不会有任何数据,因为他没有分配任何slot。需要为新节点手动分配slot。
    
    # 步骤二:reshard命令,分配slot:
    solid@test1:~/fyj/redis/redis-4.0.10/src$ ./redis-trib.rb reshard  
    172.16.10.29:7007
    
    # 提示一 是希望你需要多少个槽移动到新的节点上,可以自己设置,比如200个槽。
    How many slots do you want to move (from 1 to 16384)? 2000
    # 提示二 是你需要把这200个slot槽移动到那个节点上去(需要指定节点id,这里是7007的节点id),并且下个提示是输入all为从所有主节点(7001-7006)中分别抽取相应的槽数(一共为200个槽到指定的新节点中!,并且会打印执行分片的计划。)
    What is the receiving node ID? 382634a4025778c040b7213453fd42a709f79e28
    Please enter all the source node IDs.
    Type 'all' to use all the nodes as source nodes for the hash slots.
    Type 'done' once you entered all the source nodes IDs.
    Source node #1:all
    # 提示三 输入yes确认开始执行分片任务
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
  • 集群添加一个从节点
    # 步骤一:使用add-node命令:绿色为新增节点,红色为已知存在节点
    solid@test1:~/fyj/redis/redis-4.0.10/src$ ./redis-trib.rb add-node 172.16.10.29:7008 172.16.10.29:7001
    # 步骤二:首先需要登录到7008节点的客户端,然后使用集群命令,执行replicate命令来指定当前节点的主节点id为哪一个。把当前的7008(slave)节点指定到一个主节点下(这里使用之前创建的7007主节点)。
    solid@test1:~/fyj/redis/bin$ ./redis-cli -c -h 172.16.10.29 -p 7008
    172.16.10.29:7008> cluster replicate 307a85994f80df7e4b5e63467f6bfeba5c61c805
    (7007的id)
    OK
  • 集群删除一个主节点
    # 如果主节点有从节点,将从节点转移到其他主节点。如果主节点有slot,先将主节点里的slot分配到其他可用节点中,然后再删除节点才行,否则会有数据的丢失。
    # 步骤一:删除7007(master)节点之前,我们需要先把其全部的数据(slot槽)移动到其他节点上去(目前只能把master的数据迁移到一个节点上,暂时做不了平均分配功能)。
    solid@test1:~/fyj/redis/redis-4.0.10/src$ ./redis-trib.rb reshard  
    172.16.10.29:7007
    
    How many slots do you want to move (from 1 to 16384)? 1999
    (注释:这里不会是正好2000个槽)
    What is the receiving node ID? 614d0def75663f2620b6402a017014b57c912dad
    (注释:这里是需要把数据移动到哪?7001的主节点id)
    Please enter all the source node IDs.
    Type 'all' to use all the nodes as source nodes for the hash slots.
    Type 'done' once you entered all the source nodes IDs.
    Source node #1:307a85994f80df7e4b5e63467f6bfeba5c61c805
    (注释:这里是需要数据源,也就是我们的7007节点id)
    Source node #2:done
    (注释:这里直接输入done 开始生成迁移计划)
    Do you want to proceed with the proposed reshard plan (yes/no)? yes
    
    (注释:这里输入yes开始迁移)
    # 步骤二:最后我们直接使用del-node命令删除7007主节点即可(蓝色表示7007的节点id)。
    solid@test1:~/fyj/redis/redis-4.0.10/src$ ./redis-trib.rb del-node 172.16.10.29:7007 307a85994f80df7e4b5e63467f6bfeba5c61c805
    >>> Removing node 307a85994f80df7e4b5e63467f6bfeba5c61c805 from cluster 172.16.10.29:7007
    >>> Sending CLUSTER FORGET messages to the cluster...
    >>> SHUTDOWN the node.
  • 集群删除一个从节点
    # 步骤一:删除从节点7008,输入del-node命令,指定删除节点ip和端口,以及节点id(蓝色为7008节点id),移除了7008 slave节点,前节点的服务进程也会随之销毁。
    solid@test1:~/fyj/redis/redis-4.0.10/src$ ./redis-trib.rb del-node 172.16.10.29:7008 a78c8a41f6430b51a7eca1fdb50092c463a8f1ac
  • 列出集群节点
    solid@test1:~/fyj/redis/bin$ ./redis-cli -c -h 172.16.10.29 -p 7008
    172.16.10.29:7008> cluster nodes
  • redis.conf详细配置          https://github.com/linli8/cnblogs/blob/master/redis副本.conf

猜你喜欢

转载自blog.csdn.net/fyj1368711123/article/details/81539078