理解Master-Slave
Master-Slave 常常翻译为 主/备 ,是一种高可用性( High Availability )方案。
举个生活中的 Master-Slave 例子:
参加考试的时候,我们会准备两支钢笔,正常情况下我们只会使用一支,出问题了才会换另外一支。
所以实施 Master-Slave 是有成本的,至少会有 50% 的资源浪费(多备几支浪费会更多),可以让 Slave 承担一部分工作来充分利用资源。
Redis的Master-Slave
关于 Redis 的 Master-Slave ,《Replication – Redis》 有详尽描述。
需要注意的是 Redis 的 Master-Slave 不能保证绝对不丢数据,而是丢失一小段时间内(如:1秒钟)的数据。
下面开始 Redis 的 Master-Slave 实践,使用的 redis 版本为 3.0.6 。
创建Master结点
redis配置文件
从
/etc/redis.conf拷贝一份进行修改,无关的配置项已去掉,使用默认值即可。在终端
1启动Master结点redis-server ./redis-master.conf使用
redis-cli连接Master$ redis-cli -p 6379 127.0.0.1:6379>
创建Slave结点
redis配置文件
从
redis-master.conf拷贝一份进行修改,主要是修改监听的端口号(6380)、PID文件名、DB文件名,最关键的是设置为
Master的Slaveslaveof 127.0.0.1 6379。在终端
2启动Slave结点redis-server ./redis-slave.conf使用
redis-cli连接Slave$ redis-cli -p 6380 127.0.0.1:6380>
演示Master写Slave读的场景
在
Master写入127.0.0.1:6379> set hello world OK
从
Slave读取127.0.0.1:6380> get hello "world"
演示Slave挂掉的场景
关闭
Slave127.0.0.1:6380> shutdown not connected>
终端
2上的redis-server会自动退出,注意到它退出前进行了存盘。在
Master写入127.0.0.1:6379> set hello redis OK
在终端
2上再次启动Slaveredis-server ./redis-slave.conf
从日志上可以看到
Slave从Master重新进行了数据同步。在
Slave上读取not connected> get hello "redis" 127.0.0.1:6380>
演示Master挂掉的场景
关闭
Master127.0.0.1:6379> shutdown not connected>
终端
1上的redis-server会自动退出,注意到它退出前进行了存盘, 终端2上的Slave在不断尝试重连Master。Master-Slave角色切换
将运行中的原
Slave提升为新Master127.0.0.1:6380> slaveof no one OK
修改原
Slave的配置文件redis-slave.conf删除配置#slaveof 127.0.0.1 6379修改原
Master的配置文件redis-master.conf添加配置slaveof 127.0.0.1 6380在新
Master写入127.0.0.1:6380> set hello master-slave OK
在终端
1上再次启动原Masterredis-server ./redis-master.conf
从日志上可以看到它现在是
Slave角色了,反而从原Slave同步数据。在原
Master上读取not connected> get hello "master-slave" 127.0.0.1:6379>
总结
Redis 的 Master-Slave 是一种动态关系,角色( Master 、 Slave )会互相转换,角色转换过程中必须严格按照步骤来,操作不当可能导致数据丢失。
后面会发文介绍自动进行这种切换的工具 Redis Sentinel ,以及当 Master-Slave 发生切换后,应用程序该如何重连到新的 Master 。