一、原理
Redis的主从复制功能非常强大,一个master可以拥有多个slave,而一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构。下面是关于redis主从复制的一些特点:
1.master可以有多个slave
2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构
3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞不能处理client的请求。
4.主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理。也可以用来做简单的数据冗余
5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化。
二、配置
接上一篇文章,安装从redis服务器。
环境描述:
主redis:192.168.0.149 6379
从redis:192.168.0.148 6380
一、主从配置
1、将主从redis配置文件redis.conf中的aemonize no 改为 yes
2、修改从redis配置文件redis.conf中的port 6379 改为 6380,添加slaveof 192.168.0.149 6379
3、启动主从服务,根据上一篇将启动命令写入别名到~/.bashrc文件,因此启动时就用简短的别名了:
主redis:
[[email protected] /usr/local/redis/bin]#startRedis
从redis:
jfb-test:/usr/local/redis/bin # startRedis
4、测试写入数据同步
主redis:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2LcZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMzgjNwETN0EDOyMDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
从redis:这里启动客户端要带上端口号
5、默认是读写分离的
在从redis:
127.0.0.1:6380> set mykey thisismyslaveset
(error) READONLY You can't write against a read only slave.
127.0.0.1:6380>
二、主从切换
1、停止主redis
[[email protected] ~]#stopRedis
[[email protected] /usr/local/redis/bin]#./redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
2、将从redis设成主redis
jfb-test:/usr/local/redis/bin # ./redis-cli -p 6380 slaveof NO ONE
OK
3、测试从redis是否切换从主redis,这里能set值,说明就成了主,上面是从的时候默认是只读的不能定。
jfb-test:/usr/local/redis/bin # ./redis-cli -p 6380
127.0.0.1:6380> set name slavetomaster
OK
127.0.0.1:6380> get name
"slavetomaster"
4、原来的主redis恢复正常了,要重新切换回去
1)将现在的主redis的数据进行保存
127.0.0.1:6380> save
OK
2)将现在的主redis(148)根目录下dump.rdb文件拷贝覆盖到原来主redis(148)的根目录
jfb-test:/usr/local/redis/bin # scp dump.rdb [email protected]:/usr/local/redis/bin/
[email protected]'s password:
dump.rdb
3)启动原来的主redis(149)
[[email protected] /usr/local/redis/bin]#startRedis
[[email protected] /usr/local/redis/bin]#./redis-cli
127.0.0.1:6379> ping
PONG
4)将现在的主redis(148)中切换成slave,切换后可以发现使用set命令不行了,redis又变成只读的了。
jfb-test:/usr/local/redis/bin # ./redis-cli -p 6380 slaveof 192.168.0.149 6379
OK
jfb-test:/usr/local/redis/bin # ./redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> set name aftertransfer
(error) READONLY You can't write against a read only slave.