配置 reids 主从

配置 reids 主从

主备模式,可以实现 Redis 数据的跨主机备份。也实现了业务的高可用

程序端连接到高可用负载的 VIP,然后连接到负载服务器设置的 Redis 后端 real server,此模式不需要在程序里面配置 Redis 服务器的真实 IP 地址,当后期 Redis 服务器 IP 地址发生变更只需要更改 redis 相应的后端 real server 即可, 可避免更改程序中的IP地址设置。

4.1.1 salve 主要配置

Redis Slave 也要开启持久化(也要在 redis 的 slave 主机上开启快照功能 )并设置和 master 同样的连接密码,因为后期 slave 会有提升为 master 的可能, Slave 端切换 master 同步后会丢失之前的所有数据。

一旦某个 Slave(从节点)成为一个 master(主节点)的 slave(从节点),Redis Slave(redis从主机)服务会清空当前redis 服务器上的所有数据并将 master(redis主节点的)的数据导入到自己的内存,但是断开同步关系后不会删除当前已经同步过的数据。

4.1.2 实现 Redis 两台主机主从搭建步骤

现在我们将 master 主机做为 redis 的主节点。让 slave 主机作为 redis 的从节点。

主机名 ip 系统
master 10.0.0.7 centos 7
slave 10.0.0.17 centos 7

redis 安装方法: 二进制编译安装

安装方法见第三篇文章所写到的 redis 二进制安装。

4.1.2.1 将 master 节点 redis 配置文件拷贝至 slave

将 master 主机的配置文件先拷贝到 slave 节点上

[20:44:26 root@master apps]#scp /apps/redis/etc/redis.conf 10.0.0.17:/apps/redis/etc/redis.conf

4.1.2.2 修改 slave 节点 redis 监听端口

1、修改配置文件,将监听端口改为所有 ip 都可以监听

[20:48:42 root@slave ~]#vim /apps/redis/etc/redis.conf 
bind 0.0.0.0 

2、重启 redis

[20:49:24 root@slave ~]#systemctl restart redis

# 通过 grep 过滤端口发现 6379 已经被所有 ip 监听
[20:50:05 root@slave ~]#ss -ntl | grep 6379
LISTEN     0      128          *:6379                     *:* 

4.1.2.3 修改 slave 节点 redis 配置文件,添加 master 节点信息

之后我们要将 slave 节点设置成 master 节点的从节点,redis服务一种是命令行可以直接改 slaveof 还有一种是配置文件修改。修改 slave 节点的配置文件,ip和端口是写 master 主机的然后密码也是写 master 主机的密码

1、修改 slave 节点配置文件

[20:54:04 root@slave ~]#vim /apps/redis/etc/redis.conf 
replicaof 10.0.0.7 6379     # 同步 master 的 ip 和 redis 端口
masterauth 12345            # master 节点的 redis 密码

2、重启 redis

[20:54:40 root@slave ~]#systemctl restart redis

4.1.2.4 slave 节点查看日志信息已经开启同步

在通过观察 slave 主机的 redis 日志会发现已经记录了我们连接好了 master 的并成为了从服务

[21:00:06 root@slave apps]#cat /apps/redis/logs/redis_6379.log 
1990:S 09 Oct 2020 20:54:46.079 * Ready to accept connections
1990:S 09 Oct 2020 20:54:46.080 * Connecting to MASTER 10.0.0.7:6379
1990:S 09 Oct 2020 20:54:46.080 * MASTER <-> REPLICA sync started
1990:S 09 Oct 2020 20:54:46.080 * Non blocking connect for SYNC fired the event.
1990:S 09 Oct 2020 20:54:46.081 * Master replied to PING, replication can continue...
1990:S 09 Oct 2020 20:54:46.083 * Partial resynchronization not possible (no cached master)
1990:S 09 Oct 2020 20:54:46.086 * Full resync from master: 5a9c028523fd187a6aecce0e6cb8463870c8975c:0
1990:S 09 Oct 2020 20:54:46.141 * MASTER <-> REPLICA sync: receiving 175 bytes from master to disk
1990:S 09 Oct 2020 20:54:46.141 * MASTER <-> REPLICA sync: Flushing old data
1990:S 09 Oct 2020 20:54:46.141 * MASTER <-> REPLICA sync: Loading DB in memory
1990:S 09 Oct 2020 20:54:46.141 * Loading RDB produced by version 6.0.8
1990:S 09 Oct 2020 20:54:46.141 * RDB age 2 seconds
1990:S 09 Oct 2020 20:54:46.141 * RDB memory usage when created 1.73 Mb
1990:S 09 Oct 2020 20:54:46.141 * MASTER <-> REPLICA sync: Finished with success
1990:S 09 Oct 2020 20:54:46.151 * Background append only file rewriting started by pid 1995
1990:S 09 Oct 2020 20:54:46.227 * AOF rewrite child asks to stop sending diffs.
1995:C 09 Oct 2020 20:54:46.228 * Parent agreed to stop sending diffs. Finalizing AOF...
1995:C 09 Oct 2020 20:54:46.228 * Concatenating 0.00 MB of AOF diff received from parent.
1995:C 09 Oct 2020 20:54:46.228 * SYNC append only file rewrite performed
1995:C 09 Oct 2020 20:54:46.229 * AOF rewrite: 2 MB of memory used by copy-on-write
1990:S 09 Oct 2020 20:54:46.286 * Background AOF rewrite terminated with success
1990:S 09 Oct 2020 20:54:46.286 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB)
1990:S 09 Oct 2020 20:54:46.287 * Background AOF rewrite finished successfully

1990: s09 2020年10月20:54:46.079 *准备接受连接
1990:S 09 2020年10月20:54:46.080 *连接到MASTER 10.0.0.7:6379
1990: s09 2020年10月20:54:46.080 * MASTER <->副本同步启动
1990:S 09 2020年10月20:54:46.080 *非阻塞连接同步触发事件。
* Master回复PING,复制可以继续…
部分重新同步不可能(没有缓存的主服务器)
*从主服务器完全重新同步:5a9c028523fd187a6aecce0e6cb8463870c8975c:0
*主服务器<->复制同步:接收175字节从主服务器到磁盘
* MASTER <->副本同步:刷新旧数据
* MASTER <->复制同步:在内存中加载DB
1990: s09 2020年10月20:54:46.141 *加载版本6.0.8产生的RDB
1990:S 09 2020年10月20:54:46.141 * RDB年龄2秒
创建1.73 Mb时的RDB内存使用
* MASTER <->复制同步:成功完成
后台只追加pid 1995开始的文件重写
一个重写的孩子要求停止发送diffs。
1995: c09 2020年10月20:54:46.228 *父母同意停止发送差异。
敲定AOF……
1995: c09 2020年10月20:54:46.228 *连接从父母那里收到的0.00 MB AOF diff
*同步只追加执行的文件重写
重写:写时复制使用2 MB内存
1990: s09 2020年10月20:54:46.286 *背景AOF重写成功终止
*残余父级差异成功刷新到重写的AOF (0.00 MB)
1990: s09 2020年10月20:54:46.287 *后台AOF重写成功完成

4.1.2.5 slave 节点登录 redis 验证是否同步

[20:56:16 root@slave ~]#redis-cli -a 12345
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:10.0.0.7
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:126
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5a9c028523fd187a6aecce0e6cb8463870c8975c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:126

4.1.2.5 master 节点登录 redis 验证是否开启同步

[20:58:22 root@master ~]#redis-cli -a 12345
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.17,port=6379,state=online,offset=322,lag=0
master_replid:5a9c028523fd187a6aecce0e6cb8463870c8975c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:322
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:322

4.1.2.6 在 master 节点写入数据验证是否实现同步

现在我们在 master 主机写一个 key 值为 zhang

# 登录 redis
[21:03:09 root@master ~]#redis-cli -a 12345
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

# 通过查看所有的 key 没有任何数据
127.0.0.1:6379> KEYS *
(empty array)

# 写入一个 key 值为 zhang
127.0.0.1:6379> set key zhang
OK

# 再次查看就有了这个 key
127.0.0.1:6379> KEYS *
1) "key"

4.1.2.7 在 slave 节点上查看数据已同步

然后再回到 slave 主机上,登录 redis 查看就已经有了这个 key 而且值也是 zhang

[21:03:33 root@slave ~]#redis-cli -a 12345
127.0.0.1:6379> KEYS *
1) "key"
127.0.0.1:6379> get key
"zhang"

4.1.3 实现 redis 一主多从

我们现在要实现下图的效果

现在我们再开启 C7 主机让他来当 slave 主机的从节点从而实现了 redis 的高可用。

4.1.3.1 通过打包的方式安装 redis

将 master 主机的 redis 所有目录进行打包,让相关的配置文件拷贝过去,因为C7是一台新的主机所有我们这是为了方便。

4.1.3.1.1 创建要 apps 目录和创建一个 redis 用户
# 创建 apps 目录
[21:11:16 root@C7 ~]#mkdir /apps

# 创建 redis 用户
[21:11:22 root@C7 ~]#useradd redis -u 2020

4.1.3.1.2 在 master 节点上将 redis 目录进行打包
[20:41:54 root@master apps]#tar czvf redis.tar.gz redis/*
redis/bin/
redis/bin/redis-server
redis/bin/redis-benchmark
redis/bin/redis-cli
redis/bin/redis-check-rdb
redis/bin/redis-check-aof
redis/bin/redis-sentinel
redis/data/
redis/data/appendonly_6379.aof
redis/data/redis_6379.rdb.bck
redis/data/rdb.back.sh
redis/data/2020-10-09-16-55-53redis_6379.rdb
redis/etc/
redis/etc/redis.conf
redis/logs/
redis/logs/redis_6379.log
redis/run/

4.1.3.1.3 将 master 主机这个 redis 包和 redis 启动文件拷贝过去到 C7
# 拷贝 redis 安装文件
[21:14:10 root@master apps]#scp /apps/redis.tar.gz 10.0.0.27:/apps

# 拷贝启动 service 文件
[21:14:30 root@master apps]#scp /usr/lib/systemd/system/redis.service 10.0.0.27:/usr/lib/systemd/system/redis.service 

4.1.3.1.4 在 C7 主机进行解压 redis
[21:15:24 root@C7 ~]#cd /apps
[21:11:31 root@C7 ~]#tar xf redis.tar.gz 

4.1.3.1.5 在 C7 主机上将 redis 清空数据

再将 /apps/redis/data/ 数据全删了因为是从 master 主机上拷贝过来有数据以避免冲突

[21:16:31 root@C7 apps]#rm -f /apps/redis/data/*

4.1.3.1.6 在 C7 主机上对 redis 用户授权

然后在C7主机上将/apps/redis授权为redis用户权限

[21:16:53 root@C7 apps]#chown -R redis.redis /apps/redis/*

4.1.3.1.7 启动 redis
# 启动 redis 
[21:17:35 root@C7 apps]#systemctl start redis

# 通过 grep 过滤 6379 已经打开
[21:19:05 root@C7 apps]#ss -ntl | grep 6379
LISTEN     0      128          *:6379                     *:*                  
LISTEN     0      128       [::]:6379                  [::]:* 

4.1.3.1.8 创建 redis 启动命令

然后再做一个redis的软连接命令

[21:19:22 root@C7 apps]#ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’

4.1.3.2 在 C7 主机上添加 slave 节点为它的 master

1、在 redis 终端配置 C7 节点作为 slave 主机的从节点

# 登录至 redis
[21:23:01 root@C7 apps]#redis-cli -a 12345
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

# 指定 master 节点的 ip 和端口
127.0.0.1:6379> SLAVEOF 10.0.0.17 6379
OK

# 验证 master 节点的 redis 登录密码
127.0.0.1:6379> CONFIG SET masterauth 12345
OK

# 通过查看同步信息已经同步
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.17
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:2422
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5a9c028523fd187a6aecce0e6cb8463870c8975c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:2422
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2423
repl_backlog_histlen:0

这个时候的角色就是 master 主机是 slave 主机的 master 主服务。而 slave 主机又是 C7 主机的 master 主服务。所以我们在 master 主机上写的数据是先同步到 slave 主机上再同步到 C7 主机一级一级同步

4.1.3.3 同步验证

1、现在我们在 master 主机上 set 一个 key2 的值为 gui 来验证后端两个主机是否都有这个值和 key。

[21:28:12 root@master ~]#redis-cli -a 12345
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set key2 gui
OK
127.0.0.1:6379> get key2
"gui"

2、在我们的 slave 节点上登录至 redis 验证 key2 值已经同步

[21:29:20 root@slave ~]#redis-cli -a 12345
127.0.0.1:6379> get key2
"gui"

3、在我们的 C7 节点上登录至 redis 验证 key2 值已经同步

[21:29:42 root@C7 apps]#redis-cli -a 12345
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get key2
"gui"

4.1.3.4 实现永久同步

从而实现了3个redis主机的主从配置。另外我们不推荐使用SLAVEOF这个命令行去配置主从服务,因为只要已重启redis主从服务就会失效,所以我们还是要写到配置文件中

1、所以我们还是要再次到C7主机的redis配置文件中修改。让他成为 slave 主机的 slave节点

# 修改 redis 配置
[21:32:11 root@C7 apps]#vim /apps/redis/etc/redis.conf 
replicaof 10.0.0.17 6379                                # 写 master 节点的 ip 和端口
masterauth 12345                                        # 写 master 节点登录的 redis 的密码

2、重启 redis

[21:33:07 root@C7 apps]#systemctl restart redis

3、登录 redis 查看同步信息,已经实现同步

# 登录 redis 
[21:33:12 root@C7 apps]#redis-cli -a 12345
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

# 查看同步信息已经实现同步
127.0.0.1:6379> INFO replication
# Replication
role:slave
master_host:10.0.0.17
master_port:6379
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:3266
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:5a9c028523fd187a6aecce0e6cb8463870c8975c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3266
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:3239
repl_backlog_histlen:28
点赞