澳门美高梅手机网站于Script到Code Blocks、Code Behind到MVC、MVP、MVVM

恰恰过去的星期五(3-14)例行地主持了技术会议,主题正好是《UI层的设计模式——从Script、Code
Behind到MVC、MVP、MVVM》,是前天晚才定的,中午消费了大体上时准备了产就是起来云了。

目录

目录
1

1. 前言
2

2. 配置计划
2

3. 目结构
2

4. 编译安装
3

5. 窜系统参数
3

5.1. 修改最可怜而打开文件数
3

5.2. TCP监听队列大小 4

5.3. OOM相关:vm.overcommit_memory 4

5.4. /sys/kernel/mm/transparent_hugepage/enabled
4

6. 配置Redis 4

7. 启动redis实例 6

8. 创造及开行redis cluster前的备选工作 6

8.1. 安装ruby 7

8.2. 安装rubygems 7

8.3. 安装redis-3.0.0.gem 7

9. redis-trib.rb
7

10. 创造同启动redis集群 8

10.1. 复制redis-trib.rb 8

10.2. 创建redis cluster 9

10.3. ps aux|grep redis
10

11. redis cluster client
11

11.1. 下令行工具redis-cli 11

11.2. 从slaves读数据 11

11.3. jedis(Java cluster client) 11

11.4. r3c(C++ cluster client) 12

12. 激增节点
12

12.1. 加加一个新主(master)节点 12

12.2. 补加一个初打(slave)节点 13

13. 刨除节点
13

14. 检查节点状态
13

15. slots连锁命令 14

15.1. 迁移slosts 14

15.2. redis-trib.rb rebalance
14

16. 人工主备切换
14

17. 查集群信息
14

18. 问题排查
15

 

今日盼了世家在呢MVVM
knockout.js友(ji)好(lie)地交流,所以便整治下然后再扩大地分享。

1. 前言

本文参考官方文档而成为:http://redis.io/topics/cluster-tutorial。经测试,安装过程吧适用于redis-3.2.0。

一言九鼎目的也不是为了争,毕竟才是刚主题类,原本的打算也就算是同涂鸦技术分享而记录下来。

2. 配备计划

据悉官网介绍,部署6独redis节点,为3主3从。3雅物理机每令都创2单redis节点:

服务端口

IP地址

配置文件名

6379

192.168.0.251

redis-6379.conf

6379

192.168.0.252

redis-6379.conf

6379

192.168.0.253

redis-6379.conf

6380

192.168.0.251

redis-6380.conf

6380

192.168.0.252

redis-6380.conf

6380

192.168.0.253

redis-6380.conf

 

问题:3台物理机,会无见面主和从节点分布在与一个大体机上?

 

3. 索引结构

redis.conf为从https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf下载的配备文件。redis-6379.conf和redis-6380.conf指定了劳务端口,两者皆经include复用(包含)了redis.conf。

正文将redis安装于/data/redis(每台机器完全相同,同一台机械及之大都个节点对承诺同的目录及文书,并提议将bin目录在到环境变量PATH中,以简化后续的运):

/data/redis

|– bin

|   |– redis-benchmark

|   |– redis-check-aof

|   |– redis-check-dump

|   |– redis-cli

|   |– redis-sentinel -> redis-server

|   `– redis-server

|– conf

|   |– redis-6379.conf

|   |– redis-6380.conf

|   `– redis.conf

`– log

 

3 directories, 9 files

那么我们不怕以大致的历史进程将这些概念进行剪切:

4. 编译安装

开辟redis的Makefile文件,可以望如下内容:

PREFIX?=/usr/local

INSTALL_BIN=$(PREFIX)/bin

INSTALL=install

 

Makefile中的“?=”表示,如果该变量之前没有概念了,则赋值为/usr/local,否则什么吧不举行。

若是无装环境变量PREFIX或未改Makefile中的价值,则默认安装到/usr/local/bin目录下。建议并非使用默认配置,而是指定安装目录,如/data/redis-3.0.5:

$ make

$ make install PREFIX=/data/redis-3.0.5

$ ln -s /data/redis-3.0.5 /data/redis

$ mkdir /data/redis/conf

$ mkdir /data/redis/log

$ mkdir /data/redis/data

  • Script
  • Code Blocks、Code Behind
  • MVC、MVP、MVVM

5. 窜系统参数

我们领略的凡现实性的历史产生顺序并无使齐,因为想都是一般的,比如MVC很早好已经起了,解释型语言至今基本上也出好多分而且于互联网时代大行其道。

5.1. 修改最老而打开文件反复

修改文件/etc/security/limits.conf,加入以下简单实践:

* soft nofile 102400

* hard nofile 102400

 

# End of file

 

里102400吧一个进程最要命可以打开的文本个数,当及RedisServer的连数多时,需要设定为宜的价值。

改后,需要重登录才见面生效,如果是crontab,则需还开crontab,如:service crond restart,有些平台或是service cron restart。

不过自我一旦说之凡:永不当了这些细节!

5.2. TCP监听队列大小

就TCP listen的backlog大小,“/proc/sys/net/core/somaxconn”的默认值一般比较小若128,需要修改十分一点,比如改成为32767。立即生效还可以采取命令:sysctl -w net.core.somaxconn=32767。

一经想永远生效,需要在文件/etc/sysctl.conf中多一行:net.core.somaxconn = 32767,然后执行命令“sysctl -p”以生效。

理所当然了,这是笑话,我之意是,这些情节己无意应该在另外独立的主题探讨,篇幅也有限。

5.3. OOM相关:vm.overcommit_memory

如果“/proc/sys/vm/overcommit_memory”的值为0,则会表示开了OOM。可以设置也1关闭OOM,设置法要参见net.core.somaxconn完成。

 

5.4. /sys/kernel/mm/transparent_hugepage/enabled

默认值为“[always] madvise never”,建议安装也never,以被内核的“Transparent Huge Pages (THP)”特性,设置后redis进程需要重新开。为了永恒生效,请将“echo never > /sys/kernel/mm/transparent_hugepage/enabled”加入到文件/etc/rc.local中。

 

6. 配置redis

从https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf下载配置文件(也只是直接复制源代码包中的redis.conf,然后于其的基本功及开展修改),在斯基础及,进行如下表所示之改动(配置文件名redis-6379.conf中之6379提议设置也实际利用的捧口号):

配置项

配置文件

说明

port

6379

redis-6379.conf

客户端连接端口,并且总有一个刚好超越10000之端口,这个充分之端口用于主从复制和集群中通讯。

cluster-config-file

nodes-6379.conf

 

pidfile

/var/run/redis-6379.pid

只有当daemonize值为yes时,才发含义;并且是要求对目录/var/run有描绘权限,否则可以设想安装为/tmp/redis-6379.pid。

dir

/data/redis/data/6379

 

dbfilename

dump-6379.rdb

在dir指定的目录下

appendfilename

“appendonly-6379.aof”

 

logfile

/data/redis/log/redis-6379.log

日志文件,包含目录及文书称

loglevel

verbose

 

日志级别

port

6380

redis-6380.conf

 

cluster-config-file

nodes-6380.conf

 

pidfile

/var/run/redis-6380.pid

 

dir

/data/redis/data/6380

AOF和RDB文件存放目录

dbfilename

dump-6380.rdb

RDB文件名

appendfilename

appendonly-6380.aof

AOF文件名

logfile

/data/redis/log/redis-6380.log

 

loglevel

verbose

日志级别

cluster-enabled

yes

redis.conf

意味着以集群方式运行,为no表示坐非集群方式运行

cluster-node-timeout

3000

单位为毫秒:

repl-ping-slave-period+

(cluster-node-timeout*

cluster-slave-validity-factor)

cluster-slave-validity-factor

0

倘如最好充分之可用性,值设置为0

repl-ping-slave-period

1

slave ping master的辰距离,单位为秒

repl-timeout

10

复制超时,单位吗秒,须高于repl-ping-slave-period的价

slave-read-only

yes

slave是否就念

slave-serve-stale-data

yes

当slave与master断开连接,slave是否继续提供劳动

slave-priority

100

slave权重值,当master挂掉,只发生且重极端可怜之slave接替master

appendonly

yes

当以写AOF或RDB,则redis启动时只有见面加载AOF,AOF包含了全量数据

daemonize

yes

系部署项pidfile

protected-mode

no

3.2.0新加的配备起,默认值为yes,限制打旁机器登录Redis server,而只能从127.0.0.1报到。为保险redis-trib.rb工具的常规运行,需要设置为no,完成后好改回yes,但老是用redis-trib.rb都亟需改回为no。要惦记由无127.0.0.1访也亟需变更吧no。

tcp-backlog

32767

取值不能够跨越系统的/proc/sys/net/core/somaxconn

auto-aof-rewrite-percentage

100

安装自动rewite AOF文件(手工rewrite只待调用命令BGREWRITEAOF)

auto-aof-rewrite-min-size

64mb

触发rewrite的AOF文件大小,只有过此万分时才见面触发rewrite

no-appendfsync-on-rewrite

yes

子进程在做rewrite时,主进程不调用fsync(由本默认调度)

cluster-require-full-coverage

no

也no表示出slots不可服务经常其他slots仍然连续服务

Script

此地脚本的意不是因及时凡是因此底论开,而是像写脚论一样付出。它们还来一个特征:效能单一、管理单一、入口单一

我们太早的次是汇编,当时底码农的工作是兼职,工作内容是编写一仿照寿命不加上的机械控制指令,有些还是是令,比如至今仍然保留的Command(亮点自寻):

澳门美高梅手机网站 1

交后来计算机被用于科学计算等,需求促进了特需重新胜之开发效率,所以我们发出了尖端语言。

挺时刻码农其实多是数学家,程序的作用充分简单,就是实施有数学计算,类似今天ICPC的部分算法问题,比如Hello
World:

main()
{
    printf("hello,world\n");
}

这会儿,程序还好被概括为输入到输出的长河,我们还能够去谈话出口冯诺依曼模型。

当此时,开发是恃编写机器指令,甚至都无配用“开发”这个词来描述这项工作。

 

 

7. 启动redis实例

签到3贵物理机,启动两只redis实例(启动之前,需要创造好布局中之每目录):

1) redis-server redis-6379.conf

2) redis-server redis-6380.conf

 

可以写一个开行脚本start-redis-cluster.sh:

#!/bin/sh

 

REDIS_HOME=/data/redis

$REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis-6379.conf

$REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis-6380.conf

软件、UI和Markup Language

于很时期讲UI等于放屁,根本无存这种概念。但全赖我们出神器——摩尔定律

而是我个人认为摩尔定律是不足以让一个敲命令行的时日在几十年里转移成为这种个框架技术架构实践模式之一代,真正推动计算机形成自有的工程学体系之是还有不同事物就是:

  • 人之力并不曾变强,至少没有当同级数下换大。
  • 人类早晚会因地制宜

因为人的力量并从未“跟达到”机器,所以才见面并发各种模式、方法、工具等等来补足人之欠缺,以无限酷地透支机器性能。就比如我面前几上在闪存无聊时忽然想到的平等句子: 搭是针对合理不足之服,规范是对准不合理不足的降

当我们得机械做的作业多了起来,我们即便没有道于一个芯片上化解有事务,所以才见面有冯诺依曼模型、计算机架构,没道用同大机器解决,所以才使互联网、分布式、云计算。

同样,随着电脑的提高,倘若举行的事务多矣,就涌出了软件之定义。当“开发”正式化,我们要求的软件就更换得:功效紊乱、管理统一、多入口

的确转变之无是情理之中本质,而是需要。就比如这里说的“软件入口”在情理之中上我们还是独来一个,原理上老犹止出一个起先程序、一个启动代码有。但“软件之进口”,已经打代Main函数变成了借助替起始UI,用户既于代专业人士变成了依靠代表一般顾客,先来软件的需,才发出软件之概念,而需要是当转的

一个软件要比较马上差不多几乎单数据级的代码:

  • 成立上我们从来不办法做一个可知显所有代码的显示器
  • 无理上我们没有道于跳高速轮转着扣清所有代码

于是我们需要续加索引、用多只文件组织代码

机的上进同软件的要求扩大和细化,我们开始现出了用户界面(User
Interface)的定义以及极致可用来界面的言语——标记语言(Markup
Language)。当然,ML不是吧UI而生的,它仅仅是雅适合UI,所以才与UI坠入爱河。

因为起了重高UI的需求,所以代码才正式被分化为叙做什么(业务逻辑)和有什么(UI)的个别有的,因为咱们开时不曾道于有限种植考虑方法下同时工作,开发时之脑子是单线程的。我们所盼的又开展UI和逻辑开发只不过是我们学会了当有限种模式下迅速切换,看起如而进行,而不是确实的而开展。同样的景吧来在不同之代码有的开被。

分化的景况除了UI,还来在满,比如数据操作、UI的对象及体裁分离,我们还是继续由UI讲下去吧。

 

 

8. 创立与开行redis cluster前的备选干活

直达同步启动之redis只是单机版本,在起步redis cluster之前,需要做到如下一些仗之安装。在此之后,才堪创建和开行redis cluster。

Code Block和Code Behind(其实还有Code Inside,比如onclick=”javascript:alert(‘哎呀我*’)”)

UI和逻辑分开了片栽语言来描写,但是其啊要在同一个型被,因为它原来就是是若一同干活之。虽是分开,也用持续,因为当时是它们当要解决的题材。

这我们出现的(通常的)解决方案就是是Code Block和Code
Behind。虽然于日达像Code Block比Code
Behind要早,有种感觉就是是更为新越好,但真相上它正交替地提高正在,因为哪个为绝非办法缓解UI和逻辑代码分化后底一个哲学问题——UI和逻辑是同的,但是她可非是同步的

 

Code
Block能挺好地拍卖UI和逻辑中以一块儿的涉嫌,你于与一个地方可以又保护UI和逻辑:

 

澳门美高梅手机网站 2

 1 @model GM.OA.Finance2.Web.Models.FinancialBase.CurrencyModel
 2 @{
 3     ViewBag.Title = "EditCurrencyDrawer";
 4     Layout = "~/Views/Shared/_DrawerLayout.cshtml";
 5 }
 6 
 7 @section styles {
 8     <link href="/Content/base/table-form.css" rel="stylesheet" />
 9     <link href="/Content/base/drawer.bigtitle.css" rel="stylesheet" />
10 }

澳门美高梅手机网站 3

 

澳门美高梅手机网站 4

<a href="#" class="addcurrency oa-btn" oa-style="green">添加新币别</a>

<script type="text/javascript">
    $(document).ready(function () {
        $('.addcurrency').click(function () {
            $.oa.drawer.openUrl('AddCurrencyDrawer/', 'addcurrency', {
                width: 300
            });
        });
    });
</script>

澳门美高梅手机网站 5

 

Code
Behind能怪好地处理UI和逻辑各自分离的干,你得叫UI和逻辑各自做好各自的业务:

 

<asp:Button ID="RemoveSelectedCurrency_Button" runat="server" Text="删除选中币别" OnClick="RemoveSelectedCurrency_Button_Click" />
<asp:Button ID="RemoveAllCurrencies_Button" runat="server" Text="删除所有币别" OnClick="RemoveAllCurrencies_Button_Click" />

澳门美高梅手机网站 6

 1 protected void RemoveSelectedCurrency_Button_Click(object sender, EventArgs e)
 2         {
 3             var currencyId = Currencies_ListBox.SelectedItem.Value;
 4             currencyManager.Remove(currencyId);
 5         }
 6 
 7         protected void RemoveAllCurrencies_Button_Click(object sender, EventArgs e)
 8         {
 9             currencyManager.RemoveAll();
10         }

澳门美高梅手机网站 7

 

因为在个别种实现方式,所以就有了比,因为是了对比,所以即使存在了争论。就比如是Java和.NET、PHP和.NET、WebForm和MVC、Mac
OS和Windows、iOS和Android、腾讯和有着其他互联网企业,等等。

题目无以哪个还好,而是我们如果解决什么问题。当然,这任(ben)着(lai)像(jiu)是客气话了。

当真在UI和逻辑分化后带的实质问题是:

  • 凡是依照逻辑和UI划分地管理,还是按照单界面的作业进行分地保管

至少UI和逻辑刚分化的期,在软件及,我们尚认为相同项业务是依据同一个UI的一致层层操作就的。

以摩尔定律还不住发挥作用的时段,计算机世界还是迅速发展,所以便我们还当啊同一东西争论、思考、辩证的早晚,它已经起了蜕变了,不换的只是我们设化解的题目

 

 

8.1. 安装ruby

安命令:yum install ruby

装过程遭到,如提醒“[y/d/N]”,请捎“y”然后回车。

 

查版本:

$ ruby –version

ruby 2.0.0p353 (2013-11-22) [x86_64-Linux]

 

呢足以从Ruby官网https://www.ruby-lang.org下载安装包(如ruby-2.3.1.tar.gz)来安装Ruby。截至2016/5/13,Ruby的流行稳定版本也Ruby 2.3.1。

工作,以及界面、数据、事件、业务

于前头说交过了,当需求变换得高大,解决方案也会见更换得大;当解决方案变得巨大,就会见现出细分;当出现细分,就会起按哪种方式管理的题目

软件打拍卖同项事情发展到了若拍卖过剩作业,各业务间有隐含、顺序、主次等等的干,变得更其复杂。因为数量以及逻辑庞大了,所以数据和逻辑就是分开了,然后事件与事务分别了。

它们的涉就在我们还理得到底前面连前进使换得愈难理得清,但每当一个年华接触达到,它们UI的园地大致分化成这些原子:

  • 界面
  • 数据
  • 事件
  • 业务

您一旦细化的口舌会来更多杂乱的细节,但相信如此形容的言辞争议性比较粗。

当一个题材出现一样差的时候她是一个题目,当一个问题出现了重重软的早晚她会化为历史,当一个题目拿会冒出过多糟的时光,它将急需一个家喻户晓的定义和化解方案。

其中,多少的创新与界面的换代就等同非常事件的题目被放大了许多倍,因为她起了好多糟糕

 

 

8.2. 安装rubygems

安命令:yum install rubygems

如果不使用yum安装,也足以手动安装RubyGems,RubyGems是一个Ruby包管理框架,它的下载网址:https://rubygems.org/pages/download。

随下载安装包rubygems-2.6.4.zip后解压,然后进解压生成的目,里面来个setup.rb文件,以root用户执行:ruby setup.rb安装RubyGems。

Model-View-Controller

于ASP还在拼搏的时刻WebForm突然过来,正使WebForm还当奋发的当儿MVC突然到。当然,自己此谈话的MVC还是最为原始的MVC,因为MVC在我们尚以争之时段都迈入了无数不比分支了

起一些相信大家同意的就是是,咱俩今天讨论争论之MVC、MVP、MVVM、Code
Behind等等都源自于职能分化与筹划之合计和目的,MVC不是它们的开始,但是一个怪好的开始

深信不疑MVC的范大家很熟稔,也颇容易找到,我们这里用一下某部到的觊觎:

澳门美高梅手机网站 8

咱得以看到的凡,界面给剪切及了View,数据分到了载体Model上由于Model“携带”,业务集中在Controller中,而推动工作的风波由用户和View交互,通过View向Controller发动。

自然,实现由老多种,每种细节及都发出两样,所以我才只有称也只能讲大致的MVC。MVC的中间一个通病就是没有明白的概念,所以不同的实现(比如Struts和ASP.NET
MVC)细节及都是休平等的

我们得掌握之凡,MVC并无是像上面所说之片段事务那样是一样种“必然的”结果,它是一律雨后春笋必然结果问题遭的一致种植缓解方案,而且是不圆满的化解方案。我们沿推理去到一个地方大易犯之一个破绽百出就是是认为路程只有马上等同长而忽略其他可能性(估计就为是招众多交手的缘故)。另外,我们当座谈同样码东西不到家的时光是有一个地的,所以恳请不要像“我说其色彩单一,然后你拿它们上成绚丽多彩后证实自己是蹭的”。

MVC的形似流程是如此的:View(界面)触发事件–》Controller(业务)处理了作业,然后触发了数更新–》不明了哪个更新了Model的数量–》Model(带在多少)回到了View–》View更新数据

此也未多重复陈述MVC的规律、实践等等,因为当时就是绝长了。

 

 

8.3. 安装redis-3.0.0.gem

安命令:gem install -l redis-3.0.0.gem

 

安前,需要事先下充斥好redis-3.0.0.gem。

redis-3.0.0.gem官网:https://rubygems.org/gems/redis/versions/3.0.0

redis-3.0.0.gem下载网址:https://rubygems.org/downloads/redis-3.0.0.gem

redis-3.3.0.gem官网:https://rubygems.org/gems/redis/versions/3.3.0

Model-View-Presenter与有些衍生

譬如我们事先推理的,分化是同样栽需求的必然结果,但却尚无个一个确定的结果,比如Code
Behind和Code Block的问题等等。

MVC顺着需求将UI相关的做事分化成了三卖,这点通过实践证明无可厚非。只是她的三角形关系倒为有人口以为带来了一些题目,或者应当说他俩发生“更好之”解决方案

于只有Code Behind和Code
Block的很时候维护是可怜直白的,不是当平段代码内解决就是以跟一个涉的事件上化解。三角关系之问题不怕是保障问题。以MVC,当你发转移的时光你需要同时保障三独对象同老三个彼此,这明摆着被工作复杂化了

咱俩前面说交,随着摩尔定律,软件之求不断地别以及转移得巨大。乘势需求变换得巨大之时光,需求变动呢易得勤,这是一个冒出了成千上万涂鸦后吧拿会冒出过多底博不成的一个问题,所以它需要一个解决方案,哪怕它不自然能够让解决

为了解决需要转变,从《人月神话》到快到DDD,其不是咱已缓解了之题目,而是我们在解决的问题。放在UI的模式与MVC上来讲,就是优化还是替MVC模式,其中某就是是Model-View-Presenter(MVP)模式。

咱俩事先看看两独MVP模式之希冀:

澳门美高梅手机网站 9(图一)

澳门美高梅手机网站 10(图二)

区区帧图是差之,但是本着MVC的改善的思维却是一样的:隔断的View和Model的联系,让View只同Presenter(原Controller)交互,减少在要求转变备受得维护的靶子的数额

这种方法特别符合我们的指望,因为我们赞成被:

  • 用重新小之本金解决问题
  • 据此更易于理解的方式缓解问题

成千上万上并无是一样栽模式不好,而是为人口并未道执行,比如不便于懂,我们便会见择好掌握的法门。电脑依赖摩尔定律用多少之提高来缓解问题,而人口是为此艺术的转移来解决问题的。同样为客观原因我们不善于维护多个目标及多个对象之间的关系,所以我们改变了,或者说简化了这种办法。

MVP定义了Presenter和View之间的接口,让部分可依据已有些接口协议去分别分别独立开发,以之去化解界面需求变化频繁之题目。上面两图都来接口,不过接口的贯彻同以细节无一致,不过想及是相同的。

当此间而涉及的凡,事实上,需要变化最为频繁的并不一定是极接近用户之界面,但基本好规定的凡,最相近用户之界面是坐需要转变而用极频繁更改之。当然,如果View如果是API而非是UI,那就是外说了。

再有一对用来“解决”MVC这项缺点的照来:ASP.NET
MVC的ViewBag,Cocoa的delegate。它们还为简化数据更新的题目如有,包括MVVM。

 

 

9. redis-trib.rb

redis-trib.rb是redis官方提供的redis cluster管理工具,使用ruby实现。

Model-View-ViewModel

事先直接看看Model-View-ViewModel(MVVM)的希冀:

 澳门美高梅手机网站 11

自从图及看是比MVP简单了,更毫不说MVC了。个人无看MVVM是自从MVP进化而来,我只是当就是于MVP之后出现的同样栽“更好的”UI模式解决方案,但是用MVP来与的相比比较轻说明问题。

ViewModel大致上就是MVP的Presenter和MVC的Controller了,而View和ViewModel间没有了MVP的界面接口,而是一直互动,用数据“绑定”的形式被数更新的风波非需开发人员手动去编写特殊用例,而是自行地双向共。数据绑定你得看是Observer模式或者是Publish/Subscribe模式,原理都是为从而同一种统一的汇总的方式实现多次需要被实现之多少更新问题

比起MVP,MVVM不仅简化了政工与界面的倚重关系,还优化了数码频繁更新的解决方案,甚至可以说提供了一样栽中之缓解模式

由来,我们会明白为什么多口看MVVM是最为好之一致种模式,没有有。但实际,MVVM也是据让我们至今所说的“特有的地”

本来,最优雅的也是率先单能发代表的实施就是Windows Presentation
Foundation(WPF)了。

 

 

10. 创设与起步redis集群

Web

上述,我们在模式演变的推测基本上都或基于桌面软件的,但是过去十年也是互联网的一时。实际上多数于大家争论之并无是以桌面领域最适于的凡颇,而是以Web领域的模式问题,也就是当B/S场景下之题目

当软件去单机,去交网络的时刻,因为场景变了,所以老的缓解方案吗转移了,不过需要仍然是休变换的。咱照例要解决之题材是用户交互和数量更新的问题,还有维护等等的题材

现场景变到Web的时节,我们发现MVVM用来举行服务端是太不适用的,至少本凡匪适用的。而MVP你取都毫不提。为什么吧?因为:

  • 纱资源成本过强
  • 开发成本过高

叩问大家一个题材,当一个网页的数据更新后,你希望更新用户观看底数,你见面怎么开?

一般情形下,你会:

window.location.reload();

即使你免这样做,用户也会:

F5

 

就是比如前说之,我们见面选再直接的法缓解问题。直接刷新页面的原由是盖这样重复直白,更便于解决多少更新的问题。

森时段若免会见甘愿为了一个数额更新写一个AJAX,更别说这AJAX要带Loading、事件顺序处理、网络问题、异常处理等等,这就是开发成本过强

其余一个网成本过强就是还便于解释了,虽然宽带是主导包月的,但为不带来这么用的,何况还有移动用户。更要紧的因由是,于该地软件,更新数据是一个援问题,而于网下及,这是一个传输问题。传输成本远高于引用成本,引用之上顶多凡是当当地内存中重复拓展同样潮外存拷贝。

本条时刻,咱会更赞成被用MVC模式,因为以Web层面,我们重新倾向被一次性更新数据

 

 

10.1. 复制redis-trib.rb

用redis源代码的src目录下的集群管理程序redis-trib.rb复制到/data/redis/bin目录,并以bin目录在到环境变量PATH中,以简化后续之操作。

redis-trib.rb用法(不牵动其他参数执行redis-trib.rb即展示用法):

$ ./redis-trib.rb

Usage: redis-trib <command> <options> <arguments …>

 

  rebalance       host:port

                  –auto-weights

                  –timeout <arg>

                  –pipeline <arg>

                  –use-empty-masters

                  –weight <arg>

                  –threshold <arg>

                  –simulate

  add-node        new_host:new_port existing_host:existing_port

                  –slave

                  –master-id <arg>

  reshard         host:port

                  –timeout <arg>

                  –pipeline <arg>

                  –yes

                  –slots <arg>

                  –to <arg>

                  –from <arg>

  check           host:port

  set-timeout     host:port milliseconds

  call            host:port command arg arg .. arg

  fix             host:port

                  –timeout <arg>

  info            host:port

  create          host1:port1 … hostN:portN

                  –replicas <arg>

  import          host:port

                  –replace

                  –copy

                  –from <arg>

  help            (show this help)

  del-node        host:port node_id

 

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

 

Web的MVVM

有题目且不是问题,就算出问题啊只要化解问题。

何以是题目下突然冒出这样一句子话?我思念说之凡,要求仍是无换的,是有助于发展的原动力

还有自己事先说了,当我们谈论要争论一个问题的当儿,问题之对象已经闹改变了,而且这次是当我们谈谈是问题之前已来变动了。

网资源资产持续降低,相信已经休待差不多提及。摩尔定律和类似的部分法则在发挥着她以之用意,网络带来富更强、相应速度更快。

要是传输因为相对成本降低而致数据传的成本低于开发人员拒绝客户之工本,那么它就是见面吃实现而非是吃拒

除此以外还有某些就算是坐技术的发展,技术之资源持续让再要命范围地刮,需求为不止地提高,那么要求一直会提高超过相对不转换的开发成本的。比如jQuery的出现缓解了成千上万题目,我们本还多地失去下AJAX,哪怕很特别有仍然是为化解网络资源不足的题目;我们会用重新多之样式代码而因此了相对更少之图纸;我们不再那么依赖Flash一近似的矢量图解决方案一经直接录制视频。

最少达等同节约咱们说交的一定量独导致大家选用MVC的题材还正在吃解决,所以我们出理由相信未来Web不仅仅要MVC,可能会见需要MVVM或其他解决方案。至少我们能领略好了解为什么前端会并发有MVVM的框架,比如先驱knockout.js和AngularJs。这些框架本身的三六九等就无发讨论了,因为咱们谈谈的凡模式。

当Web上,MVVM的自查自纠对象就是无是MVC,而是Code Block

数量就更新的急需于壮大,但不见得有上自然要是为此MVVM这同样等的巨大上的模式,实际上只要你如果更新一个多少,你还是会使:

$('.notice').html('发送成功!');

坐……我们仍会动重新直白的点子解决问题……

实质上,现在Web
MVVM主要并无是用在了Web或者Wap上,而是移动App上
。按照前面的说教,只恐是:

  • HTML+JS比原生在有观上再度适合Native
  • 于移动App上比Web上重新契合用MVVM

哪怕是Native开发,实际上iOS的支付上吗是因此接近之数绑定的法子的。这里为无追究了,毕竟我啊未算是懂iOS。

只要说之是,在Web
MVVM或者Web的模式上,也便是Web的富应用上,现在尚只是大凡只最初由膨胀的需推动的号要害的未是技术会怎么动,而是要求及客观条件会怎么动

可能Webform会因为快速开发而振奋第二情,它的AJAX的模式为死满足吃简单开发,但如同大家要之未是GUI式的网页。

 

 

10.2. 创建redis cluster

创造命令(3主3打):

redis-trib.rb create –replicas 1 192.168.0.251:6379 192.168.0.252:6379 192.168.0.253:6379 192.168.0.251:6380 192.168.0.252:6380 192.168.0.253:6380

 

Ø 参数说明:

1) create

代表创建一个redis cluster集群。

2) –replicas 1

表示为集聚众多被之各一个主节点指定一个自节点,即一比一底复制。\

 

运行过程中,会发个提醒,输入yes回车即可。从屏幕输出,可以很爱地扣押有什么是主(master)节点,哪些是打(slave)节点:

>>> Creating cluster

Connecting to node 192.168.0.251:6379: OK

/usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: wrong element type nil at 0 (expected array)

/usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: ignoring wrong elements is deprecated, remove them explicitly

/usr/local/share/gems/gems/redis-3.0.0/lib/redis.rb:182: warning: this causes ArgumentError in the next release

>>> Performing hash slots allocation on 6 nodes…

Using 3 masters:

192.168.0.251:6379

192.168.0.252:6379

192.168.0.253:6379

Adding replica 192.168.0.252:6380 to 192.168.0.251:6379

Adding replica 192.168.0.251:6380 to 192.168.0.252:6379

Adding replica 192.168.0.253:6380 to 192.168.0.253:6379

M: 150f77d1000003811fb3c38c3768526a0b25ec31 192.168.0.251:6379

   slots:0-5460 (5461 slots) master

M: de461d3337b17d2119b79024d57d8b119e7320a6 192.168.0.252:6379

   slots:5461-10922 (5462 slots) master

M: faf50658fb7b0bae64cee5371da782e0f4919eee 192.168.0.253:6379

   slots:10923-16383 (5461 slots) master

S: c567db02cc40eebf577f71f703214dd2f4f26dfb 192.168.0.251:6380

   replicates de461d3337b17d2119b79024d57d8b119e7320a6

S: 284f8196b250ad9ac272316db84a07bebf661ab7 192.168.0.252:6380

   replicates 150f77d1000003811fb3c38c3768526a0b25ec31

S: 39fdef9fd5778dc94d8add819789d7d73ca06899 192.168.0.253:6380

   replicates faf50658fb7b0bae64cee5371da782e0f4919eee

Can I set the above configuration? (type ‘yes’ to accept): yes

>>> Nodes configuration updated

>>> Assign a different config epoch to each node

>>> Sending CLUSTER MEET messages to join the cluster

Waiting for the cluster to join….

>>> Performing Cluster Check (using node 192.168.0.251:6379)

M: 150f77d1000003811fb3c38c3768526a0b25ec31 192.168.0.251:6379

   slots:0-5460 (5461 slots) master

M: de461d3337b17d2119b79024d57d8b119e7320a6 192.168.0.252:6379

   slots:5461-10922 (5462 slots) master

M: faf50658fb7b0bae64cee5371da782e0f4919eee 192.168.0.253:6379

   slots:10923-16383 (5461 slots) master

M: c567db02cc40eebf577f71f703214dd2f4f26dfb 192.168.0.251:6380

   slots: (0 slots) master

   replicates de461d3337b17d2119b79024d57d8b119e7320a6

M: 284f8196b250ad9ac272316db84a07bebf661ab7 192.168.0.252:6380

   slots: (0 slots) master

   replicates 150f77d1000003811fb3c38c3768526a0b25ec31

M: 39fdef9fd5778dc94d8add819789d7d73ca06899 192.168.0.253:6380

   slots: (0 slots) master

   replicates faf50658fb7b0bae64cee5371da782e0f4919eee

[OK] All nodes agree about slots configuration.

>>> Check for open slots…

>>> Check slots coverage…

[OK] All 16384 slots covered.

结尾语

咱俩不自然得MVVM,但咱终将需要再行强有力的法门去解决持续膨胀的Web需求。

咱们得预见的凡:

  • 会来还强的浏览器
  • 会晤发再度精的JavaScript或者框架
  • 见面时有发生逾吻合之模式

除客气话的有些,我要么想念说,在不同的求下实际产生太适合之化解方案,常备给咱们纠结的莫是坐谁解决方案还好,而是我们视底极不够多

编译语言当然比讲语言效率高,但考虑到支付暨保安资金,JavaScript等老会流行,比如Node.JS、Python;.NET和微软本大有力,移植.NET到任何平台吗蛮容易,但微软是家有自己商业模式和如挣的商店;当然有些实践以及技艺重新好,但别开发人员会规避甚至否认自己不擅的东西,大家都喜爱确定的事物;有些技术还强,但是只是是基于特殊的客观条件和需,如果你想做生,要么创造客观条件,要么将其结合需求……

 

 

前发生若交流的园友会用园子的少消息,好像个人资料里吧远非管邮箱显示出来。有趣味交流之饶直indreamluo@qq.com吧。

10.3. ps aux|grep redis

[test@test-168-251 ~]$ ps aux|grep redis

test   3824  0.7  5.9 6742404 3885144 ?    Ssl   2015 1639:13 /data/redis/bin/redis-server *:6379 [cluster]

test   3831  0.5  3.9 6709636 2618536 ?    Ssl   2015 1235:43 /data/redis/bin/redis-server *:6380 [cluster]

 

住redis实例,直接用kill命令即可,如:kill 3831,重开和单机版相同,经过上述同样密密麻麻操作后,重启会自动转换成cluster模式。。

11. redis cluster client

11.1. 令行工具redis-cli

官方提供的授命行客户端工具,在单机版redis基础及指定参数“-c”即可。以下是当192.168.0.251及执行redis-cli的记录:

$ ./redis-cli -c -p 6379

127.0.0.1:6379> set foo bar

-> Redirected to slot [12182] located at 192.168.0.253:6379

OK

192.168.0.253:6379> set hello world

-> Redirected to slot [866] located at 192.168.0.251:6379

OK

192.168.0.251:6379> get foo

-> Redirected to slot [12182] located at 192.168.0.253:6379

"bar"

192.168.0.253:6379> get hello

-> Redirected to slot [866] located at 192.168.0.251:6379

"world"

 

查看集群中的节点:

192.168.0.251:6379> cluster nodes

11.2. 从slaves读数据

默认不克起slaves读取数据,但建立连接后,执行同一潮命令READONLY ,即可从slaves读取数据。如果想再也卷土重来不可知由slaves读取数据,可以执行下命令READWRITE。

11.3. jedis(java cluster client)

官网:https://github.com/xetorthio/jedis

编程示例:

Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();

//Jedis Cluster will attempt to discover cluster nodes automatically

jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7379));

JedisCluster jc = new JedisCluster(jedisClusterNodes);

jc.set("foo", "bar");

String value = jc.get("foo");

11.4. r3c(C++ cluster client)

官网:https://github.com/eyjian/r3c

12. 新增节点

12.1. 补偿加一个新主(master)节点

优先盖单机版配置和开行好redis-server,然后执行命令:

./redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000

 

履方就长达命令时,可能碰到错误“[ERR] Sorry, can’t connect to node 127.0.0.1:7006”。引起该问题的由来或者是坐ruby的版过小(运行ruby -v可以查看ruby的版本),可以品味升级ruby再尝试,比如ruby 1.8.7本就需提升。对于Redis 3.0.5和Redis 3.2.0,使用Ruby 2.3.1操作正常。请留意升级到新型版本的ruby也可能遇到这荒唐。

 

别一个会晤滋生这个题目的原由是从Redis 3.2.0版本开始引入了“保护模式(protected mode),防止redis-cli远程访问”,仅限redis-cli绑定到127.0.0.1才得连接Redis server。

以好长新主节点,可以临时的关保护模式,使用redis-cli,不指定-h参数(但足指定-p参数,或者-h参数值为127.0.0.1)进入操作界面:CONFIG SET protected-mode no。

 

瞩目7006凡是新增的节点,而7000凡曾在的节点(可为master或slave)。如果需要用7006改成某master的slave节点,执行命令:

cluster replicate 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e

 

乍加入的master节点上从来不另外数据(slots,运行redis命令cluster nodes可以看此情)。当一个slave想成master时,由于这新的master节点不管理任何slots,它不参与选举。

足利用工具redis-trib.rb的resharding特性为之新master节点分配slots,如:

redis-trib.rb reshard 127.0.0.1:7000,其中7000乎汇众多被擅自一个节点即可,redis-trib.rb将自行发现任何节点。

在reshard过程遭到,将会见了解reshard多少slots:

How many slots do you want to move (from 1 to 16384)?,取值范围也1~16384,其中16384为redis cluster的装有的slots总数,比如想就走100个,输入100即可。如果搬迁的slots数量多,应当设置redis-trib.rb的超时参数–timeout值大一点。否则,迁移过程中容易遇到过错误“[ERR] Calling MIGRATE: IOERR error or timeout reading to target instance”,导致只就有,可能会见造成数丢失。

随即,会唤起“What is the receiving node ID?”,输入新进入的master节点ID。过程遭到而遇到错误“Sorry, can’t connect to node 10.225.168.253:6380”,则恐得少先关相应的保护模式。

 

只要以搬过程遇到下面这样的左:

>>> Check for open slots…

[WARNING] Node 192.168.0.3:6379 has slots in importing state (5461).

[WARNING] Node 192.168.0.5:6380 has slots in migrating state (5461).

[WARNING] The following slots are open: 5461

 

足考虑用命令“redis-trib.rb fix 192.168.0.3:6379”尝试修复。需要展示有节点处migrating或importing状态,可以登录到对应的节点,使用命令“cluster setslot 5461 stable”修改,参数5461吗问题显得的slot的ID。

12.2. 补加一个初打(slave)节点

./redis-trib.rb add-node –slave 127.0.0.1:7006 127.0.0.1:7000

 

小心这种方法,如果上加了差不多单slave节点,可能导致master的slaves不均衡,比如有的生出3只slave,其它只1独slave。可以当slave节点上实施redis命令“CLUSTER REPLICATE”进行调整,让它成为其他master的slave。“CLUSTER REPLICATE”带一个参数,即master ID,注意运用redis-cli -c登录到slave上执行。

面方法没有点名7006之master,而是无度指定。下面方法可一目了然指定为哪个master的slave:

./redis-trib.rb add-node –slave –master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000

 

13. 勾节点

自打集群中剔除一个节点:

./redis-trib del-node 127.0.0.1:7000 `<node-id>`

 

率先只参数为集聚众多被任意一个节点,第二个参数为要去节点的ID。

 

CLUSTER FORGET <node-id>

 

留神要是抹一个master节点,则要先拿其管理之slots的迁走,然后才得去除其。

14. 检讨节点状态

redis-trib.rb check 127.0.0.1:6380

 

要是发现如下这样的一无是处:

[WARNING] Node 192.168.0.11:6380 has slots in migrating state (5461).

[WARNING] The following slots are open: 5461

 

足用redis命令取消slots迁移(5461乎slot的ID):

cluster setslot 5461 stable

急需留意,须登录到192.168.0.11:6380达执行redis的setslot子命令。

15. slots系命令

CLUSTER ADDSLOTS slot1 [slot2] … [slotN]

CLUSTER DELSLOTS slot1 [slot2] … [slotN]

CLUSTER SETSLOT slot NODE node

CLUSTER SETSLOT slot MIGRATING node

CLUSTER SETSLOT slot IMPORTING node

 

15.1. 迁移slosts

示范:将slot8自节点A迁移至节点B,有如下两栽艺术:

在节点B上执行:CLUSTER SETSLOT 8 IMPORTING A

在节点A上执行:CLUSTER SETSLOT 8 MIGRATING B

15.2. redis-trib.rb rebalance

当有增减节点时,可以运用命令:

redis-trib.rb rebalance 192.168.0.31:6379 –auto-weights

开同样涂鸦均,简单点可但指定两个参数:“192.168.0.31:6379”为汇众多被就领略之别一个节点,参数“-auto-weights”表示自动权重。

16. 人造主备切换

在用的slaves节点上执行命令:CLUSTER FAILOVER。

17. 查集群信息

对应的redis命令为:cluster info,示例:

127.0.0.1:6381> cluster info

cluster_state:ok 所有slots正常则显示为OK,否则为error

cluster_slots_assigned:16384 多少slots被分配了,即多少被master管理了,16384为全部slots

cluster_slots_ok:16384 有多少slots是正常的

cluster_slots_pfail:0 有多少slots可能处于异常状态,处于这个状态并不表示有问题,仍能继续提供服务

cluster_slots_fail:0 有多少slots处于异常状态,需要修复才能服务

cluster_known_nodes:10 集群中的节点数

cluster_size:3 集群中master个数

cluster_current_epoch:11 本地的当前时间变量,用于故障切换时生成独一无二的增量版本号

cluster_my_epoch:0

cluster_stats_messages_sent:4049 通过集群消息总线发送的消息总数

cluster_stats_messages_received:4051 通过过集通过群消息总线收到的消息总数

 

18. 题目排查

1) 如果最终一修日志也“16367:M 08 Jun 14:48:15.560 # Server started, Redis version 3.2.0”,节点状态一直终于fail状态,则恐是aof文件损坏了,这时可以以工具edis-check-aof –fix进行改动,如:

../../bin/redis-check-aof –fix appendonly-6380.aof 

0x        a1492b9b: Expected prefix ‘

AOF analyzed: size=2705928192, ok_up_to=2705927067, diff=1125

This will shrink the AOF from 2705928192 bytes, with 1125 bytes, to 2705927067 bytes

Continue? [y/N]: y

发表评论

电子邮件地址不会被公开。 必填项已用*标注