Redis之主从同步
Redis之主从复制
1. 概述
定义
- 一个redis服务可以有多个该服务的复制品,这个redis称为master,其他复制品称为slaves
- 网络正常,master会一致将自己的数据更新同步给slaves,保持主从同步
- 只有master可以执行写命令,slave只能执行读命令
作用
- 分担了读的压力(高并发)
原理
- 从服务器执行客户端发送的读命令,比如GET、LRANGE、SMEMMVERS、HGET、ZRANGE等等,客户端可以连接slaves执行读请求,来降低master的读压力
2. 实现
法一(命令行)
redis-server --port 630 --slaveof 127.0.0.1 6379
# 从server端
redis-server --port 6300 --slaveof 127.0.0.1 6379
# 从client端
redis-cli -p 6300
127.0.0.1:6300> keys *
# 发现是复制了原6379端口的redis数据
127.0.0.1:6379> set sex man
OK
127.0.0.1:6300> keys *
1) "name"
2) "sex"
# 从server只能读取数据,不能写入`
法二(命令行)
127.0.0.1:6379> keys *
1) "name"
2) "sex"
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> slaveof 127.0.0.1 6379 # 切换为从server
OK
127.0.0.1:6379> set newkey 456
(error) READONLY You can't write against a read only slave.
127.0.0.1:6379> keys *
1) "age"
2) "name"
3) "sex"
127.0.0.1:6379> slaveof no one # 切换回主server
OK
法三(修改配置)
vim /etc/redis/redis.conf
slaveof 127.0.0.1 6379
port 6300
# 启动Redis服务
redis-server redis_6300.conf
# 客户端连接测试
redis-cli -p 6300
127.0.0.1> hset user_001 username guods
(error) READONLY You can't write against a read only slave.
问题:
- 一个master可以有多个slaves
- slaves下线,只是读请求的处理性能下降
- master下线,写请求无法执行
- 其中一台slave使用
slaveof no one
命令成为master,其他slaves执行slaveof命令指向新的master,从他这里同步数据
以上过程是手动的,能够实现自动,这就需要sentine哨兵,实现故障转移failover操作
3. 哨兵
- sentinel会不断检查master和slaves是否正常
- 每一个sentinel可以监控任意多个master和master下的slaves
3.1 环境
三台redis服务器
server1 (6379)
chancey@server:~$ sudo /etc/init.d/redis-server start
server2 (6380)
chancey@server:~$ redis-server --port 6380
chancey@server:~$ redis-cli -p 6380
127.0.0.1:6380> slaveof 127.0.0.1 6379
OK
server3 (6381)
chancey@server:~$ redis-server --port 6381
chancey@server:~$ redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
3.2 搭建哨兵
安装并搭建sentine哨兵
# 安装redis-sentinel
sudo apt-get install redis-sentinel
# 新建配置文件sentinel.conf
port 26379
sentinel monitor demo 127.0.0.1 6379 1 # demo为监控器名,1为投票机制
# 启动sentinel
法一:redis-sentinel sentinel.conf
法二:redis-server sentinel.conf --sentinel
#将master的redis服务终止,查看是否会提升为主
sudo /etc/init.d/redis-server stop
# 发现提升6381为master,其他两个为从
# 在6381上设置新值,6380查看
127.0.0.1:6381> set name demo
OK
127.0.0.1:6380> get name
demo