cover_image

Redis 6 主从复制环境搭建

AlenSZ Alen的数据库学习笔记
2022年06月27日 14:06

本篇基于Red Hat Enterprise Linux release 8.1进行Redis 6.2.7的安装


目录:

  1. 准备工作

    1. 装依赖包

    2. 创建用户及目录

  2. Redis安装

    1. 编译源码

    2. 修改权限

    3. 编写配置文件

    4. 启动Redis

    5. 查看Redis

  3. Redis主从环境搭建

    1. 拓扑结构

    2. 环境配置

    3. 启动Redis

    4. 配置复制关系

    5. 查看复制关系

    6. 故障模拟


准备工作


安装Redis之前需检查依赖包是否安装,若没有安装则进行安装,同时,为了更好的管理,建议创建对应的用户和目录。


安装依赖包


使用root用户安装redis所需的依赖包:

yum install makeyum install gcc


创建用户及目录


使用root用户登录创建redis用户和组以及对应的目录:

groupadd -g 3001 redisuseradd -u 3001 -g redis redismkdir -p /bankapp/redismkdir -p /bankapp/redis/rd5410/confmkdir -p /bankapp/redis/rd5410/datamkdir -p /bankapp/redis/rd5410/logchown -R redis:redis /bankapp/redis/

下载并上传安装文件至/tmp目录:

下载地址:https://download.redis.io/releases/


Redis安装


Redis安装需要进行源码编译、配置文件编写等,具体如下:


编译源码


使用redis用户切换至对应的目录进行源码编译:

tar xvf /tmp/redis-6.2.7.tar.gz -C /bankapp/redis/cd /bankapp/redis/mv redis-6.2.7 basecd base/make

安装报错:fatal error: jemalloc/jemalloc.h: No such file or directory

解决:make distclean


修改权限


为安全控制目录及可执行程序,做出以下权限控制:

ln -s /bankapp/redis/base/src/redis-server /bankapp/redis/base/redis-serverln -s /bankapp/redis/base/src/redis-cli /bankapp/redis/base/redis-cliln -s /bankapp/redis/base/src/redis-sentinel /bankapp/redis/base/redis-sentinelecho "REDIS_HOME=/bankapp/redis/base/" >> /home/redis/.bash_profileecho "PATH=\$REDIS_HOME:\$PATH" >> /home/redis/.bash_profilesource /home/redis/.bash_profilechmod g-w /bankapp/redis/base/srcchmod o-x /bankapp/redis/base/srcchmod 740 /bankapp/redis/base/src/redis-sentinelchmod 740 /bankapp/redis/base/src/redis-serverchmod 750 /bankapp/redis/base/src/redis-clichmod 750 /bankapp/redis/base/src/redis-trib.rbchmod 750 /bankapp/redis/base/src/redis-benchmarkchmod 750 /bankapp/redis/base/src/redis-check-aofchmod 750 /bankapp/redis/base/src/redis-check-rdb


编写配置文件


以redis用户编写配置文件:

cd /bankapp/redis/rd5410/conf/cat redis.conf
daemonize yespidfile "/bankapp/redis/rd5410/log/redis.pid"port 5410tcp-backlog 511bind * -::*timeout 0tcp-keepalive 0loglevel noticelogfile "/bankapp/redis/rd5410/log/redis.log"databases 16stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename "dump5410.rdb"dir "/bankapp/redis/rd5410/data"replica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noreplica-priority 100# rename-command FLUSHDB xxxxx# rename-command FLUSHALL# rename-command KEYS# rename-command CONFIG# rename-command SHUTDOWNmaxmemory 7GBmaxmemory-policy volatile-lruappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yeslua-time-limit 5000# cluster-enabled yes# cluster-config-file nodes-5410.conf# cluster-node-timeout 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4096stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yesjemalloc-bg-thread yesmasterauth "redispwd"requirepass "redispwd"


启动Redis


以redis用户启动Redis:

redis-server /bankapp/redis/rd5410/conf/redis.conf


查看Redis


以redis用户登录,如果Redis做了认证,需通过auth命令输入密码,若使用非默认端口,则需通过-p选项指定端口号:

[redis@r01 rd5410]$ redis-cli -p 5410127.0.0.1:5410> auth redispwdOK127.0.0.1:5410> info# Serverredis_version:6.2.7


Redis主从复制环境安装


拓扑结构


这里将搭建一主两从的复制架构,具体如下:

图片

在生产环境中,各个redis实例应该部署在不同的服务器上。


环境配置


以redis用户在原来实例的基础上,创建另外两个目录:

cd /bankapp/redis/cp -R rd5410 rd5411cp -R rd5410 rd5412

分别进入对应的目录,修改redis配置文件,以rd5411目录为例,修改如下配置:

vim rd5411/conf/redis.conf:%s/5410/5411/g



启动Redis


分别启动Redis实例:

redis-server /bankapp/redis/rd5410/conf/redis.confredis-server /bankapp/redis/rd5411/conf/redis.confredis-server /bankapp/redis/rd5412/conf/redis.conf

查看redis进程:

[redis@r01 ~]$ ps -ef|grep redisredis     3495     1  0 21:07 ?        00:00:00 redis-server *:5410redis     3501     1  0 21:07 ?        00:00:00 redis-server *:5411redis     3507     1  0 21:07 ?        00:00:00 redis-server *:5412


配置复制关系


在端口5411配置复制关系:

[redis@r01 ~]$ redis-cli -p 5411127.0.0.1:5411> auth redispwdOK127.0.0.1:5411> replicaof 192.168.56.104 5410OK127.0.0.1:5411> info replication# Replicationrole:slavemaster_host:192.168.56.104master_port:5410master_link_status:upmaster_last_io_seconds_ago:7master_sync_in_progress:0slave_read_repl_offset:126slave_repl_offset:126slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2master_replid2:0000000000000000000000000000000000000000master_repl_offset:126second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:126

同样的方式,配置端口5412:

[redis@r01 ~]$ redis-cli -p 5412127.0.0.1:5412> auth redispwdOK127.0.0.1:5412> replicaof 192.168.56.104 5410OK


查看复制关系


在端口5410查看复制关系,可以看到有2个从库:

[redis@r01 ~]$ redis-cli -p 5410127.0.0.1:5410> auth redispwdOK127.0.0.1:5410> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.56.104,port=5411,state=online,offset=364,lag=1slave1:ip=192.168.56.104,port=5412,state=online,offset=364,lag=1master_failover_state:no-failovermaster_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2master_replid2:0000000000000000000000000000000000000000master_repl_offset:364second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:364

在端口5411查看复制关系,可以看到其作为从库:

127.0.0.1:5411> info replication# Replicationrole:slavemaster_host:192.168.56.104master_port:5410master_link_status:upmaster_last_io_seconds_ago:9master_sync_in_progress:0slave_read_repl_offset:420slave_repl_offset:420slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2master_replid2:0000000000000000000000000000000000000000master_repl_offset:420second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:420

在端口5412查看复制关系,可以看到其作为从库:

127.0.0.1:5412> info replication# Replicationrole:slavemaster_host:192.168.56.104master_port:5410master_link_status:upmaster_last_io_seconds_ago:3master_sync_in_progress:0slave_read_repl_offset:518slave_repl_offset:518slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2master_replid2:0000000000000000000000000000000000000000master_repl_offset:518second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:281repl_backlog_histlen:238


故障模拟


在主节点5410模拟故障:

kill -9 3495

查看从节点5411,观察其主从关系,发现其仍是从库:

127.0.0.1:5411> info replication# Replicationrole:slavemaster_host:192.168.56.104master_port:5410master_link_status:downmaster_last_io_seconds_ago:-1master_sync_in_progress:0slave_read_repl_offset:990slave_repl_offset:990master_link_down_since_seconds:33slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2master_replid2:0000000000000000000000000000000000000000master_repl_offset:990second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:990

查看从节点5412,观察其主从关系,发现其仍是从库:

127.0.0.1:5412> info replication# Replicationrole:slavemaster_host:192.168.56.104master_port:5410master_link_status:downmaster_last_io_seconds_ago:-1master_sync_in_progress:0slave_read_repl_offset:990slave_repl_offset:990master_link_down_since_seconds:80slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2master_replid2:0000000000000000000000000000000000000000master_repl_offset:990second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:281repl_backlog_histlen:710

当主节点宕机后,两个从节点都不会自动提升为主节点,仍是从节点,当启动原主节点后,其仍是主节点:

[redis@r01 ~]$ redis-server /bankapp/redis/rd5410/conf/redis.conf[redis@r01 ~]$ redis-cli -p 5410127.0.0.1:5410> auth redispwdOK127.0.0.1:5410> info replication# Replicationrole:masterconnected_slaves:2slave0:ip=192.168.56.104,port=5411,state=online,offset=14,lag=1slave1:ip=192.168.56.104,port=5412,state=online,offset=14,lag=1master_failover_state:no-failovermaster_replid:7740797d25f5a02f0938fec819e234a502896c2bmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:14second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:14

由此可见,在使用主从复制环境搭建Redis时,当主节点宕机后,从节点不能自动选主,需要手动干预,那么有没有好的方案可以自动选主呢,有,那就是使用哨兵,通过主从复制+哨兵机制,可大大提升Redis的可用性,也减轻运维的复杂性。



继续滑动看下一个
Alen的数据库学习笔记
向上滑动看下一个