7283:M 12 Mar 12:13:33.749 #
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
7283:M 12 Mar 12:13:33.749 # Server started, Redis version 3.0.7
7283:M 12 Mar 12:13:33.749 #
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
7283:M 12 Mar 12:13:33.749 * The server is now ready to accept connections on port 6379
第1个警告(WARNING: The TCP backlog setting of 511 ......)解决办法
方法1: 临时设置生效: sysctl -w net.core.somaxconn = 1024
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
net.core.somaxconn= 1024
然后执行命令
sysctl -p
net.core.somaxconn是linux中的一个kernel参数,表示socket监听(listen)的backlog上限。
backlog是socket的监听队列,当一个请求(request)尚未被处理或建立时,他会进入backlog。
而socket server可以一次性处理backlog中的所有请求,处理后的请求不再位于监听队列中。
当server处理请求较慢,以至于监听队列被填满后,新来的请求会被拒绝。
所以说net.core.somaxconn限制了接收新 TCP 连接侦听队列的大小。
对于一个经常处理新连接的高负载 web服务环境来说,默认的 128 太小了。大多数环境这个值建议增加到 1024 或者更多。
第2个警告(WARNING overcommit_memory is set to 0! ......)同样也有两个解决办法
方法1: 临时设置生效: sysctl -w vm.overcommit_memory = 1
方法2: 永久生效: 修改/etc/sysctl.conf文件,增加一行
vm.overcommit_memory = 1
然后执行命令
sysctl -p
overcommit_memory参数说明:
设置内存分配策略(可选,根据服务器的实际情况进行设置)
/proc/sys/vm/overcommit_memory
可选值:0、1、2。
0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2, 表示内核允许分配超过所有物理内存和交换空间总和的内存
注意:redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
Redis 3.0.7版本启动时出现警告的解决办法7283:M 12 Mar 12:13:33.749 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.7283:M 12 M
A主节点6379节点(/usr/local/bin/conf/
redis
6379.conf):
修改 requirepass 12345678,注释掉#bind 127.0.0.1,就是注释IP地址,这里面不能绑定IP
B从节......
1.
Redis
默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
daemonize no
2. 当
Redis
以守护进程方式运行时,
Redis
默认会把pid写入/var/run/
redis
.pid文件,可以通过pidfile指定
pidfile /var/run/
redis
.pid
3. 指定
Redis
问题就
出现
在这里:
刚开始时我发现主节点停止后,每个哨兵都显示主节点sdown,也就是主观下线,但是没有一个哨兵节点显示oldown(客观下线),这样也就不会进入重新选举主节点环节。
后来经过排查发现在所有哨兵启动成功后就出
运维之道 |
Redis
哨兵(Sentinel)深入剖析 及 Sentinel 搭建部署
主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主从服务器,这就需要人工干预,既费时费力,还会造成一段时间内服务不可用,这不是一种推荐的方式,更多的时候,我们优先考虑哨兵模式,它是当前企业应用的主流方式。
Redis
Sentinel 是
Redis
高可用 的实现方案。Sen...
28687:C 09 Sep 10:14:31.681 # oO0OoO0OoO0Oo
Redis
is starting oO0OoO0OoO0Oo
28687:C 09 Sep 10:14:31.681 #
Redis
version=4.0.11, bits=64, commit=00000000, modified=0, pid=28687, just started
28687:C 09 Sep 10:14:31.681 # Configuration loaded
28687
# Server initialized
# WARNING overcommit_memory is set to 0!
Background save may fail under low memory condition.
To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot
or run the command
如果需要扩展sentinel的指令集,需要从何入手?怎么样扩展才会显得优雅?
下面介绍一个我在工作中的实践经验,供大家参考。
以重写降级逻辑为例,我们重新定义降级逻辑控制台的增删查改逻辑就不做过多介绍,我们从扩展的降级规则发送到client端开始说起。
server端发送规则
首先,我们可以仿照sentinel原生的规则发送方法,写一个扩展的规则发送方法
private boolean setExtendRules(String app, String ip, int port, String type,
在创建
Redis
集群时
出现
"NOAUTH Authentication required"错误,可能是因为没有设置密码或者设置了密码但是在集群操作时没有提供密码。解决方法是在启动
Redis
服务时设置密码,或者在进行集群操作时提供密码。
如果你是在配置文件中设置密码,请确保在启动
redis
服务时使用了正确的配置文件,并且在连接
redis
的时候使用了密码。
如果你是通过
redis
-cli 命令来设置密码,请在
redis
-cli中使用 auth 命令来验证密码。
$
redis
-cli
127.0.0.1:6379> auth mypassword
127.0.0.1:6379>
如果你在使用第三方工具或者脚本来创建
redis
集群,请确保在连接
redis
服务器的时候使用了密码。