主要内容:
Redis集群概述、部署Redis集群(配置manage管理集群主机、创建集群、访问集群、添加节点、移除节点)
一、Redis集群概述
1、集群概述
所谓集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定、高效的状态;而单个Redis服务运行存在不稳定性,当Redis服务宕机,就没有可用服务了,且单个Redis服务运行的读写能力是有限的。
Redis 集群是一种分布式数据库解决方案,是为了强化Redis服务的读写能力而存在;用于在多个 Redis 节点之间分片数据,以提高性能、可扩展性和容错能力。Redis 集群通过将数据分布在多个节点上,使得系统能够处理更大的数据集和更高的并发请求。
- Redis集群中每一个Redis称之为一个节点,所有的Redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽;
- 节点的fail是通过集群中超过半数的节点检测失效时才生效;
- 客户端与Redis节点直连,不需要中间proxy层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- Redis集群中有两种类型的节点:主节点(master)、从节点(slave)
- Redis集群,是基于Redis主从复制实现(使用管理主机创建集群时,自动分配主从)
- 主从复制模型中,有多个Redis节点;其中有且仅有一个为主节点Master。从节点Slave可以有多个,只要网络连接正常,Master会一直将自己的数据更新同步给Slaves,保持主从同步;主节点Master:可读、可写,从节点Slave:只读
2、部署Redis集群:
基本原理:集群中至少应有奇数个节点,所以至少有三个节点,每个节点至少有一个备份节点;(实验中,一个主从结构为一个节点)
实验网络拓扑:
服务器角色:Manager、redis1、redis2、redis3、redis4、redis5、redis6
- Manger:IP为192.168.2.20,安装redis-3.2.1.gem搭建集群工具,部署集群管理脚本
- Redis1:IP为192.168.2.11,编译安装Redis,开启集群功能,bind设置所有主机访问
- Redis2:IP为192.168.2.12,编译安装Redis,开启集群功能,bind设置所有主机访问
- Redis3:IP为192.168.2.13,编译安装Redis,开启集群功能,bind设置所有主机访问
- Redis4:IP为192.168.2.14,编译安装Redis,开启集群功能,bind设置所有主机访问
- Redis5:IP为192.168.2.15,编译安装Redis,开启集群功能,bind设置所有主机访问
- Redis6:IP为192.168.2.16,编译安装Redis,开启集群功能,bind设置所有主机访问
存储结构:
- Redis-Cluster把所有的物理节点映射到[0-16383]Slot上(不一定是平均分配),Cluster 负责维护nodeslotvalue。
- Redis集群预分好16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod求余 16384的值,决定将一个key放到哪个哈希槽中。
例如:Redis集群预分好16384个哈希槽,往Redis集群中存储一个key-value(值为10000),根据CRC16算法对值求余,10000 % 16384=存储哈希槽范围,即找到存储节点,存储节点内部为一个主从同步架构,存储到主服务器再同步到从服务器上;
集群相关配置: /etc/redis/6379.conf
- cluster-enabled yes //启用集群功能
- cluster-config-file nodes-6379.conf //指定集群配置文件位置
- cluster-node-timeout 15000 //心跳时间(单位毫秒)
- 集群服务端口:16379
步骤1:配置管理主机(manage操作)
① 配置脚本运行环境
[root@manager ~]# yum -y install rubygems
[root@manager ~]# gem install redis-3.2.1.gem //参考/linux-soft/4/redis/
Successfully installed redis-3.2.1
Parsing documentation for redis-3.2.1
Installing ri documentation for redis-3.2.1
1 gem installed
补充:RubyGems 是 Ruby 的一个包管理器,它提供一个分发 Ruby 程序和库的标准格式,还提供一个管理程序包安装的工具;
补充:redis-3.2.1.gem,搭建redis集群所需要的软件(redis和ruby接口相关)
② 部署集群管理脚本(redis-trib.rb)
[root@manager ~]# tar -xf redis-4.0.8.tar.gz
[root@manager ~]# cp redis-4.0.8/src/redis-trib.rb /usr/local/bin/
[root@manager ~]# chmod +x /usr/local/bin/redis-trib.rb //授予脚本执行权限
# 查看帮助
[root@manager ~]# redis-trib.rb help //Redis集群管理脚本帮助
步骤2:创建集群
① 启动redis1的集群功能(redis1操作)
# 停止服务
[root@redis1 ~]# service redis_6379 stop
Stopping ...
Redis stopped
# 修改配置文件
[root@redis1 ~]# vim /etc/redis/6379.conf
protected-mode no //关闭保护模式,以允许不使用密码、不指定绑定地址提供服务
# bind 127.0.0.1 //注释本地连接,允许所有主机连接
# requirepass tedu.cn //注释密码,不使用密码
cluster-enabled yes //启用集群功能
cluster-config-file nodes-6379.conf //指定集群配置文件位置
cluster-node-timeout 5000 //心跳时间(单位毫秒)
# 清空原有Redis数据库的数据
[root@redis1 ~]# rm -rf /var/lib/redis/6379/*
# 修改服务启动文件,去掉密码
[root@redis1 ~]# vim +43 /etc/init.d/redis_6379
...
$CLIEXEC -p $REDISPORT shutdown
...
# 启动服务
[root@redis1 ~]# service redis_6379 start
Starting Redis server...
# 查看端口,集群服务运行在16379端口上
[root@redis1 ~]# ss -tlnp | grep redis
LISTEN 0 128 *:6379 *:* users:(("redis-server",pid=1867,fd=7))
LISTEN 0 128 *:16379 *:* users:(("redis-server",pid=1867,fd=10))
LISTEN 0 128 :::6379 :::* users:(("redis-server",pid=1867,fd=6))
LISTEN 0 128 :::16379 :::* users:(("redis-server",pid=1867,fd=9))
② 在redis1上配置redis2、redis3、redis4、redis5、redis6的集群功能
# 配置redis1可SSH免密登录
[root@redis1 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@redis1 ~]# for i in {12..16}
> do
> ssh-copy-id 192.168.2.$i
> done
# 将redis1上编译好的redis安装目录拷贝到其他节点(/usr/local/redis/)
[root@redis1 ~]# for i in {12..16}
> do
> scp -r /usr/local/redis/ 192.168.2.$i:/usr/local/
> done
# 将redis命令目录添加至PATH环境变量(/usr/local/redis/bin)
[root@redis1 ~]# for i in {12..16}
> do
> ssh 192.168.2.$i "echo 'export PATH=$PATH:/usr/local/redis/bin' >> /etc/bashrc"
> d