redis集群

部署3(Master)+3(Slave)的一个集群安装过程,真实生产环境上可以采用每台物理机上部署一个Master进程和一个Slave进程,Slave进程是其他物理机上的Master的备机,避免服务器在断电的情况下,配对的Master和Slave都不可用。

架构

下载redis 

wget -c http://download.redis.io/releases/redis-3.0.7.tar.gz;tar -zxf redis-3.0.7.tar.gz ;cd redis-3.0.7;make&&make install

新建6个文件夹

将redis.conf 拷贝到文件夹内

修改配置文件

配置选项

描述

daemonize

yes

logfile

"/usr/local/redis-3.0.7/logs/redis-7001.log"

databases

1

dir

/usr/local/redis-3.0.7/7001

用来存放数据的地方

cluster-enabled

yes

cluster-config-file

/usr/local/redis-3.0.7/7001/nodes.conf

nodes.conf由redis自己生成

cluster-node-timeout

15000

cluster-migration-barrier

1

cluster-require-full-coverage

yes

只要集群中有一对Master-Slave不可用时,整个集群不可用

分别启动 redis-server 7001/redis.conf

安装Ruby

wget -c https://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.7.tar.gz;tar -zxf ruby-2.2.7.tar.gz;cd ruby-2.2.7

./configure --prefix=/usr/local/ruby;make&&make install

加为环境变量 

export PATH=/usr/local/ruby/bin:$PATH

source /etc/profile

验证ruby是否安装成功,执行ruby –v,出现如下输出,即ruby安装OK

安装redis gem

wget -c https://rubygems.org/downloads/redis-3.3.2.gem

安装 gem install -l redis-3.3.2.gem

如果安装redis-3.2.1.gem出错

安装zlib

  1. tar -xzvf zlib-1.2.8.tar.gz
  2. cd zlib-1.2.8
  3. ./configure --prefix=/opt/zlib
  4. make
  5. make install

安装ruby-zlib

  1. cd ruby-2.1.6/ext/zlib
  2. ruby ./extconf.rb --with-zlib-dir=/opt/zlib
  3. make
  4. make install

最后安装redis-3.3.2gem

gem install -l redis-3.3.2.gem

启动集群

  1. 进入src目录 cd redis-3.0.7/src
  2. 执行./redis-trib.rb create --replicas 1 192.168.0.3:7001 192.168.0.3:7002 192.168.0.3:7003 192.168.0.3:7004 192.168.0.3:7005 192.168.0.3:7006

为本机IP,出现如下日志即为集群部署OK

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

多机部署时,只要在其中一台机器上执行./redis-trib.rb就可以了

验证

  1. 进入redis控制台redis-cli -c -p 7001
  2. set foo car
  3. get foo

如果能取出数据即集群安装OK。

报错

1)、将需要新增的节点下aof、rdb等本地备份文件删除;
2)、同时将新Node的集群配置文件删除,即:删除你redis.conf里面cluster-config-file所在的文件;
3)、再次添加新节点如果还是报错,则登录新Node,./redis-cli–h x –p对数据库进行清除:
192.168.0.3:7001> flushdb #清空当前数据库

 如果远程可 redis-cli -h 192.168.0.3 -c -p 7001-7006  get a

redis-cli  -p 7003 shutdown

redis-cli -c -p 7001 cluster nodes 查看集群节点

redis-cli -h localhost -p 7001  monitor 监控redis的连接及读写操作 

redis-cli -h localhost -p 7001 info  redis服务的统计信息 

动态增加删除节点

新增启动7007,7008端口

./redis-trib.rb add-node 192.168.0.3:7007 192.168.0.3:7001

如果加入了其他点可以删除 7007文件下的nodes.conf文件

redis官方给出的集群方案中,数据的分配是按照槽位来进行分配的,每一个数据的键被哈希函数映射到一个槽位,redis-3.0.0规定一共有16384个槽位,当然这个可以根据用户的喜好进行配置。当用户put或者是get一个数据的时候,首先会查找这个数据对应的槽位是多少,然后查找对应的节点,然后才把数据放入这个节点。这样就做到了把数据均匀的分配到集群中的每一个节点上,从而做到了每一个节点的负载均衡,充分发挥了集群的威力。

如果要创建master 需要给一定哈希槽,这样才能充分利用节点 之前哈希槽平均分配到了3个master节点

将7007设置为master给予4000哈希槽

./redis-trib.rb reshard 192.168.0.3:7007

 

输入7007的node_id

从所有节点随机转移哈希槽,凑足4000

输入yes开始分配

成功输出(由于配置了maxmemory 100m,内存溢出导致未分配到4000哈希槽)

将7008设置为7007的slave (7008需先加入此集群)

前面我们已经把这个新节点添加到集群中了,现在我们要让新节点7008成为7007的从节点,只需要执行下面的命令就可以了,命令后面的节点ID就是7007的节点ID

redis-cli -c -p 7008 cluster replicate node_id

删除节点  (因为之前内存不足问题,我直接修改了node.conf文件重启)

1:如果删除的节点是主节点,这里我们删除192.168.0.3:7007节点,这个节点有690个哈希槽
首先要把节点中的哈希槽转移到其他节点中,执行下面的命令
cd /usr/local/redis3.0.0.7/src
./redis-trib.rb reshard 192.168.0.3:7007
系统会提示我们要移动多少哈希槽,这里移动690个,因为192.168.0.3:7007节点有690个哈希槽
然后系统提示我们输入要接收这些哈希槽的节点的ID,这里使用192.168.0.3:7001的节点ID
然后要我们选择从那些节点中转出哈希槽,这里一定要输192.168.0.3:7007这个节点的ID,最后输入 done 表示输入完毕
最后一步,使用下面的命令把这个节点删除后面为7007 node_id 
cd /usr/local/redis3.0.7/src/
./redis-trib.rb del-node 192.168.0.3:7007 3126945afebaf2fd685fd90637250852de91a2bc  
2:如果节点是从节点的,直接使用下面的命令删除即可。
cd /usr/local/redis3.0.7/src/
./redis-trib.rb del-node 192.168.0.3:7008 node_id

config get动态扩容 (连接哪个节点能改这个节点参数,临时生效)

config get *获取所有可动态扩参数

config set maxmemory  

 

 redis-cli -c -h localhost -p 7001 info

redis_version:2.4.16                                  # Redis 的版本
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.1.2                                         #gcc版本号
process_id:10629                                        # 当前 Redis 服务器进程id
uptime_in_seconds:145830                      # 运行时间(秒)
uptime_in_days:1                                        # 运行时间(天)
lru_clock:947459                                        
used_cpu_sys : Redis 服务器耗费的系统 CPU
used_cpu_user : Redis 服务器耗费的用户 CPU
used_cpu_sys_children : 后台进程耗费的系统 CPU
used_cpu_user_children : 后台进程耗费的用户 CPU
connected_clients:1                                  # 连接的客户端数量
connected_slaves:0                                  # slave的数量
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:832784                               # Redis 分配的内存总量
used_memory_human:813.27K
used_memory_rss:1896448                     # Redis 分配的内存总量(包括内存碎片)
used_memory_peak:832760                
used_memory_peak_human:813.24K    #Redis所用内存的高峰值
mem_fragmentation_ratio:2.28                 # 内存碎片比率
mem_allocator:jemalloc-3.0.0                 

loading:0
aof_enabled:0                                                  #redis是否开启了aof
changes_since_last_save:0                         # 上次保存数据库之后,执行命令的次数
bgsave_in_progress:0                                   # 后台进行中的 save 操作的数量
last_save_time:1351506041                        # 最后一次成功保存的时间点,以 UNIX 时间戳格式显示
bgrewriteaof_in_progress:0                         # 后台进行中的 aof 文件修改操作的数量
total_connections_received:1                      # 运行以来连接过的客户端的总数量
total_commands_processed:1                    # 运行以来执行过的命令的总数量
expired_keys:0                                                # 运行以来过期的 key 的数量
evicted_keys:0                                                #运行以来删除过的key的数量
keyspace_hits:0                                            # 命中 key 的次数
keyspace_misses:0                                     # 不命中 key 的次数
pubsub_channels:0                                     # 当前使用中的频道数量
pubsub_patterns:0                                      # 当前使用的模式的数量
latest_fork_usec:0                                      
vm_enabled:0                                                # 是否开启了 vm (1开启  0不开启)
role:master                                                     #当前实例的角色master还是slave
db0:keys=183,expires=0                             # 各个数据库的 key 的数量,以及带有生存期的 key 的数量 

  

EXPIRE key 100

设置了过期时间,100秒后,key将自动被删除。

 ################################ GENERAL  #####################################
daemonize yes
port 6379
logfile "/opt/oracle/redis/logs/Redis.log"
loglevel notice
syslog-enabled no
pidfile /opt/oracle/redis/logs/Redis.pid
dir "/opt/oracle/redis/data"
databases 1

################################ SNAPSHOTTING  ################################
#save 900 1
#save 300 10
#save 60 10000
stop-writes-on-bgsave-error no
dbfilename    "master.rdb"

############################# CLUSTER #########################################
cluster-enabled yes
cluster-config-file     /opt/oracle/redis/conf/masternodes.conf
cluster-node-timeout    15000
cluster-migration-barrier       1
cluster-require-full-coverage   yes

################################# REPLICATION #################################
slave-serve-stale-data yes
slave-read-only yes
repl-backlog-size 1mb
repl-backlog-ttl 3600
min-slaves-to-write 0
min-slaves-max-lag 10

################################### LIMITS ####################################
maxclients 10000
tcp-backlog 128
maxmemory 16gb
maxmemory-policy noeviction
tcp-keepalive 60
############################## APPEND ONLY MODE ###############################
appendonly no

################################## SLOW LOG ###################################
slowlog-log-slower-than 10000
slowlog-max-len 128 
原文地址:https://www.cnblogs.com/linxizhifeng/p/7159745.html