redis集群及相关缓存问题
redis简介
介绍
Redis 是一个开源的内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如:
- 字符串(strings)
- 散列(hashes)
- 列表(lists)
- 集合(sets)
- 有序集合(sorted sets)
- 范围查询
- 位图(Bitmaps)
- 基数计算(HyperLogLogs)
- 地理空间(geospatial)
redis 内置了 复制,LUA脚本, LRU驱动事件,事务和不同级别的 磁盘持久化, 并通过 Redis哨兵和Cluster提供高可用性。
由于其支持多种存储格式,对高并发读写的优秀支持以及高可用使得redis逐渐成为最广泛使用的nosql数据库.
redis的官方网站
非常建议在安装和使用之前先看一下官方文档,里面对于redis安装和使用过程有非常明确的指导,是最有价值和最有参考意义的.
如果英文好的话可以看英文文档,地址:
https://redis.io/
如果看英文比较吃力,也有中文社区
http://www.redis.cn/
redis单机版安装
- 检查是否安装gcc等依赖:
yum list installed | grep gcc
yum list installed | grep pcre-devel
yum list installed | grep zlib-devel
yum list installed | grep openssl-devel
如果没有安装需要安装:
yum -y install gcc pcre-devel zlib-devel openssl openssl-devel
- 上传附件redis文件夹
解压redis,安装到/app/redis目录
tar -zxvf redis-3.2.1.tar.gz -C /app
cd /app/redis-3.2.1
make
make install PREFIX=/app/redis
- 启动redis
进入redis安装目录
cd /app/redis/bin
./redis-server
- 查看redis进程
ps -ef|grep redis
如果有redis进程号存在证明安装成功了
redis cluster集群安装
集群安装很简单,但是不同的版本有不同的安装方式
1. 集群安装的准备工作
-
创建cluster
cd /app/redis/bin mkdir redis_cluster cd redis_cluster mkdir 7001 mkdir 7002 mkdir 7003 mkdir 7004 mkdir 7005 mkdir 7006
注: 如果在不同的服务器下安装redis集群就将对应的cluster文件夹创建到该服务器下
-
修改redis.conf
复制redis.conf文件到集群目录下cp /app/redis-3.2.1/redis.conf /app/redis/bin/redis_cluster/7000 vi redis.conf
修改如下:
daemonize yes bind 192.168.56.101 #绑定的ip,一定要修改 pidfile /var/run/redis_7000.pid #生成的唯一标识,一定要修改成不同的 logfile "/app/redis/redis_log/redis_7000.log" #根据需要修改 dir "/app/redis_db" #可以不修改 port 7000 #根据规划修改 cluster-enabled yes #开始集群,一定要修改 cluster-config-file nodes_7000.conf #自动生成配置文件,一定要修改 cluster-node-timeout 5000 #超时时间,根据需要修改 appendonly yes #打开aof持久化策略 # 新增配置 masterauth "yourpassword" #根据需要新增,如果你的redis需要密码则需要此项 requirepass "yourpassword" #需要密码登录
-
启动节点
检查是否开启了防火墙:systemctl status firewalld
如果开启了要开放对应的两个端口如:7001,17001
例:
添加指定需要开放的端口:firewall-cmd --add-port=7001/tcp --permanent firewall-cmd --add-port=17001/tcp --permanent
重载入添加的端口:
firewall-cmd --reload
查询指定端口是否开启成功:
firewall-cmd --query-port=7001/tcp firewall-cmd --query-port=17001/tcp
-
启动redis节点
redis-server redis_cluster/7001/redis.conf -
依次配置好剩下的节点
2. redis5以前版本的集群启动
- 安装ruby和rubygem
-
离线安装
-
下载redis.gem
上传准备的包,解压并安装(具体版本可以在官网中找到)
https://gems.ruby-china.com/search?utf8=%E2%9C%93&query=redis
点进去以后
选择自己的版本点进去,下载
-
下载ruby
当执行以下语句时会提醒你当前版本所需要的ruby最低版本gem install redis
ERROR: Error installing redis: redis requires Ruby version >= 2.3.0
到ruby的官方网站去下载对应的包,至少要大于提示的最低版本
http://www.ruby-lang.org/en/downloads/
-
下载rubygem
https://rubygems.org/pages/download
-
安装
(1)rubytar -xvf ruby-2.3.0.tar.gz -C /app/ cd /app/ruby-2.3.0/ ./configure make && make install
检查是否成功
ruby -v
(2) rubygem
tar -xvf rubygems-2.3.0.tgz -C /app/ cd /app/rubygems-2.3.0/ ruby setup.rb
(3) redis gem模块
上传redis-3.3.1.gem到/app/rubygems-2.3.0/下gem install -l ./redis-3.3.1.gem
-
RVM安装
可以参考其他博客教程
Redis集群环境Ruby必须版本2.2以上解决(4)修改配置
powershell find / -name client.rb
找到位于此目录下的文件:lib/redis/client.rbvi /usr/local/lib/ruby/gems/2.3.0/gems/redis-3.3.1/lib/redis/client.rb
修改password
(5) 启动集群
进入redis源包下cd /app/redis-3.2.1/src
创建并启动集群
./redis-trib.rb create -a yourpassword --replicas 1 192.168.75.23:7001 192.168.75.24:7004 192.168.75.24:7003 192.168.75.25:7006 192.168.75.25:7005 192.168.75.23:7002
注:
-
-a:密码
-
--replicas:副本数量(1为每个主节点有一个子节点)
- 集群按照一定的规则创建主备节点,写在前面的为主节点,紧跟其后的是它的从节点
(但存在一定的可能redis没有按照这个规则创建,后面会介绍怎么手动修改主备节点) - 主备节点的创建原则:
(1) 至少需要6个节点(三主三从)
(2) 根据redis选举机制,创建集群时尽量不让主节点都在一台机器上,或者一台机器上拥有超过半数的主节点
(3) 主节点的从节点需要分布在其他服务器上,如:192.168.75.23:7001的从节点应该为192.168.75.24:7004
(6)节点加入集群
- 进入redis安装目录
cd \app\redis\bin
- 登录子节点
redis-cli -h 192.168.75.23 -p 7001 -c
- 输入命令
每个服务器节点都meet一遍然后等待连接成功auth yourpassword cluster meet 192.168.75.24 7004
(7)测试集群是否创建成功
在redis中输入set命令,如果执行成功,集群创建成功 -
3. redis5及以后版本的集群启动
进入redis源包下
cd /app/redis-3.2.1/src
创建并启动集群
redis-cli -a yourpassword --cluster create --cluster-replicas 1
10.128.52.33:7001 10.128.52.34:7004 10.128.52.34:7003 10.128.52.35:7006 10.128.52.35:7005 10.128.52.33:7002
4. 主从节点的手动切换
- 从节点的手动切换
查看主从节点信息
cluster slots
如果发现有主节点的从节点是当前服务器的,需要手动将其他服务器的从节点更改为自己的从节点.
假设:
192.168.75.23 7001的从节点为192.168.75.23 7002,现在需要将192.168.75.24 7004更改为192.168.23 7001的从节点
操作如下:
登录192.168.75.24 7004,执行命令(masterid就是上图中的节点id,这里需要输入7001的节点id)
cluster replicate masterid
依次更换好其他从节点
再次执行 cluster slots查看集群信息
-
主节点的切换
一般不会出现redis主节点分配到同一台服务器的情况,但是如果出现了就需要重新分配主节点.- 如果是刚开始创建的集群,建议删除所有的db文件和生成的节点文件,直接重新创建集群;
- 但如果是无法停止redis服务并重新创建集群,那么就需要手动切换:
redis没有直接更换主节点的命令,手动更新主节点非常麻烦. - 如果该主节点的的从节点位于其他服务器,可以手动下线该主节点,sentinel将自动将从节点变更为主节点,重启原先的主节点以后将自动变成原从节点(现主节点)的从节点
- 如果情况更复杂一点,提供以下思路供参考:
(1) 在需要创建主节点的服务器新建一个节点(如75.24:7007),启动,并加入到当前集群
新增结束后执行新增主节点命令:
(2) 重新分配hash槽,将你要挪动的主节点的所有hash槽全部迁移到新主节点上redis-trib.rb add-node 192.168.75.24:7007 //redis5以后用redis-cli redis-cli add-node 192.168.75.24:7007
redis-trib.rb reshard 192.168.75.24:7003 //可以为任意的节点 在此登录的7003只是作为客户端去访问的 //redis5以后同样用redis-cli
原主节点有多少个就填多少个
等待一段时间之后按照以下输入
完成后检查集群
分配成功后下线原来的主节点cluster slots
-
以下是我觉得写的比较清晰的文章,推荐一下,可以看看
什么是redis的文件事件处理器
redis是单线程还是多线程
redis事件操作为什么选择单线程总结一下:
redis是单线程模型,但是仅仅是文件事件分派时使用单线程,而在I/O操作时为了提高效率在4版本以后采用了多线程.
redis执行事件时不需要通过多线程提高效率,因为内存操作本来就非常快,而多线程频繁切换上下文反而会影响效率. 但是redis的瓶颈在内存和io.内存不用说,但单线程的io如果网络不好导致单线程阻塞在那里,将会非常影响效率,所以在高版本中,采用多线程提高网络数据和协议的处理效率,降低网络阻塞对redis性能的影响