Redis-3.2.0集群配置(redis cluster)

目录

 

目录 1java

1. 前言 2node

2. 部署计划 2linux

3. 目录结构 2git

4. 编译安装 3github

5. 修改系统参数 3redis

5.1. 修改最大可打开文件数 3编程

5.2. TCP监听队列大小 4ruby

5.3. OOM相关:vm.overcommit_memory 4app

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

 

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

5. 修改系统参数

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仍然继续服务

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

8. 建立和启动redis cluster前的准备工做

上一步启动的redis只是单机版本,在启动redis cluster以前,须要完成以下一些依赖的安装。在此以后,才能够建立和启动redis cluster。

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。

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。

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

9. redis-trib.rb

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

10. 建立和启动redis集群

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.

 

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.

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

 

 

FROM:  http://blog.csdn.net/aquester/article/details/50150163

相关文章
相关标签/搜索