文章目录
一、案例概述
1.1 单节点Redis服务器带来的问题
- 单点故障,服务不可用
- 无法处理大量的并发数据请求
- 数据丢书一大灾难
1.2 解决方法
- 搭建Redis集群
二、案例前置知识点
2.1 Redis集群介绍
- Redis集群是一个提供在多个Redis间节点间共享数据的程序集(路由)
- Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
- Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令
2.2 Redis集群的优势
- 自动分割数据到不同的节点上
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令
2.3 Redis集群的实现方法
-
有客户端分片
-
代理分片
-
服务器端分片
Redis群集:去中心化模式——>区块链用的多
2.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节点从集群中移除
2.5 Redis-Cluster的主从复制模型
- 集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会缺少5501-11000这个范围的槽而不可用
- 为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1成为新的主节点继续服务
- 当B和B1都失败后,集群将不可用
三、案例环境
案例拓扑图
四、案例实施
-
设置网络参数、关闭防火墙和selinux(所有节点)
-
下载并安装Redis(所有节点)
-
修改Redis配置文件(所有节点)
-
创建Redis集群(master1节点)
- 导入key文件并安装rvm
- 执行环境变量让其生效
- 安装Ruby2.4.1版本
- 安装redis客户端
- 创建redis集群
-
调整Redis集群主从关系
- 删除所有的从节点(master1节点)
- 删除节点配置文件和持久化文件(slave1、2、3节点)
- 重新添加从节点(master1节点)
- 检查新的主从关系(master节点)
-
测试集群数据读写
实验
环境
两台虚拟机,每台配置三个网卡,第一台作为master,第二台作为slave
过程
'设置网络参数、关闭防火墙和selinux(所有节点)'
iptables -F
setenforce 0
yum install gcc gcc-c++ -y
#拖入安装包 redis-5.0.7.tar.gz
tar zxvf redis-5.0.7.tar.gz -C /opt/
cd /opt/redis-5.0.7
make
make PREFIX=/usr/local/redis install
ln -s /usr/local/redis/bin/* /usr/local/bin/
cd /opt/redis-5.0.7/utils/
./install_server.sh
... #一直回车
#输入ok
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf //配置文件路径
Log file : /var/log/redis_6379.log //日志文件路径
Data dir : /var/lib/redis/6379 //数据文件路径
Executable : /usr/local/bin/redis-server //可执行文件路径
Cli Executable : /usr/local/bin/redis-cli //客户端命令工具
[root@localhost utils]# netstat -lnupt | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 100865/redis-server
'修改Redis配置文件(所有节点)'
vim /etc/redis/6379.conf
70 #bind 127.0.0.1 ##注释掉bind项,redis中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 ##群集超时时间设置
/etc/init.d/redis_6379 restart
'正常启动后,/var/lib/redis/6379/目录下会多出两个文件,'
'一个是持久化appendonly.aof文件,另外一个节点自动生成的nodes-6379.conf配置文件。'
'创建Redis集群(master1节点)'
'##导入key文件'
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
cd /opt/
##拖入软件包 rvm-installer.sh '(可翻墙从网站下载:另存为rvm-installer.sh文件,运行:curl -sSL https://get.rvm.io | bash -s stable)'
chmod +x rvm-installer.sh
'##执行脚本'
./rvm-installer.sh
'##执行环境变量'
cd /etc/profile.d/
source /etc/profile.d/rvm.sh
'##列出Ruby可安装的版本'
rvm list known
'##安装2.4.10版本'
rvm install 2.4.10
'##使用Ruby2.4.10版本'
rvm use 2.4.10
'##查看当前Ruby2.4.10版本'
ruby -v
'##再次安装Redis'
gem install redis
'##创建集群'
'六个实例分为三组,每组一主一从,--replicas 1 表示每组一个从,下面交互的时候,需要输入yes才可以创建。'
'使用源码解压目录中的redis-trib.rb 工具创建群集。'
M:
14.0.0.77
14.0.0.131
14.0.0.132
S:
14.0.0.99
14.0.0.133
14.0.0.134
vim /etc/redis/6379.conf
bind 14.0.0.77 14.0.0.131 14.0.0.132 ##监听三个地址
/etc/init.d/redis_6379 restart
vim /etc/redis/6379.conf
bind 14.0.0.99 14.0.0.133 14.0.0.134
/etc/init.d/redis_6379 restart
'###创建哈希槽'
redis-cli --cluster create 14.0.0.77:6379 14.0.0.131:6379 14.0.0.132:6379 14.0.0.99:6379 14.0.0.133:6379 14.0.0.134:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 14.0.0.133:6379 to 14.0.0.77:6379
Adding replica 14.0.0.134:6379 to 14.0.0.131:6379
Adding replica 14.0.0.99:6379 to 14.0.0.132:6379
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.77:6379
slots:[0-16383] (5461 slots) master
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.131:6379
slots:[0-16383] (5462 slots) master
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.132:6379
slots:[0-16383] (5461 slots) master
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.99:6379
replicates 99c08e17828e26502410da43e06bffc9e241b261
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.133:6379
replicates 99c08e17828e26502410da43e06bffc9e241b261
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.134:6379
replicates 99c08e17828e26502410da43e06bffc9e241b261
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
>>> Performing Cluster Check (using node 14.0.0.77:6379)
M: 99c08e17828e26502410da43e06bffc9e241b261 14.0.0.77:6379
slots:[0-16383] (16384 slots) master
1 additional replica(s)
S: 46953fbf8bc27794a61db66214882b294375396d 14.0.0.133:6379
slots: (0 slots) slave
replicates 99c08e17828e26502410da43e06bffc9e241b261
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
redis-cli -c -h 14.0.0.77 '##进入master'
set name zhangsan
'##进入其他节点(slave)'
redis-cli -c -h 14.0.0.131
get name
redis-cli -c -h 14.0.0.132
get name
redis-cli -c -h 14.0.0.99
get name
redis-cli -c -h 14.0.0.133
get name
redis-cli -c -h 14.0.0.134
get name