Mac环境下面Redis的集群和安装使用
一,为什么要搭建的Redis集群
的Redis的的的的都知道是一个内存数据库,也就是说存储数据的容量首先你于主机的内存。普通主机服务器的内存一般几十G,但是假如我们需要存储大容量的数据(比如上百ģ的数据)单机就无法提供服务了所以我们要集群
在3.0版本之前,通常的做法是获取某个键的哈希码,然后MOD,不过这种做法无法很好的支持动态伸缩性需求,一旦节点的增或者删操作,都会导致键无法在Redis的的的中的中间.redis3.0版本以上开始支持cluster,采用的是hash slot(哈希槽)。他可以把多个redis实例整合在一起,形成一个集群,也就是将数据分散到集群的多台机器上(这里不做过多的解释这篇文重点说下集群的实现)
集群环境Mac osx系统10.12.6
1,下载和安装的Redis的的的的
这里不做详细介绍,直接去官网下载最新版本的redis即可。(http://www.redis.cn/ 我下载的是3.2.5版本目前最新貌似已经到了四点几了)
1.1下载完成后直接解压缩文件:
打开终端:
1,cd /Downloads/redis-3.2.5(进入到你的解压缩目录)
2,make install
3,等待安装成功
如图4所示,安装成功后,redis的的的的的-3.2.5的SRC文件夹下面会生成一些文件如下:
2,创建集群目录
2.1,在/ usr / Documents /下面创建集群文件夹cluster,并在文件夹下面创建各个节点文件夹,文件夹名和端口号一致(这里路径随意看个人习惯我这里端口默认用7001~7006)
2.2,将redis的的的的的-3.2.5文件夹下面的redis.conf文件夹修改一下,修改以下几个属性:
port 7001 //节点端口
daemonize yes //配置redis作为守护进程运行,默认情况下,redis不是作为守护进程运行的
支持群集的是//是否开启集群
cluster-config-file nodes-7000.conf //该节点的对应的节点配置文件
cluster-node-timeout 5000 //集群超时时间
appendonly yes //存储方式,
2.3,将redis.conf文件和redis的-3.2.5 / SRC目录下面的redis.server文件分别拷贝到各个节点文件夹中,也就是上面的创建目录01,02,03,04,05,06文件夹中修改各个文件夹下面的redis.conf文件,端口对应的各个节点的端口,
2.4,启动各个节点:
cd / usr / Documents / redis-cluster / redis01
$ sudo redis-server redis.conf
cd / usr / Documents / redis-cluster / redis02
$ sudo redis-server redis.conf
cd / usr / Documents / redis-cluster / redis03
$ sudo redis-server redis.conf
cd / usr / Documents / redis-cluster / redis04
$ sudo redis-server redis.conf
cd / usr / Documents / redis-cluster / redis05
$ sudo redis-server redis.conf
cd / usr / Documents / redis-cluster / redis06
$ sudo redis-server redis.conf
2.5,查看有多少个redis的的的的的在运行:
$ ps -ef | grep redis
可以看到6个节点都在运行
3接下来就是开始集群我们切换目录到最开始的redis的的的的安装目录SRC中
cd /Downloads/redis-3.2.5/src
执行这个命令./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
如果出现下面的信息那一切正常那恭喜你已经成功了
等待过程输入是即可
但是本人安装过程遇到一个坑!这个坑搞了我一整天时间!
在上面执行./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这一步的时候有可能出现下面报错
如何解决?
第一可能是因为没有安装ruby的redis插件解决方式gem install redis(如果是这种那还好说装完后正常启动就完事了)
第二执行gem install redis报错如下
解决方式网上搜索有几种:
一种是更新红宝石源换镜像然后升级的的的的CocoaPods 千万别用这种(亲身体验被折腾一天)用了这种死活升级不了的的的的CocoaPods各种SSL拉取包报错又得更新你电脑的OpenSSL的的的的(百度搜索的解决方案我也不知道为啥总之无底洞折腾完一个牵引出另外一个)。
第二种:直接用RVM来升级红宝石,RVM是可以让你拥有很多红宝石版本的一个工具,具体的可以去了解一下(以下各个步骤均在终端中实现)首先安装RVM:
curl -L https://get.rvm.io | bash -s稳定
等待一段时间即可安装完成RVM如下图
载入RVM环境
source~ / .rvm / scripts / rvm
检查是否安装成功,
rvm -v
用RVM安装红宝石的环境
rvm install 2.2.4
设置为电脑默认版本
rvm使用2.2.4 - 默认
查看已安装的红宝石
rvm列表
卸载一个已安装的ruby2.3版本
rvm删除2.3
然后我们在回到上面的第三步开始集群就好了./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后面操作和上面一样就不多说了
4至此,集群搭建完毕:查看集群信息一切正常redis-cli -h 127.0.0.1 -p 7000群集信息
测试一下链接之任意一个节点redis-cli -h 127.0.0.1 -p 7001
执行集群节点可以看到我们集群的每一个节点状态三主三丛以及主从节点的IP端口还有每个节点对应的哈希槽(这里不详细概述了)
节点会对命令请求进行分析和键的槽计算,并且会查找这个命令所要处理的键所在的槽。如果要查找的哈希槽正好就由接收到命令的节点负责处理,那么节点就直接执行这个命令。
这里我们设置一下设定键值
如果所查找的槽不是由该节点处理的话,节点将查看自身内部所保存的哈希槽到节点ID的映射记录,并且客户端回复一个MOVED错误。上面的错误信息包含键你好所属的哈希槽886,以及负责处理这个槽的节点的IP和端口号127.0.0.1:7004。
虽然我们用节点ID来标识集群中的节点,但是为了让客户端的转向操作尽可能地简单,节点在MOVED错误中直接返回目标节点的IP和端口号,而不是目标节点的ID。客户端应应记录槽886由节点127.0.0.1:7004负责处理“这一信息,这样当再次有命令需要对槽886执行时,客户端就可以加快寻找正确节点的速度这样,当集群处于稳定状态时,所有客户端最终都会保存有一个哈希槽至节点的映射记录,使得集群非常高效:客户端可以直接向正确的节点发送命令请求,无须转向,代理或者其他任何可能发生单点故障(单点故障)的实体(这里 一点不明白刚开始操作是这样后面我关闭了集群从新开启的时候插入键值队集会默认跳转到对应的节点然后插入进去返回OK表示已经插入成功取数据也是一样无论链接到哪个节点得都会自动跳转到对应的哈希槽对应节点返回数据)。
五总结一下基本用法----------------------------------------
集群
集群信息:打印集群的信息
群集节点:列出集群当前已知的所有节点(节点),以及这些节点的相关信息。
节点
集群是否满足<IP> <端口>:将IP和端口所指定的节点添加
群集忘记<node_id>:从集群中移除node_id指定的节点
.clusterreplicate <node_id>:将当前节点设置为node_id指定的节点的从节点。
集群节点:将节点到集群当中,让它成为集群的一份子。的
插槽文件保存到硬盘里面。槽(slot)
cluster addslots <slot> [slot ...]:将一个或多个槽(slot)指派(assign)给当前节点
.clusterdelslots <slot> [slot ...
cluster:slotfllotsots :移除一个或多个槽对当前节点的指派.cluster
setslot <slot> node <node_id>:移除一个或多个槽对当前节点的指派.traceflushslots:移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。将槽槽指派给node_id指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然
cluster setslot <slot> import <node_id>:从node_id指定的节点中导入槽slot到本节点
.cluster setslot <slot> stable:取消对槽slot的导入(import)或者迁移(migrate)。
键
cluster keyslot <key >:计算键key应该被放置在哪个槽上
.clustercountkeysinslot <slot>:返回槽槽目前包含的键值对数量
.clustergetkeysinslot <slot> <count>:返回计数个槽槽中的键。