一、原理
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.1.228 6379
从redis:192.168.1.229 6380
一、主从配置
1、将主从redis配置文件redis.conf中的daemonized no 改为 yes 42行
vi /usr/local/redis/bin/redis.conf
注意:改为守护进程后,界面启动就没有图形效果!
2、修改从redis配置文件redis.conf中的port 6379 改为 6380,添加slaveof 192.168.1.228 6379
50行 6380
最后一行 slaveof 192.168.1.228 6379
3、启动主从服务,根据上一篇将启动命令写入别名到~/.bashrc文件,因此启动时就用简短的别名了:
主redis(此时没有图形界面):
#startRedis
从redis:
# startRedis
4、测试写入数据同步
主redis:
[root@master ~]# cd /usr/local/redis/bin
[root@master bin]# ./redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> get hello
"world"
从redis:这里启动客户端要带上端口号
[root@slave1 ~]# cd /usr/local/redis/bin
[root@slave1 bin]# ./redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> get hello
"world"
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
#stopRedis
cd /usr/local/redis/bin
./redis-cli
Could not connect to Redis at 127.0.0.1:6379: Connection refused
2、将从redis设成主redis
cd /usr/local/redis/bin
# ./redis-cli -p 6380 slaveof NO ONE
OK
3、测试从redis是否切换从主redis,这里能set值,说明就成了主,上面是从的时候默认是只读的不能定。
[root@slave1 bin]# cd /usr/local/redis/bin
[root@slave1 bin]# ./redis-cli -p 6380 slaveof NO ONE
OK
[root@slave1 bin]# ./redis-cli -p 6380
127.0.0.1:6380> set name slavetomaster
OK
127.0.0.1:6380> get name
"slavetomaster"
127.0.0.1:6380>
4、原来的主redis恢复正常了,要重新切换回去
1)将现在的主redis的数据进行保存
127.0.0.1:6380> save
OK
2)将现在的主redis(148)根目录下dump.rdb文件拷贝覆盖到原来主redis(148)的根目录
[root@slave1 bin]# scp /usr/local/redis/bin/dump.rdb [email protected]:/usr/local/redis/bin/
dump.rdb
3)启动原来的主redis(149)
#startRedis
#./redis-cli
127.0.0.1:6379> ping
PONG
4)将现在的主redis(229)中切换成slave,切换后可以发现使用set命令不行了,redis又变成只读的了。
[root@slave1 bin]# cd /usr/local/redis/bin
[root@slave1 bin]# ./redis-cli -p 6380 slaveof 192.168.1.228 6379
OK
[root@slave1 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.
127.0.0.1:6380>