1.Redis
redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。
2.Redis集群
Redis Cluster 即 Redis 集群,是 Redis 官方在 3.0 版本推出的一套分布式存储方案。完全去中心化,由多个节点组成,所有节点彼此互联。Redis 客户端可以直接连接任何一节点获取集群中的键值对,不需要中间代理,如果该节点不存在用户所指定的键值,其内部会自动把客户端重定向到键值所在的节点。
Redis 集群是一个网状结构,每个节点都通过 TCP 连接跟其他每个节点连接。在一个有 N 个节点的集群中,每个节点都有 N-1 个流出的 TCP 连接,和 N-1 个流入的连接,这些 TCP 连接会永久保持。
Redis Cluster 同其他分布式存储系统一样,主要具备以下两个功能:
数据分区:Redis 集群会将用户数据分散保存至各个节点中,突破单机 Redis 内存最大存储容量。集群引入了 哈希槽slot的概念,其搭建完成后会生成 16384 个哈希槽slot,同时会根据节点的数量大致均等的将 16384 个哈希槽映射到不同的节点上。当用户存储key-value时,集群会先对key进行 CRC16 校验然后对 16384 取模来决定key-value放置哪个槽,从而实现自动分割数据到不同的节点上。
数据冗余:Redis 集群支持主从复制和故障恢复。集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给集群里的其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。
1.下载安装Redis
wget http://download.redis.io/releases/redis-5.0.6.tar.gz
2.解压Redis源码包
tar -zxvf redis-5.0.3.tar.gz
3.安装
Redis 基于 C 语言开发,故编译源码需要 GCC(Linux下的一个编译器,这里需要用来编译.c文件)的支持。如机器上未安装需要先执行命令yum -y install gcc安装 GCC 编译工具,然后make distclean清除之前生成的文件,最后make && make install重新编译安装。进入解压后的目录并使用make命令执行编译安装Redis(以/home目录为例)
* 注:make编译安装前需提前安装GCC编译器,否则会编译失败,安装命令:
yum -y install gcc
cd /home/redis-5.0.6
make
* 出现类似下列输出则表示安装成功
* 安装成功后,Redis目录文件会出现如下文件
4.启动集群各个节点
cd /home/redis-5.0.6/src
./run-server /home/redis-5.0.6/redis-cluster/7001/redis.conf
5.Redis配置文件---redis.conf释义
依据 Redis Cluster 内部故障转移实现原理,Redis 集群至少需要 3 个主节点,而每个主节点至少有 1 从节点,因此搭建一个集群至少包含 6 个节点,三主三从,并且分别部署在不同机器上。(本次以部署在同一台机器上为例)
目前 Redis Cluster 的搭建有两种方式:
两种方式原理一样,自动搭建方式只是将手动搭建方式中需要执行的 Redis 命令封装到了可执行程序。生产环境下推荐使用第二种方式,简单快捷,不易出错。(本次以自动搭建为例)
由于我们这是在一台机器上模拟多个节点,可以预先规划下各个节点的属性:
节点编号 | IP 地址 | TCP 端口 | 节点类型 | 从节点 | 启动配置 |
A | 127.0.0.1 | 7001 | 主 | D | /home/redis-5.0.6/redis-cluster/7001/redis.conf |
B | 127.0.0.1 | 7002 | 主 | E | /home/redis-5.0.6/redis-cluster/7002/redis.conf |
C | 127.0.0.1 | 7003 | 主 | F | /home/redis-5.0.6/redis-cluster/7003/redis.conf |
D | 127.0.0.1 | 8001 | 从 | / | /home/redis-5.0.6/redis-cluster/8001/redis.conf |
E | 127.0.0.1 | 8002 | 从 | / | /home/redis-5.0.6/redis-cluster/8002/redis.conf |
F | 127.0.0.1 | 8003 | 从 | / | /home/redis-5.0.6/redis-cluster/8003/redis.conf |
1.创建节点
mkdir /home/redis-5.0.6/redis-cluster
cd redis-cluster
mkdir -p 7001 7002 7003 8001 8002 8003
2.分别复制配置文件到各个节点目录
cp redis.conf /home/redis-5.0.6/redis-cluster/7001
cp redis.conf /home/redis-5.0.6/redis-cluster/7002
cp redis.conf /home/redis-5.0.6/redis-cluster/7003
cp redis.conf /home/redis-5.0.6/redis-cluster/8001
cp redis.conf /home/redis-5.0.6/redis-cluster/8002
cp redis.conf /home/redis-5.0.6/redis-cluster/8003
3.分别修改节点配置文件(以7001节点为例,其他原理相同)
cd /home/redis-5.0.6/redis-cluster/7001
vi redis.conf
* 具体修改内容如下:
bind 192.168.83.128 # 设置当前节点主机地址
port 7001 # 设置客户端连接监听端口
pidfile /var/run/redis_7001.pid # 设置 Redis 实例 pid 文件
daemonize yes # 以守护进程运行 Redis 实例
cluster-enabled yes # 启用集群模式
cluster-node-timeout 15000 # 设置当前节点连接超时毫秒数
cluster-config-file nodes-7001.conf # 设置当前节点集群配置文件路径
4.启动集群各个节点
cd /home/redis-5.0.6/src
./run-server /home/redis-5.0.6/redis-cluster/7001/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/7002/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/7003/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/8001/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/8002/redis.conf
./run-server /home/redis-5.0.6/redis-cluster/8003/redis.conf
* 启动后,会有如下提示:
* 通过ps命令查看确认各个节点是否运行
5.自动搭建集群
Redis 3.0 版本之后官方发布了一个集群管理工具 redis-trib.rb,集成在 Redis 源码包的src目录下。其封装了 Redis 提供的集群命令,使用简单、便捷。不过 redis-trib.rb 是 Redis 作者使用 Ruby 语言开发的,故使用该工具之前还需要先在机器上安装 Ruby 环境。后面作者可能意识到这个问题,Redis 5.0 版本开始便把这个工具集成到 redis-cli 中,以--cluster参数提供使用,其中create命令可以用来创建集群。如果您安装的 Redis 是 3.x 和 4.x 的版本可以使用 redis-trib.rb 搭建,不过之前需要安装 Ruby 环境。先使用 yum 安装 Ruby 环境以及其他依赖项:
yum -y install ruby ruby-devel rubygems rpm-build
确认安装版本:
ruby -v
* 本次搭建使用的 Redis 版本是 5.0.6,所以我可以直接使用redis-cli --cluster create命令搭建,具体命令如下所示(重点):
./redis-cli --cluster create 10.252.30.241:7001 10.252.30.241:7002 10.252.30.241:7003 10.252.30.241:8001 10.252.30.241:8002 10.252.30.241:8003 --cluster-replicates 1
* 主节点在前,从节点在后。其中--cluster-replicas参数用来指定一个主节点带有的从节点个数,如上--cluster-replicas 1即表示 1 个主节点有 1 个从节点。
* 创建成功会有如下提示
至此,Redis集群搭建完毕!
1.Redis启动/重启
./run-server /home/redis-5.0.6/redis.conf
2.客户端登录
./redis-cli
./redis-cli -h ip # 进入指定服务器的Redis实例
3.关闭Redis
· 方式一:shell交互命令关闭
1)进入Redis的shell命令行
./redis-cli
2)关闭Redis
shutdown
在 shell 交互界面输入 shutdown 命令就可以关闭 Redis 实例,后面有一个可选参数,nosave 就是不将内存中的数据持久化,save 就是将内存中的数据持久化。shutdown 关闭方式是比较优雅的关闭方式,建议使用这种关闭方式
· 方式二:kill+进程号关闭
1)查看Redis进程号
ps -ef | grep redis
2)杀掉Redis进程
kill 19317
使用 kill方式关闭 Redis 实例服务,需要注意一个地方,那就是需要把 pid 文件删掉,pid文件存放的位置我们在 redis.conf 里配置的 pidfile /var/run/redis_6379.pid,我们需要到 /var/run 目录下把 redis_6379.pid 删掉,这样下一次才能正常重启 Redis 服务。
上面两种方式都可以关闭 Redis 服务,随便选一种都行,但是切记不要使用 Kill 9 方式关闭 Redis 进程,这样 Redis 不会进行持久化操作,除此之外,还会造成缓冲区等资源不能优雅关闭,极端情况下会造成 AOF 和复制丢失数据的情况
4.设置Redis开机自启动
5.Redis进程绑定到指定的CPU
1)查看Redis进程
ps -ef | grep redis
2)显示进程运行的CPU
taskset -p 19317
3)查看本服务器CPU数量
lscpu
4)指定进程运行在某个特定的CPU上(将7001节点的Redis绑定到CPU2上)
taskset -pc 1 23197
显示结果:
pid 23197’s current affinity list: 0-3
pid 23197’s new affinity list: 1
* 注:0-3表示一共4个CPU,1表示CPU将只会运行在第2个CPU上(从0开始计数)
5)进程启动时指定CPU
taskset -c 1 ./redis-server ../redis-cluster/7001/redis.conf
taskset -c 1 ./redis-server ../redis-cluster/8001/redis.conf
taskset -c 2 ./redis-server ../redis-cluster/7002/redis.conf
taskset -c 2 ./redis-server ../redis-cluster/8002/redis.conf
taskset -c 3 ./redis-server ../redis-cluster/7003/redis.conf
taskset -c 3 ./redis-server ../redis-cluster/8003/redis.conf
1.使用./redis-cli进入shell时报错Could not connect to Redis at 127.0.0.1:6379: Connection refused
【解决办法】
1)编辑redis配置文件redis.conf 并修改 daemonize no(第128行) 为 daemonize yes ,这样就可以默认启动就后台运行
2)重启redis服务
redis-server /etc/redis.conf
* 注:开启客户端要确保服务端启动
2.外部无法访问redis
【解决办法】
1)编辑redis配置文件redis.conf 并修改 bind 127.0.0.1 为bind 0.0.0.0(代表不做限制)
2)重启redis服务
redis-server /etc/redis.conf
* 其他可能原因:防火墙未添加redis端口、安全组、protected-mode保护模式未关闭、密码错误等