redis单机集群

来源:互联网 发布:linux kvm命令 编辑:程序博客网 时间:2024/06/01 07:18

总结一下当前redis集群的使用以及一些踩过的坑

以下资源来源于互联网,综合于多个blog文章,由鄙人总结,希望给新人一个正确的指导
1、新建一个集群目录
mkdir redis_cluser
2、新建6个文件夹
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
mkdir 7006
3、将配置文件redis.conf分别拷贝进这6个文件夹(作为节点配置)
cp redis.conf /home/liupan/redis_cluser/7001
cp redis.conf /home/liupan/redis_cluser/7002
cp redis.conf /home/liupan/redis_cluser/7003
cp redis.conf /home/liupan/redis_cluser/7004
cp redis.conf /home/liupan/redis_cluser/7005
cp redis.conf /home/liupan/redis_cluser/7006
4、分别修改这6个配置文件
修改内容如下:
port 7001  //六个节点配置文件分别是7001-7006
daemonize yes        //redis后台运行
pidfile /var/run/redis_7001.pid   //pidfile文件对应7001-7006
cluster-enabled yes   //开启集群
cluster-config-file nodes_7001.conf  //保存节点配置,自动创建,自动更新对应7001-7006
cluster-node-timeout 5000    //集群超时时间,节点超过这个时间没反应就断定是宕机
appendonly yes   //存储方式,aof,将写操作记录保存到日志中
备注:
注意不要配置requirepass属性,如果配置了则也需要配置masterauth属性并且修改client.rb中的password属性,后面会详细讲解


5、启动各个节点 并查看启动状况
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-server /home/liupan/redis_cluster/7001/redis.conf 
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-server /home/liupan/redis_cluster/7002/redis.conf 
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-server /home/liupan/redis_cluster/7003/redis.conf 
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-server /home/liupan/redis_cluster/7004/redis.conf 
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-server /home/liupan/redis_cluster/7005/redis.conf 
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-server /home/liupan/redis_cluster/7006/redis.conf 


liupan@liupan-virtual-machine:~/redis/redis/bin$ ps -ef|grep redis
liupan     6865      1  0 15:44 ?        00:00:09 ./redis-server 127.0.0.1:7005 [cluster]
liupan     6870      1  0 15:44 ?        00:00:09 ./redis-server 127.0.0.1:7006 [cluster]
liupan     6875      1  0 15:44 ?        00:00:08 ./redis-server 127.0.0.1:7004 [cluster]
liupan     6880      1  0 15:44 ?        00:00:09 ./redis-server 127.0.0.1:7003 [cluster]
liupan     6887      1  0 15:44 ?        00:00:09 ./redis-server 127.0.0.1:7002 [cluster]
liupan     6894      1  0 15:44 ?        00:00:08 ./redis-server 127.0.0.1:7001 [cluster]
liupan     7063   2277  0 19:18 pts/0    00:00:00 grep --color=auto redis
liupan@liupan-virtual-machine:~/redis/redis/bin$ 


6、开启集群
由于redis集群工具redis-trib.rb(安装文件夹中可以找到)是ruby语言编写的,所以需要安装ruby编译环境
sudo apt-get install ruby 安装ruby
sudo gem install redis 安装ruby-redis集成插件
./redis-trib.rb create --replicas 1 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 127.0.0.1:7006 创建集群
可能会遇到如下异常
ERR] Sorry, can't connect to node 127.0.0.1:7001
可能原因:
1)ruby版本过低(来源网络,未验证)
2)配置文件中bind 设置有问题(来源网络,未验证),其实bind 属性是针对多网卡计算机提供的,一般情况下127.0.0.1够用,并不是大家理解的ip监控,实际应用中起不到客户端过滤作用---来源网络
3)配置文件中设置了requirepass,并且client.rb中没有配置password,启动集群的时候,集群工具由于没有密码,不能访问节点,配置了password但没有配置masterauth 也不行,启动集群的时候从服务器没有密码,无法从主服务器同步数据。由于主从服务器的不固定性(选举产生),所以masterauth要保持一致,requirepass也要保持一致,因为你要从集群中的一个跳板机获取整个集群的数据,redis之间的通信也依赖于一致的requirepass


7、配置redis集群密码
依次连接各个节点
./redis-cli -c -p 7001
config set masterauth passwd123 设置数据同步密码,当集群启动时从节点会用该密码从master主节点同步数据
config set requirepass passwd123 redis连接密码
auth passwd123(主要是因为上一步设置了redis连接密码,下面的rewrit命令需要验证身份)
config rewrite 将命令设置的配置持久化到配置文件中,具体可以打开各个节点配置文件观察


8、配置了redis集群密码之后redis-trib.rb工具的各个命令都不会再起作用了,使用集群工具访问节点需要携带连接密码,目前我不太清楚命令行是否可以携带密码操作,故解决方案是把redis连接密码配置到ruby环境的client.rb中
client.rb路径
/var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis/client.rb
路径不清楚的朋友可以用sudo find / -name 'client.rb'命令来查找
liupan@liupan-virtual-machine:~/redis/redis/bin$ sudo find / -name 'client.rb'
[sudo] liupan 的密码: 
对不起,请重试。
[sudo] liupan 的密码: 
find: ‘/run/user/1000/gvfs’: 权限不够
/var/lib/gems/2.3.0/gems/redis-4.0.1/lib/redis/client.rb
/usr/lib/ruby/2.3.0/xmlrpc/client.rb
注意查找结果有两个,你需要修改一个程序格式如下的client.rb


require_relative "errors"
require "socket"
require "cgi"


class Redis
  class Client


    DEFAULTS = {
      :url => lambda { ENV["REDIS_URL"] },
      :scheme => "redis",
      :host => "127.0.0.1",
      :port => 6379,
      :path => nil,
      :timeout => 5.0,
      :password => "passwd123",
      :db => 0,
      :driver => nil,
      :id => nil,
      :tcp_keepalive => 0,
      :reconnect_attempts => 1,
      :inherit_socket => false
    }


    attr_reader :options


    def scheme
      @options[:scheme]
    end


    def host
      @options[:host]
    end


    def port
      @options[:port]
    end


    def path
      @options[:path]
    end


    def read_timeout
      @options[:read_timeout]
    end


    def connect_timeout
      @options[:connect_timeout]
    end


    def timeout
      @options[:read_timeout]
    end


9、至此带访问控制的redis集群部署成功


10、关闭redis集群之后启动节点再创建一次节点测试一些想法,又遇到一个坑爹的错误
[ERR] Node 127.0.0.1:7001 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
当然集群是没有问题的,在启动节点之后整个集群好像自己就启动了,不需要控制,有空再研究一下吧
liupan@liupan-virtual-machine:~/redis/redis/bin$ ./redis-cli -c -p 7001 -a passwd123
127.0.0.1:7001> lpush l1 111 222  333
-> Redirected to slot [10293] located at 127.0.0.1:7002
(integer) 3
127.0.0.1:7002> 


备注一下,在集群跳板机上操作整个集群需要-a加密码,如果只是单独连接一个节点在cli客户端使用auth 命令登录,是无法将数据存到其他节点的哦,其实你可以理解为cli客户端中的auth只是登录了该节点的redis