redis

redis集群模式

redis集群

redis有三种集群方式:
1、主从复制
2、哨兵模式
3、集群

集群

redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点则是从主节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉。

部署集群

在同一台服务器上部署:
1、首先下载redis-6.2.6.tar.gz的包,然后解压到任意目录,进入/usr/local/src/redis-6.2.6/src(解压目录在/usr/local/src)
2、创建redis集群安装后的目录,mkdir /usr/local/redis
3、执行安装 make install PREFIX=/usr/local/redis ,之后会生成一个bin目录包含redis命令
如果出现zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory(make MALLOC=libc)
4、创建conf目录存放配置文件,创建data目录存放持久化数据文件
5、在data目录下面创建6个目录如data01、data02,因为redis集群节点数必须大于等于6个节点,且数据目录不能相同。
6、在conf下面配置6个配置文件node6370.conf,6371.conf…

具体配置如下

具体差别为port,pidfile,data,
这是一个 Redis 配置文件的示例,我将逐个解析每个配置项的含义:

daemonize yes 启用后台守护进程运行模式
pidfile /var/run/redis.pid redis启动后的进程ID保存文件
port 6379 指定使用的端口号
bind IP 监听指定的网络接口
unixsocket /tmp/redis.sock 指定监听的socket,适用于unix环境
timeout N 客户端空闲N秒后断开连接,参数0表示不启用
loglevel notice 指定服务器信息显示的等级,4个参数分别为debug\verbose\notice\warning
logfile “” 指定日志文件,留空是使用系统的标准输出
syslog-enabled no 是否启用将记录记载到系统日志功能,默认为不启用
syslog-ident redis 若启用日志记录,则需要设置日志记录的身份
syslog-facility local0 若启用日志记录,则需要设置日志facility,可取值范围为local0~local7,表示不同的日志级别
databases 16 设置数据库的数量,默认启动时使用DB0,使用“select ”可以更换数据库
tcp-backlog 511 此参数确定TCP连接中已完成队列(3次握手之后)的长度,应小于Linux系统的/proc/sys/net/core/somaxconn的值,此选项默认值为511,而Linux的somaxconn默认值为128,当并发量比较大且客户端反应缓慢的时候,可以同时提高这两个参数。
tcp-keepalive 0 指定ACKs的时间周期,单位为秒,值非0的情况表示将周期性的检测客户端是否可用,默认值为60秒。

#SNAPSHOTTING
数据保存频率:
save 900 1 900秒后保存,至少有1个key被更改时才会触发
save 300 10 300秒后保存,至少有10个key被更改时才会触发
save 60 10000 60秒后保存,至少有10000个key被更改时才会触发

stop-writes-on-bgsave-error yes 最近一次save操作失败则停止写操作
rdbcompression yes 启用压缩
rdbchecksum yes 启用CRC64校验码,当然这个会影响一部份性能
dbfilename dump.rdb 指定存储数据的文件名
dir ./ 指定工作目录,rdb文件和aof文件都会存放在这个目录中,默认为当前目录

#SECURITY
requirepass foobared 有slave端连接时是否需要密码验证

#LIMITS
maxclients 10000 同一时间内最大clients连接的数量,超过数量的连接会返回一个错误信息
maxmemory 设置最大内存
如果内存使用量到达了最大内存设置,有6种处理方法:

#class 1, volatile # 基于过期时间的淘汰策略
#volatile-lru # 在设置了过期时间的key上,执行LRU策略
#volatile-lfu # 在设置了过期时间的key上,执行LFU策略
#volatile-random # 在设置了过期时间的key上,执行随机淘汰策略
#volatile-ttl # 删除过期时间最近的key
#class 2, allkey # 简单过期策略
#allkeys-lru # 使用近似LRU策略来淘汰key
#allkeys-lfu # 使用近似LFU策略来淘汰key
#allkeys-random # 随机淘汰任何key
#class 3, no eviction # 不淘汰策略
#noeviction # 不淘汰任何key 返回错误

默认的设置是 maxmemory-policy noeviction
maxmemory-samples 5 LRU算法检查的keys个数

#APPEND ONLY MODE
appendonly yes 启用AOF模式
appendfilename “appendonly.aof” 设置AOF记录的文件名

#向磁盘进行数据刷写的频率,有3个选项:
#always 有新数据则马上刷写,速度慢但可靠性高
#everysec 每秒钟刷写一次,折衷方法,所谓的redis可以只丢失1秒钟的数据就是源于此处
#no 按照OS自身的刷写策略来进行,速度最快
appendfsync everysec

no-appendfsync-on-rewrite no 当主进程在进行向磁盘的写操作时,将会阻止其它的fsync调用
auto-aof-rewrite-percentage 100 aof文件触发自动rewrite的百分比,值为0则表示禁用自动rewrite
auto-aof-rewrite-min-size 64mb aof文件触发自动rewrite的最小文件size
aof-load-truncated yes 是否加载不完整的aof文件来进行启动

#LUA SCRIPTING
lua-time-limit 5000 设置lua脚本的最大运行时间,单位为毫秒

#EVENT NOTIFICATION
notify-keyspace-events “” 事件通知,默认不启用,具体参数查看配置文件

#REPLICATION
Redis的主从复制采用异步的方式进行。
如果同步连接时slave端短暂的与master端断开了连接,那连接恢复后允许slave端与master端进行一次局部的再同步。
主从复制是自动进行的,并不需要用户的介入,slave端会自动尝试重连master并进行数据同步。
slaveof 设置master端的IP与端口信息
masterauth 如果master端启用了密码保护(requirepass),那slave端就需要配置此选项
slave-serve-stale-data yes 当slave端在主从复制的过程中与master端断开了连接,此时有2种处理方法:一种是继续提供服务即使数据可能不是最新的,另一种是对请求返回一个错误信息,默认配置是继续提供服务
slave-read-only yes 自redis 2.6版本开始,slave端默认为readonly

主从同步支持两种策略,即disk和socket方式(socket方式尚不完善,还处于实验阶段)。
新的slave端和重连的salve端不允许去继续同步进程,这被称之为“完全同步”。
一个RDB文件从master端传到slave端,分为两种情况:
1、支持disk:master端将RDB file写到disk,稍后再传送到slave端;
2、无磁盘diskless:master端直接将RDB file传到slave socket,不需要与disk进行交互。
无磁盘diskless方式适合磁盘读写速度慢但网络带宽非常高的环境。
repl-diskless-sync no 默认不使用diskless同步方式
repl-diskless-sync-delay 5 无磁盘diskless方式在进行数据传递之前会有一个时间的延迟,以便slave端能够进行到待传送的目标队列中,这个时间默认是5秒

repl-ping-slave-period 10 slave端向server端发送pings的时间区间设置,默认为10秒
repl-timeout 60 设置超时时间
repl-disable-tcp-nodelay no 是否启用TCP_NODELAY,如果启用则会使用少量的TCP包和带宽去进行数据传输到slave端,当然速度会比较慢;如果不启用则传输速度比较快,但是会占用比较多的带宽。
repl-backlog-size 1mb 设置backlog的大小,backlog是一个缓冲区,在slave端失连时存放要同步到slave的数据,因此当一个slave要重连时,经常是不需要完全同步的,执行局部同步就足够了。backlog设置的越大,slave可以失连的时间就越长。
repl-backlog-ttl 3600 如果一段时间后没有slave连接到master,则backlog size的内存将会被释放。如果值为0则表示永远不释放这部份内存。
slave-priority 100 slave端的优先级设置,值是一个整数,数字越小表示优先级越高。当master故障时将会按照优先级来选择slave端进行恢复,如果值设置为0,则表示该slave永远不会被选择。
min-slaves-to-write 3
min-slaves-max-lag 10 设置当一个master端的可用slave少于N个,延迟时间大于M秒时,不接收写操作。

#REDIS CLUSTER
一个正常的redis实例是不能做为一个redis集群的节点的,除非它是以一个集群节点的方式进行启动。
cluster-enabled yes 配置redis做为一个集群节点来启动
cluster-config-file node-6379.conf 每个集群节点都有一个集群配置文件,这个文件不需要编辑,它由redis节点来创建和更新。每个redis节点的集群配置文件不可以相同。
cluster-node-timeout 15000 设置集群节点超时时间,如果超过了指定的超时时间后仍不可达,则节点被认为是失败状态,单位为毫秒。

集群中的slave可以迁移到那些没有可用slave的master端,这提升了集群处理故障的能力。毕竟一个没有slave的master端如果发生了故障是没有办法去进行failover的。
要将一个slave迁移到别的master,必须这个slave的原master端有至少给定数目的可用slave才可以进行迁移,这个给定的数目由migration barrier参数来进行设置,默认值为1,表示这个要进行迁移的slave的原master端应该至少还有1个可用的slave才允许其进行迁移,要禁用这个功能只需要将此参数设置为一个非常大的值。
cluster-migration-barrier 1

默认情况下当redis集群节点发现有至少一个hashslot未被covered时将会停止接收查询。
这种情况下如果有一部份的集群down掉了,那整个集群将变得不可用。
集群将会在所有的slot重新covered之后自动恢复可用。
若想要设置集群在部份key space没有cover完成时继续去接收查询,就将参数设置为no。
cluster-require-full-coverage yes

#SLOW LOG
redis的slow log是一个系统OS进行的记录查询,它是超过了指定的执行时间的。执行时间不包括类似与client进行交互或发送回复等I/O操作,它只是实际执行指令的时间。
有2个参数可以配置,一个用来告诉redis执行时间,这个时间是微秒级的(1秒=1000000微秒),这是为了不遗漏命令。另一个参数是设置slowlog的长度,当一个新的命令被记录时,最旧的命令将会从命令记录队列中移除。
slowlog-log-slower-than 10000
slowlog-max-len 128
可以使用“slowlog reset”命令来释放slowlog占用的内存。

#LATENCY MONITOR
latency-monitor-threshold 0 延迟监控,用于记录等于或超过了指定时间的操作,默认是关闭状态,即值为0。

#ADVANCED CONFIG
当条目数量较少且最大不会超过给定阀值时,哈希编码将使用一个很高效的内存数据结构,阀值由以下参数来进行配置。
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

与哈希类似,少量的lists也会通过一个指定的方式去编码从而节省更多的空间,它的阀值通过以下参数来进行配置。
list-max-ziplist-entries 512
list-max-ziplist-value 64

集合sets在一种特殊的情况时有指定的编码方式,这种情况是集合由一组10进制的64位有符号整数范围内的数字组成的情况。以下选项可以设置集合使用这种特殊编码方式的size限制。
set-max-intset-entries 512

与哈希和列表类似,有序集合也会使用一种特殊的编码方式来节省空间,这种特殊的编码方式只用于这个有序集合的长度和元素均低于以下参数设置的值时。
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

hll-sparse-max-bytes 3000 设置HyeperLogLog的字节数限制,这个值通常在0~15000之间,默认为3000,基本不超过16000
activerehashing yes redis将会在每秒中抽出10毫秒来对主字典进行重新散列化处理,这有助于尽可能的释放内存

redis使用一个内部程序来处理后台任务,例如关闭超时的client连接,清除过期的key等等。它并不会同时处理所有的任务,redis通过指定的hz参数去检查和执行任务。
hz默认设为10,提高它的值将会占用更多的cpu,当然相应的redis将会更快的处理同时到期的许多key,以及更精确的去处理超时。
hz的取值范围是1~500,通常不建议超过100,只有在请求延时非常低的情况下可以将值提升到100。
hz 10

当一个子进程要改写AOF文件,如果以下选项启用,那文件将会在每产生32MB数据时进行同步,这样提交增量文件到磁盘时可以避免出现比较大的延迟。
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes 启用增量写入 RDB 时的 fsync

通过redis-cli创建集群

./redis-cli --cluster create --cluster-replicas 1 10.157.5.53:6369 10.157.5.53:6370 10.157.5.53:6371 10.157.5.53:6372 10.157.5.53:6373 10.157.5.53:6374(这种情况是六台机器)

三台机器防止一台机器上既是master又是slave
使用以下命令创建主节点:redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 0
增加从节点:
redis-cli --cluster add-node 127.0.0.1:7003 127.0.0.1:7000 --cluster-slave --cluster-master-id ***************

其中:

slave 表示要添加从节点
cluster-master-id 要添加到哪一个主节点,id是*****
127.0.0.1:7003 要添加的从节点
127.0.0.1:7000 原集群中任意节点

集群相关命令

集群客户端命令(redis-cli -c -p port)
cluster info :打印集群的信息
cluster nodes :列出集群当前已知的所有节点( node),以及这些节点的相关信息。
节点
cluster meet :将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
cluster forget <node_id> :从集群中移除 node_id 指定的节点。
cluster replicate <node_id> :将当前节点设置为 node_id 指定的节点的从节点。
cluster saveconfig :将节点的配置文件保存到硬盘里面。
槽(slot)
cluster addslots [slot …] :将一个或多个槽( slot)指派( assign)给当前节点。
cluster delslots [slot …] :移除一个或多个槽对当前节点的指派。
cluster flushslots :移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
cluster setslot node <node_id> :将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给
另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
cluster setslot migrating <node_id> :将本节点的槽 slot 迁移到 node_id 指定的节点中。
cluster setslot importing <node_id> :从 node_id 指定的节点中导入槽 slot 到本节点。
cluster setslot stable :取消对槽 slot 的导入( import)或者迁移( migrate)。

cluster keyslot :计算键 key 应该被放置在哪个槽上。
cluster countkeysinslot :返回槽 slot 目前包含的键值对数量。
cluster getkeysinslot :返回 count 个 slot 槽中的键

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值