「Redis」- 配置主从复制

  CREATED BY JENKINSBOT

内容简介

本部分将介绍如何搭建Redis主从复制。

主从模式

作用:

	* 数据备份
	* 负载均衡

一些要注意的点:

	一主多从
	主节点进行读写,从节点只能进行读
	从节点要禁用写操作
	从节点故障后,不会影响其他节点,重启后还会从主节点同步数据
	主节点故障后,无法进行写入操作,只能进行从节点的数据读取
	在主节点故障后,需要使用Redis Sentinel让从节点成为主节点
	如果主节点配置了密码,从节点需要在配置文件中指定密码来访问主节点。客户端访问主节点需要密码,访问从节点不需要密码。

主从模式缺点:

	* 主节点故障后,无法进行写入操作,只能进行从节点的数据读取(使用Redis Sentinel来解决)

环境说明

在测试环境中,共由三台主机:

	* centos7.0-redis-0: 172.16.0.117, Master
	* centos7.0-redis-1: 172.16.0.118, Slave
	* centos7.0-redis-2: 172.16.0.117, Slave

CentOS 7.0,Redis 3.2.12,Port 6379

搭建主从复制

################################################################################
# 1. 安装服务
################################################################################
yum install -y redis.x86_64

################################################################################
# 2. 启动服务并开机启动
################################################################################
systemctl start redis.service
systemctl enable redis.service

################################################################################
# 3. 查看服务状态(分别在三台主机中执行,或者使用Ansible执行)
# !!!此步骤可以跳过,只是为了查看及测试服务状态
################################################################################
redis-cli -h localhost -p 6379 info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

################################################################################
# 3. 修改配置文件:/etc/redis.conf
# 主要有两点:
#     1). 修改bind参数,默认是「bind 127.0.0.0」的,这会导致外部无法访问
#     2). 设置slaveof参数,用于设置主动同步
# 注意事项:
#     1). 不要bind 0.0.0.0,安全问题
#     2). 这里只演示了使用配置,没有进行严谨的安全配置
################################################################################
# 主节点的配置(172.16.0.117, Master)
bind 172.16.0.117

# 从节点的配置(172.16.0.118, Slave)
bind 172.16.0.118
slaveof 172.16.0.117 6379
# masterauth mypass

# 从节点的配置(172.16.0.119, Slave)
bind 172.16.0.119
slaveof 172.16.0.117 6379
# masterauth mypass

################################################################################
# 4. 重启服务(Ansible或手动重启)
################################################################################
systemctl restart redis.service

################################################################################
# 5. 查看服务状态(分别执行,或者使用Ansible执行)
################################################################################
redis-cli -h 172.16.0.117 -p 6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.0.118,port=6379,state=online,offset=407,lag=0
slave1:ip=172.16.0.119,port=6379,state=online,offset=407,lag=1
master_repl_offset:407
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:406

redis-cli -h 172.16.0.118 -p 6379 info replication
# Replication
role:slave
master_host:172.16.0.117
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:449
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

redis-cli -h 172.16.0.119 -p 6379 info replication
# Replication
role:slave
master_host:172.16.0.117
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_repl_offset:477
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

################################################################################
# 6. 写入数据并测试
################################################################################
# 从节点无法写入(这是正常的)
redis-cli -h 172.16.0.119 -p 6379 set k1 "$(date)"
(error) READONLY You can't write against a read only slave.

# 向主节点写入数据
redis-cli -h 172.16.0.117 -p 6379 set k1 "$(date)"
OK

# 从主节点读取数据
redis-cli -h 172.16.0.117 -p 6379 get k1
"Mon Feb 25 22:03:06 EST 2019"

redis-cli -h 172.16.0.118 -p 6379 get k1
"Mon Feb 25 22:03:06 EST 2019"

redis-cli -h 172.16.0.119 -p 6379 get k1
"Mon Feb 25 22:03:06 EST 2019"

动态添加节点

加入集群,成为从节点

# config set requirepass “mypass”
# config set masterauth “mypass”
# slaveof “host-master” “port-number”

查看复制情况

# info keyspace
# info replication

从集群脱离,成为Master节点

# slaveof no one

参考文献

Redis安装及主从配置
Redis/Replication
How to setup Redis master and slave replication
Print number of keys in Redis