Redis的常用的集群方式主要有以下3种
1:主从复制
2:哨兵(Sentinel)
3:Cluster
一、主从
主从其实就是一般包含一个主,一个或多个从,从节点从主节点复制数据,可以实现读写分离,主节点做写,从节点做读。在配置上基本没什么要改的。这里用Linux做演示。
//这里启动3个docker,就让5678当主节点吧
docker run -d -p 5678:6379 redis
docker run -d -p 5679:6379 redis
docker run -d -p 5677:6379 redis
启动之后分别进入容器里面

在主节点里面添加数据。并且能够查到

然后我们去随便一个从节点里面去查询,发现并不能查到,这是为什么呢?因为还没有做数据的同步

要做数据的同步需要执行这个命令
slaveof host port

ok,这样就能查到数据了。然后后面无论在主节点添加数据,都能在从节点查询到。
如果想知道主节点有多少从节点的话可以使用 这个命令
info replication

主从节点的优缺点:
优点:可以实现读写分离,主节点的数据会自动复制到从节点,分担主节点的压力
缺点:当主节点宕机了,会导致部分数据未同步。也不具备容错和回复功能,无论主节点或者从节点宕机都需要等重启之后才能使用
二、哨兵模式
其实哨兵模式也是一种主从,只不过增加了哨兵的功能,用于监控主节点的状态,当主节点宕机之后会进行投票重新选出主节点。
哨兵的宕机分为两种:主观宕机(我认为你掉线了)和客观宕机(我们认为你掉线了),当客观宕机了之后就会再选举一个从节点作为主节点,而这又可以分为两步
1:选哨兵领导
a:我发现了master下线,你们(其他哨兵)选我当哨兵领导吧
b:其他哨兵没有选过其他人当领导,那我就是领导了
c:超过一半的其他哨兵同意,我就是领导了
d:如果有多个哨兵同时参选,等待任意时间后重新发起投票,直到选出了领头的
2:由哨兵领导推举主节点
选主节点要遵循以下原则
a:健康性:从节点响应的时间
b:完整性:根据从节点备份的完整性,根据数据备份偏移量
c:稳定性:启动时间周期,心跳检测
d:如果以上三个条件都相等,则根据节点启动时分配的run id来分配,runid越小越有可能被选择为主节点
然后开始吧。哨兵需要做一些配置文件。

配置文件
主节点:redis-6379.conf:
port 6379
requirepass 123456
从节点如上,端口分别是6380,6381
port 6380
slaveof 127.0.0.1 6379
masterauth 123456
port 6381
slaveof 127.0.0.1 6379
masterauth 123456
然后是哨兵:
# 其他两个sentinel节点的端口号分别为26380、26381
port 26379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 3000
# 必须配置,否则启动后sentinel节点都会是sdown(主观宕机)状态或者odown(客观宕机)状态
sentinel auth-pass mymaster 123456
然后启动就行了。可以把哨兵模式做成这个样子,把配置文件都放到Sentinel文件夹里面然后一键启动(哈哈,刚学的)

启动代码:
@echo off
echo Starting Sentinel:
pushd %~dp0\Sentinel
echo Targets: 7010-7011
@start "Redis (Sentinel-Target): 7010" /min ..\3.0.503\redis-server.exe redis-7010.conf
@start "Redis (Sentinel-Target): 7011" /min ..\3.0.503\redis-server.exe redis-7011.conf
echo Monitors: 26379-26381
@start "Redis (Sentinel): 26379" /min ..\3.0.503\redis-server.exe sentinel-26379.conf --sentinel
@start "Redis (Sentinel): 26380" /min ..\3.0.503\redis-server.exe sentinel-26380.conf --sentinel
@start "Redis (Sentinel): 26381" /min ..\3.0.503\redis-server.exe sentinel-26381.conf --sentinel
popd
启动之后可以发现7011是从节点,7010是主节点

然后通过以下命令进入到26379哨兵查看主从节点状态
redis-cli -p 26379

然后我们将主节点7010关闭,可以发现,哨兵就重新将7011选为主节点了(当然这里只启动了两个,可以多启动几个节点,测试效果更佳),而当之前关闭的主节点重启之后,就会变成从节点

这是重启后的,会连接到现在的主节点7011

哨兵模式的优缺点
优点:哨兵模式可以算主从模式的升级吧,主从的优点都有,而且哨兵还有监控的功能,当主节点宕机之后哨兵会推选一个健康的从节点做主节点,这样提高了软件的可用性
缺点:主从模式的缺点都有,而且配置哨兵啥的比较麻烦,而且在重新选举主节点期间,无法确定主从,无法工作
三、cluster
集群采用了多主多从,按照一定的规则进行分片,将数据分别存储,一定程度上解决了哨兵模式下单机存储有限的问题。
集群模式一般是3主3从,且需要ruby辅助搭建。
1:复制5个redis出来,作为3主3从,端口可以自定义
2:修改配置:cluster-enabled yes
3:安装 Ruby
4:安装redis驱动: 地址:https://rubygems.org/gems/redis/versions/3.3.2
将下载的Redis驱动文件redis-3.3.2.gem复制到Ruby安装目录下(即:C:Ruby30-x64),打开CMD,运行如下命令:
gem install --local C:Ruby30-x64redis-3.3.2.gem
5:下载集群管理工具,将扩展名为rb的文件拷贝到6379文件夹中
6:将6个redis启动,在6379的文件夹下cmd,输入命令:
//replicas 1 表示为集群中的每个主节点创建1个从节点
redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
接着执行就是了,这里要选yes

以上,集群搭建完毕。我们可以登录6379查看集群状态
redis-cli -p 6378
cluster nodes

从上面我们可以看到集群中3个主节点被分成了3个分区,可以来单独存储自己的数据。然后我们设置一个值,会自动跳转到相应的节点。

在部署集群的时候我踩了以下几个坑,希望能够注意下!
1:invalid byte sequence in UTF-8 解决:文件夹不能含中文
2:Node 127.0.0.1:6379 is not configured as a cluster node 解决:将cluster-enabled yes的注释取消
3: Node 127.0.0.1:6379 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0 解决:清除dump和aof文件
4: ERR Slot 5798 is already busy (Redis::CommandError) 解决:挨个登录客户端,执行flushall和cluster reset命令,然后重新执行命令创建集群
5:(error) MOVED 6918 127.0.0.1:6380 解决:redis-cli启动时使用 -c -p
6:销毁之前的集群 解决:将node.conf删除
集群的优缺点
优点:配置了多主多从,可以使数据分区,去中心化,减小了单台机子的负担,且可用性更高于哨兵模式
缺点:搭建麻烦
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
question的一些答案关于redirect_to让我想到了其他一些问题。基本上,我正在使用Rails2.1编写博客应用程序。我一直在尝试自己完成大部分工作(因为我对Rails有所了解),但在需要时会引用Internet上的教程和引用资料。我设法让一个简单的博客正常运行,然后我尝试添加评论。靠我自己,我设法让它进入了可以从script/console添加评论的阶段,但我无法让表单正常工作。我遵循的其中一个教程建议在帖子Controller中创建一个“评论”操作,以添加评论。我的问题是:这是“标准”方式吗?我的另一个问题的答案之一似乎暗示应该有一个CommentsController参
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
是否可以让这段代码更紧凑?我在这里错过了什么吗?ifvaluemax_ratemax_rateelsevalueend 最佳答案 这里有一些完全不同的东西:[min_rate,value,max_rate].sort[1] 关于ruby-如何更优雅地记下这三种情况?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13309740/
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一