redis集群部署手册

月光凯特 贡献于2016-10-27

作者 月光凯特  创建于2008-09-11 17:20:00   修改者Administrator  修改于2016-10-27 06:48:00字数10182

文档摘要:
关键词:

系统参数修改:(可选,如果有root权限的话) 1、修改最大可打开文件数 修改文件/etc/security/limits.conf,加入以下两行: * soft nofile 102400 * hard nofile 102400 # End of file 其中102400为一个进程最大可以打开的文件个数,当与RedisServer的连接数多时,需要设定为合适的值。 2、修改TCP监听队列大小 修改/etc/sysctl.conf文件 增加一行:net.core.somaxconn = 32767 然后执行命令“sysctl -p”以生效。 3、OOM 如果“/proc/sys/vm/overcommit_memory”的值为0,则会表示开启了OOM。可以设置为1关闭OOM。 然后执行命令“sysctl -p”以生效。 ------------------------------------------------------------------------------------------------------------ 安装redis 3.2 打开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 最终目的,在用户家目录下有一个redis主目录,主目录下有三个目录:bin conf log bin下有以下6个文件: redis-benchmark、redis-check-aof、redis-check-dump、redis-cli、redis-sentinel -> redis-server、redis-server conf下有以下1+n个文件: redis.conf #通用配置、redis-6379.conf #实例特殊配置 log 修改家目录下 .profile 文件,将~/redis/bin添加至环境变量 #方便操作 ------------------------------------------------------------------------------------------------------------ 以下安装均在root权限下,确保系统安装zlib,否则gem install会报(no such file to load -- zlib) 安装ruby:version(2.3.1) cd /path/ruby ./configure -prefix=/usr/local/ruby make make install cp ruby /usr/local/bin 安装rubygem:version(2.6.4) cd /path/gem ruby setup.rb cp bin/gem /usr/local/bin 安装gem-redis:version(3.0.0) gem install redis --version 3.0.0 #由于源的原因,可能下载失败,就手动下载下来安装 #download地址:http://rubygems.org/gems/redis/versions/3.0.0 gem install -l /data/soft/redis-3.0.0.gem 安装redis-cluster cd /path/redis make cp /opt/redis/src/redis-server /usr/local/bin cp /opt/redis/src/redis-cli /usr/local/bin cp /opt/redis/src/redis-trib.rb /usr/local/bin ------------------------------------------------------------------------------------------------------------ 配置redis 通用配置 #GENERAL daemonize no-------------------#是否以守护进程运行 tcp-backlog 511-------------------#TCP监听队列大小,不能大于系统的somaxconn参数设置 timeout 0-------------------#指定在一个 client 空闲多少秒之后关闭连接,0就是不管它 tcp-keepalive 0-------------------#心跳包 loglevel notice-------------------#定义日志级别 databases 16-------------------#设置数据库的数目 dir /opt/redis/data-------------------#设置永久化文件目录 slave-serve-stale-data yes-------------------#当slave与master断开连接,slave是否继续提供服务 slave-read-only yes-------------------#slave只读 #not use default repl-disable-tcp-nodelay yes-------------------#在slave和master同步后(发送psync/sync),后续的同步是否设置成TCP_NODELAY假如设置成yes,则redis会合并小的TCP包从而节省带宽,但会增加同步延迟(40ms),造成master与slave数据不一致假如设置成no,则redis master会立即发送同步数据,没有延迟。前者关注性能,后者关注一致性。 slave-priority 100-------------------#slave权重值,当master挂掉,只有权重最大的slave接替master appendonly yes-------------------#打开aof持久化 appendfsync everysec-------------------#每秒一次aof写 no-appendfsync-on-rewrite yes-------------------#关闭在aof rewrite的时候对新的写操作进行fsync auto-aof-rewrite-min-size 64mb-------------------#触发rewrite的AOF文件大小,只有大于此大小时才会触发rewrite lua-time-limit 5000-------------------#执行一个LUA脚本时的最大时间,防止死循环等等,设置为0是没有限制,单位为秒 ★cluster-enabled yes-------------------#打开redis集群 ★cluster-node-timeout 15000-------------------#节点互连超时的阀值 ★cluster-migration-barrier 1-------------------#一个master可以拥有的最小slave数量。该项的作用是,当一个master没有任何slave的时候,某些有富余slave的master节点,可以自动的分一个slave给它。设为1,则当master有2个以上可用节点时,才可以将其中的1个slave节点迁移给其他的master slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes 实例特殊配置 include /opt/redis/redis-common.conf-------------------#包含通用配置 port 6379-------------------#监听tcp端口 logfile /data/redis/log/redis-6379.log-------------------#定义日志路径、文件名 maxmemory 100m-------------------#最大可用内存 #内存耗尽时采用的淘汰策略: # volatile-lru -> remove the key with an expire set using an LRU algorithm # allkeys-lru -> remove any key accordingly to the LRU algorithm # volatile-random -> remove a random key with an expire set # allkeys-random -> remove a random key, any key # volatile-ttl -> remove the key with the nearest expire time (minor TTL) # noeviction -> don't expire at all, just return an error on write operations maxmemory-policy allkeys-lru appendfilename "appendonly-6379.aof"-------------------#aof存储文件 dbfilename dump-6379.rdb-------------------#rdb文件,只用于动态添加slave过程 ★cluster-config-file nodes-6379.conf-------------------#cluster配置文件(启动自动生成) auto-aof-rewrite-percentage 80-100-------------------#部署在同一机器的redis实例,把auto-aof-rewrite搓开,防止瞬间fork所有redis进程做rewrite,占用大量内存 ★cluster-slave-validity-factor-------------------#如果要最大的可用性,值设置为0,如果设置了其它数值,例如10,那么如果有slave在与master断开连接超过timeout+10,则此slave不会去failover它的master。 ★cluster-require-full-coverage-------------------#为no表示有slots不可服务时其它slots仍然继续服务,建议为yes --------------------------------------------------------------------------------------------------------------------- (1)#启动集群相关节点(必须是空节点),指定配置文件和输出日志 redis-server /opt/redis/conf/redis-6380.conf > /opt/redis/logs/redis-6380.log 2>&1 redis-server /opt/redis/conf/redis-6381.conf > /opt/redis/logs/redis-6381.log 2>&1 redis-server /opt/redis/conf/redis-6382.conf > /opt/redis/logs/redis-6382.log 2>&1 redis-server /opt/redis/conf/redis-7380.conf > /opt/redis/logs/redis-7380.log 2>&1 redis-server /opt/redis/conf/redis-7381.conf > /opt/redis/logs/redis-7381.log 2>&1 redis-server /opt/redis/conf/redis-7382.conf > /opt/redis/logs/redis-7382.log 2>&1 (2):使用自带的ruby工具(redis-trib.rb)构建集群 #redis-trib.rb的create子命令构建 #--replicas 则指定了为Redis Cluster中的每个Master节点配备几个Slave节点 #节点角色由顺序决定,先master之后是slave(为方便辨认,slave的端口比master大1000) redis-trib.rb create --replicas 1 10.10.34.14:6380 10.10.34.14:6381 10.10.34.14:6382 10.10.34.14:7380 10.10.34.14:7381 10.10.34.14:7382 (3):检查集群状态 #redis-trib.rb的check子命令构建 #ip:port可以是集群的任意节点 redis-trib.rb check 1 10.10.34.14:6380 cluster nodes cluster info PS:节点似乎要重启才能生效,(未验证),验证的时候上面3个命令都执行一下看看。 附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 通过过集通过群消息总线收到的消息总数 命令行工具redis-cli 官方提供的命令行客户端工具,在单机版redis基础上指定参数“-c”即可。 $ ./redis-cli -c -p 6380 查看集群中的节点: 在任意节点命令行里执行cluster nodes 从slaves读数据 默认不能从slaves读取数据,但建立连接后,执行一次命令READONLY,即可从slaves读取数据。如果想再次恢复不能从slaves读取数据,可以执行下命令READWRITE。 --------------------------------------------------------------------------------------------------------------------- 一、添加一个master节点:创建一个空节点(empty node),然后将某些slot移动到这个空节点上,这个过程目前需要人工干预。 1、在conf目录下设置新节点的配置文件 2、启动节点 redis-server /opt/redis/conf/redis-6386.conf > /opt/redis/logs/redis-6386.log 2>&1 3、加入空节点到集群 add-node 将一个节点添加到集群里面, 第一个是新节点ip:port, 第二个是任意一个已存在节点ip:port redis-trib.rb add-node 10.10.34.14:6386 10.10.34.14:6381 注意:执行上面这条命令时,可能遇到错误,原因有两个: 1、ruby版本过低 2、开启了保护模式(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。 4、为新节点分配slot 注意:reshard命令要在接收slot的节点上操作。 redis-trib.rb reshard 10.10.34.14:6386 #根据提示选择要迁移的slot数量(ps:这里选择500) How many slots do you want to move (from 1 to 16384)? 500 #选择要接受这些slot的node-id What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf #选择slot来源: #all表示从所有的master重新分配, #或者数据要提取slot的master节点id,最后用done结束 Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:all #打印被移动的slot后,输入yes开始移动slot以及对应的数据. #Do you want to proceed with the proposed reshard plan (yes/no)? yes #结束 二、添加新的slave节点 1、在conf目录下设置新节点的配置文件 2、启动节点 redis-server /opt/redis/conf/redis-7386.conf > /opt/redis/logs/redis-7386.log 2>&1 3、加入空节点到集群 add-node 将一个节点添加到集群里面, 第一个是新节点ip:port, 第二个是任意一个已存在节点ip:port redis-trib.rb add-node 10.10.34.14:7386 10.10.34.14:7381 4、redis-cli连接上新节点shell,输入命令:cluster replicate 对应master的node-id cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835 --------------------------------------------------------------------------------------------------------------------- 对于负载/数据均匀的情况,可以在线reshard slot来解决,方法与添加新master的reshard一样,只是需要reshard的master节点是老节点. 当有增减节点时,可以使用命令: redis-trib.rb rebalance 192.168.0.31:6379 --auto-weights 做一次均衡,简单点可以只指定两个参数:“192.168.0.31:6379”为集群中已知的任何一个节点,参数“-auto-weights”表示自动权重 迁移slosts 示例:将slot8从节点A迁移到节点B,有如下两种方法: 在节点B上执行:CLUSTER SETSLOT 8 IMPORTING A 或在节点A上执行:CLUSTER SETSLOT 8 MIGRATING B 附: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 cluster setslot 5461 stable #取消迁移 --------------------------------------------------------------------------------------------------------------------- 删除节点 从集群中删除一个节点: ./redis-trib del-node 127.0.0.1:7000 `` 第一个参数为集群中任意一个节点,第二个参数为需要删除节点的ID。 CLUSTER FORGET 注意如果是删除一个master节点,则需要先将它管理的slots的迁走,然后才可以删除它。 例如: #把10.10.34.14:6386当前master迁移到10.10.34.14:6380上 redis-trib.rb reshard 10.10.34.14:6380 #根据提示选择要迁移的slot数量(ps:这里选择500) How many slots do you want to move (from 1 to 16384)? 500(被删除master的所有slot数量) #选择要接受这些slot的node-id(10.10.34.14:6380) What is the receiving node ID? c4a31c852f81686f6ed8bcd6d1b13accdc947fd2 (ps:10.10.34.14:6380的node-id) Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:f51e26b5d5ff74f85341f06f28f125b7254e61bf(被删除master的node-id) Source node #2:done #打印被移动的slot后,输入yes开始移动slot以及对应的数据. #Do you want to proceed with the proposed reshard plan (yes/no)? yes --------------------------------------------------------------------------------------------------------------------- 问题排查 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 主备切换 在需要的slaves节点上执行命令:CLUSTER FAILOVER。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档