配置
先安装redis
1 2
| make make PREFIX=/usr/local/redis install
|
找个地方创建两个文件,如:
把redis.conf文件复制到这两个目录
进入d6379目录中,配置文件就改了
启动第一个redis
1
| /usr/local/redis/bin/redis-server redis.conf
|
进入d6380目录中,配置文件修改为
1 2 3 4 5
| port 6380 daemonize yes
# slaveof <masterip> <masterport> slaveof 127.0.0.1 6379
|
启动从节点
1
| /usr/local/redis/bin/redis-server redis.conf
|
查看一下进程情况
1 2 3
| ps -ef | grep redis root 8428 1 0 17:06 ? 00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6379 root 8453 1 0 17:16 ? 00:00:00 /usr/local/redis/bin/redis-server 127.0.0.1:6380
|
测试
再开一个shell窗口,分别登入两个redis
登录主的
1 2
| $ /usr/local/redis/bin/redis-cli 127.0.0.1:6379>
|
登录从的
1 2
| $ /usr/local/redis/bin/redis-cli -p 6380 127.0.0.1:6380>
|
分别查看他们的状态:
主的
1 2 3 4
| 127.0.0.1:6379> info Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=0
|
从的
1 2 3 4 5
| 127.0.0.1:6380> info Replication # Replication role:slave master_host:127.0.0.1 master_port:6379
|
在主的上设置值
1 2 3 4
| 127.0.0.1:6379> set key1 vvv1 OK 127.0.0.1:6379> keys * 1) "key1"
|
在从的上查看
1 2 3 4
| 127.0.0.1:6380> keys * 1) "key1" 127.0.0.1:6380> get key1 "vvv1"
|
可以看到从的已经自动从主的上复制了数据
再试一下在从的上写数据
1 2
| 127.0.0.1:6380> set key2 vvv2 (error) READONLY You can't write against a read only slave.
|
主从切换
SLAVEOF host port
SLAVEOF 命令用于在 Redis 运行时动态的修改复制(replication)功能的行为。
通过执行 SLAVEOF host port 命令,可以将当前服务器转变为指定服务器的从属服务器(slave server)。
如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。
另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。
利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。
将从服务器升级为主服务器,并且关闭复制功能
1 2 3 4 5 6 7
| 127.0.0.1:6380> SLAVEOF NO ONE OK 127.0.0.1:6380> info Replication # Replication role:master connected_slaves:0
|
此时可以写入数据
1 2
| 127.0.0.1:6380> set k5 'upgrade to master' OK
|
将6379转成6380的从服务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| 127.0.0.1:6379> slaveof 127.0.0.1 6380 OK 127.0.0.1:6379> info Replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:5 master_sync_in_progress:0 slave_repl_offset:2844 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:9c8b0e2e24636212f659b3f8bc17cbae51785db2 master_replid2:6e0c53cc1c7438c88273db17fa654f285026e1ce master_repl_offset:2844 second_repl_offset:2777 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2844
|
变成从的后会删除自己已有的数据,并将主服务器的数据复制过来
可以看到之前添加的数据也复制过来了
1 2 3 4 5 6
| 127.0.0.1:6379> keys * 1) "kk2" 2) "k5" 3) "key1" 127.0.0.1:6379> get k5 "upgrade to master"
|
主节点下的从节点的信息都可以通过info命令查看
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 127.0.0.1:6380> info Replication # Replication role:master connected_slaves:3 slave0:ip=192.168.1.215,port=6379,state=online,offset=4768,lag=1 slave1:ip=192.168.1.215,port=6380,state=online,offset=4768,lag=0 slave2:ip=127.0.0.1,port=6379,state=online,offset=4768,lag=0 master_replid:d3ea04b9553a6c20b2bbe836dd35e2311ee1ed06 master_replid2:d7ded5c06b7d723590dd4aa8bee2b7020f3cbc96 master_repl_offset:4768 second_repl_offset:4617 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:4533 repl_backlog_histlen:236
|