@
网上有很多教程,这里不做赘述,只提我之前踩过的坑:
caused by:io.lettuce.core.redisException:connot retrieve initial cluster partitions from initial URIs
原因:因为端口未开放
解决:以开放6556端口为例
#查看开放的端口
$ firewall-cmd --list-ports
#查询6556端口是否开放
$ firewall-cmd --query-port=6556/tcp
firewall-cmd --add-port=6556/tcp --permanent
#重新加载生效
firewall-cmd --reload
daemonize yes #守护线程
port 6556 #端口
logfile "6556.log" #日志文件
dir "/usr/local" #持久化文件目录路径
requirepass "123456" #需要密码
masterauth "123456" #主机密码
#绑定虚拟机地址及本地映射地址
bind 192.168.2.237 127.0.0.1
appendonly yes #开启持久化aof模式
appendfilename "aof-6556.aof" #aof文件夹
appendfsync everysec #每秒更新
no-appendfsync-on-rewrite yes #同步数据时不重写
auto-aof-rewrite-percentage 100 #增加倍数达到100%重写
auto-aof-rewrite-min-size 64mb #重写最低文件大小为64mb
port 6557
daemonize yes
logfile "6557.log"
dir "/usr/local"
requirepass "123456"
masterauth "123456"
bind 192.168.2.37 127.0.0.1
appendonly yes
appendfilename "aof-6557.aof"
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
port 6776 #端口
daemonize yes #守护线程
logfile "6776.log" #日志
dir "/usr/local" #持久化目录
#sentinel监听主机为master及其地址和端口
#且当有2个sentinel认为master失效后才算真正失效
sentinel monitor master 192.168.2.237 6556 2
#当达到15000毫秒(默认30s),master失效才被sentinel认为失效
sentinel failover-timeout master 15000
#连接master和slave的密码,且master和slave的密码须一致
sentinel auth-pass master 123456
#发生failover时主备切换有1个slave同时对新的master进行同步
sentinel parallel-syncs master 1
#该sentinel绑定的地址及端口
bind 192.168.2.237 127.0.0.1
port 6777 #端口
daemonize yes #守护线程
logfile "6777.log" #日志
dir "/usr/local" #持久化目录
#sentinel监听主机为master及其地址和端口
#且当有2个sentinel认为master失效后才算真正失效
sentinel monitor master 192.168.2.237 6556 2
#当达到15000毫秒(默认30s),master失效才被sentinel认为失效
sentinel failover-timeout master 15000
#连接master和slave的密码,且master和slave的密码须一致
sentinel auth-pass master 123456
#发生failover时主备切换有1个slave同时对新的master进行同步
sentinel parallel-syncs master 1
#该sentinel绑定的地址及端口
bind 192.168.2.37 127.0.0.1
我直接在usr/local目录下运行:
./redisfile/redis/src/redis-server ./redisfile/redis/redis-6556.conf
这里直接在/usr/local目录下编写一个.sh脚本同时启动两个redis服务,节省后面每次启动的时间,脚本start-all.sh
如下:
./redisfile/redis/src/redis-server ./redisfile/redis/redis-6557.conf
./redisfile2/redis/src/redis-server ./redisfile2/redis/redis-6558.conf
编写好后要赋予其读写执行的权限,最后启动
chmod +x start-all.sh
sh start-all.sh
我直接在usr/local目录下运行:
./redisfile/redis/src/redis-sentinel ./redisfile/redis/sentinel -6776.conf
这里直接在/usr/local目录下编写一个.sh脚本同时启动两个sentinel 服务,节省后面每次启动的时间,脚本start-all-sentinel.sh
如下:
./redisfile/redis/src/redis-sentinel ./redisfile/redis/sentinel-6777.conf
./redisfile2/redis/src/redis-sentinel ./redisfile2/redis/sentinel-6778.conf
编写好后要赋予其读写执行的权限,最后启动
chmod +x start-all-sentinel.sh
sh start-all-sentinel.sh
待redis和sentinel都运行后,sentinel的配置文件也发生了改变,其中sentinel-6556.conf如下:
sentinel known-slave master 192.168.2.37 6557
sentinel known-slave master 192.168.2.37 6558
sentinel known-sentinel master 192.168.2.37 6778 75f0266605bfa79a173076e6394d1c5f0032ebd6
sentinel known-sentinel master 192.168.2.37 6777 03e6af6441ffac5c9602c693974e299136ac4632
现在主机是6556,我们把6556的redis服务停止,同时停止6778的sentinel服务,看sentinel是否能够选举出新的主机并切换过去。
## 先在主机192.168.2.237找出6556redis的运行进程
ps -ef|grep redis
## 再杀死进程
kill -9 76529
同上从机192.168.2.37找出6778sentinel的运行进程并杀死
过15秒后看sentinel-6776.conf的主机master已经由6556变成6558了
port 6776
daemonize yes
logfile "6776.log"
dir "/usr/local"
sentinel myid 72ea9a3eb747027d16a2911abe372e7f5a24b620
sentinel monitor master 192.168.2.37 6558 2
这里简单说下:master可读可写,另外一台salve(经三次测试每次都是下一次宕机后不会成为主机的从机)竟然也是可读可写,但是其中的数据并不会同步到master和另一台slave,包括主机切换后也不会。
随心所往,看见未来。Follow your heart,see night!
欢迎点赞、关注、留言,一起学习、交流!
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我主要使用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
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende
给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最
了解Rails缓存如何工作的人可以真正帮助我。这是嵌套在Rails::Initializer.runblock中的代码:config.after_initializedoSomeClass.const_set'SOME_CONST','SOME_VAL'end现在,如果我运行script/server并发出请求,一切都很好。然而,在我的Rails应用程序的第二个请求中,一切都因单元化常量错误而变得糟糕。在生产模式下,我可以成功发出第二个请求,这意味着常量仍然存在。我已通过将以上内容更改为以下内容来解决问题:config.after_initializedorequire'some_cl
我想编写一个ruby脚本来递归复制目录结构,但排除某些文件类型。因此,给定以下目录结构:folder1folder2file1.txtfile2.txtfile3.csfile4.htmlfolder2folder3file4.dll我想复制这个结构,但不包含.txt和.cs文件。因此,生成的目录结构应如下所示:folder1folder2file4.htmlfolder2folder3file4.dll 最佳答案 您可以使用查找模块。这是一个代码片段:require"find"ignored_extensions=[".cs"
我经常迷上ruby的一件事是递归模式。例如,假设我有一个数组,它可能包含无限深度的数组作为元素。所以,例如:my_array=[1,[2,3,[4,5,[6,7]]]]我想创建一个方法,可以将数组展平为[1,2,3,4,5,6,7]。我知道.flatten可以完成这项工作,但这个问题是作为我经常遇到的递归问题的一个例子-因此我试图找到一个更可重用的解决方案。简而言之-我猜这种事情有一个标准模式,但我想不出任何特别优雅的东西。任何想法表示赞赏 最佳答案 递归是一种方法,它不依赖于语言。您在编写算法时要考虑两种情况:再次调用函数的情
这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo
我想开始使用“Sinatra”框架进行编码,但我找不到该框架的“MVC”模式。是“MVC-Sinatra”模式或框架吗? 最佳答案 您可能想查看Padrino这是一个围绕Sinatra构建的框架,可为您的项目提供更“类似Rails”的感觉,但没有那么多隐藏的魔法。这是使用Sinatra可以做什么的一个很好的例子。虽然如果您需要开始使用这很好,但我个人建议您将它用作学习工具,以对您来说最有意义的方式使用Sinatra构建您自己的应用程序。写一些测试/期望,写一些代码,通过测试-重复:)至于ORM,你还应该结帐Sequel其中(imho
之前有人问过这个问题,我发现了以下clip关于如何一次设置一个类对象的所有属性,但由于批量分配保护,这在Rails中是不可能的。(例如,您不能Object.attributes={})有没有一种很好的方法可以将一个类的属性合并到另一个类中?object1.attributes=object2.attributes.inject({}){|h,(k,v)|h[k]=vifObjectModel.column_names.include?(k);h}谢谢。 最佳答案 利用assign_attributes使用:without_prote