Linux搭建Redis集群服务

Linux搭建Redis集群服务

安装过程

第一步:下载并解压

kunzai@kunzai:~$ cd /usr/local/
kunzai@kunzai:/usr/local$ wget http://download.redis.io/releases/redis-3.2.4.tar.gz
kunzai@kunzai:/usr/local$tar -zxvf redis-3.2.4.tar.gz 

第二步:安装

kunzai@kunzai:/usr/local$cd redis-3.2.4
kunzai@kunzai:/usr/local$make && make install

第三步: 将 redis-trib.rb 复制到 /usr/bin 目录下

redis-trib.rb这个一般在redis的安装路径中都有,如果找不到可以使用下面命令搜一下,然后列出所在目录,把它copy到相应目录中就可。

sudo find / -name redis-trib.rb
cp redis-trib.rb /usr/local/bin/ 

第四部: 创建 Redis 节点

首先在 192.168.2.195 机器上 /root/local/redis-3.2.4 目录下创建 redis_cluster 目录;

sudo mkdir redis_cluster  

在 redis_cluster 目录下,创建名为6380、6381、6382,6383,6384,6385的目录,并将 redis.conf 拷贝到这三个目录中

mkdir 6380 6381 6382 6383 6384 6385
cp redis.conf redis_cluster/6380 
cp redis.conf redis_cluster/6381 
cp redis.conf redis_cluster/6382
cp redis.conf redis_cluster/6383
cp redis.conf redis_cluster/6384
cp redis.conf redis_cluster/6385

第五部:分别修改这三个配置文件,修改如下内容

port  6380                                        //端口6380、6381、6382,6383,6384,6385      
bind 本机ip                                       //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip 否则创建集群时无法访问对应的端口,无法创建集群(我这里暂且用127.0.0.1)
daemonize    yes                               //redis后台运行
pidfile  /var/run/redis_6380.pid          //pidfile文件对应6380、6381、6382,6383,6384,6385
cluster-enabled  yes                           //开启集群  把注释#去掉
cluster-config-file  nodes_6380.conf   //集群的配置  配置文件首次启动自动生成 6380、6381、6382,6383,6384,6385
cluster-node-timeout  15000                //请求超时  默认15秒,可自行设置
appendonly  yes                           //aof日志开启  有需要就开启,它会每次写操作都记录一条日志

第六步: 启动各个节点

redis-server redis_cluster/6380/redis.conf
redis-server redis_cluster/6381/redis.conf
redis-server redis_cluster/6382/redis.conf
redis-server redis_cluster/6383/redis.conf
redis-server redis_cluster/6384/redis.conf
redis-server redis_cluster/6385/redis.conf

第七步:检查节点

kunzai@kunzai:/usr/local/redis/redis_cluster$ ps -ef |grep redis
redis      935     1  0 08:08 ?        00:00:33 /usr/bin/redis-server 127.0.0.1:6379
root      3472     1  0 11:40 ?        00:00:15 redis-server 127.0.0.1:6381 [cluster]
root      3478     1  0 11:41 ?        00:00:15 redis-server 127.0.0.1:6382 [cluster]
root      6647     1  0 15:06 ?        00:00:00 redis-server 127.0.0.1:6380 [cluster]
root      6834     1  0 15:19 ?        00:00:00 redis-server 127.0.0.1:6383 [cluster]
root      6840     1  0 15:19 ?        00:00:00 redis-server 127.0.0.1:6384 [cluster]
root      6846     1  0 15:19 ?        00:00:00 redis-server 127.0.0.1:6385 [cluster]
kunzai    6852  3192  0 15:20 pts/1    00:00:00 grep --color=auto redis



kunzai@kunzai:/usr/local/redis/redis_cluster$ sudo netstat -tnlp | grep redis
tcp        0      0 127.0.0.1:16380         0.0.0.0:*               LISTEN      6647/redis-server 1 
tcp        0      0 127.0.0.1:16381         0.0.0.0:*               LISTEN      3472/redis-server 1 
tcp        0      0 127.0.0.1:16382         0.0.0.0:*               LISTEN      3478/redis-server 1 
tcp        0      0 127.0.0.1:16383         0.0.0.0:*               LISTEN      6834/redis-server 1 
tcp        0      0 127.0.0.1:16384         0.0.0.0:*               LISTEN      6840/redis-server 1 
tcp        0      0 127.0.0.1:16385         0.0.0.0:*               LISTEN      6846/redis-server 1 
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      935/redis-server 12 
tcp        0      0 127.0.0.1:6380          0.0.0.0:*               LISTEN      6647/redis-server 1 
tcp        0      0 127.0.0.1:6381          0.0.0.0:*               LISTEN      3472/redis-server 1 
tcp        0      0 127.0.0.1:6382          0.0.0.0:*               LISTEN      3478/redis-server 1 
tcp        0      0 127.0.0.1:6383          0.0.0.0:*               LISTEN      6834/redis-server 1 
tcp        0      0 127.0.0.1:6384          0.0.0.0:*               LISTEN      6840/redis-server 1 
tcp        0      0 127.0.0.1:6385          0.0.0.0:*               LISTEN      6846/redis-server 1 

第八步:启动集群
进入redis-trib.rb所在的目录,执行以下命令,不报错,直接跳过第九,十步骤

 sudo ./redis-trib.rb  create  --replicas  1  127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385

第九步:安装ruby

ruby需要安装redis所支持的版本,一般都会遇到版本低需要升级ruby问题{报错redis requires Ruby version >= 2.2.2}
安装之前可以使用(ruby -v)查看一下版本

第一种方式:ubuntn17.1使用apt-get安装ruby2.3

如果不行那就在更新一下sudo apt-get update,然后再安装sudo apt-get install ruby2.3,试试可以吗?

# sudo apt-get update
# sudo apt-get install ruby2.3

第二种方式:cenos7.2通过下载压缩包安装ruby
centos7/rhel7安装较高版本ruby2.2/2.3/2.4+

        ~]# wget http://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.5.tar.gz

    ~]# tar zxvf  ruby-2.3.5.tar.gz

    ~]# cd ruby-2.3.5

    ruby-2.3.5]# ./configure  --prefix=/opt/ruby

    ruby-2.3.5]# make && make install

    ruby-2.3.5]# ln -s /opt/ruby/bin/ruby /usr/bin/ruby

    ruby-2.3.5]# ln -s /opt/ruby/bin/gem /usr/bin/gem

    ~]#ruby -v    //查看一下版本

第十步:安装rubygem redis依赖
第一种方式:ubuntn17.10安装
之前就有gem

gem install -l redis-3.3.0.gem

第二种方式:cenos7.2安装
②安装rubygem redis依赖

    ~]# wget http://rubygems.org/downloads/redis-3.3.0.gem

    ~]# gem install -l redis-3.3.0.gem

验证是否可以使用
出现Usage: redis-trib

kunzai@kunzai:/usr/local/redis$ ./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的节点地址必须是不包含任何槽/数据的节点,否则会拒绝创建集群
②:如果节点设置了密码需要修改配置文件传送门
③:[ERR] Node 127.0.0.1:6381 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0

 sudo ./redis-trib.rb  create  --replicas  1  127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385

报错:

>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6380
127.0.0.1:6381
127.0.0.1:6382
Adding replica 127.0.0.1:6383 to 127.0.0.1:6380
Adding replica 127.0.0.1:6384 to 127.0.0.1:6381
Adding replica 127.0.0.1:6385 to 127.0.0.1:6382
M: 6ba7d505cc00697093086bf8fc0125f68563a8ee 127.0.0.1:6380
   slots:0-5460,6916,7040,11111,11235,15174,15298 (5467 slots) master
M: cb934cf015bfbe8387a83eee8f6fddb44db70a82 127.0.0.1:6381
   slots:2977,5461-10922,11111,11235,15174,15298 (5467 slots) master
M: 7480dcc92137c6f84d6add3a7228b430a8ae2d86 127.0.0.1:6382
   slots:2977,6916,7040,10923-16383 (5464 slots) master
S: 25cfee850379ae24274e63717d6c39f2623b0931 127.0.0.1:6383
   replicates 6ba7d505cc00697093086bf8fc0125f68563a8ee
S: 5659995af3f18767f5efc038a8f6a82dab731caa 127.0.0.1:6384
   replicates cb934cf015bfbe8387a83eee8f6fddb44db70a82
S: 9d73c5f3f14284050d05240327d8d7da91c45e4e 127.0.0.1:6385
   replicates 7480dcc92137c6f84d6add3a7228b430a8ae2d86
Can I set the above configuration? (type 'yes' to accept): yes
/var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 2977 is already busy (Redis::CommandError)
    from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:2764:in `block in method_missing'
    from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `block in synchronize'
    from /usr/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
    from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:45:in `synchronize'
    from /var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis.rb:2763:in `method_missing'
    from ./redis-trib.rb:212:in `flush_node_config'
    from ./redis-trib.rb:776:in `block in flush_nodes_config'
    from ./redis-trib.rb:775:in `each'
    from ./redis-trib.rb:775:in `flush_nodes_config'
    from ./redis-trib.rb:1296:in `create_cluster_cmd'
    from ./redis-trib.rb:1700:in `<main>'

解决报错:
看到文章说:安装的时候redis用3.0.0的gem就好了,我用的是redis (4.0.1)然后就卸载,重新安装没直接操作如下步骤,记住重新安装gem redis后,需要redis集群密码的重新“第十一步:创建集群”注意事项中的第一小点

gem list
gem uninstall redis --version 3.3.2
gem install redis --version 3.0.0
gem list

还是不行
清空配置集群失败的配置文件
redis*.conf
可以使用命令查找文件的所在目录,然后删除配置文件——需要重启redis的各个节点服务

sudo find / -name redis6380.conf

运行命令成功

 sudo ./redis-trib.rb  create  --replicas  1  127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385


说明:--replicas参数指定集群中每个主节点配备几个从节点,这里设置为1。

       这里因为测试,只用了3台机器,如果部署节点使用不同的IP地址,redis-trib-rb会尽可能保证主从节点不分配在同一台机器下,

       因此会重新排序节点表顺序。节点列表顺序用于确定主从角色,先主节点之后是从节点。

       创建过程中首先会给出主从节点角色分配的计划
       
       最后的输出报告说明:16384个槽全部被分配完,集群创建成功。

    这里需要注意给redis-trib.rb的节点地址必须是不包含任何槽/数据的节点,否则会拒绝创建集群。
/var/lib/gems/2.3.0/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release
>>> Performing Cluster Check (using node 127.0.0.1:6380)
M: 6ac7184cc56814c3bbe333b8ad485eb0b7d16519 127.0.0.1:6380
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 88fb7c9c052f2092db2e233b99ade3beab683bab 127.0.0.1:6381
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 894371a13a7d84cbe9142dc9d5fe6f0e33cb25e1 127.0.0.1:6383
   slots: (0 slots) slave
   replicates 6ac7184cc56814c3bbe333b8ad485eb0b7d16519
S: 59791c4677193b82520db498bcd8a7893185a401 127.0.0.1:6384
   slots: (0 slots) slave
   replicates 88fb7c9c052f2092db2e233b99ade3beab683bab
S: 4fac9940ce2f3ee701a647e33d008f04b43b9801 127.0.0.1:6385
   slots: (0 slots) slave
   replicates 1d0aaf7973d22a94107913baca200bc0e0414959
M: 1d0aaf7973d22a94107913baca200bc0e0414959 127.0.0.1:6382
   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.

第十二步:集群完整性检查

群完整性指所有的槽都分配到存活的主节点上,只要16384个槽中有一个没有分配给节点则表示集群不完整。

    可以用redis-trib.rb check命令检测之前创建的集群是否成功,check命令只需要给出集群中任意一个节点地址就可以

    完成整个集群的检查工作,命令使用如下所示:
    
     ./redis-trib.rb check 127.0.0.1:6380

输出:

/var/lib/gems/2.3.0/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release
>>> Performing Cluster Check (using node 127.0.0.1:6380)
M: 6ac7184cc56814c3bbe333b8ad485eb0b7d16519 127.0.0.1:6380
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 88fb7c9c052f2092db2e233b99ade3beab683bab 127.0.0.1:6381
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 894371a13a7d84cbe9142dc9d5fe6f0e33cb25e1 127.0.0.1:6383
   slots: (0 slots) slave
   replicates 6ac7184cc56814c3bbe333b8ad485eb0b7d16519
S: 59791c4677193b82520db498bcd8a7893185a401 127.0.0.1:6384
   slots: (0 slots) slave
   replicates 88fb7c9c052f2092db2e233b99ade3beab683bab
S: 4fac9940ce2f3ee701a647e33d008f04b43b9801 127.0.0.1:6385
   slots: (0 slots) slave
   replicates 1d0aaf7973d22a94107913baca200bc0e0414959
M: 1d0aaf7973d22a94107913baca200bc0e0414959 127.0.0.1:6382
   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.

Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.
输出这样说明,所有槽都已经分配到节点

查看集群目前情况:

127.0.0.1:6380> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:983
cluster_stats_messages_pong_sent:1021
cluster_stats_messages_sent:2004
cluster_stats_messages_ping_received:1016
cluster_stats_messages_pong_received:983
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2004

redis客户端集群常用命令

集群客户端命令(redis-cli -c -p port)
集群
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet <ip> <port> :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots <slot> [slot ...] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots <slot> [slot ...] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot <slot> node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot <slot> migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot <slot> importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot <slot> stable :取消对槽 slot 的导入( import)或者迁移( migrate)。
键
cluster keyslot <key> :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot <slot> :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot <slot> <count> :返回 count 个 slot 槽中的键  

redis集群选举容错

节点失效选举过程中是所有的集群参与的,如果半数以上master几点与当前master节点通信超时(cluster-node-timeout),就认为当前master挂掉

什么时候redis集群不可用

  1. 如果有任意master挂掉,且没有slave就会导致集群进入fail状态
  2. 如果超过半数master挂掉,无论是否有slaver顶替集群都进入fail状态

猜你喜欢

转载自blog.csdn.net/a656678879/article/details/80481839