redis集群

redis集群
概述:redis集群至少要3个主节点(6台主机)redis集群是用ruby脚本写的
redis如果开启了集群功能的话运行的时候有2个端口号,一个是本机使用的端口,另外一个是本机访问集群上的其他机器的端口
在任何一台主机上创建集群都可以

[root@1 /]# rpm -q ruby (查看本机是否有ruby包)
未安装软件包 ruby [root@1 /]# yum -y install ruby.x86_64 (安装ruby解释包/主包)
作为依赖被安装:
libyaml.x86_64 0:0.1.4-11.el7_0
ruby-irb.noarch 0:2.0.0.648-30.el7
ruby-libs.x86_64 0:2.0.0.648-30.el7
rubygem-bigdecimal.x86_64 0:1.2.0-30.el7
rubygem-io-console.x86_64 0:0.4.2-30.el7
rubygem-json.x86_64 0:1.7.7-30.el7
rubygem-psych.x86_64 0:2.0.0-30.el7
rubygem-rdoc.noarch 0:4.0.0-30.el7
rubygems.noarch 0:2.0.14.1-30.el7

[root@1 redis-cluster]# yum -y install ruby-devel-2.0.0.648-30.el7.x86_64.rpm (安装依赖包)
已安装:
ruby-devel.x86_64 0:2.0.0.648-30.el7

rubygems-2.0.14.1-30.el7.noarch (安装gem解释器)

[root@1 redis-cluster]# gem install redis-3.2.1.gem (安装依赖包)
Successfully installed redis-3.2.1
Parsing documentation for redis-3.2.1
Installing ri documentation for redis-3.2.1
1 gem installed

修改配置文件

在6台主机上做如下配置,并运行redis服务

 vim/etc/redis/redis.conf

bind IP地址                                   //只写物理接口IP地址
daemonize yes                             //守护进程方式运行
port   xxx                                    //端口号不要使用默认的6379
cluster-enabled yes                    //开启集群
cluster-config-file  nodes.conf   //集群的配置文件不要使用默认的名称
cluster-node-timeout 5000        //请求超时5秒

所有redis全部启动
注意:如果起来后起来了4个服务那么就删除 /var/lib/redis/6379/* 然后pkill掉进程,再启动就好了

创建集群

/root/redis-4.0.8/src/redis-trib.rb create –replicas 1 192.168.4.51:6351 192.168.4.52:6352 (–replicas 1 表示自动为每一个master节点分配一个slave节点) 192.168.4.53:6353 192.168.4.54:6354 192.168.4.55:6355 192.168.4.56:6356 (创建集群)
Can I set the above configuration? (type ‘yes’ to accept): yes

Check slots coverage…
[OK] All 16384 slots covered. (所有hash slots 槽位数)

如果报错:
/usr/local/share/gems/gems/redis-3.2.1/lib/redis/client.rb:113:in `call’: ERR Slot 3662 (槽位数)is already busy (Redis::CommandError)

from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2556:in `block in method_missing'
from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in `block in synchronize'
from /usr/share/ruby/monitor.rb:211:in `mon_synchronize'
from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:37:in `synchronize'
from /usr/local/share/gems/gems/redis-3.2.1/lib/redis.rb:2555:in `method_missing'
from ./redis-trib.rb:212:in `flush_node_config'
from ./redis-trib.rb:906:in `block in flush_nodes_config'
from ./redis-trib.rb:905:in `each'
from ./redis-trib.rb:905:in `flush_nodes_config'
from ./redis-trib.rb:1426:in `create_cluster_cmd'
from ./redis-trib.rb:1830:in `<main>'

解决方案:
for i in 192.168.4.5{1..6}; do a=1; pssh -i -H i"redisclih i " r e d i s − c l i − h i -p 635$a shutdown”; done (先停止所有的redis)

[root@localhost ~]# for i in 192.168.4.5{1..6}; do pssh -i -H $i “rm -rf /var/lib/redis/6379/*”; done(删除所有的文件)

for i in 192.168.4.5{1..6}; do pssh -i -H $i “/etc/init.d/redis_6379 start”; done (然后重启所有数据库)

然后再次创建集群

任意一台主机访问本机的redis服务,查看即可

-redis-cli -c (class) -h (IP地址) -p(集群端口)

卸载集群:

[root@localhost /]# for i in {1..6}; do pssh -i -H 192.168.4.5 i"redisclih192.168.4.5 i " r e d i s − c l i − h 192.168.4.5 i -p 635$i shutdown”; done (停止服务)

[root@localhost /]# for i in {1..6}; do pssh -i -H 192.168.4.5$i “rm -rf /var/lib/redis/6379/*”; done (删除集群文件)

root@localhost /]# for i in {1..6}; do pssh -i -H 192.168.4.5$i “/etc/init.d/redis_6379 start”; done (再次启动服务)

[root@2 ~]# redis-cli -c -h 192.168.4.51 -p 6351 (连接集群中的主机)

192.168.4.51:6351> 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:1057
cluster_stats_messages_pong_sent:1182
cluster_stats_messages_sent:2239
cluster_stats_messages_ping_received:1177
cluster_stats_messages_pong_received:1057
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:2239

192.168.4.51:6351> CLUSTER nodes (查看本机节点信息)
4223a141b9c5decbde28441b518cbac90dc003d8 192.168.4.56:6356@16356 slave
809e47959e211774e8957c38e7ee44bbca020457 0 1528513649506 6 connected
e5f3093d78828a8c95c118b6b9ada5bddff01e9b 192.168.4.54:6354@16354 slave 2b779c31619d19fc43ee86c10d5c15fc46c0df4d 0 1528513649000 4 connected
fddd9b3711071d7a66104cb098132439758f0a63 192.168.4.55:6355@16355 slave a1bd48779becaa83ee5ef4a8d8d758d2b4748ce6 0 1528513650000 5 connected
809e47959e211774e8957c38e7ee44bbca020457 192.168.4.52:6352@16352 master - 0 1528513649000 2 connected 5461-10922
a1bd48779becaa83ee5ef4a8d8d758d2b4748ce6 192.168.4.51:6351@16351 myself,master - 0 1528513650000 1 (当前数据库主机) connected 0-5460
2b779c31619d19fc43ee86c10d5c15fc46c0df4d(id号) 192.168.4.53:6353@16353 master - 0 1528513649708 3 connected 10923-16383

把key使用 crc16 算法做计算 然后计算结果和 16384做求模运算
从库会自动同步主库的数据

主库的选举
主库能存能取
主库坏了,从库自动升级成主库,修好之后,之前的主库会变成当前主机的从库
从库不能取,用来备份数据的
dump.rdb (数据存储在硬盘的地方)

[root@localhost 6379]# redis-cli -c -h 192.168.4.55 -p 6355 (进入集群模式)
192.168.4.55:6355> ping
PONG
192.168.4.55:6355> keys *
(empty list or set)
192.168.4.55:6355> get name
-> Redirected to slot [5798] located at 192.168.4.56:6356 (提示你去哪里查)(原理:把name字段通过crc16算法与16383取余,得到hash 槽,哈希槽对应的主机上)
“yaya”

redis-trib.rb脚本:

语法格式

Redis-trib.rb  选项   参数

选项

add-node 添加新节点
check 对节点主机做检查
reshard 对节点主机重新分片
add-node --slave 添加从节点主机
del-node 删除节点主机

添加新的数据库进集群:
添加的节点默认为主库

./redis-trib.rb add-node 192.168.4.57:6357(新主机的ip和端口) 192.168.4.51:6351 (任意一个集群中的主机——>添加主库)
[root@1 src]# ./redis-trib.rb check 192.168.4.51:6351 (检查主从状态)
重新分片:
[root@1 src]# ./redis-trib.rb reshard 192.168.4.51:6351 (重新分片)
How many slots do you want to move (from 1 to 16384)? 4096 (你要拿出来多少槽位,计算公式:总槽位/当前主节点)
What is the receiving node ID? (4096给谁,给新的master id,用 cluster nodes,前面的就是自己的id)
Source node all (从所有主节点主机或取来分配)
[root@1 src]# ./redis-trib.rb check 192.168.4.51:6351 (检查node是否分配完成)

./redis-trib.rb add-node –slave –master-id id值(做谁的从就写谁) 192.168.4.57:6357(新主机的ip和端口) (添加一个从库,不指定master-id,会随机添加为从节点最少的主的从)

[root@1 src]# ./redis-trib.rb check 192.168.4.51:6351 (再检查主从状态)

移除从库:
[root@1 src]# ./redis-trib.rb del-node 192.168.4.51:6351 e5f3093d78828a8c95c118b6b9ada5bddff01e9b (移除从库,移除了后进程就自杀了)

Removing node e5f3093d78828a8c95c118b6b9ada5bddff01e9b from cluster 192.168.4.51:6351
Sending CLUSTER FORGET messages to the cluster…
SHUTDOWN the node.

移除主库:

未完待续!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值