• 幕客老师召集小伙伴
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

Redis-Cluster集群配置手册

1     集群建立

1.1          配置redis.confredis集群节点)

复制redis.conf 至当前目录下,修改相关配置如下,放入各个实例的工作目录中:

 

基本选项:

       bind www.iaskjob.com+本机ip地址

port 每个实例的端口号

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

appendonly yes

daemonize yes

dir ./

bind 绑定redis连接地址。

cluster-enabled 选项用于开实例的集群模式。

cluster-conf-file 设定了保存节点配置文件的路径,此文件由redis自动创建与更新,无需手动修改。

cluster-node-timeout 选项设定了节点的超时时间。

appendonly 设置是否启用AOF模式持久化。

daemonize 设置是否后台运行。

dir选项设定了redis实例的工作目录,redis默认为/var/lib/redis,相应的持久化文件(dump.rdb, appendonly.aof)与集群节点信息文件(nodes.conf)会保存在此目录下,当单台服务器开启多个redis实例时,所有实例都设置为同样的文件名会导致冲突,建议此项设置为./相对路径,并未每个redis实例建立相应的目录,启动redis-server时从各个目录启动。

 

1.2          逐一开启redis实例(redis集群节点)

redis-server ./redis.conf

 

1.3          安装ruby环境(管理节点)

yum install -y rubygems     //安装rubygem

由于yum自带ruby版本过低(需要在2.2.0以上),因此安装2.3.0

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh        //安装rvm ruby版本管理

rvm install 2.3.0

rvm use 2.3.0--default         //设置ruby1.9.3为默认的ruby,因为还安装有1.8.3 

gem install redis --version 3.3.5

 

gem-redis最新版本4.0数据分片时会报错

[ERR] Calling MIGRATE ERR Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME | PAUSE | REPLY)

这里安装3.3.5版本。

 

1.4          建立集群(管理节点)

复制redis src文件中的redis-trib.rbbin目录下

执行

redis-trib.rb create --replicas 1 www.iaskjob.com:7001 www.iaskjob.com:7002 www.iaskjob.com:7003 www.iaskjob.com:7004 www.iaskjob.com:7005 www.iaskjob.com:7006

create 表示建立集群

--replicas 1 表示每个master节点建立1slave

redis-cluster最少需要3个节点才能建立集群,每个节点需要一个从节点负责备份,因此需要6redis实例。

 

建立成功后最后会显示如下信息:

[OK] All nodes agree about slots configuration. 

>>> Check for open slots... 

>>> Check slots coverage... 

[OK] All 16384 slots covered. 

 

1.5          客户端使用

redis-cluster需要客户端进行支持,可以通过redis-cli -c 来启动。

 

2     redis.conf配置详解

 

1redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程:

daemonize no

2、当redis以守护进程方式运行时,redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定:

pidfile /var/run/redis.pid

3、指定redis监听端口,默认端口号为6379

port 6379

4、设置tcpbacklogbacklog是一个连接队列,backlog队列总和=未完成三次握手队列+已完成三次握手队列。在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核会将这个值减小到/proc/sys/net/core/somaxconn 的值,所以需要确认增大somaxconntcp_max_syn_backlog两个值来达到想要的效果:

    tcp-backlog 511

5、绑定的主机地址:

    bind www.iaskjob.com

6、当客户端闲置多长时间后关闭连接,如果指定为0,表示永不关闭:

    timeout 300

7、设置检测客户端网络中断时间间隔,单位为秒,如果设置为0,则不检测,建议设置为60

    tcp-keepalive 0

8、指定日志记录级别,redis总共支持四个级别:debugverbosenoticewarning,默认为verbose

    loglevel verbose

9、日志记录方式,默认为标准输出,如果配置redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

    logfile stdout

10、设置数据库数量,默认值为16,默认当前数据库为0,可以使用select<dbid>命令在连接上指定数据库id

    databases 16

11、指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合:

    save <seconds><changes>

    save 300 10:表示300秒内有10个更改就将数据同步到数据文件

12、指定存储至本地数据库时是否压缩数据,默认为yesredis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变得巨大:

    rdbcompression yes

13、指定本地数据库文件名,默认值为dump.rdb

   dbfilename dump.rdb

14、指定本地数据库存放目录:

   dir ./

15、设置当本机为slave服务时,设置master服务的IP地址及端口,在redis启动时,它会自动从master进行数据同步:

   slaveof <masterip><masterport>

16、当master服务设置了密码保护时,slave服务连接master的密码:

   masterauth <master-password>

17、设置redis连接密码,如果配置了连接密码,客户端在连接redis时需要通过auth <password>命令提供密码,默认关闭:

   requirepass foobared

18、设置同一时间最大客户端连接数,默认无限制,redis可以同时打开的客户端连接数为redis进程可以打开的最大文件描述符数,如果设置maxclients 0,表示不作限制。当客户端连接数到达限制时,redis会关闭新的连接并向客户端返回 max number of clients reached错误消息:

   maxclients 128

19、指定redis最大内存限制,redis在启动时会把数据加载到内存中,达到最大内存后,redis会先尝试清除已到期或即将到期的key,当次方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制, 会把key存放内存,value会存放在swap区:

   maxmemory <bytes>

20、设置缓存过期策略,有6种选择:(LRU算法最近最少使用)

   volatile-lru:使用LRU算法移除key,只对设置了过期时间的key

   allkeys-lru:使用LRU算法移除key,作用对象所有key

   volatile-random:在过期集合key中随机移除key,只对设置了过期时间的key;

   allkeys-random:随机移除key,作用对象为所有key

   volarile-ttl:移除哪些ttl值最小即最近要过期的key

   noeviction:永不过期,针对写操作,会返回错误信息。

   maxmemory-policy noeviction

21、指定是否在每次更新操作后进行日志记录,redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内置存在于内存中。默认为no

   appendonly no

22、指定更新日志文件名,默认为appendonly.aof

   appendfilename appendonly.aof

23、指定更新日志条件,共有3个可选值:

   no:表示等操作系统进行数据缓存同步到磁盘(快);

   always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全);

   everysec:表示每秒同步一次(折中,默认值)

   appendfsync everysec

24、指定是否启用虚拟内存机制,默认值为noVM机制将数据分页存放,由redis将访问量较小的页即冷数据 swap到磁盘上,访问多的页面由磁盘自动换出到内存中:

   vm-enabled no

25、虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个redis实例共享:

   vm-swap-file /tmp/redis.swap

26、将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(redis的索引数据就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为 0

   vm-max-memory 0

27redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享, vm-page-size是根据存储的数据大小来设定的,作者建议如果储存很多小对象,page大小最好设置为32或者64bytes;如果存储很多大对象,则可以使用更大的page,如果不确定,就使用默认值:

   vm-page-size 32

28、设置swap文件中page数量,由于页表(一种表示页面空闲或使用的bitmap)是放在内存中的,在磁盘上每8pages将消耗1byte的内存:

   vm-pages 134217728

29、设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成长时间的延迟。默认值为4

   vm-max-threads 4

30、设置在客户端应答时,是否把较小的包含并为一个包发送,默认为开启:

   glueoutputbuf yes

31、指定在超过一定数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法:

   hash-max-zipmap-entries 64

   hash-max-zipmap-value 512

32、指定是否激活重置hash,默认开启:

   activerehashing yes

33、指定包含其他配置文件,可以在同一主机上多个redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件:

   include /path/to/local.conf

 

3     redis cluster基本管理命令

进入集群客户端以后可以使用如下命令管理集群,cluster命令属于集群基本管理命令,redis-trib.rb已经对其进行了封装,一般集群管理直接使用redis-trib.rb工具即可。

 

//集群(cluster) 

CLUSTER INFO 打印集群的信息 

CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。  

 

//节点(node) 

CLUSTER MEET <ip> <port> ip port 所指定的节点添加到集群当中,让它成为集群的一份子。 

CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。 

CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。 

CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。  

 

//(slot) 

CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。 

CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。 

CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。 

CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。 

CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。 

CLUSTER SETSLOT <slot> IMPORTING <node_id> node_id 指定的节点中导入槽 slot 到本节点。 

CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。  

 

// (key) 

CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。 

CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。 

CLUSTER GETKEYSINSLOT <slot> <count> 返回 count slot 槽中的键。 

4     集群管理工具redis-trib.rb详解

1create:创建集群

2check:检查集群

3info:查看集群信息

4fix:修复集群

5reshard:在线迁移slot

6rebalance:平衡集群节点slot数量

7add-node:将新节点加入集群

8del-node:从集群中删除节点

9set-timeout:设置集群节点间心跳连接的超时时间

10call:在集群全部节点上执行命令

11import:将外部redis数据导入集群

 

ruby源码执行流程可参考:https://blog.csdn.net/huwei2003/article/details/50973967

4.1          create创建集群

create命令可选replicas参数,replicas表示需要有几个slave。最简单命令使用如下:

(模式一、建立主模式)

redis-trib.rb create 10.180.157.199:6379 10.180.157.200:6379 10.180.157.201:6379

有一个slave的创建命令如下:

(模式二、简历主从模式,增加备份节点)

redis-trib.rb create --replicas 1 10.180.157.199:6379 10.180.157.200:6379 (至少6个)

4.2          check检查集群

检查集群状态的命令,没有其他参数,只需要选择一个集群中的一个节点即可。

4.3          info查看集群信息

info命令用来查看集群的信息。

4.4          fix修复集群

目前fix命令能修复两种异常,一种是集群有处于迁移中的slot的节点,一种是slot未完全分配的异常。

4.5          reshard在线迁移slot

 

reshard命令可以在线把集群的一些slot从集群原来slot负责节点迁移到新的节点,利用reshard可以完成集群的在线横向扩容和缩容。

 

reshard         host:port

                --from <arg>

                --to <arg>

                --slots <arg>

                --yes

                --timeout <arg>

                --pipeline <arg>

host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。

--from <arg>:需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id,还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入。

--to <arg>slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入。

--slots <arg>:需要迁移的slot数量,不传递该参数的话,则会在迁移过程中提示用户输入。

--yes:设置该参数,可以在打印执行reshard计划的时候,提示用户输入yes确认后再执行reshard

--timeout <arg>:设置migrate命令的超时时间。

--pipeline <arg>:定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10

4.6          rebalance平衡集群节点slot数量

rebalance命令可以根据用户传入的参数平衡集群节点的slot数量,rebalance功能非常强大,可以传入的参数很多,以下是rebalance的参数列表和命令示例。

 

rebalance       host:port

                --weight <arg>

                --auto-weights

                --threshold <arg>

                --use-empty-masters

                --timeout <arg>

                --simulate

                --pipeline <arg>

 

$ruby redis-trib.rb rebalance --threshold 1 --weight b31e3a2e=5 --weight 60b8e3a1=5 --use-empty-masters  --simulate 10.180.157.199:6379

下面也先一一解释下每个参数的用法:

 

host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。

--weight <arg>:节点的权重,格式为node_id=weight,如果需要为多个节点分配权重的话,需要添加多个--weight <arg>参数,即--weight b31e3a2e=5 --weight 60b8e3a1=5node_id可为节点名称的前缀,只要保证前缀位数能唯一区分该节点即可。没有传递–weight的节点的权重默认为1

--auto-weights:这个参数在rebalance流程中并未用到。

--threshold <arg>:只有节点需要迁移的slot阈值超过threshold,才会执行rebalance操作。具体计算方法可以参考下面的rebalance命令流程的第四步。

--use-empty-mastersrebalance是否考虑没有节点的master,默认没有分配slot节点的master是不参与rebalance的,设置--use-empty-masters可以让没有分配slot的节点参与rebalance

--timeout <arg>:设置migrate命令的超时时间。

--simulate:设置该参数,可以模拟rebalance操作,提示用户会迁移哪些slots,而不会真正执行迁移操作。

--pipeline <arg>:与resharpipeline参数一样,定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10

4.7          add-node将新节点加入集群

add-node命令可以将新节点加入集群,节点可以为master,也可以为某个master节点的slave

 

add-node    new_host:new_port existing_host:existing_port

          --slave

          --master-id <arg>

add-node有两个可选参数:

 

--slave:设置该参数,则新节点以slave的角色加入集群

--master-id:这个参数需要设置了--slave才能生效,--master-id用来指定新节点的master节点。如果不设置该参数,则会随机为节点选择master节点。

4.8          del-node从集群中删除节点

del-node可以把某个节点从集群中删除。del-node只能删除没有分配slot的节点。删除命令传递两个参数:

 

host:port:从该节点获取集群信息。

node_id:需要删除的节点id

注意:del-node以后,被删除的节点本身保存的节点信息并没有清空,如果需要再次加入集群需要清空该节点的nodes.conf

4.9          set-timeout设置集群节点间心跳连接的超时时间

set-timeout用来设置集群节点间心跳连接的超时时间,单位是毫秒,不得小于100毫秒,因为100毫秒对于心跳时间来说太短了。该命令修改是节点配置参数cluster-node-timeout,默认是15000毫秒。通过该命令,可以给每个节点设置超时时间,设置的方式使用config set命令动态设置,然后执行config rewrite命令将配置持久化保存到硬盘。

4.10      call在集群全部节点上执行命令

call命令可以用来在集群的全部节点执行相同的命令。call命令也是需要通过集群的一个节点地址,连上整个集群,然后在集群的每个节点执行该命令。

4.11      import将外部redis数据导入集群

import命令可以把外部的redis节点数据导入集群。

Redis-Cluster集群配置手册

Pingbacks已打开。

引用地址

暂无评论

发表评论