Redis集群

1. Redis集群概述

1.1 为什么要搭建Redis集群

单节点Redis服务器带来的问题单点故障
■服务不可用
■无法处理大量的并发数据请求
■数据丢失—大灾难

1.2 Redis集群介绍

■Redis集群是一个提供在多个Redis间节点间共享数据的程序集
■Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
■Redis集群通过分区来提供—定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

1.3 Redis集群的优势

■自动分割数据到不同的节点上
■整个集群的部分节点失败或者不可达的情况下能够继续处理命令

Redis集群的实现方法
■有客户端分片
■代理分片
■服务器端分片

1.4 Redis-Cluster数据分片

■Redis集群没有使用一致性hash,而是引入了哈希槽概念
■Redis集群有16384个哈希槽
■每个key通过CRC16校验后对16384取模来决定放置槽
■集群的每个节点负责一部分哈希槽
■以3个节点组成的集群为例
◆节点A包含0到5500号哈希槽
◆节点B包含5501到11000号哈希槽
◆节点C包含11001到16384号哈希槽
■支持添加或者删除节点
◆添加删除节点无需停止服务

例如:
  如果想新添加个节点D,需要移动节点A,B,C中的部分槽到D上
  如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除

1.5 Redis-Cluster的主从复制模型

■集群中具有A,B,C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用
■为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选本B1为新的主节点继续服务
■当B和B1都失败后,(集群将不可用)

2. 实验

2.1 设置网络参数、关闭防火墙和selinux(所有节点)

在两台虚拟机中各自增加两张网卡

[root@localhost ~]# iptables -F			###清除防火墙规则
[root@localhost ~]# iptables -t nat -F			###清除防火墙表规则
[root@localhost ~]# setenforce 0			###关闭核心防护
[root@localhost ~]# service network restart
[root@localhost ~]# ifconfig 
增加两个两个网卡 node1
inet 20.0.0.15  netmask 255.0.0.0  broadcast 20.255.255.255
inet 20.0.0.128  netmask 255.255.255.0  broadcast 20.0.0.255
inet 20.0.0.129  netmask 255.255.255.0  broadcast 20.0.0.255
增加两个两个网卡 node2
inet 20.0.0.16  netmask 255.255.255.0  broadcast 20.0.0.255
inet 20.0.0.130  netmask 255.255.255.0  broadcast 20.0.0.255
inet 20.0.0.131  netmask 255.255.255.0  broadcast 20.0.0.255

2.2 下载并安装Redis(所有节点)

[root@localhost ~]# yum install gcc gcc-c++ make  -y   ##安装编译器
[root@localhost ~]# tar zxvf redis-5.0.7.tar.gz -C /opt      ###解压软件到opt目录下
[root@localhost ~]# cd /opt/redis-5.0.7/     ##到解压的目录下
[root@localhost redis-5.0.7]# make     
[root@localhost redis-5.0.7]# make install
[root@localhost bin]# cd /opt/redis-5.0.7/utils/
[root@localhost utils]# ./install_server.sh  执行自动安装脚本
一直回车
Selected config:Port: 6379
Config file :/etc/redis/6379.conf	//配置文件路径
Log file:/var/log/redis_6379.log1	//日志文件路径
Data dir: /var/lib/redis/6379		//数据文件路径
Executable : /usr/local/redis/bin/redis-server   //可执行文件路径Cli Executable : /usr/local/bin/redis-cli		//客户端命令工具

2.3 修改Redis配置文件(所有节点)

[root@localhost utils]# vim /etc/redis/6379.conf 
70 注释掉bind  前面家#
89 protected-mode no   ##关闭保护模式
93 port 6379
137 daemonize yes   ##独立进程启动
700 appendonly yes   ##开启aof持久化
833 cluster-enabled yes   ##开启群集功能
841  cluster-config-file nodes-6379.conf  ##群集名称文件设置
847  cluster-node-timeout 15000  ##群集超时时间设置
[root@localhost utils]# /etc/init.d/redis_6379 restart   ##重启redis服务
[root@localhost utils]# cd /var/lib/redis/
[root@localhost redis]# ls
6379
[root@localhost redis]# cd 6379/
[root@localhost 6379]# ls
appendonly.aof  dump.rdb  nodes-6379.conf

2.4 创建Redis集群(master1节点)

导入key文件并安装rvm

导入key文件并安装rvm
root@localhost ~]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3   ##
[root@localhost ~]# vim rvm-installer.sh 
https://blog.youkuaiyun.com/weixin_48190892/article/details/109515348  ##脚本地址
[root@localhost ~]# chmod +x rvm-installer.sh 
[root@localhost ~]# ./rvm-installer.sh  ##执行下载编译rvm的脚本
等待下载就行了
[root@localhost ~]# ls /etc/profile.d/    ##看下里面有没有rvm.sh

执行环境变量让其生效

[root@localhost ~]# source /etc/profile.d/rvm.sh  ##刷新一下

安装Ruby2.4.1版本

[root@localhost ~]# rvm list known   ###查看可以安装的ruby版本
[root@localhost ~]# rvm install 2.4.1   ##安装2.4.1版本
[root@localhost ~]# rvm use 2.4.1   ##启动使用2.4.1
Using /usr/local/rvm/gems/ruby-2.4.1
[root@localhost ~]# ruby -v   ##查看版本
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

重新安装Redis

[root@localhost ~]# gem install redis   ##重新安装redis
Fetching redis-4.2.2.gem
Successfully installed redis-4.2.2
Parsing documentation for redis-4.2.2
Installing ri documentation for redis-4.2.2
Done installing documentation for redis after 0 seconds
1 gem installed

创建redis集群

redis-cli --cluster create 20.0.0.129:6379 20.0.0.15:6379 20.0.0.128:6397 20.0.0.16:6379 20.0.0.130:6379 20.0.0.131:6379 --cluster-replicas 1
[root@localhost ~]# redis-cli -h 20.0.0.130 -p 6379

2.5 测试

在master服务器上:

[root@localhost ~]# redis-cli -c -h 20.0.0.15 -p 6379	###登录20.0.0.15
20.0.0.20:6379> set name zhang		###创建一个name键和zhang的值
OK
20.0.0.20:6379> get name			###查看name键的值
"zhang"


[root@localhost ~]# redis-cli -c -h 20.0.0.16 -p 6379	###登录slave副本服务器
20.0.0.21:6379> keys *			###查看一下有没有在master创建的name键
1) "name"

20.0.0.16:6379>get name				###查看name键的值
"zhang"

注意点:这边就做了redis群集,并没有做主从

### Redis 集群的搭建与配置 #### 一、Redis 集群简介 Redis 是一种高性能的键值存储系统,支持多种数据结构操作。通过集群模式可以实现分布式存储和高可用性。Redis 集群允许多个 Redis 实例协同工作,提供更高的吞吐量和更强的数据持久化能力。 --- #### 二、环境准备 在开始之前,需确认以下条件已满足: - 所有服务器的操作系统版本一致(如 CentOS 7 或 Windows),并安装了相同版本的 Redis 软件。 - 已关闭防火墙或开放必要的端口(默认 Redis 使用 6379 及其衍生端口)。 - 每台服务器上至少有两个 Redis 实例运行,分别作为主节点和从节点[^1]。 --- #### 三、具体步骤 ##### 1. 下载并解压 Redis 文件 下载指定版本的 Redis 压缩包(如 Redis 6.2.5 或更高版本),将其解压到目标路径下。例如,在 Linux 中执行以下命令: ```bash wget http://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5.tar.gz cd redis-6.2.5 make ``` ##### 2. 创建多个实例目录 为每个 Redis 实例创建独立的工作目录,并复制 `redis.conf` 至对应文件夹中。例如: ```bash mkdir -p /service/redis/{6379,6380} cp redis.conf /service/redis/6379/ cp redis.conf /service/redis/6380/ ``` ##### 3. 修改配置文件 编辑每个实例下的 `redis.conf` 文件,设置不同的监听端口号和其他必要参数。以下是关键配置项: - 设置绑定 IP 地址:`bind 0.0.0.0` - 关闭保护模式:`protected-mode no` - 开启集群功能:`cluster-enabled yes` - 指定集群配置文件位置:`cluster-config-file nodes-{port}.conf` - 设定日志级别:`loglevel notice` ##### 4. 启动 Redis 实例 依次启动各个 Redis 实例。例如: ```bash redis-server /service/redis/6379/redis.conf redis-server /service/redis/6380/redis.conf ``` 如果是在多台物理机上部署,则需要远程登录每台机器重复上述过程[^2]。 ##### 5. 构建集群拓扑 利用 `redis-cli` 的集群管理工具完成初始化操作。假设当前存在六个节点分布在三台主机上,则可输入如下指令构建集群关系: ```bash redis-cli --cluster create \ 192.168.x.y:6379 192.168.x.z:6379 ... \ --replicas 1 ``` 其中 `--replicas` 参数表示每个主节点分配几个副本[^4]。 ##### 6. 验证集群状态 最后可以通过以下方式验证集群是否正常运作: ```bash redis-cli -c -h {任意IP} -p {任一口号} CLUSTER INFO CLUSTER NODES PING SET key value GET key ``` --- #### 四、注意事项 - 如果使用 Docker 容器来部署 Redis 集群,请确保容器间网络互通良好。 - 对于 Windows 平台上的开发测试场景,可通过批处理脚本来简化服务启动流程[^3]。 --- #### 五、示例代码片段 下面展示了一个简单的 Python 程序用于连接至 Redis 集群并向其中写入一条记录: ```python import redis r = redis.StrictRedisCluster(startup_nodes=[{"host": "127.0.0.1", "port": "6379"}], decode_responses=True) r.set('foo', 'bar') print(r.get('foo')) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值