主从复制
一主一从结构
bash
复制代码
# 配置host61为主服务器
[root@host61 ~]# yum -y install redis
[root@host61 ~]# vim /etc/redis.conf
bind 192.168.88.61 #设置服务使用的Ip地址
port 6379 #设置服务使用的端口号 使用默认端口即可
[root@host61 ~]# systemctl start redis
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
192.168.88.61:6379> info replication #查看复制信息
# Replication
role:master #默认就是主服务器
connected_slaves:0 #没有从服务器
master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# 配置host62为host61的从服务器
[root@host62 ~]# yum -y install redis #安装软件
[root@host62 ~]# vim /etc/redis.conf #修改配置文件
bind 192.162.88.62 #设置服务的ip地址
port 6379 #设置服务的端口号 默认即可
:wq
[root@host62 ~]# systemctl start redis #启动服务
[root@host62 ~]# redis-cli -h 192.162.88.62 -p 6379 #连接服务
192.162.88.62.:6379> replicaof 192.162.88.61 6379 #指定主服务器ip和端口
OK
192.162.88.62.:6379> config rewrite #永久保存配置
OK
192.162.88.62.:6379> exit #退出服务
[root@host62 ~]# tail -1 /etc/redis.conf #查看文件末尾
replicaof 192.162.88.61 6379
[root@host62 ~]# redis-cli -h 192.162.88.62 -p 6379 #连接服务
192.162.88.62.:6379> info replication #查看复制信息
# Replication
role:slave #角色
master_host:192.162.88.61 #主服务器ip地址
master_port:6379 #主服务器端口号
master_link_status:up #与主服务器连接状态 (up 正常 down 连接失败)
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
# 在主服务器host61查看复制信息
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
192.168.88.61:6379> info replication
# Replication
role:master #角色
connected_slaves:1 #一个从
slave0:ip=192.168.88.62,port=6379,state=online,offset=322,lag=0 #从服务器信息
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
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
192.168.88.61:6379> mset x 1 y 2 z 3 #存储数据
OK
192.168.88.61:6379> keys * #查看变量
1) "z"
2) "y"
3) "x"
# 在从服务器查看是否同步数据
[root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379
192.168.88.62.:6379> keys *
1) "y"
2) "x"
3) "z"
一主多从结构
bash
复制代码
[root@host63 ~]# yum -y install redis #安装软件
[root@host63 ~]# vim /etc/redis.conf #修改配置文件
bind 192.168.88.63
port 6379
[root@host63 ~]# systemctl start redis #启动服务
[root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 #连接服务
192.168.88.63:6379> replicaof 192.168.88.61 6379 #指定主服务器ip和端口
OK
192.168.88.63:6379> config rewrite #永久保存配置
OK
192.168.88.63:6379> exit
[root@host63 ~]# tail -1 /etc/redis.conf #保存到文件末尾
replicaof 192.168.88.61 6379
[root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 #连接服务
192.168.88.63:6379> info replication #查看复制信息
# Replication
role:slave #角色
master_host:192.168.88.61 #主服务器IP
master_port:6379 #主服务器端口
master_link_status:up #与主服务器连接状态 up 正常连接状态
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:1171
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1171
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1158
repl_backlog_histlen:14
192.168.88.63:6379> keys * #查看是否同步数据
1) "x"
2) "z"
3) "y"
# 在host61 查看到有2台从服务器
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
192.168.88.61:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.88.62,port=6379,state=online,offset=3027,lag=0
slave1:ip=192.168.88.63,port=6379,state=online,offset=3013,lag=1
master_replid:209b3b7ce20c708ab1b6b95a5d1becb2454b0941
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3027
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3027
主从从结构
bash
复制代码
# 将host63恢复为独立的redis服务器,然后配置为host62的从服务器
[root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379
192.168.88.63:6379> replicaof no one #恢复为独立的数据库服务器
OK
192.168.88.63:6379> replicaof 192.168.88.62 6379 #指定主服务器为62
OK
192.168.88.63:6379> config rewrite #保存配置
OK
192.168.88.63:6379> exit #断开连接
[root@host63 ~]# tail -1 /etc/redis.conf #查看是否保存
replicaof 192.168.88.62 6379
[root@host63 ~]# redis-cli -h 192.168.88.63 -p 6379 #连接服务
192.168.88.63:6379> info replication #查看复制信息
# Replication
role:slave #角色
master_host:192.168.88.62 #主服务器IP
master_port:6379 #主服务端口
master_link_status:up #与主服务器连接状态
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:4545
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4545
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:4420
repl_backlog_histlen:126
# 在host62查看复制信息
[root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379
192.168.88.62.:6379> info replication #查看复制信息
# Replication
role:slave #本身是从服务器
master_host:192.168.88.61 #主服务器ip
master_port:6379 #主服务器redis服务端口
master_link_status:up #与主服务器连接状态
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:4769
slave_priority:100
slave_read_only:1
connected_slaves:1 #本身有一个从服务器
slave0:ip=192.168.88.63,port=6379,state=online,offset=4769,lag=0 #从服务器信息
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4769
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4769
# 配置带验证的主从复制
- 配置主机host61,redis服务连接密码为123456
- 主机host62设置连接host61的redis服务密码
# 给host61主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同步数据。
# 配置主机host61,redis服务连接密码为123456
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379
192.168.88.61:6379> config get requirepass #查看密码,默认服务没有密码
1) "requirepass"
2) ""
192.168.88.61:6379> config set requirepass 123456 #设置密码
OK
192.168.88.61:6379> auth 123456 #输入密码
OK
192.168.88.61:6379> config rewrite #保存配置
OK
192.168.88.61:6379> exit #退出
[root@host61 ~]# tail -1 /etc/redis.conf #保存到文件的末尾
requirepass "123456"
[root@host61 ~]# redis-cli -h 192.168.88.61 -p 6379 #连接服务
192.168.88.61:6379> auth 123456 #输入密码
OK
192.168.88.61:6379> info replication #查看复制信息
# Replication
role:master
connected_slaves:0 # 没有从服务器了 因为从没有输入连接密码连接不上主服务器
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5763
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:5763
# 主机host62设置连接host61的redis服务密码
[root@host62 ~]# redis-cli -h 192.168.88.62 -p 6379 连接服务
192.168.88.62.:6379> info replication #查看复制信息
# Replication
role:slave
master_host:192.168.88.61
master_port:6379
master_link_status:down #没设置密码 与master主机是断开状态
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:274
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:7803
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:7803
192.168.88.62:6379> config set masterauth 123456 #指定主服务器密码
OK
192.168.88.62:6379> config rewrite #保存配置
OK
192.168.88.62:6379> info replication #查看复制信息
# Replication
role:slave
master_host:192.168.88.61
master_port:6379
master_link_status:up #设置连接密码后 状态为up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_repl_offset:5847
slave_priority:100
slave_read_only:1
connected_slaves:1
slave0:ip=192.168.88.63,port=6379,state=online,offset=5847,lag=1
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:5847
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:5764
repl_backlog_histlen:84
哨兵服务
bash
复制代码
- 配置主机Host67为master服务器
- 配置主机host68为Host67的slave服务器
- 配置主机host69运行哨兵服务
---
说明:
1)可以使用一主一从或 一主多从 或 主从从 + 哨兵服务 做服务的高可用 和 数据自动备份
2)如果主从结构中的redis服务设置连接密码的话必须全每台数据库都要设置密码且密码要一样,要么全都不设置密码。
3)如果Redis服务有密码宕机的服务器启动服务后,要人为指定主服务器的连接密码。
---
# 配置主机Host67为master服务器
[root@host67 ~]# yum -y install redis 安装redis服务软件
[root@host67 ~]# vim /etc/redis.conf 修改配置文件
bind 192.168.88.67 #设置redis服务使用IP地址
port 6379 #设置redis服务使用端口
[root@host67 ~]# systemctl start redis 启动服务
[root@host67 ~]# redis-cli -h 192.168.88.67 -p 6379 连接服务
192.168.88.67:6379> info replication #查看角色
# Replication
role:master #默认是master角色
connected_slaves:0 #没有从服务器
master_replid:0aebff37df915061ddf157cc33d8742f14e8773f
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# 配置主机host68为Host67的slave服务器
[root@host68 ~]# yum -y install redis #安装软件
[root@host68 ~]# vim /etc/redis.conf #修改配置文件
bind 192.168.88.68 #设置服务使用Ip地址
port 6379 #设置服务监听端口 默认即可
[root@host68 ~]# systemctl start redis #启动服务
[root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 #连接服务
192.168.88.68:6379> replicaof 192.168.88.67 6379 #指定主服务器ip和端口
OK
192.168.88.68:6379> config rewrite #永久保存配置
OK
192.168.88.68:6379> exit #断开
[root@host68 ~]# tail -1 /etc/redis.conf #保存到文件末尾
replicaof 192.168.88.67 6379
[root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379 #连接服务
192.168.88.68:6379> info replication #查看复制信息
# Replication
role:slave #角色 从服务器
master_host:192.168.88.67 #主服务器Ip
master_port:6379 #主服务端口
master_link_status:up #与主连接状态
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:476ae25abdb72c60a4ada0dcc73910a7455ecac1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
# 配置主机host69运行哨兵服务
]# yum -y install redis #安装软件
]# vim /etc/redis-sentinel.conf #创建并编辑主配置文件
bind 192.168.88.69 #指定哨兵服务使用ip地址
port 26379 #指定哨兵服务监听端口
daemonize yes #以守护进程方式运行服务
sentinel monitor mymaster 192.168.88.67 6379 1 #监视master服务器Host67
[root@host69 ~]# systemctl start redis-sentinel #启动哨兵服务
[root@host69 ~]# netstat -utnlp | grep 26379 #查看端口号
tcp 0 0 192.168.88.69:26379 0.0.0.0:* LISTEN 1651/redis-sentinel
# 查看日志获取监视信息
[root@host69 ~]# tail -f /var/log/redis/sentinel.log
1651:X 03 Jun 2023 21:42:49.523 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1651:X 03 Jun 2023 21:42:49.523 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1651, just started
1651:X 03 Jun 2023 21:42:49.523 # Configuration loaded
1651:X 03 Jun 2023 21:42:49.523 * supervised by systemd, will signal readiness
1651:X 03 Jun 2023 21:42:49.525 * Running mode=sentinel, port=26379.
1651:X 03 Jun 2023 21:42:49.525 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1651:X 03 Jun 2023 21:42:49.530 # Sentinel ID is f9475074a53444ee81765646c105e04e73ac9ec8
1651:X 03 Jun 2023 21:42:49.530 # +monitor master mymaster 192.168.88.67 6379 quorum 1
1651:X 03 Jun 2023 21:42:49.533 * +slave slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
# 测试配置
# 停止master主机的redis 服务,原slave角色会升级为主,哨兵服务会自动监视新的master服务,宕机的master 主机恢复后自动配置为当前主的从服务器。停止master主机的redis 服务
[root@host67 ~]# systemctl stop redis
# 原slave升为主
[root@host68 ~]# redis-cli -h 192.168.88.68 -p 6379
192.168.88.68:6379> info replication
# Replication
role:master #角色
connected_slaves:0 #没从服务器
master_replid:e4d9399cdf19c724b032859e77316019735d391e
master_replid2:bd1b8d193de170bedd8b40780ee3fb45f9590a5b
master_repl_offset:35343
second_repl_offset:32642
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:183
repl_backlog_histlen:35161
# 哨兵服务会自动监视新的master服务
[root@host69 ~]# tail -f /var/log/redis/sentinel.log 查看日志文件
1651:X 03 Jun 2023 21:50:23.603 # +failover-state-select-slave master mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:23.694 # +selected-slave slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:23.695 * +failover-state-send-slaveof-noone slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:23.796 * +failover-state-wait-promotion slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:24.452 # +promoted-slave slave 192.168.88.68:6379 192.168.88.68 6379 @ mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:24.452 # +failover-state-reconf-slaves master mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:24.502 # +failover-end master mymaster 192.168.88.67 6379
1651:X 03 Jun 2023 21:50:24.502 # +switch-master mymaster 192.168.88.67 6379 192.168.88.68 6379
1651:X 03 Jun 2023 21:50:24.502 * +slave slave 192.168.88.67:6379 192.168.88.67 6379 @ mymaster 192.168.88.68 6379
1651:X 03 Jun 2023 21:50:54.586 # +sdown slave 192.168.88.67:6379 192.168.88.67 6379 @ mymaster 192.168.88.68 6379
# 宕机的master 主机恢复后自动配置为当前主的从服务器
[root@host67 ~]# systemctl start redis 启动服务
[root@host67 ~]# redis-cli -h 192.168.88.67 -p 6379 连接服务
192.168.88.67:6379> info replication #查看角色
# Replication
role:slave #从服务器
master_host:192.168.88.68 #主服务器ip
master_port:6379 #主服务器端口
master_link_status:up #连通状态
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:54542
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:e4d9399cdf19c724b032859e77316019735d391e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:54542
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:54379
repl_backlog_histlen:164