redis三主三从如果挂了一对redis 主从切换还能正常工作吗

Redis 主从设置以及注意的问题
Reids的主从设置简单到只需要一句话就完成了,在从机配置文件redis.conf里面添加
slaveof 192.168.252.133 5371
192.168.252.133 为主机IP
5371为主机端口
先启动主机,再启动从机。为提高性能,主机可以设置不使用持久化,从机使用持久化设置。
如果需要密码:在主机设置
requirepass 123456
123456为密码
从机设置 masterauth 123456
123456为密码
要注意的问题是: 当主机宕机,千万不要先启动主机实例,否则从机数据会被清空!!!!,切记。
1:redis主从环境,均未开启持久化;当主实例宕机,从实例上的数据不受影响;当主恢复后,主实例上的数据将会继续同步到从实例,即原来的值将变为空值;
2:redis主从环境,从实例开启快照持久化当主实例宕机,从实例上的数据不受影响;当主恢复后,主实例上的数据将会继续同步到从实例,即原来的值将变为空值;
3:推进一层,当主,从实例均宕机的情况下会如何呢?
这次先关闭从实例,再关闭主实例!启动则先启动从实例,测试数据;再启动主实例,再测试数据!
实践证明,在redis主从读写分离条件下,快照持久化只有开在主实例侧才可以保证数据可以跨越实例重启!
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!在redis的主从机制中,如果主服务器down了是否能自动切_百度知道
在redis的主从机制中,如果主服务器down了是否能自动切
我有更好的答案
  首先说下部署方案:  在两台服务器上分别部署一套Redis,两台服务器共用一个浮动IP,两套Redis实例则做Master-Slave,始终由浮动IP指向服务器上的Redis实例做Master。使用HA软件来检测Redis实例的运行情况。  如果从机出现异常,则重启从机Redis实例;  当主机出现异常,则进行如下操作:  1) Slave主动断开与Master的连接(通过HA软件调用预置脚本实现),然后HA软件将浮动IP指向备机,进行主备机切换;  2) 切换后,HA软件尝试重启现备机的Redis实例,重启成功后将其配置为现主机Redis实例的Slave,然后开始主从复制。  断开与Master连接与重启实例的命令比较简单,就不在此贴出了。  这个方案可能会对业务造成短时影响(要看HA软件的效率),但是对客户端来讲主从切换是不感知的。
采纳率:97%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。骨灰攻城狮 架构师
Redis的哨兵模式第一次主从切换成功,再次进行主从切换就不行了,怎么破?
我在centOS7.4上用redis 4.0.6没有碰到这个问题,可以多次切换。感觉这个问题应该是配置的问题。
当一个master配置为需要密码才能连接时,客户端和slave在连接时都需要提供密码。
master通过requirepass设置自身的密码,不提供密码无法连接到这个master。
slave通过masterauth来设置访问master时的密码。
当使用了sentinel时,由于一个master可能会变成一个slave,一个slave也可能会变成master,所以需要在master 和slave的配置文件中同时都要设置上述两个配置项,才能多次切换,否则就有可能只能切换一次。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Posts - 184,
Articles - 17,
Comments - 436
LIVE AND LEARN
09:16 by pursuer.chen, ... 阅读,
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动 Redis Sentinel 。
Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
&监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
&提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
&自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
redis版本:3.0.7&
主:6379 & ,sentinel:26379
从:6380 &&,sentinel:26380
本章主要介绍怎样搭建自动故障转移的reids群集,当主宕机了从接替主成为新的主,宕机的主启动后自动变成了从,其实它和Mysql的双主模式是一样的互为主从;redis群集需要用到redis-sentinel程序和sentinel.conf配置文件。
mkdir -p /usr/local/redis
mkdir -p /usr/local/redis/6379
mkdir -p /usr/local/redis/6380
mkdir -p /usr/local/redis/redis_cluster
&vim&redis_6379.conf
daemonize yes
pidfile /usr/local/redis/6379/redis_6379.pid
tcp-backlog 128
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir "/usr/local/redis/6379"
masterauth "123456"
requirepass "123456"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
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
hll-sparse-max-bytes 3000
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
aof-rewrite-incremental-fsync yes
&vim sentinel_1.conf
&群集文件配置
port 26379
dir "/usr/local/redis/redis_cluster"
# 守护进程模式
daemonize yes
# 指明日志文件名
logfile "/usr/local/redis/redis_cluster/sentinel_26379.log"
sentinel monitor mymaster 192.168.137.40 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 18000
sentinel auth-pass mymaster 123456
&vim&redis_6380.conf
daemonize yes
pidfile "/usr/local/redis/6380/redis_6380.pid"
tcp-backlog 128
tcp-keepalive 0
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/usr/local/redis/6380"
masterauth "123456"
requirepass "123456"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
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
hll-sparse-max-bytes 3000
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
aof-rewrite-incremental-fsync yesslaveof 127.0.0.1
vim sentinel_2.conf
#sentinel端口
port 26380
#工作路径,注意路径不要和主重复
dir "/usr/local/redis_cluster"
# 守护进程模式
daemonize yes
# 指明日志文件名
logfile "/usr/local/redis_cluster/sentinel_26380.log"
#哨兵监控的master,主从配置一样,sentinel monitor &master-name& &ip& &redis-port& &quorum&
sentinel monitor mymaster 192.168.137.40 6379 2
# master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds mymaster 5000
#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 18000
#设置master和slaves验证密码
sentinel auth-pass mymaster 123456
1.应用程序连接到哨兵端口,通过指定不同的master名称连接到具体的主副本。
2.哨兵配置文件中只需要配置主从复制中的主副本ip和端口即可,当主从进行切换时哨兵会自动修改哨兵配置文件中的主副本ip为新在主副本ip。
3.一个哨兵配置文件中可以同时配置监控多个主从复制。
4.单个哨兵就可以用来进行主从故障监控,但是如果只有一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换(单点问题);&quorum&这个2代表投票数,当2个sentinel认为一个master已经不可用了以后,将会触发failover,才能真正认为该master已经不可用了。(sentinel集群中各个sentinel也有互相通信,通过gossip协议);所以合理的配置应该是同时启动多个哨兵进程,并且最好是在不同的服务器中启动。
主从都要启动
src/redis-server redis.conf
启动群集监控
主从都要启动
src/redis-sentinel sentinel.conf --sentinel
启动报错处理
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.
两个解决方法(overcommit_memory)
echo "vm.overcommit_memory=1" & /etc/sysctl.conf
或 vi /etcsysctl.conf , 然后reboot重启机器
echo 1 & /proc/sys/vm/overcommit_memory
不需要启机器就生效
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(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。
这里又涉及到Overcommit和OOM。
什么是Overcommit和OOM
在Unix中,当一个用户进程使用malloc()函数申请内存时,假如返回值是NULL,则这个进程知道当前没有可用内存空间,就会做相应的处理工作。许多进程会打印错误信息并退出。
Linux使用另外一种处理方式,它对大部分申请内存的请求都回复"yes",以便能跑更多更大的程序。因为申请内存后,并不会马上使用内存。这种技术叫做Overcommit。
当内存不足时,会发生OOM killer(OOM=out-of-memory)。它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存。
Overcommit的策略
Linux下overcommit有三种策略(Documentation/vm/overcommit-accounting):
0. 启发式策略。合理的overcommit会被接受,不合理的overcommit会被拒绝。
1. 任何overcommit都会被接受。
2. 当系统分配的内存超过swap+N%*物理RAM(N%由vm.overcommit_ratio决定)时,会拒绝commit。
overcommit的策略通过vm.overcommit_memory设置。
overcommit的百分比由vm.overcommit_ratio设置。
# echo 2 & /proc/sys/vm/overcommit_memory
# echo 80 & /proc/sys/vm/overcommit_ratio
当oom-killer发生时,linux会选择杀死哪些进程
选择进程的函数是oom_badness函数(在mm/oom_kill.c中),该函数会计算每个进程的点数(0~1000)。
点数越高,这个进程越有可能被杀死。
每个进程的点数跟oom_score_adj有关,而且oom_score_adj可以被设置(-1000最低,1000最高)。
错误2:WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
echo 511 & /proc/sys/net/core/somaxconn
16433:X 12 Jun 14:52:37.734 * Increased maximum number of open files to 10032 (it was originally set to 1024).
新装的linux默认只有1024,当负载较大时,会经常出现error: too many open files
ulimit -a:使用可以查看当前系统的所有限制值
vim /etc/security/limits.conf
在文件的末尾加上
* soft nofile 65535
* hard nofile 65535
执行su或者重新关闭连接用户再执行ulimit -a就可以查看修改后的结果。&
故障切换机制
1. 启动群集后,群集程序默认会在从库的redis文件中加入连接主的配置
# Generated by CONFIG REWRITE
slaveof 192.168.137.40 6379
2.启动群集之后,群集程序默认会在主从的sentinel.conf文件中加入群集信息
port 26379
dir "/usr/local/redis-6379"
# 守护进程模式
daemonize yes
# 指明日志文件名
logfile "./sentinel.log"
sentinel monitor mymaster 192.168.137.40 6379 1
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 18000
sentinel auth-pass mymaster 123456
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 1
sentinel known-slave mymaster 192.168.137.40 6380
sentinel known-sentinel mymaster 192.168.137.40 26380 c77c5f64aaade531c7127ceeb5c3f
sentinel current-epoch 1
#sentinel端口
port 26380
dir "/usr/local/redis-6380"
# 守护进程模式
daemonize yes
# 指明日志文件名
logfile "./sentinel.log"
#哨兵监控的master,主从配置一样,在进行主从切换时6379会变成当前的master端口,
sentinel monitor mymaster 192.168.137.40 6379 1
# master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds mymaster 5000
#若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 18000
#设置master和slaves验证密码
sentinel auth-pass mymaster 123456
#哨兵程序自动添加的部分
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 1
###指明了当前群集的从库的ip和端口,在主从切换时该值会改变
sentinel known-slave mymaster 192.168.137.40 6380
###除了当前的哨兵还有哪些监控的哨兵
sentinel known-sentinel mymaster 192.168.137.40 26379 7ae202a5d438e9d55c9d
sentinel current-epoch 1
模拟主故障
[root@monitor redis-6380]# ps -ef|grep redis
00:00:15 /usr/local/redis-6379/src/redis-server *:6379
00:00:15 /usr/local/redis-6380/src/redis-server *:6380
00:00:05 /usr/local/redis-6379/src/redis-sentinel *:26379 [sentinel]
00:00:05 /usr/local/redis-6380/src/redis-sentinel *:26380 [sentinel]
0 15:56 pts/1
00:00:00 grep redis
[root@monitor redis-6380]# kill -9 4171
[root@monitor redis-6380]# ps -ef|grep redis
00:00:15 /usr/local/redis-6380/src/redis-server *:6380
00:00:05 /usr/local/redis-6379/src/redis-sentinel *:26379 [sentinel]
00:00:05 /usr/local/redis-6380/src/redis-sentinel *:26380 [sentinel]
0 15:56 pts/1
00:00:00 grep redis
[root@monitor redis-6380]#
从哨兵配置文件中可以看到当前的主库的已经发生了改变
&从日志文件也可以看到当前的主已经从6379转换成了6380
&redis配置文件官方说明:
&redis的哨兵端口2使用客户端软件无法连接,使用程序可以连接,客户端软件只能直接连接端口。使用哨兵监控当主故障后会自动切换从为主,当主启动后就变成了从。有看到别人只配置单哨兵26379的这种情况,这种情况无法保证哨兵程序自身的高可用。
&&& 作者:
&&& 博客:
本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。
《欢迎交流讨论》Redis三主三从集群搭建
一,Redis的的的的简介官网给的定义大概意思是:Redis的的的的是一个开源,内存数据结构存储,用作数据库,缓存和消息代理它支持的数据结构有:字符串,哈希,列表,集合,有序集合,位图,超级日志和具有半径查询的地理空间索引.Redis是一个高性能的支持主从同步的键 - 值数据库。二,集群搭建1&系统环境 本地用的VirtualBox虚拟虚拟的安装三台配置一样的的的Centos下的虚拟机查看版本:2&三主三从架构说明三台服务器,启动6个实例,形成三主三从,其中存储相同数据的主从节点不能落在同一台机器上,目的是防止部署的Redis的的的的虚拟机宕机从而造成主从节点全部失效实验机器的地址与端口如下:
IP端口10.252.21.154 700010.252.21.154 700110.252.21.156 700010.252.21.156 700110.252.21.157 700010.252.21.157 70013&安装在三台机器上全部执行如下操作:sudo yum upate && yum install wgetmakir / root /软件cd / root /软件wget http://download.redis.io/releases/redis-3.2.1.tar.gztar -xvf redis-3.2.1.tar.gzcd redis-3.2.1使mv redis-3.2.1 / usr / local / redis /mkdir / usr / local / clustermkdir cp /usr/local/redis/redis.conf / usr / local / cluster / 7000cp /usr/local/redis/redis.conf / usr / local / cluster / 7001vi /usr/local/cluster/7000/redis.confvi /usr/local/cluster/7001/redis.conf 修改配置文件中下面选项,如port 7000:指定当前Redis服务的端口,默认为6379daemonize yes:配置redis作为守护进程运行集群启用是:开启集群功能 绑定10.252.21.154 127.0.0.1:绑定本地回环地址 appendonly是:配置数据持久化在防火墙中对端口开放:firewall-cmd --zone = public --add-port = 7000 / tcp --permanentfirewall-cmd --zone = public --add-port = 7001 / tcp --permanentfirewall-cmd --reload启动Redis的的的的实例:cd / usr / local / cluster / 7000 redis-server redis.confcd / usr / local / cluster / 7001 redis-server redis.conf检查是否启动成功:为了使用主从节点不落在同一台机器上使用如下命令:每台IP +端口交叉(没有找到命令指定主从节点的关系的方法)./redis-trib.rb create --replicas 1 10.252.21.156:.21.154:.21.154:.21.157:.21.157:.21.156:7001这里选择是表示接受了这种方式:Redis Cluser采用虚拟槽分区,所有键根据哈希函数映射到0?16383整数槽内,Redis Cluser采用虚拟槽分区,所有键根据哈希函数映射到0?16383整数槽内。到此为止集群搭建成功!三,搭建过程踩的坑1&在装的Redis的的时使报错:解决方式:安装gcc和gcc-c ++:yum install gcc,yum install gcc-c ++如果想看安装情况:先安装yum install tcl,然后进行测试测试2&执行./redis-trib.rb create --replicas语句报如下错误:/usr/local/rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in`require':无法加载这样的文件 -
redis(LoadError)解决方式:安装依赖,因为没有安装红宝石的Redis的的插件yum安装ruby ruby gems -ygem install redis-3.0.0.gem3&等待群集加入.......解决方式:1& cd / usr / local / cluster / 70002& rm -rf rm -rf appendonly.aof nodes.conf同样的7000也需要执行删除nodes.conf的appendonly.aofredis集群不需要开通redis客户端连接的端口如7000,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口+ 10000执行如下命令:firewall-cmd --zone = public --add-port = 17000 / tcp --permanentfirewall-cmd --zone = public --add-port = 17001 / tcp --permanentfirewall-cmd --reload四,测试这里使用的Redis的的-CLI来进行演示1&存储测试Redis集群把所有的数据映射到16384个槽中。每个key会映射为一个固定的槽,只有当节点分配了槽,才能响应和这些槽关联的键命令。这里name --conan落在了10.252 .21.151这个节点上我们知道10.252.21.156:.21.151:7001的从节点相应的在从节点也可以获取到数据测试如下:2&故障转移测试把154的主节点杀掉查看一下新的主转移情况:这里可以看出156:7000成了matser节点,我们再获取值:3&使用Jedis链接的的Redis的的集群运行结果:CSDN文章同步会慢些,欢迎关注微信公众号:挨踢男孩
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!

我要回帖

更多关于 redis 主从 的文章

 

随机推荐