使用一台服务器,搭建redis集群模式(三主三从),并从原redis数据库(redis哨兵模式,一主一从)迁移数据。
redis2.8版本之前的模式
持久化功能会把内存中的数据保存在硬盘上,重启时,从硬盘加载数据,以保证保证在服务器重启的情况下不会丢失(或少量丢失)数据。
但数据仍然是存储在一台服务器上。如果该服务器出现硬盘故障等,数据就会丢失。
为了避免单点故障导致的数据丢失,通常的做法是将数据库复制多个副本部署在多台服务器上(即从数据库)。单点故障时,其他服务器能够继续提供服务。
为此, Redis 提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
redis2.8及之后的模式
在主从模式中,当主数据库遇到异常中断服务后,开发者需要人工介入,手动选择一个从数据库升格为主数据库来继续提供服务。
Redis 2.8中提供了哨兵工具,来实现自动化的系统监控和故障恢复功能。
顾名思义,哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。
redis3.0版本之后
即使使用哨兵,redis每个实例也是全量存储,每个redis存储的内容都是完整的数据,浪费内存且有木桶效应。Redis在高并发、大数据量的情况内存压力将会增大;为了最大化利用内存,可以采用集群,就是分布式存储。即将Redis的数据根据一定的规则分配到多台机器:
一个 Redis 集群包含 16384 个哈希槽(hash slot),数据库中的每个键都属于这 16384 个哈希槽的其中一个,集群中的每个节点负责处理一部分哈希槽。
一般集群建议搭建三主三从架构,三主提供服务,三从提供备份功能。
sudo yum install tcl
sudo yum install gcc
sudo yum install make
sudo yum install ruby
sudo yum install rubygems
sudo gem install redis
sudo yum install centos-release-scl-rh #会在/etc/yum.repos.d/目录下多出一个CentOS-SCLo-scl-rh.repo源
sudo yum install rh-ruby23 -y #安装ruby
sudo scl enable rh-ruby23 bash
ruby -v #查看版本
sudo mkdir /usr/local/redis
cd /usr/local/redis
sudo wget http://download.redis.io/releases/redis-4.0.11.tar.gz
sudo tar -xvf redis-4.0.11.tar.gz
cd redis-4.0.11
sudo make
cd /usr/local/redis/redis-4.0.11
sudo mkdir data #数据文件存储在该路径下
sudo mkdir logs #日志文件路径
sudo mkdir config-files
# 依次创建7001-7006六个配置文件,分别为六个实例的配置文件
sudo cp redis.conf ./config-files/redis_7001.conf
sudo cp redis.conf ./config-files/redis_7002.conf
sudo cp redis.conf ./config-files/redis_7003.conf
sudo cp redis.conf ./config-files/redis_7004.conf
sudo cp redis.conf ./config-files/redis_7005.conf
sudo cp redis.conf ./config-files/redis_7006.conf
cd config-files
依次修改六个配置文件 ,主要需要修改以下参数,以7001为例
#bind 127.0.0.1 #绑定IP,即绑定本地回环地址。开启这个配置时,redis 只接收来自于该 IP 地址列表的请求,如果不进行设置,那么将处理所有请求
protected-mode no #关闭保护模式
port 7001 #端口号,
daemonize yes #配置redis作为守护进程运行
cluster-enabled yes #开启集群功能
appendonly yes #配置数据持久化, 开启aof日志。有需要就开启,它会每次写操作都记录一条日志
dbfilename dump_7001.rdb #自动生成到data目录下面,需要写一个文件名,按照端口号区分
dir ./data #数据文件的路径
logfile "/usr/local/redis/redis-4.0.11.logs/7001.log" #日志文件的路径
appendfilename "appendonly_7001.aof"
pidfile /var/run/redis_7001.pid
cluster-config-file nodes-7001.conf
firewall-cmd --zone=public --add-port=7001/tcp --permanent
firewall-cmd --zone=public --add-port=7002/tcp --permanent
firewall-cmd --zone=public --add-port=7003/tcp --permanent
firewall-cmd --zone=public --add-port=7004/tcp --permanent
firewall-cmd --zone=public --add-port=7005/tcp --permanent
firewall-cmd --zone=public --add-port=7006/tcp --permanent
firewall-cmd --reload
逐一启动,比较麻烦,可以写成shell脚本
sudo vim /usr/local/redis/redis-4.0.11/start.sh
脚本如下:
#!/bin/bash
./src/redis-server ./config-files/redis_7001.conf
./src/redis-server ./config-files/redis_7002.conf
./src/redis-server ./config-files/redis_7003.conf
./src/redis-server ./config-files/redis_7004.conf
./src/redis-server ./config-files/redis_7005.conf
./src/redis-server ./config-files/redis_7006.conf
运行start.sh脚本
sudo sh start.sh
ps -ef | grep redis
使用edis-trib.rb工具创建集群
./src/redis-trib.rb create --replicas 1 192.168.100.3:7001 192.168.100.3:7002 192.168.100.3:7003 192.168.100.3:7004 192.168.100.3:7005 192.168.100.3:7006
./src/redis-trib.rb check 127.0.0.1:7001
登录:
./src/redis-cli -c -h 192.168.100.3 -p 7001
注:因为涉及到数据迁移,这里建议先进行迁移后再设置密码,以免迁移时出现问题
逐个进入redis节点,进行设置
./src/redis-cli -c -h 192.168.100.3 -p 7001
#登录redis
192.168.100.3:7001>config set masterauth passwd
192.168.100.3:7001>config set requirepass passwd
192.168.100.3:7001>config rewrite
redis-trib.rb是官方提供的Redis Cluster的管理工具,无需额外下载,默认位于源码包的src目录下,但因该工具是用ruby开发的,所以需要准备相关的依赖环境。
部署redis集群模式时,创建集群即使用的该工具。
注意源数据库不能为集群模式;
# redis-trib.rb help
Usage: redis-trib <command> <options> <arguments ...>
create host1:port1 ... hostN:portN
--replicas <arg>
check host:port
info host:port
fix host:port
--timeout <arg>
reshard host:port
--from <arg>
--to <arg>
--slots <arg>
--yes
--timeout <arg>
--pipeline <arg>
rebalance host:port
--weight <arg>
--auto-weights
--use-empty-masters
--timeout <arg>
--simulate
--pipeline <arg>
--threshold <arg>
add-node new_host:new_port existing_host:existing_port
--slave
--master-id <arg>
del-node host:port node_id
set-timeout host:port milliseconds
call host:port command arg arg .. arg
import host:port
--from <arg>
--copy
--replace
help (show this help)
For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
其内部处理流程如下:
gem install redis 安装的版本较高,无法使用import,因此要重新安装3.3.3-3.3.5之间的版本
sudo gem uninstall redis
sudo gem install redis -v 3.3.3
同时源数据库要设置成无密码访问,配置文件里注释掉requirepass一行,并重启源数据库【略】
#requirepass "123456"
进行数据迁移
./src/redis-trib.rb import --from 192.168.100.3:6379 --copy --replace 192.168.100.3:7001