一、Redis主从模式
1.1简介
在实际生产环境下,Redis 基本上是不可能部署成单机模式的。一般都需要部署 Redis 集群实现高可用,以保障业务的稳定运行。
要想学会部署 Redis 集群,那就先从 Redis 集群中最简单的主从模式做起。
在一些简单小型的应用中,我们可能会看到类似于下图的 Redis 部署架构。其中 Master 是主机,Slave 是从机,而这种架构方式就是所谓的一主多从:
在这种架构模式下,主机和从机的数据完全一致,主机支持数据的写入和读取等各项操作,而从机则只支持与主机数据的同步和读取。也就是说,客户端可以将数据写入到主机,由主机自动将数据的写入操作同步到从机。
主从模式很好的解决了数据备份问题,并且由于主从服务数据几乎是一致的,因而可以将写入数据的命令发送给主机执行,而读取数据的命令发送给不同的从机执行,从而达到读写分离的目的。
1.2部署
下面介绍如何部署一个一主三从的主从模式。
为了区分单机模式的部署位置,这里拷贝一下 Redis 的目录:
cp -r /usr/local/redis-4.0.11 /usr/local/redis-ms
接下来会基于/usr/local/redis-ms目录部署主从模式。
由于每个 Redis 实例都是一个单独的进程,所以需要在每个 Redis 实例启动时为其分配一个
独立的配置文件就能使它们区分开来(同时由于本次是部署在同一台机器,需为每个实例指定不
同的服务端口)。
为了在同一台机器上部署一主三从的 Redis,准备以下四份配置文件:
角色 | 配置文件 | 服务端口 |
---|---|---|
主机 | redis-6379.conf | 6379 |
从机 | redis-6380.conf | 6380 |
从机 | redis-6381.conf | 6381 |
从机 | redis-6382.conf | 6382 |
注:这四份配置文件均拷贝自 /usr/local/redis-ms/redis.conf ,拷贝到 /usr/local/redis-ms/ 目录再修改即可。
主机 redis-6379.conf 配置文件内容如下:
bind 127.0.0.1 # 正式部署请设为合适的 IP
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
dir /tmp/redis-ms # Redis 的工作目录(若不存在需手建否则无法启动),logfile 与 dbfilename 受其影响
logfile "6379.log" # Redis 日志名称(默认不配置,表示输出到 stdout),正式部署请设置为合适的名称
dbfilename dump-6379.rdb # Redis 数据持久化时的存储位置,正式部署请设置为合适的名称
从机 redis-6380.conf 配置文件内容如下:
bind 127.0.0.1 # 正式部署请设为合适的 IP
port 6380
daemonize yes
pidfile /var/run/redis_6380.pid
dir /tmp/redis-ms # Redis 的工作目录(若不存在需手建否则无法启动),logfile 与 dbfilename 受其影响
logfile "6380.log" # Redis 日志名称(默认不配置,表示输出到 stdout),正式部署请设置为合适的名称
dbfilename dump-6380.rdb # Redis 数据持久化时的存储位置,正式部署请设置为合适的名称
slaveof 127.0.0.1 6379 # 标注所从属的主机
从机 redis-6381.conf 配置文件内容如下:
bind 127.0.0.1 # 正式部署请设为合适的 IP
port 6381
daemonize yes
pidfile /var/run/redis_6381.pid
dir /tmp/redis-ms # Redis 的工作目录(若不存在需手建否则无法启动),logfile 与 dbfilename 受其影响
logfile "6381.log" # Redis 日志名称(默认不配置,表示输出到 stdout),正式部署请设置为合适的名称
dbfilename dump-6381.rdb # Redis 数据持久化时的存储位置,正式部署请设置为合适的名称
slaveof 127.0.0.1 6379 # 标注所从属的主机
从机 redis-6382.conf 配置文件内容如下:
bind 127.0.0.1 # 正式部署请设为合适的 IP
port 6382
daemonize yes
pidfile /var/run/redis_6382.pid
dir /tmp/redis-ms # Redis 的工作目录(若不存在需手建否则无法启动),logfile 与 dbfilename 受其影响
logfile "6382.log" # Redis 日志名称(默认不配置,表示输出到 stdout),正式部署请设置为合适的名称
dbfilename dump-6382.rdb # Redis 数据持久化时的存储位置,正式部署请设置为合适的名称
slaveof 127.0.0.1 6379 # 标注所从属的主机
建上面配置的 Redis 工作目录:
#mkdir /tmp/redis-ms
然后使用 redis-server 命令启动 Redis 主从实例:
#cd /usr/local/redis-ms/src/ # 切换到启动脚本目录
./redis-server ../redis-6379.conf # 启动 Redis 主机,必须先启动
./redis-server ../redis-6380.conf # 启动 Redis 从机
./redis-server ../redis-6381.conf # 启动 Redis 从机
./redis-server ../redis-6382.conf # 启动 Redis 从机
1.3测试
现在测试 Redis 主从模式是否能正常工作
可先通过ps -ef|grep redis
命令可查看四个主从进程是否正常启动:
root 7049 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6379
root 7057 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6380
root 7065 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6381
root 7081 1 0 21:21 ? 00:00:00 ./redis-server 127.0.0.1:6382
然后通过 Redis 测试客户端命令redis-cli
分别连接到四台机器:
#cd /usr/local/redis-ms/src/ # 切换到启动脚本目录
./redis-cli -h 127.0.0.1 -p 6379 # 连接到 Redis 主机
./redis-cli -h 127.0.0.1 -p 6380 # 连接到 Redis 从机
./redis-cli -h 127.0.0.1 -p 6381 # 连接到 Redis 从机
./redis-cli -h 127.0.0.1 -p 6382 # 连接到 Redis 从机
分别在四个 Redis 测试客户端执行get
命令,获取键名为name的数据:
127.0.0.1:6379> get name
(nil) # 由于是新部署的Redis主从模式,该键值必定不存在
127.0.0.1:6380> get name
(nil) # 由于是新部署的Redis主从模式,该键值必定不存在
127.0.0.1:6381> get name
(nil) # 由于是新部署的Redis主从模式,该键值必定不存在
127.0.0.1:6382> get name
(nil) # 由于是新部署的Redis主从模式,该键值必定不存在
现在在 Redis 主机 6379 的客户端写入数据(执行set
命令,为键 name设置数据):
127.0.0.1:6379> set name jingjing
OK
再在三台 Redis 从机 6380~6382 的客户端读取数据(执行 get 命令,获取键名为 site 的数据)。
由于经过主从数据同步,此时三台从机都能取到值:
127.0.0.1:6380> get name
"jingjing"
127.0.0.1:6381> get name
"jingjing"
127.0.0.1:6382> get name
"jingjing"
至此 Redis 主从模式部署完成。
下次将介绍哨兵模式的部署,而哨兵模式是基于主从模式的,所以可以暂且不用停止 Redis 进程,下篇见!