文章目录
发展背景
单节点Redis服务器带来的问题
- 单点故障,服务不可用
- 无法处理大量的并发数据请求
- 数据丢失造成大灾难
解决方法
- 搭建Redis集群
Redis集群介绍
- Redis集群是一个提供在多个Redis间节点间共享数据的程序集
- Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
- Redis集群通过分区来提供一定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令,只要存在可用节点就可以进行处理;
- 去中心化结构,没有主导节点,所以结果由大家共同协商,适用场景区块链
Redis集群的优势
Redis集群优势在于:
- 自动分割数据到不同的节点上
- 整个集群的部分节点失败或者不可达的情况下能够继续处理命令
Redis集群的实现方法
Redis集群实现的三种方法:
- 客户端分片
- 代理分片
- 服务器端分片
Redis的使用环境大致为:
后端语言在环境中会找连接数据库拿数据,Redis可以缓存数据库的数据到本地,以加快的对客户端的响应,之后在一定的时间内客户端都可以从Redis端拿到数据库的数据。
客户端分片大致为:路由和服务器位置都放在客户端中,也就是寻址在客户端
代理分片大致为:路由和位置在代理端
服务器分片为:寻址放在服务器端
后面的案例配置就是服务器分片
Redis-Cluster数据分片
Redis群集的数据分片
- Redis集群没有使用一致性hash,而是引入了哈希槽概念
- Redis 集群有16384个哈希槽
- 每个key通过CRC16校验后对16384取模来决定放置槽
- 集群的每个节点负责一部分哈希槽,这代表哈希槽是分散在不同的数据节点上的,那么如果当其中一台节点宕机之后,哈希槽将会在剩余的节点当中重新分配,数据会有副本
以3个节点组成的集群为例,节点A包含О到5500号哈希槽,节点B包含5501到11000号哈希槽,节点C包含11001到16384号哈希槽
支持热添加添加或者删除节点
- 添加删除节点无需停止服务
如果想新添加个节点D,需要移动节点A,B,C中的部分槽到D上如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除
Redis-Cluster的主从复制模型
集群中具有A,B,C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用
为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成,在节点B失败后,集群便会选举B1为新的主节点继续服务当B和B1都失败后,集群将不可用
关于主从,当我们在一台服务器上插入一条数据之后,这条数据会在所有服务器中找另一台来存放,后这两台构成主从,主从仅仅只作为区分二者的作用并没有表示哪一个是主导地位
Redis群集配置示例
案例环境
我们不用六台服务器了,那样很多重复的操作,我们用两台服务器每台服务器绑定三张网卡自动分配ip
主机 | ip | 系统 | 安装软件 |
---|---|---|---|
1,2,3 | dhcp | centos7 | redis-5.0.7.tar.gz ruby |
4,5,6 | dhcp | centos7 | redis-5.0.7.tar.gz |
案例拓扑如下
案例配置
安装Redis
在两台服务器上均安装Redis,步骤如下
[root@localhost ~]#iptables -F
[root@localhost ~]#setenforce 0
[root@localhost ~]#yum -y install gcc gcc-c++
[root@localhost ~]#tar zxvf redis-5.0.7.tar.gz
[root@localhost ~]#cd redis-5.0.7/
[root@localhost ~]#make
[root@localhost ~]#make PREFIX=/usr/local/redis install
[root@localhost ~]#ln -s /usr/local/redis/bin/* /usr/local/bin/
[root@localhost ~]# cd redis-5.0.7/utils
[root@localhost utils]# ./install_server.sh
全部回车即可
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]
Selected default - /var/lib/redis/6379
Please select the redis executable path [/usr/local/bin/redis-server]
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
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
启动优化
[root@localhost ~]# ls /usr/local/reids/bin/
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
这里面的几个可执行文件,benchmark为压测、aof和rdb为持久化的文件、cli用户端管理命令
[root@localhost ~]# netstat -lutpn | grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 6118/redis-server 1
主Redis配置
[root@localhost ~]# vim /etc/redis/6379.conf
70 bind 20.0.0.10 20.0.0.135 20.0.0.142
93 port 6379
137 daemonize yes
833 cluster-enabled yes
841 cluster-config-file nodes-6379.conf
847 cluster-node-timeout 15000
700 appendonly yes
[root@localhost ~]# cd /var/lib/redis/6379
[root@localhost 6379]# ls
dump.rdb
重启服务后再/var/lig/redis/6379下会多两个文件,一个是AOF持久化文件,一个是节点文件nodes-6379.conf
[root@localhost 6379]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@localhost 6379]# ls
appendonly.aof dump.rdb nodes-6379.conf
[root@localhost 6379]#
安装ruby添加节点
----在master上操作-----
//导入key文件
[root@localhost 6379]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
.............
//安装rvm(使用浏览器打开另存为rvm-installer.sh文件,运行。由于这个路径需要翻墙,所以直接拿下好的资源)
curl -sSL https://get.rvm.io |bash -s statle
..............
把准备好的文件rvm-installer.sh放到虚拟机里
[root@localhost ~]# chmod +x rvm-installer.sh
执行脚本
[root@localhost ~]# ./rvm-installer.sh
执行环境变量
[root@localhost ~]# source /etc/profile.d/rvm.sh
查看版本
[root@localhost ~]# rvm list known
安装ruby
[root@localhost ~]#rvm install ruby-2.4.10
视情况,有的要等很久,建议使用移动用户热点
查看安装好的ruby版本
[root@localhost ~]#ruby -v
再次安装Redis
[root@localhost ~]#gem install redis
重启
/etc/init.d/redis_6379 restart
#添加网卡,把节点ip加在后面
redis-cli --cluster create 20.0.0.10:6379 20.0.0.135:6379 20.0.0.142:6379 20.0.0.110:6379 20.0.0.143:6379 20.0.0.133:6379--cluster-replicas 1
从Redis配置
安装Redis,修改下配置文件即可
[root@localhost ~]# vim /etc/redis/6379.conf
70 bind 20.0.0.133 20.0.0.143 20.0.0.110
93 port 6379
137 daemonize yes
833 cluster-enabled yes
841 cluster-config-file nodes-6379.conf
847 cluster-node-timeout 15000
700 appendonly yes
[root@localhost ~]#vim /etc/init.d/redis-cli restart
[root@localhost ~]#netstat -antp | grep 6379
就可以测试了,正常现象为在任何一台上可登录任意一台Redis服务器,在其中一台服务器上插入键值之后在其他剩余的其中一台服务器上可看到