redis集群的学习

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了redis集群的学习相关的知识,希望对你有一定的参考价值。

redis配置文件详解

redis默认是不作为守护进程来运行的,你可以把这个设置为yes,让它作为守护进程来运行

注意,当作为守护进程的时候,redis 会把进程ID 写到/var/run/redis.pid 

daemonize no

# 当以守护进程方式运行的时候,redis会把进程ID 默认写到/var/run/redis.pid 可以在这里修改路径

pidfile /var/run/redis.pid

接受连接的特定端口.默认是 6379

如果端口设置为0 redis就不会监听TCP 套接字

port 6379

如果你想的话,你可以绑定单一接口,如果这里没单独设置,那么所有接口的连接都会被监听

#bind 127.0.0.1

# 指定用来监听时连接的 unix 套接字的路径,你可以绑定单一接口,如果不指定就不会通过unix套接字监听

unixsocket /tmp/redis.sock

unixsocketperm 755

#一个客户端空闲多少秒后关闭连接(0代表禁用,永不关闭)

timeout 0

#设置服务器调试等级

#可能值:

#debug (很多信息,对开发/测试有用)

#verbose(很多精简的有用信息,但是不像debug 等级那么多)

#notice (适量的意思,基本上是生产环境中需要的程度)

#warning (只有狠重要/严重的信息会记录下来)

 

#指定日志文件名,也可以使用stdout 来强制redis把日志信息写到标准输出上

#注意:如果redis以守护进程方式运行,而你设置日志显示的标准输出的话,那么日志会发送到 /dev/null 

logfile stdout (可以写一个日志文件的路径)

#要使用系统日志记录器很简单,只要设置 syslog-enabled 为yes 就可以了

#然后根据需要设置其他一些 syslog 参数就可以了

#syslog-enabled no

#指明 syslog身份

syslog ident redis

指明syslog 的设备,必须是一个用户或者是 local0-local7之一 

#syslog-fadlity local 0

database 16

 

把数据库存到磁盘上

save <seconds> <changes>

会在指定秒数和数据变化次数之后把数据库写到磁盘上

下面的列子将会进行把数据库写入磁盘的操作

#900 秒 (15分钟) 之后,且至少1次变更

#300秒  (5分支)     之后, 且至少10次变更

# 60秒之后,且至少 10000次变更

#注意: 要想不写磁盘的话就把所有 save 设置 注释就行了

save 900 1

save 300 10

save 60 10000

只需要一个参数即可

# 当导出到 .rdb 数据库时 是否用 LZF 压缩字符串对象

#默认设置为yes,所以几乎总是生效的

#如果你想节省CPU 的话你可以把这个设置为 no,但是如果你有可压缩的key的话,那数据文件夹会更大了

rdbcompression yes

#数据库的文件名

dbfilename dump.rdb

 

#工作目录

#数据库会写到这个目录下,文件名叫是上面的 dbfilename 的值

#累加文件也放在这里

#注意你这里指定的必须是目录,不是文件名

dir

##############################

# 主从同步 通过slaveof 配置来实现redis实例的备份

#注意 这里是本地从远端复制数据 ,也就是说 本地可以有不同的数据库文件 ,绑定不同的IP ,监听不同的IP 监听不同的端口

#

# slaveof <masterip><masterport>

#如果master 设置了密码 (通过下面的"requirepass" 选项来配置),那么slave 在开始同步之前必须进行身份验证,否则它的同步请求会被拒绝

#

#masterauth <master-password>

#当一个 slave失去和 master的连接,或者同步正在进行中,slave的行为有两种可能

1)如果 slave-serve-stale-data设置为yes (默认值),slave 会继续响应客户端请求,可能是正常的数据,

也可能是还没获得值的空数据

2) 如果slave-server-stale-data设置为no,slave 会回复正在从 master同步 SYNC with master in process)

来处理各种请求,除了info和slaveof命令

#

slave-sever-stale-data yes

#下面的选项设置了大块数据I/O 向master请求数据和ping响应的过期时间

#默认值 60秒

#

#一个很重要的事情:确保这个值比 repl-ping-slave-period 大,否则master 和slave之间的传输过期时间比预想的要短

#repl-timeout 60

#要求客户端在处理任何命令时都要验证身份和密码

#警告:因为redis太快了,所以居心不良的人可以每秒尝试150k的密码来试图破解

requirepass redispassword   密码

# 命令重命名

#在共享环境,可以为危险的命令改变名字.比如,你可以为config改个其他不太容易猜到的名字,这样你自己仍然可以使用,而别人却没法做坏事了

#列如

rename-command CONFIG  "你自己想命名的名字"

 

#甚至也可以通过给命令赋值 一个空字符串来完全禁用这条命令

#

# rename-command CONFIG ""

 

#############限制##########################

#设置最多同时连接客户的数量

#默认没有限制,这个关系到redis进程能够打开的文件描述符数量

#特殊值 0 表示没有限制

#一旦达到这个限制,redis会关闭所有新连接并发送错误 达到最大用户数上限

#maxclients 128

#不要用比设置的上限更多的内存,一旦内存使用达到上限,redis会根据选定的回收策略

参见(maxmemory-policy) 删除key

 

#如果 因为删除策略问题 redis无法删除key,或者策略设置为noeviction redis会回复需要更多内存的错误信息给命令

例如:set LPUSH 等等,但是会继续合理响应只读命令:比如 get

 

#在使用redis作为LRU 缓存 ,或者为实例设置了硬性内存限制的时候,(使用noeviction 策略)的时候,这个选项还是蛮有用的)

#警告:当一推slave连上达到内存上限的实例的时候,响应slave需要的输出缓存所需内存不计算在使用内存当中

#这样当请求 一个删除掉的key的时候就不会触发网格问题,重新同步的事件,然后slave就会收到一堆删除指令,直到数据库空了为止

简而言之,如果你用slave  连上一个master的话,那建议你把master内存限制设小点儿,确保有足够的内存用做输出缓存

 

maxmemory <bytes>

 

内存策略,如果内存限制了,redis如何删除key,你可以在下面5个里面选 

#volatile-lru    - 根据lru算法生成 的过期时间来删除

#allkeys-lru    - 根据lru算法删除任何key

#volatile-random -根据过期设置来随机删除Key

#allkeys--random -无差别随机删

#volatile-ttl     -根据最近过期时间来删除

#noeviction          - 谁也不删,直接在写操作时返回错误

 

# 注意:对所有策略来说,如果redis找不到合适的可以删除的key都会在写操作时返回一个错误

 默认值如下

 

maxmemory-policy volatile-lru

# 默认情况下,redis是异步的把数据导出到磁盘上,这种情况下,当redis挂掉的时候,最新的数据就丢了

#如果不希望丢掉任何一条数据的话就该用纯累加模式,一旦开启这个模式,redis就会把每次写入的数据在接收

后都写入appendonly.aof 文件

#每次启动时redis都会把这个文件的数据读入内存中

#注意,异步导出的数据库文件和纯累加文件可以并存

#如果纯累加模式开启了,那么redis会在启动时载入日志文件而忽略导出的 dump.rdb文件

#重要 查看BGREWRITEAOF 来了解当累加日志文件太大了之后,怎么在后台重新处理这个日志文件

 

#纯累加文件名字 (默认appendonly.aof)

appendfilename appendonly.aof

 

# fsync() 请求操作系统马上把 数据写到磁盘上,不要再等了

#有些 操作系统会真的把数据马上刷到磁盘上,有些则要磨蹭一下,但是会尽快去做

 

#redis支持三种不同的模式

#no:不要立刻写,只有在操作系统需要写的时候再写,比较快

#always:每次写操作都立刻写入到aof文件,慢,但是最安全

# everysec:每秒写一次,折中方案

 

默认的everysec 通常来说能在速度和数据之间取得比较好的平衡

如果真的理解了这个意味着什么,那么设置no 可以获得更好的性能表现(如果丢数据的话,则只能拿到一个不是很新的快照)

#或者相反的,你选择always 来牺牲速度确保数据安全,完整

如果拿不准 就使用everysec

#appendfsync always

appendfsync everysec

#appendfsync no

 

#如果你有延迟的问题那就把这个设为yes,否则就保持 no,这是保存持久数据最安全的方式

no-appendfsync-no-rewrite no

 

#自动重写AOF 文件

如果AOF日志文件大到指定百分比,redis能够通过BGREWRITEAOF 自动重写AOF日志文件

#

#工作原理:redis 记住上次重写时AOF 日志的大小(或者重启后没有写操作的话,那好直接用此时的AOF 文件)

基准尺寸和当前尺寸做比较,如果当前尺寸超过指定比例,就会触发重写操作

你还需要指定被重写日志的最小尺寸,这样避免了达到约定百分比但尺寸仍然很小的情况还要重写

#指定百分比为0 会禁用AOF 自动重写特性

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb 

 

redis慢查询日志可以记录超过指定时间的查询

例如;连接客户端,发送响应数据等,只计算命令运行的实际时间(这是唯一一种命令运行线程阻塞而无法同时为其他请求服务的场景)

你可以为慢查询日志配置两个参数:一个是超标的时间,单位为微妙

另一个是慢查询日志的长度.当 一个新的命令被写进日志的时候,最老的那个记录会被删掉

下面的时间单位是微妙,所以1000000 就是1秒,注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令

slowlog-log-slower-than 10000 

#这个长度没有限制,只要有足够的内存就行,你可以通过 slowlog reset来释放内存

slow-max-len 128

 

 

 

#警告!虚拟内存在redis2.4是反对的

### 非常不鼓励使用虚拟内存

#虚拟内存可以使redis在内存不够的情况下仍然可以将所有数据库序列保存在内存里

为了做到这一点,高频key会调到内存里,而低频key会转到交换文件里,就像操作系统使用内存页一样

#要使用虚拟内存,只要把vm-enabled 设置为yes,并根据需要设置下面三个虚拟内存参数就可以了

 

vm-enabled no  

#vm-enabled yes

 

#这是交换文件的路径,估计你猜到了,交换文件不能在多个redis实例之间共享,所以确保每个redis实例使用一个独立交换文件

vm-swap-file /tmp/redis.swap

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

appendonly no

 

以上是关于redis集群的学习的主要内容,如果未能解决你的问题,请参考以下文章

redis高级应用(集群搭建集群分区原理集群操作)

深入学习Redis:集群

Redis进阶学习07--分布式缓存--下

Redis学习专题- Redis主从+哨兵集群部署

深入学习Redis:集群(转)

Redis集群学习笔记