Redis 主从复制机制

1、读写分离的好处:

  • 性能优化:主服务器专注于写操作,可以用更适合写入数据的模式工作;同样,从服务器专注于读操作,可以用更适合读取数据的模式工作。
  • 强化数据安全,避免单点故障:由于数据同步机制的存在,各个服务器之间数据保持一致,所以其中某个服务器宕机不会导致数据丢失或无法访问。从这个角度说参与主从复制的 Redis 服务器构成了一个集群

2、搭建步骤

① 思路

Redis 集群在运行时使用的是同一个可执行文件,只是对应的配置文件不同。

每个配置文件中相同的参数是:

daemonize yes
dir /usr/local/cluster-redis

不同的参数有:

配置项名称作用取值
portRedis 服务器启动后监听的端口号6000 7000 8000
dbfilenameRDB 文件存储位置dump6000.rdb
dump7000.rdb
dump8000.rdb
logfile日志文件位置/var/logs/redis6000.log
/var/logs/redis7000.log
/var/logs/redis8000.log
pidfilepid 文件位置/var/run/redis6000.pid
/var/run/redis7000.pid
/var/run/redis8000.pid

② 步骤

  • 第一步:创建/usr/local/cluster-redis 目录

    1
    mkdir /usr/local/cluster-redis
  • 第二步:把原始未经修改的 redis.conf 复制到/usr/local/cluster-redis 目录

    1
    cp /opt/redis-4.0.2/redis.conf /usr/local/cluster-redis
  • 第三步:把/usr/local/cluster-redis 目录下的 redis.conf 复制为 redis6000.conf

    1
    2
    cd /usr/local/cluster-redis
    cp redis.conf redis6000.conf
  • 第四步:按照既定计划修改 redis6000.conf 中的相关配置项

    • port
    • daemonize yes
    • pidfile
    • logfile
    • dbfilename
    • dir

  • 第五步:复制 redis6000.conf 为 redis7000.conf

    1
    cp redis6000.conf redis7000.conf
  • 第六步:修改 redis7000.conf 中的相关配置项

    • port
    • dbfilename
    • logfile
    • pidfile
  • 第七步:复制 redis6000.conf 为 redis8000.conf

  • 第八步:修改 redis8000.conf 中的相关配置项

    • port
    • dbfilename
    • logfile
    • pidfile

③ 启动 Redis 主从复制集群

1
2
3
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis6000.conf
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis7000.conf
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/redis8000.conf

客户端指定端口号登录

1
/usr/local/redis/bin/redis-cli -p 6000

使用 redis-cli 停止指定服务器的命令格式如下:

/usr/local/redis/bin/redis-cli -h IP 地址 -p 端口号 shutdown

1
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6000 shutdown

查看一下,是否成功停止:

1
ps -ef | grep redis | grep -v grep

3、主从关系

① 查看主从关系

1
info replication

127.0.0.1:6000> info replication

# Replication

role:master
connected_slaves:0

刚刚启动的集群服务器中每一个节点服务器都认为自己是主服务器。需要建立主从关系。

② 设定主从关系

在从机上指定主机位置即可

1
SLAVEOF 127.0.0.1 6000

③ 取消主从关系

在从机上执行命令

1
SLAVEOF NO ONE

4、初步测试

  • 测试 1:在主机写入数据,在从机查看,可以正常查看

127.0.0.1:6000> set age 888
OK
127.0.0.1:6000> get age
“888”

127.0.0.1:7000> get age
“888”

  • 测试 2:在从机写入数据报错。配置文件中的依据是:slave-read-only yes

127.0.0.1:7000> set age 999
(error) READONLY You can’t write against a read only slave.

  • 测试 3:主机执行 SHUTDOWN 看从机状态。、

127.0.0.1:8000> info replication

# Replication

role:slave
master_host:127.0.0.1
master_port:6000
master_link_status:down

  • 测试 4:主机恢复启动,看从机状态。结果:从机还是 slave。

127.0.0.1:8000> info replication

# Replication

role:slave
master_host:127.0.0.1
master_port:6000
master_link_status:up

  • 测试 5:从机 SHUTDOWN,此时主机写入数据,从机恢复启动查看状态。结果:从机的主从关系消失需要重新设定主从关系,主从关系建立后可以正常从主机读取数据。

5.哨兵模式

① 作用

通过哨兵服务器监控 master/slave 实现主从复制集群的自动管理。

② 相关概念

[1]主观下线

1 台哨兵检测到某节点服务器下线。

[2]客观下线

多台哨兵检测到某节点服务器下线

或者说认为某个节点服务器下线的哨兵服务器达到指定数量,判断为客观下线。这个数量后面在哨兵的启动配置文件中指定。

③ 配置方式

简单起见我们只配置一台哨兵。我们所需要做的就是创建一个哨兵服务器运行所需要的配置文件。

1
vim /usr/local/cluster-redis/sentinel.conf
格式sentinelmonitor为主机命名主机 IP主机端口号将主机判定为下线时需要 Sentinel 同意的数量
例子sentinelmonitormymaster127.0.0.160001

④ 启动哨兵

1
/usr/local/redis/bin/redis-server /usr/local/cluster-redis/sentinel.conf --sentinel

⑤ 测试

关闭主服务器

1
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6000 shutdown

+sdown master mymaster 127.0.0.1 6000 【主观下线】
+odown master mymaster 127.0.0.1 6000 #quorum 1/1【客观下线】
……
+vote-for-leader 047c7d448848f5e0ed0f678918dbe4d8d9b5f1b4 1【选举 leader】
……
+failover-state-send-slaveof-noone slave 127.0.0.1:8000 127.0.0.1 8000 @ mymaster 127.0.0.1 6000【把一个从机设置为主机】

————-重新启动挂掉的主机———————
-sdown slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 8000【离开主观下线状态】
+convert-to-slave slave 127.0.0.1:6000 127.0.0.1 6000 @ mymaster 127.0.0.1 8000【转换为从机】