利用redis replication实现redis服务器热迁移

利用redis replication实现redis服务器热迁移

文章开头我先声明:标题过于高大上,主要是为了装逼。

某个月黑风高的夜晚,一只运维攻城狮和一只PHP程序猿在促膝长谈,只见PHP程序猿双眼目光呆滞的盯着眼前屏幕上的一坨坨代码状文本,突然问出一句:“这个你会搞吗?”语气中透着一股程序猿的傲娇与对运维这一行业的轻蔑。攻城狮显然感觉到了空气中的那一缕杀气,但为了不给这个行业丢脸,攻城狮还是傲娇的仰头,冷冷的说:“我瞅瞅!”

问题是这样的,程序员他们公司最近要更换一台redis服务器,但是更换的过程中还不能down机。根据网上提供的方法有两种,一种是把数据库down出来,然后在新的redis服务器上搞进去,然后切换。很明显,大家对于这种方案的态度就俩字:呵呵!

另外一种方法就是使用redis的主从同步方式来让新的服务器实时同步旧的服务器,等数据同步完成后,在将所有的请求趁旧服务器一个不注意的时候,噶本儿!转到新的服务器上,从此做一个毫无违和感的始乱终弃的服务器替换,小三在一片欢呼声中成功上位,噢耶!

想想如此跌宕起伏的剧情,攻城狮在夜里兴奋了,雄起了,然后果断开机,开虚拟机,搞起!然后……这是个悲伤的故事,攻城狮百度了一堆文档,发现redis主从同步配置竟然简单到令人发指!只需要在slave服务器的redis.conf配置文件中添加一行:

   slaveof <masterIP> <masterport>

这样一条简单的配置,攻城狮熟练的操作着虚拟机,他开机了!!他配IP地址了!!他远程登录了!!他用yum装了redis了!!他开始配置redis了!!他那粗壮的手指在疯狂的打压键盘,他的嘴角开始微微扬起,他准备着迎接即将到来的胜利!!这个时候他感觉不是一个人!他的背后是整个运维行业的注视!!快看!!攻城狮启动服务了!!他开始测试了!!然后,测试失败了……

呵呵,真是一个悲伤的故事!

让我们来看一下配置的过程和问题所在:

两台虚拟机:

master的IP是192.168.31.118,没有做任何更改,启动了redis服务

slave的IP是192.168.31.200,在/etc/redis.conf文件中增加了一行配置:slaveof 192.168.1.118 6379

然后启动了redis服务。

测试的过程是在master服务器上,使用redis-cli客户端登录redis命令行界面,使用flushdb命令清空所有key(该过程只用于测试,真实环境中敲个这命令你就不用搞什么热迁移了),创建两个键值对:

然后到slave服务器上,使用redis-cli命令登录redis并使用命令key*来查看是否同步了数据,结果悲剧了:

想象中Duang~的一下就同步过来的数据卡壳了,数据不知道死哪去了!文档中就是这么写的啊,肿么搞不定了呢?

无奈,查日志呗,好在redis记录了日志,由于是slave没有同步到数据且master没做别的更改,那么问题很有可能就出在slave上,查看slave上的redis日志,以下是日志内容:

看到了么?多么痛的领悟!居然链接被拒绝?!搞毛线啊??!明明是照着网上的文档来的啊,而且不止一个文档这么配置啊,为毛如此坚决的拒绝一个单身狗的合理要求?!怒摔!!

攻城狮又一次被碾压了,程序猿眼角那束光是怎么回事?分明感到被歧视了呢!夜已深,第二天还得卖身的攻城狮含恨而睡去,睡梦中,攻城狮梦到了他成功解决问题的那一刹那,很美,很美……

好吧,故事并没有结束,就在第二天,攻城狮终于抽出了时间来解决别人公司的问题(老板还好不看我博客,不然后果很严重啊!)攻城狮不愧为攻城狮,他将目光转向了master服务器,看来master什么都不配置是不正确的。仔细观看配置文件时,攻城狮终于眼前一亮!他看到了在配置文件中有一行这样的配置:

bind 127.0.0.1

瞬间开窍,尼玛啊,坑爹啊,这个配置是用来限制允许哪些IP访问redis的啊,怎么网上的文档一致忽略这么一个关键配置啊!尼玛能不能少点转载,写文章的时候走走脑子啊喂!!这帮坑爹的小婊砸!!再次怒摔!!

然后,攻城狮放了个大招,将这个配置更改为:bind 0.0.0.0   是的,攻城狮开始疯狂的报复这个社会了!!改完以后重启redis,成功了,成功了!!!攻城狮那副大眼镜框子后面闪烁出了点点的泪光,他呢喃道:“终于TM的通了,F**K!”主从终于配置成功了!

你以为故事就这样结束了?!你还是太年轻!还有一条关键的配置配好吗?那就是在redis2.6以上,默认slave服务器是不允许执行写操作的,所以,这就注定了slave从工作的那一刻起就注定了是个备胎!哼哼,我们就是来拯救备胎的,所以果断在slave的配置中修改如下配置:

slave-read-only no

允许slave上执行写操作,没错,就是这么任性!如此一来,备胎就可以准备上位了,剩下的事情就交给开发,让其将redis服务器改到新的服务器上,改完后,在新的服务器上登录redis并执行命令:

SLAVEOF no one

至此,正式将slave从备胎扶上位!

虽然这只是一个简单的配置,但是作为一个运维工程师,不正是靠着这种一点一滴的积累,一步一步慢慢走向大牛道路的吗?运维说到底玩的不是技术,而是经验!运维还是老的辣!!

时间: 2024-10-23 04:32:14

利用redis replication实现redis服务器热迁移的相关文章

利用redis-sentinel+keepalived实现redis高可用

目标.需求: 为上层应用提供高可靠.低延迟.低(无限接近0)数据损失的Redis缓存服务 方案概述: 采用同一网络内的三台主机(可以是物理主机.虚拟机或docker容器),要求三台主机之间都能相互访问,每一台主机上都安装redis-server.redis-sentinel和keepalived. redis-server负责提供Redis缓存服务,三台主机间的关系是master-slave-slave redis-sentinel负责提供Redis高可用,三台主机间的关系与redis-serv

redis集群同步迁移方法(一):通过redis replication实现

讲到redis的迁移,一般会使用rdb或者aof在主库做自动重载到目标库方法.但该方法有个问题就是无法保证源节点数据和目标节点数据保持一致,一般线上环境也不允许源库停机,所以要在迁移过程后还要实现同步达到数据的一致性.公司线上环境使用的是redis自己的cluster,每个节点都拥有多个rdb和aof文件,使用原始方法无疑是难上加难.本文主要讨论两种方法来实现不停机源库前提下,实现源库(redis cluster)到目标库(cluster或者单实例)的迁移: 采用redis replicatio

aof恢复与rdb服务器间迁移——redis

1. aof恢复与rdb服务器间迁移: 1.1. Aof恢复: 如果不小心执行了flushdb或flushall了怎么办? (1)立马执行命令:shutdown nosave 关闭服务器,为了防止其他人正在操作服务器触发重写aof,如果aof重写了,彻底没救了 (2)修改aof文件,删除最后一行的命令:flushdb (或flushall) (3)再次启动服务器,查看数据恢复 操作流程如下: 127.0.0.1:6379> set hello word OK 127.0.0.1:6379> f

CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

05_NoSQL数据库之Redis数据库:Redis的常用命令,键值相关命令和服务器相关命令

 Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以再Linux终端使用. 键值相关命令: Keys:返回满足给定pattern的所有key 用表达式*表示取出所有的key 127.0.0.1:6379> keys * 1) "age" 2) "name" 3) "age2" 127.0.0.1:6379> keys a* 1) "age" 2) "age2&

利用lvs keepalived配置redis高可用及负载均衡

需求 我们用ES做日志服务,架构是 上游数据来源=>redis=>logstash=>ES redis目前还是单点, 没有做高可用, 现在数据量越来越多, 如果下游消费不出问题还好, redis里面数据来了就走,但是下游一旦出问题, 分给redis的内存半小时就撑满了. 看到redis3.0 beta版本已经提供了集群功能, 但是需要client以集群模式接入, 我们这么多上游用户, 不太可能统一要求他们改造. 公司也有硬件的LB, 同事在E公司的时候就是用的硬件LB. 但接入还要申请,

redis cluster + redis replication 搭建

redis cluster + redis replication 搭建 环境 部署搭建 192.168.255.250 [[email protected] 3010]# grep -vE "^#|^$" redis.conf bind 192.168.255.250 ##一定要写本机ip并且建立集群的时候要用这个ip建立 port 3010 daemonize yes #守护线程模式(后台启动) pidfile /etc/redis-cluster/3010/redis_3010.

利用redis-sentinel+consul实现redis高可用

在前文<利用redis-sentinel+keepalived实现redis高可用>详细描述了利用redis-sentinel+keepalived实现redis高可用的方案.本文中redis-sentinel的应用场景也是一样的,也是提供Redis单实例服务,当某Redis(master)服务意外停掉或该服务所在的主机发生宕机故障或网络故障时,另一台Redis服务会由slave自动成为master,提供Redis读写服务.redis-sentinel的配置可以参考前文,本文略去,只讨论con

利用乐观锁及redis解决电商秒杀高并发基本逻辑

解决秒杀高并发问题方法很多,如悲观锁,消息队列等…… 利用乐观锁及redis解决秒杀高并发基本逻辑 //初始化redis $redis = new Redis(); // 设置键值,起到监视作用  执行事务之前,判断被修改,回滚 $redis->watch('sales'); // 获取销量 $sales = $redis->get('sales'); // 如果销量存在,先删除,false // $redis->del('sales'); // 库存,秒杀两件产品 $store = 2