有一天正在摸鱼 ,突然被领导告知 要搭建redis集群。
于是本着 积极向上的精神 。开始学习 百度 各种资料搭建
本机使用环境是vritualBox创建虚拟机 lunix Centos7版本 reids4.0.6
首先 先要安装redis到虚拟机中
我在/home下面上传了redis的gz安装包
一、安装主redis
进入/home路径下,解压缩安装包。
cd /home
# 解压命令
tar -zxvf redis-4.0.6.tar.gz
解压后在home文件夹下会粗现一个文件夹(就是我们刚才解压的)
然后 进入解压后的文件夹,开始编译安装
cd redis-4.0.6/
#编译后安装 安装到指定目录下
make PREFIX=/usr/local/redis install
我这里已经安装过了,就可以启动redis了 。
先进入刚才安装的目录下 ls查看下文件 可以看到有一个bin文件夹
我们把刚才/home/redis-***中的redis.conf复制过来,使用cp命令。
cp /home/redis-4.0.6/redis.conf /usr/local/redis/bin/
然后我们来查看下redis.conf中都有什么内容
首先我们要修改下访问策略 redis默认只能127.0.0.1的ip访问,使用vim或者vi编辑器,找到配置文件中的bind 将127.0.0.1注释掉 不限制ip访问限制(如果有需求可以设置)。
然后我们查看下是否允许远外部访问配置 protected-mode 属性 将yes修改为no
是否作为守护线程启动 daemonize属性 修改为yes。
这个时候就可以用命令行启动redis服务了.
redis-server /usr/local/redis/bin/redis.conf
这个时候如果需要设置密码的话的童鞋可以搜索下相关配置(我就不说了嗷) 。我们可以查看下防火墙是否开通了相应的端口(百度,百度,百度 不做延伸扩展)。
我是用的是rdm工具来访问redis 。
测试是否能连通 redis。这样 就做好了(主)redis 。
二、搭建(从)redis
如果我们需要把从redis搭建到同一台服务器的话 ,就可以用不同的配置文件来启动redis(一会说)。如果我们的从redis不在这台服务器上 ,那么我们就需要到从服务器上重新安装一遍redis。
我们接下来说说,怎么搭建从redis 以及 主从redis的配置文件到底哪里不一样:
我是在同一台服务器上搭建的从redis。那么为了方便管理配置文件。我在 /usr/local 路径下创建了一个文件夹。来管理从redis的配置文件
cd /usr/local/
mkdir redis-cluster
cd redis-cluster
#这里我创建三个从redis 那么管理配置文件的地方就创建了三个文件夹 文件夹名称为端口号
mkdir 8001 8002 8003
将redis.conf复制到每个文件夹中。
我们修改配置文件后启动:
#######################################
#修改端口为从redis端口 这里以8001为例
port 6379
修改为
prot 8001
#######################################
#######################################
#主redis 的连接地址 搜索关键词 slaveof
# slaveof <masterip> <masterport>
slaveof 192.168.0.115 6379
#######################################
#######################################
#如果主reids需要密码才能访问 修改这个地方 masterauth
# masterauth <master-password>
masterauth root
#######################################
#启动方式
redis-serve /usr/local/redis-cluster/8001/redis.conf
如果防火墙没有拦截端口的话。我们访问从redis所在服务器的ip 端口为刚才修改的8001 然后就可以连接了。如果连接成功
我们可以尝试在主redis中存入数据 从redis中 刷新会出现刚才主redis中的新增的数据 此时我们主从redis已经搭建好了
不过我们尝试往从redis中存入数据的时候。会发现 存不进去 报错 因为从redis只能读取 不能插入。
我们搭建主从redis后 会减少主redis的读取压力 。主redis中写入。从redis中读取。
redis主从复制的原理图
- 从数据库连接主数据库,发送SYNC命令;
- 主数据库接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主数据库BGSAVE执行完后,向所有从数据库发送快照文件,并在发送期间继续记录被执行的写命令;
- 从数据库收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主数据库快照发送完毕后开始向从数据库发送缓冲区中的写命令;
- 从数据库完成对快照的载入,开始接收命令请求,并执行来自主数据库缓冲区的写命令;(从数据库初始化完成)
- 主数据库每执行一个写命令就会向从数据库发送相同的写命令,从数据库接收并执行收到的写命令(从数据库初始化完成后的操作)
- 出现断开重连后,2.8之后的版本会将断线期间的命令传给重数据库,增量复制。
- 主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。Redis 的策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
优点:
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;
- 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成;
- Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力;
- Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求;
- Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据;
缺点:
- Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复;
- 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性;
- 如果多个Slave断线了,需要重启的时候,尽量不要在同一时间段进行重启。因为只要Slave启动,就会发送sync请求和主机全量同步,当多个 Slave 重启的时候,可能会导致 Master IO剧增从而宕机。
- Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂;
三、哨兵模式
对不起 我还没亲手搭建 不敢写
四、cluster集群
为了创建集群,首先我必须有一些以集群模式(cluster mode)运行的Redis实例。
下面是一个最小的Redis集群配置文件:
<--redis服务端口号-->
port 7000
<--是否启动集群模式 默认为注释-->
cluster-enabled yes
<--自动生成的配置文件 可以自定义名称 -->
cluster-config-file nodes.conf
<--过期时间 -->
cluster-node-timeout 5000
<--是否启动aof存储 具体查看参考文档 redis持久化的文档-->
appendonly yes
<--这个设置代表会在启动redis时所在目录生成rdm文件-->
dir ./
<--守护进程 如果你在同一台服务器来启动很多redis服务的话 需要修改这个名称 否则数据会错乱-->
pidfile /var/run/redis_6379.pid
<--如果使用cluster集群的话 我们必须注释掉主从复制中从redis中的slave配置 否则服务无法启动-->
slaveof ***.***.***.***:**
为了启动我们的集群 我们至少需要六个redis服务(三主三从)。
我是本地启动6个服务 那么我开始在我的/usr/local/redis-cluster(这个目录没有的话自己创建)下创建我的redis集群配置文件
我创建了 8000 8001 8002 8003 8004 8005 六个文件夹 ,将redis.conf文件分别复制到每个文件夹内。
启动redis服务时 可以看到每个服务的cluster-config文件中 暂时没出现集群的配置
最简单的实现是用redis-trib工具,它在src目录下。它是一个ruby程序,所以需要先安装ruby。
yum install ruby
yum install rubygems
gem install redis
#这个时候 可能会报错 于是,要升级Ruby版本
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
#下面这行curl也许会报错提示无法读取 将网址替换为
# https://raw.githubusercontent.com/rvm/rvm/master/binscripts/rvm-installer
curl -sSL https://get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm list known
rvm install 2.4.1
参考文档:
redis持久化(扩展阅读)
REDIS persistence -- Redis中国用户组(CRUG)
虚拟机xfs 恢复
redis主从复制的配置以及实现原理
redis集群启动成功后 关闭所有节点后重启 失败 提示 err slot xxx is already busy