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
- tar -xzvf zlib-1.2.8.tar.gz
- cd zlib-1.2.8
- ./configure --prefix=/opt/zlib
- make
- make install
安装ruby-zlib
- cd ruby-2.1.6/ext/zlib
- ruby ./extconf.rb --with-zlib-dir=/opt/zlib
- make
- make install
最后安装redis-3.3.2gem
gem install -l redis-3.3.2.gem
启动集群
- 进入src目录 cd redis-3.0.7/src
- 执行./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就可以了
验证
- 进入redis控制台redis-cli -c -p 7001
- set foo car
- 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将自动被删除。
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