目录:
准备工作
安装依赖包
创建用户及目录
Redis安装
编译源码
修改权限
编写配置文件
启动Redis
查看Redis
Redis主从环境搭建
拓扑结构
环境配置
启动Redis
配置复制关系
查看复制关系
故障模拟
准备工作
安装Redis之前需检查依赖包是否安装,若没有安装则进行安装,同时,为了更好的管理,建议创建对应的用户和目录。
安装依赖包
使用root用户安装redis所需的依赖包:
yum install make
yum install gcc
创建用户及目录
使用root用户登录创建redis用户和组以及对应的目录:
groupadd -g 3001 redis
useradd -u 3001 -g redis redis
mkdir -p /bankapp/redis
mkdir -p /bankapp/redis/rd5410/conf
mkdir -p /bankapp/redis/rd5410/data
mkdir -p /bankapp/redis/rd5410/log
chown -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 base
cd 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-server
ln -s /bankapp/redis/base/src/redis-cli /bankapp/redis/base/redis-cli
ln -s /bankapp/redis/base/src/redis-sentinel /bankapp/redis/base/redis-sentinel
echo "REDIS_HOME=/bankapp/redis/base/" >> /home/redis/.bash_profile
echo "PATH=\$REDIS_HOME:\$PATH" >> /home/redis/.bash_profile
source /home/redis/.bash_profile
chmod g-w /bankapp/redis/base/src
chmod o-x /bankapp/redis/base/src
chmod 740 /bankapp/redis/base/src/redis-sentinel
chmod 740 /bankapp/redis/base/src/redis-server
chmod 750 /bankapp/redis/base/src/redis-cli
chmod 750 /bankapp/redis/base/src/redis-trib.rb
chmod 750 /bankapp/redis/base/src/redis-benchmark
chmod 750 /bankapp/redis/base/src/redis-check-aof
chmod 750 /bankapp/redis/base/src/redis-check-rdb
编写配置文件
以redis用户编写配置文件:
cd /bankapp/redis/rd5410/conf/
cat redis.conf
daemonize yes
pidfile "/bankapp/redis/rd5410/log/redis.pid"
port 5410
tcp-backlog 511
bind * -::*
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/bankapp/redis/rd5410/log/redis.log"
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump5410.rdb"
dir "/bankapp/redis/rd5410/data"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
# rename-command FLUSHDB xxxxx
# rename-command FLUSHALL
# rename-command KEYS
# rename-command CONFIG
# rename-command SHUTDOWN
maxmemory 7GB
maxmemory-policy volatile-lru
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
# cluster-enabled yes
# cluster-config-file nodes-5410.conf
# cluster-node-timeout 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
masterauth "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 5410
auth redispwd
OK
info
# Server
redis_version:6.2.7
Redis主从复制环境安装
拓扑结构
这里将搭建一主两从的复制架构,具体如下:
在生产环境中,各个redis实例应该部署在不同的服务器上。
环境配置
以redis用户在原来实例的基础上,创建另外两个目录:
cd /bankapp/redis/
cp -R rd5410 rd5411
cp -R rd5410 rd5412
分别进入对应的目录,修改redis配置文件,以rd5411目录为例,修改如下配置:
vim rd5411/conf/redis.conf
:%s/5410/5411/g
启动Redis
分别启动Redis实例:
redis-server /bankapp/redis/rd5410/conf/redis.conf
redis-server /bankapp/redis/rd5411/conf/redis.conf
redis-server /bankapp/redis/rd5412/conf/redis.conf
查看redis进程:
~]$ ps -ef|grep redis
redis 3495 1 0 21:07 ? 00:00:00 redis-server *:5410
redis 3501 1 0 21:07 ? 00:00:00 redis-server *:5411
redis 3507 1 0 21:07 ? 00:00:00 redis-server *:5412
配置复制关系
在端口5411配置复制关系:
[redis@r01 ~]$ redis-cli -p 5411
127.0.0.1:5411> auth redispwd
OK
127.0.0.1:5411> replicaof 192.168.56.104 5410
OK
127.0.0.1:5411> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_read_repl_offset:126
slave_repl_offset:126
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
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
同样的方式,配置端口5412:
[redis@r01 ~]$ redis-cli -p 5412
auth redispwd
OK
192.168.56.104 5410 replicaof
OK
查看复制关系
在端口5410查看复制关系,可以看到有2个从库:
[redis@r01 ~]$ redis-cli -p 5410
127.0.0.1:5410> auth redispwd
OK
127.0.0.1:5410> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.104,port=5411,state=online,offset=364,lag=1
slave1:ip=192.168.56.104,port=5412,state=online,offset=364,lag=1
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:364
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:364
在端口5411查看复制关系,可以看到其作为从库:
127.0.0.1:5411> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:420
slave_repl_offset:420
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:420
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:420
在端口5412查看复制关系,可以看到其作为从库:
127.0.0.1:5412> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_read_repl_offset:518
slave_repl_offset:518
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:518
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:281
repl_backlog_histlen:238
故障模拟
在主节点5410模拟故障:
kill -9 3495
查看从节点5411,观察其主从关系,发现其仍是从库:
127.0.0.1:5411> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:990
slave_repl_offset:990
master_link_down_since_seconds:33
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:990
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:990
查看从节点5412,观察其主从关系,发现其仍是从库:
127.0.0.1:5412> info replication
# Replication
role:slave
master_host:192.168.56.104
master_port:5410
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:990
slave_repl_offset:990
master_link_down_since_seconds:80
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:d94c2d2fcae4ac39a001c2c6a5fc5d65a6f6b8e2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:990
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:281
repl_backlog_histlen:710
当主节点宕机后,两个从节点都不会自动提升为主节点,仍是从节点,当启动原主节点后,其仍是主节点:
[redis@r01 ~]$ redis-server /bankapp/redis/rd5410/conf/redis.conf
[redis@r01 ~]$ redis-cli -p 5410
127.0.0.1:5410> auth redispwd
OK
127.0.0.1:5410> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.104,port=5411,state=online,offset=14,lag=1
slave1:ip=192.168.56.104,port=5412,state=online,offset=14,lag=1
master_failover_state:no-failover
master_replid:7740797d25f5a02f0938fec819e234a502896c2b
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
由此可见,在使用主从复制环境搭建Redis时,当主节点宕机后,从节点不能自动选主,需要手动干预,那么有没有好的方案可以自动选主呢,有,那就是使用哨兵,通过主从复制+哨兵机制,可大大提升Redis的可用性,也减轻运维的复杂性。