当数据量变得庞大的时候,读写分离还是很有必要的。同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能。
redis提供了一个master,多个slave的服务。
准备三个redis服务,依次命名文件夹子master,slave1,slave2.这里为在测试机上,不干扰原来的redis服务,我们master使用6000端口。
配置文件(redis.conf)
master配置修改端口:
slave1修改配置:
<code>port 6001</code>
<code>slaveof 127.0.0.1 6000</code>
<code>masterauth 123456</code>
<code>requirepass 123456</code>
slave2修改配置:
<code>port 6002</code>
requirepass是认证密码,应该之后要作主从切换,所以建议所有的密码都一致, masterauth是从机对主机验证时,所需的密码。(即主机的requirepass)
启动主机
<code>redis-server redis.conf </code>
启动从机:
输入:
可以看到主从机的redis已经相应启动。
我们来验证下 主从复制。
master:
<code>[root@localhost master]</code><code># redis-cli -p 6000</code>
<code>127.0.0.1:6000> auth 123456</code>
<code>OK</code>
<code>127.0.0.1:6000> </code><code>set</code> <code>test</code> <code>chenqm</code>
slave1:
<code>[root@localhost slave2]</code><code># redis-cli -p 6001</code>
<code>127.0.0.1:6001> auth 123456</code>
<code>127.0.0.1:6001> get </code><code>test</code>
<code>"chenqm"</code>
slave2:
<code>[root@localhost slave2]</code><code># redis-cli -p 6002</code>
<code>127.0.0.1:6002> auth 123456</code>
<code>127.0.0.1:6002> get </code><code>test</code>
可以看到主机执行写命令,从机能同步主机的值,主从复制,读写分离就实现了。
但是万一主机挂了怎么办,这是个麻烦事情,所以redis提供了一个sentinel(哨兵),以此来实现主从切换的功能,类似与zookeeper.
我们配置两个sentinel进程:
<code>port 26379</code>
<code>sentinel monitor mymaster 127.0.0.1 6000 2</code>
<code><br>sentinel auth-pass mymaster 123456</code>
<code>vi</code> <code>sentinel.conf</code>
<code>port 26479</code>
<code>sentinel auth-pass mymaster 123456</code>
启动sentinel服务(到对应的目录执行相应的命令):
<code>redis-server sentinel.conf --sentinel</code>
查看日志:
从对应的日志观察到,一个master服务,两个slave服务
我们现在来kill master进程
<code>[root@localhost slave1]</code><code># ps -ef|grep redis</code>
<code>root 6960 1 0 19:29 ? 00:00:02 redis-server *:6000 </code>
<code>root 6968 1 0 19:30 ? 00:00:01 redis-server *:6001 </code>
<code>root 6975 1 0 19:30 ? 00:00:01 redis-server *:6002 </code>
<code>root 7014 6570 0 19:42 pts</code><code>/0</code> <code>00:00:01 redis-server *:26479 </code>
<code>root 7017 6789 0 19:42 pts</code><code>/5</code> <code>00:00:01 redis-server *:26379 </code>
<code>root 7021 6729 0 19:46 pts</code><code>/3</code> <code>00:00:00 </code><code>grep</code> <code>redis</code>
<code>[root@localhost slave1]</code><code># kill -9 6960</code>
我们观察日志:
<code>[7014] 11 Jan 19:43:41.463 </code><code># +sdown master mymaster 127.0.0.1 6000</code>
<code>[7014] 11 Jan 19:46:42.379 </code><code># +switch-master mymaster 127.0.0.1 6000 127.0.0.1 6001</code>
master切换了,当6000端口的这个服务重启的时候,他会变成6001端口服务的slave。
因为sentinel在切换master的时候,把对应的sentinel.conf和redis.conf文件的配置修改。
期间我们还需要关注的一个问题:sentinel服务本身也不是万能的,也会宕机,所以我们还得部署sentinel集群,象我这样多启动几个sentinel。
关注这个配置:
<code>sentinel monitor mymaster 127.0.0.1 6000 2<br><br><br>这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机,才会去执行主从切换的功能。</code>
<code></code>
本文转自 蓝叶子Sheep 51CTO博客,原文链接:http://blog.51cto.com/dellinger/1960069,如需转载请自行联系原作者