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群集,并没有做主从