【Linux基础服务教程】Redis多实例和主从复制

一、Redis多实例

环境准备:
redis实例:/opt/6380数据目录:/opt/6380/data日志:/var/log/redis_6380.log
redis实例:/opt/6381数据目录:/opt/6381/data日志:/var/log/redis_6381.log

1.规划实例目录

如果没有tree命令,可以使用yum install -y tree安装

[root@master ~]# mkdir -p /opt/638{0,1}/{data,conf}
[root@master ~]# tree /opt
/opt
├── 6380
│   ├── conf
│   └── data
└── 6381
    ├── conf
    └── data

2.修改配置文件

[root@master ~]# cp /usr/local/redis/conf/redis.conf /opt/6380/conf/	#复制一份原配置文件
[root@master ~]# vim /opt/6380/conf/redis.conf

bind 10.10.10.128	#按照规划,更改为本机IP
port 6380	#按照规划,更改端口
daemonize yes	#开启后台运行
pidfile /var/run/redis_6380.pid		#修改pid文件
loglevel warning	#避免空间利用问题,修改日志等级为最高
logfile "/var/log/redis_6380.log"	#按照规划,指定日志文件存放路径
dbfilename dump_6380.rdb	#修改数据文件命名规则,方便区分其他
dir /opt/6380/data	#按照规划,指定数据文件存放路径
appendonly yes	#启用aof日志
appendfilename "appendonly_6380.aof"	#为了方便区分其他,更改命名规则
[root@master ~]# cp /opt/6380/conf/redis.conf /opt/6381/conf/	#拷贝配置文件给第二个实例
[root@master ~]# sed -ri 's|6380|6381|g' /opt/6381/conf/redis.conf	#快速修改里面的端口和配置文件命名规则

3.启动实例

[root@master ~]# redis-server /opt/6380/conf/redis.conf 
[root@master ~]# redis-server /opt/6381/conf/redis.conf

4.检查实例是否成功启动

如果提示没有netstat命令,可以使用yum install -y net-tools安装

[root@master ~]# netstat -tunlp | grep redis
tcp        0      0 10.10.10.128:6380       0.0.0.0:*               LISTEN      6308/redis-server 1 
tcp        0      0 10.10.10.128:6381       0.0.0.0:*               LISTEN      6313/redis-server 1

5.测试数据读写

[root@master ~]# redis-cli -h 10.10.10.128 -p 6380
10.10.10.128:6380> set uid 1001
OK
10.10.10.128:6380> get uid
"1001"
[root@master ~]# redis-cli -h 10.10.10.128 -p 6381
10.10.10.128:6381> set uid 1002
OK
10.10.10.128:6381> get uid
"1002"

二、主从复制

作用: 避免单点故障、提高可用性

1.主从复制核心要素

  • 基于异步进行数据复制
  • 支持一主多从
  • 复制数据时不影响前端业务, 非阻塞
  • redis 2.6版本开始,从服务器为只读模式

2.修改配置文件

基于上面的多实例修改
10.10.10.128 6380作从节点
10.10.10.128 6381作主节点

[root@master ~]# vim /opt/6380/conf/redis.conf

replicaof 10.10.10.128 6381		#后面跟上主节点的IP和端口
# masterauth <master-password>	#后面跟上主节点的密码,因为我们没有配置密码,故不做修改

3.重启实例

[root@master ~]# redis-cli -h 10.10.10.128 -p 6380 shutdown
[root@master ~]# redis-server /opt/6380/conf/redis.conf

4.检查主从

[root@master ~]# redis-cli -h 10.10.10.128 -p 6381	#登录主库
10.10.10.128:6381> info Replication		#查看主从信息
# Replication
role:master
connected_slaves:1
slave0:ip=10.10.10.128,port=6380,state=online,offset=224,lag=1
master_replid:77eb31bbfbe2f21f6a8f3f19a3b5e58df5fd0ede
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:224
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:224
[root@master ~]# redis-cli -h 10.10.10.128 -p 6380		#登录从库
10.10.10.128:6380> info Replication		#查看从库信息
# Replication
role:slave
master_host:10.10.10.128
master_port:6381
master_link_status:up
master_last_io_seconds_ago:8
master_sync_in_progress:0
slave_repl_offset:378
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:77eb31bbfbe2f21f6a8f3f19a3b5e58df5fd0ede
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:378
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:378

5.主从切换

A.模拟主库故障

[root@master ~]# redis-cli -h 10.10.10.128 -p 6381 shutdown

B.将原来的从提升到新主

[root@master ~]# redis-cli -h 10.10.10.128 -p 6380
10.10.10.128:6380> slaveof no one
OK
10.10.10.128:6380> info Replication
# Replication
role:master
connected_slaves:0	#此时从节点为0
master_replid:1cafa25aebcd5a8943818f151f66e6ccb97a3de6
master_replid2:77eb31bbfbe2f21f6a8f3f19a3b5e58df5fd0ede
master_repl_offset:574
second_repl_offset:575
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:574

C.注释掉原来的配置信息

[root@master ~]# vim /opt/6380/conf/redis.conf
# replicaof 10.10.10.128 6381

D.修改配置文件,配置新从库

[root@master ~]# vim /opt/6381/conf/redis.conf
replicaof 10.10.10.128 6380

E.模拟数据库恢复

[root@master ~]# redis-server /opt/6381/conf/redis.conf

F.登录数据库查看新的主从关系

[root@master ~]# redis-cli -h 10.10.10.128 -p 6381
10.10.10.128:6381> info replication
# Replication
role:slave
master_host:10.10.10.128
master_port:6380
master_link_status:up
master_last_io_seconds_ago:7
master_sync_in_progress:0
slave_repl_offset:616
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1cafa25aebcd5a8943818f151f66e6ccb97a3de6
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:616
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:575
repl_backlog_histlen:42
[root@master ~]# redis-cli -h 10.10.10.128 -p 6380
10.10.10.128:6380> info Replication
# Replication
role:master
connected_slaves:1	#有1个从库
slave0:ip=10.10.10.128,port=6381,state=online,offset=756,lag=0
master_replid:1cafa25aebcd5a8943818f151f66e6ccb97a3de6
master_replid2:77eb31bbfbe2f21f6a8f3f19a3b5e58df5fd0ede
master_repl_offset:756
second_repl_offset:575
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:756