本篇文章熬了一个下午,基本上会踩中的坑都中了,如果对您有帮助,请务必点个赞,多谢。
这里哪怕是不用云服务器,在本机搭建,然后还没了解过shell也是可以的。
redis简介
Redis(Remote Dictionary Server)远程字典服务。c语言开发的开源的高性能的高性能键值对数据库。
我们都知道,我们通过关系型数据库(mysql或者oracle)查询数据,实质上都是去取存放在硬盘中的数据,其中每一次IO操作都是比较消耗时间和资源的,因此关系型数据库都会拼命减少IO次数,因此,便诞生了redis,将数据存放在内存中,这样通过jedis或其他工具去读redis缓存就会舒服的多了。
redis安装
这个直接百度下载即可,因为后期会用shell脚本,所以下载的便是linux版,但其实,不管window版还是linux版,下载下来都是一个压缩包,解压即可使用,解压后如下图
window版
linux版
linux环境下redis的超详细安装与使用 点击以上链接即可,在此不做赘述。
集群的搭建
1)多份配置文件
很明显,因为端口号是唯一的,因此我们需要多份不同端口的配置文件,redis中,集群最少需要六个节点,三个master,三个slave。因此需要六份
#注:配置文件中不要加上需要密码才能访问
#1.复制redis.config文件到redis-6379.config,并将其中的注释,空行都去掉
cat redis.config |grep -v "#"|grep -v "^$"> redis-6379.conf
#2.在redis-6379.config中加上
cluster-enabled yes #开启集群功能
cluster-config-file nodes-6379.conf #集群中节点的文件名,诞生的配置文件会在src/下
cluster-node-timeout 5000 #节点超时时间5秒
#3.修改端口并创建多份配置文件
sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
sed "s/6379/6381/g" redis-6379.conf > redis-6381.conf
sed "s/6379/6382/g" redis-6379.conf > redis-6382.conf
sed "s/6379/6383/g" redis-6379.conf > redis-6383.conf
sed "s/6379/6384/g" redis-6379.conf > redis-6384.conf
tips:
- 这里所有节点要在同一网段下,所以,一个节点在百度云,一个节点在阿里云,这样是不行的,之后ruby开启集群时,会一直连不上
- 配置文件中bind绑定的ip要为0.0.0.0,因为bind绑定的地址是网卡上的ip才能正常启动,而很明显,我们在本地访问云上的redis集群时,用的都是公网ip,而服务器端可以使用ifconfig查看,是没有公网ip的。
2)编写redis服务器开启的shell脚本
shell脚本类似于window中的bat文件,通过编写脚本,便能使我们十多分钟的集群配置过程在几秒内完成。
#!/bin/bash
#我的redis解压后文件夹名称为redis-3.2.5,然后存放路径在/opt/下,熟悉shell的可以更改redis和start_path
#但如果对shell还不了解的请务必放在指定路径并且文件名为redis-3.2.5
redis="redis-3.2.5"
start_path="/opt/${redis}/src/"
for before in `ps -ef|grep 'redis-'|grep -v grep|awk '{print $2}'`
do
`kill -s 9 ${before}`
echo "先前已有进程,已清除"
done
for config in `find /opt/${redis}/ -name "redis-*.conf"`
do
`cd ${start_path}&&./redis-server ${config}`
echo "对应${config}配置已成功启动"
done
for port in `find /opt/${redis}/ -name "redis-*.conf"|grep -o "[0-9]\{4\}"|awk '{print $0}'`
do
`cd ${start_path}&&./redis-cli -p ${port} flushall`
`cd ${start_path}&&./redis-cli -p ${port} cluster reset`
echo "cluster reset"
done
`cd ${start_path}../&&rm -rf nodes-*.conf`
#编写脚本
vi start.sh #vim编辑器打开后将上面代码拷贝进去,复制以后在vim编辑器界面点击鼠标右键即可,然后保存退出编辑器
#赋予执行权限,注,本文中所有操作都是在root权限下
chmod u+x start.sh
#执行
./start.sh
此处为批量开启服务器,同时将服务器存储和节点信息情况
运行结果
使用ps -ef|grep redis-命令查看
第二列为进程号。
2)使用ruby开启集群
#安装ruby
sudo apt-get install ruby
#gem源安装redis
sudo gem install redis
#都安装成功后
cd src/
#执行以下命令
#开启集群
./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384
成功界面
3)重置脚本
#返回到redis的根目录,即/opt/redis3.2.5/
#创建重启脚本的所需要的变量
vi var.sh
#里面填入
#!/bin/bash
redis="redis-3.2.5"
oldip="127.0.0.1"
newip="106.12.77.187"
PID=()
port=()
flag=0
x=0
y=0
#创建重启脚本
vi reset.sh
#!/bin/bash
source var.sh
for fileName in `find /opt/${redis} -name '*nodes*.conf'`
do
`sed -i "s/${oldip}/${newip}/g" ${fileName}`
echo ${fileName}
done
for array in `ps -ef|grep 'redis-server'|grep -v grep|awk '{print $2;print $9}'`
do
if [ $flag -eq 0 ]
then
PID[x]=$array
flag=1
let "x++"
else
port[y]=${array: 0-4: 4}
flag=0
let "y++"
fi
done
for((i=0;i<${#PID[@]};i++))
do
`kill -s 9 ${PID[i]}`
done
echo "redis cluster 重启中"
for((i=0;i<${#PID[@]};i++))
do
`cd /opt/${redis}/src/&&./redis-server ../redis-${port[i]}.conf`
done
echo "redis cluster 重启成功"
#保存退出后,执行chmod u+x reset.sh
#然后./reset.sh 执行脚本
#因为在云服务器上时,集群所创建的节点配置文件中ip只适用于在云服务器上的redis客户端,因此我们要
#把它改成外网ip才能访问成功
4)在本地访问云服务器上的redis集群
我是在windows中用redis的客户端访问的
redis-cli.exe -c -h ip地址 -p 端口号
tips:
在redis集群中有这样一个概念,redis将整个存储的空间划成一个一个的slot(槽),总共有16383个,每个master节点都有一定数量的slots,当我们想存放一个值,例如set name zhangsan,在redis中会将键进行换算,并存入到对应的槽中
本次脚本都是在/opt/redis-3.2.5/下,执行ruby命令在/opt/redis-3.2.5/src下