内容简介
本部分将介绍如何搭建Redis主从复制。
主从模式
作用:
- 数据备份
- 负载均衡
一些要注意的点:
一主多从
主节点进行读写,从节点只能进行读
从节点要禁用写操作
从节点故障后,不会影响其他节点,重启后还会从主节点同步数据
主节点故障后,无法进行写入操作,只能进行从节点的数据读取
在主节点故障后,需要使用Redis Sentinel让从节点成为主节点
如果主节点配置了密码,从节点需要在配置文件中指定密码来访问主节点。客户端访问主节点需要密码,访问从节点不需要密码。
主节点进行读写,从节点只能进行读
从节点要禁用写操作
从节点故障后,不会影响其他节点,重启后还会从主节点同步数据
主节点故障后,无法进行写入操作,只能进行从节点的数据读取
在主节点故障后,需要使用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