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
posted @ 2019-09-02 20:01  ChanceySolo  阅读(175)  评论(0编辑  收藏  举报