单个Redis服务如果宕机的话,服务就不可用了,为了解决这种问题,redis也提供有集群服务。传统的Redis集群采用的主从复制模式,一般为一主多从,主节点有读写权限,但是从节点只有读的权限。主节点会定期将数据同步到从节点中,保证数据一致性的问题。这种集群方式在运行时存在一些问题:
Redis的哨兵机制就是解决主从复制存在缺陷(选举问题),解决问题保证我们的Redis高可用,实现自动化故障发现与故障转移。
要使用哨兵机制,除了启动Redis服务以外,还要启动哨兵服务来进行监控,会介绍详细步骤。哨兵服务的工作原理如下:
演示集群采用1主2从,采用伪集群,在一台虚拟机中启动,端口暂定6381、6382、6383,集群结构可以选择下面2种,因为数量较少,此次采用普通样式。
主节点配置文件和单机的时候一样,主要修改以下几点
基本和主节点差不多,但要加上 slaveof 配置和主节点账号密码。
哨兵配置文件是 sentinelconf ,因为有3个redis服务,所以启动3个哨兵服务,对应的配置文件分别为: sentinel_26381conf 、 sentinel_26382conf 、 sentinel_26383conf
Redis服务和哨兵服务都启动了,可以测试哨兵的自动选举了,将6381沙雕,等几秒,再查看6382,6382的主从信息
注意:这个时候如果去看redis的配置文件,会发现配置文件中已经自动改好了主节点为6383了;而且哨兵的配置文件中,也改了主节点为6383了。这些都是哨兵帮我们做的
因集群中已有了新主节点,所以6381再启动只能作为从节点。此时6381启动,需要在配置文件中加入主节点信息:
redis版本为redis-3212,使用工具将安装包上传到data目录。
在data目录下创建文件夹redis,将redis安装在此目录。
第一步:解压。
第二步:安装,PREFIX=/data/redis用来设置安装目录。
到此,redis已经安装完成,剩下就是配置和启动服务。
进入redis目录, 创建配置文件conf、日志logs、数据库dump、进程号pid四个目录,用来存放对应的文件,这四个目录也可以存放在其他文件夹,只要与配置文件中的配置一致即可,否则在启动服务时会报错。 其中bin目录就是redis安装成功后的一些命令文件。
redis服务配置一主二从,哨兵模式。注意:如果在实际开发中用不到哨兵模式,redis服务配置一主一从即可。
主Redis配置:redis_6379conf
从Redis配置,redis_6380conf和redis_6381conf,与主Redis配置基本上一样,不一样的地方在于 端口、数据库、日志、pid文件名称 ,都以6380或6381为标志, 最重要的地方是建立主从关系和同步验证。
注意: 对只使用redis服务 ,只需要在主Redis里面配置requirepass,在从Redis里面配置masterauth,密码保持一致,密码尽可能复杂,以免被攻击破解。
注意: 对只使用redis服务 ,如果从Redis也有必要加入访问验证,也可以设置requirepass,而且密码可以与主Redis密码不同。
将配置文件放置到/data/redis/conf目录下,然后就可以启动服务了。
启动服务要按照主从顺序依次启动。
查看服务启动情况:
也可以通过查看日志文件来确认服务是否正常启动。
通过客户端登录Redis验证数据同步情况:
主Redis登录验证,设置数据:
从Redis登录,获取数据:从Redis并没有设置密码,所以无需验证就可以 *** 作。
配置哨兵模式:
Redis Sentinel集群通常由3到5个节点组成,如果个别节点挂了,集群还可以正常运作。Sentinel负责监控Redis集群的 健康 情况。
如果主Redis挂掉,Sentinel集群会通过投票选择一个新的主Redis。 当原来的主Redis恢复时,它会被当做新的主Redis的从Redis重新加入Redis集群。
设置连接master和slave的密码,需要注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码必须设置相同。也就是说主Redis和从Redis都必须设置requirepass和masterauth,而且密码必须相同。
sentinelconf配置信息:
将该配置文件放置到/data/redis/conf目录下,启动sentinel服务:
验证sentinel是否起作用,可以手工shutdown掉主Redis。
这时从Redis想要访问主Redis同步数据就会提示错误信息:
sentinel在监测到主Redis宕机之后,通过选举,将一个从Redis选定为新的主Redis。通过查看sentinel日志可以发现,选定6380为新的主Redis,同时将另外两个Redis作为从Redis。
注意:选定6380为主Redis后,所有的配置文件都会被修改,主要是重新建立主从关系。
6379会新增:slaveof 127001 6380
6380会删掉:slaveof 127001 6379
6381会修改:slaveof 127001 6380
由于6379服务已经关掉,所以虽然sentinel将6379作为6380的从服务,但是没有真正的建立。
重新启动6379服务,这时sentinel会重建建立一次主从关系:
根据下面步骤创建适应业务需求的云数据库Redis版实例。
使用下列方法中任意一种打开购买页:
打开云数据库Redis版产品首页,单击立即购买。
说明 如果尚未登录阿里云账号,单击立即购买后需要先使用阿里云账号和密码登录。
登录Redis管理控制台,单击右上角的创建实例。
设置以下参数。
选择密码设置方式。
立即设置:在下方的输入密码区域设置密码。
稍后设置:创建实例后再修改密码。
设置实例名称、购买数量,如果创建包年包月实例,还需设置时长。
在确认订单页,阅读《云数据库KVStore版服务协议》,确认接受后在服务协议前的选框中单击勾选。
单击去开通。
因为这方面内容较多,这里也写不开那么多内容,所以你可以留言或到我的博客上搜索相关内容,老魏有写过教程,还不止一篇,都挺详细的内容,可以帮助你入门。
redis 分布式,主从同步张映 发表于 2011-06-27
分类目录: cache, nosql
标签:master, redis, slave, 主从, 分布式, 集群
redis和memcache比较像的,memcache可以实现服务器的集群,redis肯定也是可以的。下面在一台机,实现redis主从复制。
1,copy一下redisconf,生成一个从机的配置
cp /usr/local/redis/redisconf /usr/local/redis/redis_slaveconf
2,修改主服务器的配置redisconf
bind 127001
3,修改从服务器的配置redis_slaveconf
pidfile /usr/local/redis/var/redis_slavepid
port 10002
bind 127001
logfile /usr/local/redis/var/redis_slavelog
dbfilename dump_slaverdb
slaveof 127001 6379
4,启动主服务器,从服务器
redis-server /usr/local/redis/redisconf
redis-server /usr/local/redis/redis_slaveconf
查看一下,redislog文件会有以下内容
[3774] 27 Jun 12:53:32 The server is now ready to accept connections on port 10002
[3774] 27 Jun 12:53:32 - 0 clients connected (0 slaves), 539568 bytes in use
[3774] 27 Jun 12:53:32 Connecting to MASTER
[3772] 27 Jun 12:53:32 - Accepted 127001:33237
[3772] 27 Jun 12:53:32 Slave ask for synchronization
[3772] 27 Jun 12:53:32 Starting BGSAVE for SYNC
[3772] 27 Jun 12:53:32 Background saving started by pid 3775
[3774] 27 Jun 12:53:32 MASTER <-> SLAVE sync started: SYNC sent
[3775] 27 Jun 12:53:32 DB saved on disk
[3772] 27 Jun 12:53:33 Background saving terminated with success
[3772] 27 Jun 12:53:33 Synchronization with slave succeeded
[3774] 27 Jun 12:53:33 MASTER <-> SLAVE sync: receiving 333 bytes from master
[3774] 27 Jun 12:53:33 MASTER <-> SLAVE sync: Loading DB in memory
[3774] 27 Jun 12:53:33 MASTER <-> SLAVE sync: Finished with success
查看一下
root@ubuntu:/usr/local/redis# ps -e|grep redis
3774 00:00:00 redis-server
4148 00:00:00 redis-server
5,测试结果
<php
$redis = new redis();
$redis->connect('127001', 6379);
$redis->set('test',json_encode(array(1,2,3,4)));
print_r(json_decode($redis->get('test')));
>
root@ubuntu:/usr/local/redis# telnet 127001 10002
Trying 127001
Connected to 127001
Escape character is '^]'
get test
$9
[1,2,3,4]
缓存数据是放在6379这个端口的服务器上,代码执行后,登录到10002端口的slave服务器上也可以看到有数据,说明已经同步了。
我尝试了一下,redis的主主同步,但是没有成功,我看了一下log,以从服务器127001 10002为master的时候,同时启动二个端口,怎么也连接不上127001 6379是不支持呢?还是配置有问题,我在网上查了一下,没看到有人配置主主同步的。来自: >
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)