Redis 配置 主从、集群

参数名 默认值 解释
bind 127.0.0.1 绑定ip地址
port 6379 绑定端口
dademonize no yes:打开守护进程  no:关闭守护进程
pidfile /var/run/redis/redis-server.pid pid文件路径
logfile /var/log/redis/redis-server.log 日志文件路径
requirepass   redis密码
save 900 1 RDB持久化频率(时间/秒  key修改次数)
slaveof   master的ip mater的端口
masterauth   master的密码
slave-read-only yes slave是否只读,默认为只读
appendonly no yes:打开AOF持久化  no:关闭AOF持久化
appendfilename appendonly.aof 保存AOF持久化文件名称
appendfsync everysec

always:收到命令立即写入磁盘

everysec:每秒强制写入磁盘一次

no:依赖os写入,大约1次/30S

cluster-enabled no 是否启用Redis群集支持
cluster-config-file nodes-6379.conf 这不是用户可编辑的配置文件,而是每次发生更改时Redis群集节点自动保持群集配置(基本上是状态)的文件,为了能够在启动时重新阅读它。该文件列出了集群中其他节点,状态,持久变量等内容。由于某些消息接收,通常会将此文件重写并刷新到磁盘上。
cluster-node-timeout 15000 如果主节点的可访问时间超过指定的时间,则其从属节点将进行故障转移。此参数控制Redis群集中的其他重要事项。值得注意的是,在指定时间内无法访问大多数主节点的每个节点都将停止接受查询。
cluster-slave-validity-factor 10 如果设置为零,则从站将始终尝试对主站进行故障切换,而不管主站和从站之间的链路是否保持断开连接的时间长短。如果该值为正,则计算最大断开时间作为节点超时值乘以此选项提供的因子,如果节点是从属节点,则如果主链接断开连接的时间超过指定的时间,则不会尝试启动故障转移。
cluster-migration-barrier 1 主服务器将保持连接的最小从服务器数,以便另一个从服务器迁移到不再由任何从服务器覆盖的主服务器。
cluster-require-full-coverage yes 如果设置为yes,则默认情况下,如果任何节点未覆盖某个百分比的密钥空间,则集群将停止接受写入。如果该选项设置为no,即使只能处理有关键子集的请求,群集仍将提供查询。

redis主从配置

master可以拥有多个slave,slave也可以拥有多个slave,一直下去,可以形成一个强大的多级服务器集群。

master可以用来写数据,slave用来读数据,通过主从服务器配置实现读写分离。

master配置master.conf

bind                    192.168.0.111
port			6379
daemonize		yes
pidfile			/var/run/redis/redis-master.pid
logfile			/var/log/redis/redis-master.log
requirepass		123456
save			900 1
appendonly		no

 slave配置slave.conf

bind			192.168.0.207
port			6379
daemonize		yes
pidfile			/var/run/redis/redis-slave.pid
logfile			/var/log/redis/redis-slave.log
requirepass		123456
save			900 1
slaveof                 192.168.0.111 6379
masterauth              123456
slave-read-only	        yes
appendonly		yes
appendfilename	        appendonly.aof
appendfsync		everysec

 在master服务器上使用命令sudo redis-server /etc/redis/master.conf启动redis,在slave服务器上使用命令sudo redis-server /etc/redis/slave.conf启动redis,再分别使用redis-cli 命令(redis -h 192.168.0.111 -a 123456)登陆redis,使用info命令查看redis状态。master正常情况如图:

 slave正常情况如图:

 当然还可以为master配置更多的slave服务器,也可以对slave配置slave服务器,这里只写了简单的主从配置。这里的配置master中没有配置AOF持久化,在slave配置了AOF持久化。

redis集群配置

官方文档:https://redis.io/topics/cluster-tutorial

这里在两台机器上配置的集群,ip分别是192.168.0.111和192.168.0.207,其中7000,7001,7002端口在192.168.0.111上,7003,7004,7005在192.168.0.207上

7000的集群配置文件:

bind                    192.168.0.111
port                    7000
daemonize               yes
pidfile                 /var/run/redis/redis-7000.pid
logfile                 /var/log/redis/redis-7000.log
save                    900 1
slave-read-only         yes
appendonly              no
appendfilename          appendonly.aof
appendfsync             everysec
cluster-enabled         yes
cluster-config-file     node-7000.conf
cluster-node-timeout    15000

 只需要把每个端口的配置文件中ip和端口改成对应的ip和端口即可

最后再分别用对应端口的配置文件启动redis

使用ruby脚本创建集群:

安装ruby:http://www.ruby-lang.org/zh_cn/documentation/installation/#apt

这里使用的是Ubuntu,直接使用下面这条命令就可以安装

sudo apt-get install ruby-full

 其他版本系统可以参照上面安装ruby的官方教程

复制安装目录下的创建集群脚本到/usr/bin下

sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb  /usr/bin/redis-trib.rb

 切换ruby镜像源为国内

sudo gem source --add https://gems.ruby-china.com/ --remove https://rubygems.org/

 安装ruby的redis库

sudo gem install redis

 执行创建集群的脚本,创建集群

sudo redis-trib.rb create --replicas 1 192.168.0.111:7000 192.168.0.111:7001 192.168.0.111:7002 192.168.0.207:7003 192.168.0.207:7004 192.168.0.207:7005

 --replicas 后的参数意思是每个主服务器都有1个从服务器

上面操作都正常的情况下,应该会有类似这样的结果

Using 3 masters:
192.168.0.111:7000
192.168.0.207:7003
192.168.0.111:7001
Adding replica 192.168.0.207:7004 to 192.168.0.111:7000
Adding replica 192.168.0.111:7002 to 192.168.0.207:7003
Adding replica 192.168.0.207:7005 to 192.168.0.111:7001
M: 6355b6523cf069badc33a8d4eaeca82771e4bac0 192.168.0.111:7000
   slots:0-5460 (5461 slots) master
M: 95010c8559bcb2fa4cae21f51dd0e8bb01cf9d0e 192.168.0.111:7001
   slots:10923-16383 (5461 slots) master
S: 8f1a59a93810df993f44f68f35f1379e8618069b 192.168.0.111:7002
   replicates 91fdaaa1d98b92e7bc55fc286fcc5903091eb006
M: 91fdaaa1d98b92e7bc55fc286fcc5903091eb006 192.168.0.207:7003
   slots:5461-10922 (5462 slots) master
S: 90bd5d6f269c97ee30816d495e3688649e90e334 192.168.0.207:7004
   replicates 6355b6523cf069badc33a8d4eaeca82771e4bac0
S: 6dffd445515378c699d8445b1772cb89a3c032fe 192.168.0.207:7005
   replicates 95010c8559bcb2fa4cae21f51dd0e8bb01cf9d0e
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 192.168.0.111:7000)
M: 6355b6523cf069badc33a8d4eaeca82771e4bac0 192.168.0.111:7000
   slots:0-5460 (5461 slots) master
M: 95010c8559bcb2fa4cae21f51dd0e8bb01cf9d0e 192.168.0.111:7001
   slots:10923-16383 (5461 slots) master
M: 8f1a59a93810df993f44f68f35f1379e8618069b 192.168.0.111:7002
   slots: (0 slots) master
   replicates 91fdaaa1d98b92e7bc55fc286fcc5903091eb006
M: 91fdaaa1d98b92e7bc55fc286fcc5903091eb006 192.168.0.207:7003
   slots:5461-10922 (5462 slots) master
M: 90bd5d6f269c97ee30816d495e3688649e90e334 192.168.0.207:7004
   slots: (0 slots) master
   replicates 6355b6523cf069badc33a8d4eaeca82771e4bac0
M: 6dffd445515378c699d8445b1772cb89a3c032fe 192.168.0.207:7005
   slots: (0 slots) master
   replicates 95010c8559bcb2fa4cae21f51dd0e8bb01cf9d0e

 这段内容的意思是192.168.0.111:7000,192.168.0.207:7003,192.168.0.111:7001是master,192.168.0.207:7004是 192.168.0.111:7000的从服务器,192.168.0.111:7002是192.168.0.207:7003的从服务器,192.168.0.207:7005 是192.168.0.111:7001的从服务器。0-5460的插槽在192.168.0.111:7000上,5461-10922的插槽在192.168.0.207:7003上,10923-16383的插槽在192.168.0.111:7001上。

上面的配置的集群没有使用密码验证,相对不安全,可以对集群每台redis使用下面的命令设置密码

使用redis-cli登陆redis集群  -c参数表示登陆的是redis集群

redis-cli -h 192.168.0.111 -p 7000 -c

CONFIG SET masterauth 123456
CONFIG SET requirepass 123456
AUTH 123456
CONFIG REWRITE

但是 这样后面使用redis-trib.rb其他命令时,会出现无法连接服务器的情况,所以还需要修改ruby的reids库里的client.rb文件

使用sudo find -name 'client.rb' 查找ruby的redis库下的client.rb文件

修改成下面

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 => "123456",
      :db => 0,
      :driver => nil,
      :id => nil,
      :tcp_keepalive => 0,
      :reconnect_attempts => 1,
      :reconnect_delay => 0,
      :reconnect_delay_max => 0.5,
      :inherit_socket => false
    }

 修改完成保存即可

TIPS:配置redis集群时,如果redis端口为6379,则服务器应当开放6379和16379两个TCP端口,6379用于为客户端提供服务的普通Redis TCP端口,16379用于集群总线,即使用二进制协议的节点到节点通信通道。节点使用集群总线进行故障检测,配置更新,故障转移授权等。

另外官方还有一种使用create-cluster脚本配置redis集群的方式,请移步:https://redis.io/topics/cluster-tutorial

使用python3测试redis集群

先安装rediscluster

pip install redis-py-cluster

创建一个demo

from rediscluster import RedisCluster

if __name__ == '__main__':
    nodes = [
        {'host': '192.168.0.111', 'port': '7000'},
        {'host': '192.168.0.111', 'port': '7001'},
        {'host': '192.168.0.111', 'port': '7002'},
    ]
    src = RedisCluster(startup_nodes=nodes, decode_responses=True, password='123456')
    res = src.set('test', '123')
    print(res)

再使用redis-cli 登陆redis集群查看 test键是否正确插入

posted @ 2019-09-06 16:33  Wuliwawa  阅读(218)  评论(0编辑  收藏  举报