您的位置:首页 > 数据库 > Redis

Redis 3.0集群搭建测试(一)

2017-02-12 07:07 441 查看
Redis3.0 最大的特点就是有了cluster的能力,使用redis-trib.rb工具可以轻松构建Redis Cluster。Redis Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。节点之间使用gossip协议传播信息以及发现新节点,这种结构和Cassandra很相似,Cassandra节点可以转发请求。Redis集群中节点不作为client请求的代理,client根据node返回的错误信息重定向请求。
一、集群特性

1.数据可以在cluster的多个node之间进行共享;

2.一次请求处理多批key的命令将不再被支持,因为这些命令处理的key可能在不同的node之间,使用了它们反而会降低cluster的性能;

3.提供高HA,即某个node failed后cluster依旧提供高可用性。

cluster提供如下能力保证:

1.在cluster内自动把数据划分到不同的set上;

2.当集群中一小群机器出现网络故障时或者其他种类的failure时,cluster要保证系统继续可用;

redis的每个node启动后占用两个port 6379 & 16379。redis通过port 6379继续对client提供服务,client通过redis独有的文本协议与node进行通信,所以这个port被成为client port or command port。redis node通过port 16379与cluster内部的其他node进行二进制形式的通信,所以被称为data port or bus port。通过port 16379,node之间进行 failure detection(探活)、configure
update(配置更新)、failure authorization(失败确认)。如果node使用别的端口作为command port,那么data port 一定是command port + 10000。

两个不同的cluster之间也可以通过data port进行data migration。
二、分片

redis cluster内部没用提供一致性hash算法来保证集群的可伸缩能力,而是通过简单的crc16 hash算法来进行sharding,所以它最多提供16384个slot。如果cluster有三个node,分别为 A and B and C,则A负责0 - 5500 slots,B负责5501 - 11000 slots,C负责11001 - 16383 slots。进行扩容的时候,就得在不同的node之间进行slots的迁移,不需要关机,也不会出现服务不可用现象。

cluster内部每个node(也成为一个instance)由一个master和多个slave构成,当master fail的时候,可以通过选举机制选出一个slave代替master。

Redis Cluster不提供强一致性。例如cluster接受了一个写请求,给client返回ok,这个写请求的内容也可能丢失。因为其写流程如下:

1 master B接受了一个写请求;

2 B写成功,返回ok给client;

3 B把数据广播给slaves(B1、B2、B3)

如果第二步执行完毕后,B crash了,则会发生数据不一致现象。这与传统的DBMS类似,它们接收了写请求后,每隔1S才会把数据写入disk,这么做也是在性能和一致性之间做一个平衡。

如果用户对数据的一致性要求比较高,Redis可能也会兼顾这种需求,将来会提供相应的选项,让redis中的slave没用成功的接受数据之前不会给client返回ok给client。即先执行step 3,然后再执行step 2。

一致性还有一种场景。假设有client Z,与cluster内各个node A and B and C,以及各个node的replica A1 and B1 and C1,Z与B之间连接正常,但是B与B1以及cluster内其他nodes连接失败。如果Z发起write request,那么B会给他返回ok,但是B1无法获取到相应的数据,这就要求写的时候也要把node与cluster内其他的成员的探活也要考虑在内。基本要求就是,写时间周期要大于探活时间周期(node timeout)。当node B timeout之后,master
B会自动进入failing状态,拒绝外部client的连接请求,而cluster则会选出slave B1来代替B。

三、安装配置

1.环境

使用2台centos服务器,每台机器上部署3个实例,集群为三个主节点与三个从节点:

192.168.36.54:6380

192.168.36.54:6381

192.168.36.54:6382

192.168.36.189:6380

192.168.36.189:6381

192.168.36.189:6382

2.安装依赖

由于通过Redis-trib.rb工具构建Redis
Cluster,需要rudy环境,执行如下命令安装:

yum -y  install zlib ruby rubygems

安装ruby 的redis库:

gem install redis

3.安装redis 3.0

wget http://download.redis.io/releases/redis-3.0.0.tar.gz
tar -zxvf redis-3.0.0.tar.gz

mkdir redis

cd redis-3.0.0

make PREFIX=/home/slim/redis

make PREFIX=/home/slim/redis install

将集群工具复制到/home/slim/redis/bin下

cp /home/slim/redis-3.0.0/src/redis-trib.rb ./bin/

创建数据配置目录

mkdir -p /home/slim/redis/{conf,data,logs}

4.配置

在2台机器上配置如下:

cd /home/slim/redis

cp /home/slim/redis-3.0.0/redis.conf ./conf/redis-6380.conf 

cp /home/slim/redis-3.0.0/redis.conf ./conf/redis-6381.conf 

cp /home/slim/redis-3.0.0/redis.conf ./conf/redis-6382.conf 

修改配置:

[plain] view
plain copy

 print?





#基本配置  

daemonize  yes  

pidfile /home/slim/redis/data/redis-6380.pid  

port 6380  

bind 192.168.36.189  

unixsocket /home/slim/redis/data/redis-6380.sock  

unixsocketperm 700  

timeout 300  

loglevel verbose  

logfile /home/slim/redis/logs/redis-6380.log  

databases 16  

dbfilename dump-6380.rdb  

dir /home/slim/redis/data/  

  

#aof持久化  

appendonly yes  

appendfilename appendonly-6380.aof  

appendfsync everysec  

no-appendfsync-on-rewrite yes    

auto-aof-rewrite-percentage 80-100  

auto-aof-rewrite-min-size 64mb    

lua-time-limit 5000  

  

#集群配置  

cluster-enabled yes  

cluster-config-file /home/slim/redis/data/nodes-6380.conf  

cluster-node-timeout 5000  

每个实例配置类似,修改一下都应端口、IP地址、文件名称即可。

Redis集群由多个运行在集群模式(cluster mode)下的Redis实例组成,实例的集群模式需要通过配置来开启,开启集群模式的实例将可以使用集群特有的功能和命令。要让集群正常运作至少需要三个主节点, 不过在刚开始试用集群功能时, 强烈建议使用六个节点: 其中三个为主节点, 而其余三个则是各个主节点的从节点。

cluster-enabled:开实例的集群模式

cluster-conf-file:设定了保存节点配置文件的路径,默认值为nodes.conf。节点配置文件无须人为修改,它由Redis集群在启动时创建,并在有需要时自动进行更新。

cluster-node-timeout:集群节点互连超时的阀值

5.启动服务

1)启动2台机器实例

 ./bin/redis-server ./conf/redis-6380.conf ;tail -f logs/redis-6380.log

 ./bin/redis-server ./conf/redis-6381.conf ;tail -f logs/redis-6381.log

 ./bin/redis-server ./conf/redis-6382.conf ;tail -f logs/redis-6382.log

启动日志中打印:

“8591:M 11 Apr 22:20:46.134 * No cluster configuration found, I'm 83fc65283bbbb71b4c089337df05594d67f4cab6”

每个节点都使用 ID 而不是 IP 或者端口号来记录其他节点, 因为 IP 地址和端口号都可能会改变, 而这个独一无二的标识符(identifier)则会在节点的整个生命周期中一直保持不变。

查看启动进程:

[plain] view
plain copy

 print?





ps -ef | grep redis  

slim      8525     1  0 22:16 ?        00:00:01 ./bin/redis-server 192.168.36.54:6380 [cluster]  

slim      8544     1  0 22:17 ?        00:00:00 ./bin/redis-server 192.168.36.54:6381 [cluster]  

slim      8591     1  0 22:20 ?        00:00:00 ./bin/redis-server 192.168.36.54:6382 [cluster]  

2)集群配置

在每台机器上启动的redis服务都是相互独立,下面我们就使用redis-trib.rb工具构建Redis Cluster。

./bin/redis-trib.rb create --replicas 1  192.168.36.54:6380 192.168.36.54:6381 192.168.36.54:6382 192.168.36.189:6380 192.168.36.189:6381 192.168.36.189:6382

命令的意义如下:

给定 redis-trib.rb 程序的命令是 create , 这表示我们希望创建一个新的集群。

选项 --replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。

之后跟着的其他参数则是实例的地址列表, 我们希望程序使用这些地址所指示的实例来创建新集群。

简单来说, 以上命令的意思就是让 redis-trib 程序创建一个包含三个主节点和三个从节点的集群。

启动日志:

[plain] view
plain copy

 print?





>>> Creating cluster  

Connecting to node 192.168.36.54:6380: OK  

Connecting to node 192.168.36.54:6381: OK  

Connecting to node 192.168.36.54:6382: OK  

Connecting to node 192.168.36.189:6380: OK  

Connecting to node 192.168.36.189:6381: OK  

Connecting to node 192.168.36.189:6382: OK  

>>> Performing hash slots allocation on 6 nodes...  

Using 3 masters:  

192.168.36.54:6380  

192.168.36.189:6380  

192.168.36.54:6381  

Adding replica 192.168.36.189:6381 to 192.168.36.54:6380  

Adding replica 192.168.36.54:6382 to 192.168.36.189:6380  

Adding replica 192.168.36.189:6382 to 192.168.36.54:6381  

M: f6285c8a7506b224840d7b26b2b5d1671320c21f 192.168.36.54:6380  

   slots:0-5460 (5461 slots) master  

M: 26ce71d626175f88e0416e3f45b2bfb29304c7b3 192.168.36.54:6381  

   slots:10923-16383 (5461 slots) master  

S: 83fc65283bbbb71b4c089337df05594d67f4cab6 192.168.36.54:6382  

   replicates b1a15a3cd14ea65671a7134850e17b8919a17da5  

M: b1a15a3cd14ea65671a7134850e17b8919a17da5 192.168.36.189:6380  

   slots:5461-10922 (5462 slots) master  

S: 1080e423a55a2c24dae649dac03ffa09ed26d3e8 192.168.36.189:6381  

   replicates f6285c8a7506b224840d7b26b2b5d1671320c21f  

S: de4302f43ff89843675446396552fd19f741246a 192.168.36.189:6382  

   replicates 26ce71d626175f88e0416e3f45b2bfb29304c7b3  

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.36.54:6380)  

M: f6285c8a7506b224840d7b26b2b5d1671320c21f 192.168.36.54:6380  

   slots:0-5460 (5461 slots) master  

M: 26ce71d626175f88e0416e3f45b2bfb29304c7b3 192.168.36.54:6381  

   slots:10923-16383 (5461 slots) master  

M: 83fc65283bbbb71b4c089337df05594d67f4cab6 192.168.36.54:6382  

   slots: (0 slots) master  

   replicates b1a15a3cd14ea65671a7134850e17b8919a17da5  

M: b1a15a3cd14ea65671a7134850e17b8919a17da5 192.168.36.189:6380  

   slots:5461-10922 (5462 slots) master  

M: 1080e423a55a2c24dae649dac03ffa09ed26d3e8 192.168.36.189:6381  

   slots: (0 slots) master  

   replicates f6285c8a7506b224840d7b26b2b5d1671320c21f  

M: de4302f43ff89843675446396552fd19f741246a 192.168.36.189:6382  

   slots: (0 slots) master  

   replicates 26ce71d626175f88e0416e3f45b2bfb29304c7b3  

[OK] All nodes agree about slots configuration.  

>>> Check for open slots...  

>>> Check slots coverage...  

[OK] All 16384 slots covered.  

从启动日志可以看出有6个集群实例,主节点为:
192.168.36.54:6380
192.168.36.189:6380
192.168.36.54:6381
每个主节点对应一个从节点
Adding replica 192.168.36.189:6381 to 192.168.36.54:6380
Adding replica 192.168.36.54:6382 to 192.168.36.189:6380
Adding replica 192.168.36.189:6382 to 192.168.36.54:6381
slots划分:
192.168.36.54:6380   0-5460
192.168.36.189:6380  5461-10922
192.168.36.54:6381   10923-16383
一共16384 slots

:redis-trib.rb使用参数

[plain] view
plain copy

 print?





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

  

  fix             host:port  

  call            host:port command arg arg .. arg  

  check           host:port  

  import          host:port  

                  --from <arg>  

  set-timeout     host:port milliseconds  

  add-node        new_host:new_port existing_host:existing_port  

                  --master-id <arg>  

                  --slave  

  reshard         host:port  

                  --to <arg>  

                  --from <arg>  

                  --slots <arg>  

                  --yes  

  create          host1:port1 ... hostN:portN  

                  --replicas <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.  

参数说明:
call:执行redis命令
create:创建一个新的集群。host1:port1 ... hostN:portN指定了用于构建Redis Cluster的所有redis实例,节点角色由顺序决定,先master之后是slave。而--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点。
add-node  将一个节点添加到集群里面, 第一个是新节点ip:port, 第二个是任意一个已存在节点ip:port,--master-id 
reshard:重新分片
check:查看集群信息
del-node:移除一个节点
对于客户端redis-cli要访问集群,在启动的时候需要添加一个-c参数,如查看集群所有节点:

[plain] view
plain copy

 print?





./bin/redis-cli -c -h 192.168.36.189 -p 6380  cluster nodes  

1080e423a55a2c24dae649dac03ffa09ed26d3e8 192.168.36.189:6381 slave f6285c8a7506b224840d7b26b2b5d1671320c21f 0 1428817516066 5 connected  

b1a15a3cd14ea65671a7134850e17b8919a17da5 192.168.36.189:6380 myself,master - 0 0 4 connected 5461-10922  

83fc65283bbbb71b4c089337df05594d67f4cab6 192.168.36.54:6382 slave b1a15a3cd14ea65671a7134850e17b8919a17da5 0 1428817515047 4 connected  

26ce71d626175f88e0416e3f45b2bfb29304c7b3 192.168.36.54:6381 master - 0 1428817514946 2 connected 10923-16383  

f6285c8a7506b224840d7b26b2b5d1671320c21f 192.168.36.54:6380 master - 0 1428817514844 1 connected 0-5460  

de4302f43ff89843675446396552fd19f741246a 192.168.36.189:6382 slave 26ce71d626175f88e0416e3f45b2bfb29304c7b3 0 1428817516578 6 connected  

参考文章:

1.Redis 官方集群教程

2.Redis 集群原理与使用

3.Redis 3.0.0集群试练

4.Redis3.0.0 集群示例
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: