redis配置、安装、集群
前言
Redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用。单节点的Redis已经就达到了很高的性能,为了提高可用性我们可以使用Redis集群。
当然了,现在集群的方式有很多,隧道模式(还有更高级的虚拟隧道模式)、行星模型、智能路由、P2P模式,各种各样的,算是各有各的好处吧,也有官方给了一种cluster工具,不过本文不用官方的,因为他的官方的这个是在一个服务器上折腾。。。一台机器死了,直接全崩,有点没必要,本文主要讲 主从模式的redis.
redis简介
-
分布式 -
- 所谓的分布式就是不是单独跑在一台服务器上的,不管公司花多少钱一台服务器多牛,它也是有极限的,1000t内存也是极限,所以单台服务器风险还是比较大的,万一它死了,整个公司完全瘫了也不合适。
- 所以分布式就是说让我这一个服务是部署在一个一个的服务器上,这样的话就算是有一个服务器因为各种各样的原因瘫了,没关系,继续跑,只不过整个系统性能会有所下降,然后过一段时间等这些节点重新恢复了它又可以接入分布式的系统当中。
-
内存数据存储 - noSQL
- 咱们知道跟数据库所有的打交道都需要用SQL语言来完成,结构化查询语言。
- 它有的时候也叫noSQL,因为咱们那个数据库,说实话它很强,各种关系,各种乱七八糟的东西,但是数据库,它更适合复杂的查询,对于简单的查询,性能反不如noSQL,因为noSQL是为了这种简单的 比如 key value对儿的这种简单查询优化过的。所以它的性能反而会更高,在这种场景下。
分布式原理
请求、数据、计算分散出去
比如有十个人,一人负责一种数据,现在有一堆数据在等着,数据末尾是1的找第一个人,数据末尾是2的找第二个人。。。说起来很简单,但是这个怎么分散,以及分散之后万一有人挂了备份怎么备,怎么找,备份机器也挂了该怎么办,学文还是很多的。
安装、配置redis
本文需要用到至少三个服务器最好是四个,因为一台单独的机器去控制方便查看,大家请自行配好防火墙网关等配置且克隆,如果遇到问题可留言
- 下载 - wget http://download.redis.io/releases/redis-5.0.5.tar.gz
- 解压 - tar -zxf redis-5.0.5.tar.gz
- 安装基础依赖
- yum install tcl gcc make -y
现在完这些后在服务器中先打开刚刚解压的redis文件:
cd redis-5.0.5
然后可以ls看一下里面的目录,有一个deps文件夹,也打开它:
cd deps
接下来咱们就可以make了,编译redis里的几个模块,它里面有四大模块,接下来还有另一件事,就是把这些编译好的模块组装成程序。在linux下很多东西都是这样,先编译再组装,很多玩法。
make hiredis jemalloc linenoise lua
安装
make install
配置redis
- ./install_server.sh
- 问题
- Please select the redis port for this instance: 指定一个端口
- Please select the redis config file name 指定一个配置文件
- Please select the redis log file name 指定一个日志文件
- Please select the data directory for this instance 指定磁盘文件的位置
- Please select the redis executable path 可执行文件放哪里
- 设置随机启动
systemctl enable redis_port
集群
前面说了分布式的原理,这里说一下,集群和分布式基本上是一个意思,但是集群可以代表除分布式以外的意思。
还拿之前分布式的例子来说,比如现在有三个服务,我需要 set 'name' 'aaa'
或者是 get name
这样一个操作,他会拿着你这个 key
,也就是例子说的 name
,去计算一个所谓的 crc
。 crc
是所谓的 循环冗余校验
是一种数据里常用的一种专门做散列、哈希的方法。说白了就是吧这个key转换成一个数字,转成一个数字之后会去%一个数,这个是redis自己定的,反正就是可能会有余数,比如%完之后是0的,找第0个服务,1的是第一个服务,大概是这意思。
而且,还有一个很重要的一点,就是备份,如果其中的一个挂了,服务要立刻去找别的机器上的这个服务,而且要交叉着备,全放在一个里也跟没做一样。
这种方案基本上能解决99%的错误了,因为硬件不可能经常坏,如果要99.999%,那可能就需要两套交叉备份方案,看个人需求。
咱们这边讲的主要是主从服务。比如说一台服务器里,开了两个,一个是主服务,一个是从服务,如果服务器挂了那肯定两个一块死,如果是主服务死了,那个从服务会立马跟上,变成主服务,过一会刚才死的主服务恢复了又回变成从服务,然后他继续运行。
redis集群配置
再次强调一下,配集群前最好准备四台虚拟机,最好网卡配上static,要不然每次重启会很抓狂
redis集群我比较喜欢手动配置,因为官方提供了一个一键配置的方法,但是它有个要求,这个集群必须工作在一台服务器上,这。。。纯属字就给自己找事儿干。直接开个进程完事儿了
然后先在一台机器上建一个配置文件,名字随便取,我比较喜欢叫 redis.conf
vim redis.conf
redis.conf
#端口7000
port 7000
#关闭保护模式——不带密码启动
protected-mode no
#集群特性启用
cluster-enabled yes
#存储节点信息配置文件——所有节点会互相同步
cluster-config-file nodes.conf
#存活时间——超过5s没有心跳自动删除节点并广播
cluster-node-timeout 5000
#只追加,不删除
appendonly yes
接下来,咱们就可以直接按着咱们的配置跑一下redis试一,直接
redis-server ./redis.conf
如果没问题的话,你会看到这个页面
刚才咱们说了咱们的模式是是主从模式,有了一个主节点之后,还需要一个从节点,直接
cp redis.conf redis2.conf
然后把 redis2.conf
里的端口改一下,改成你心动的那个数字,还有就是 cluster-config-file
这个配置文件也换一个名字,要不然启动的时候就报错了
接下来,就是scp 把这个 redis.conf
以及 redis2.conf
分别传到另外克隆的两台虚拟机上,这里就不多介绍了。
scp 本地文件路径 远程用户@服务器地址:对方服务器路径
最后的最后,就是启动咱们的集群了
顺便一说,如果走到这一步了你还没有开防火墙的话,并且没注意到我这句话你就要无比的酸爽了,因为意味着上边一半的步骤你要删了重来
直接每台服务器来一句
firewall-cmd --add-port=7000/tcp --permanent
firewall-cmd --add-port=17000/tcp --permanent
为什么开两个端口呢,因为redis定的。。。。
一个是你自己指定的,比如说7000,另一个就是你的数+ 10000
7000 是负责数据通信的
17000 专门来做命令通信的,走redis自己的一套协议
启动集群
redis-cli --cluster create 192.168.181.130:7000 192.168.181.130:7001 192.168.181.131:7000 192.168.181.131:7001 192.168.181.132:7000 192.168.181.132:7001 --cluster-replicas 1
–cluster 集群配置
create 创建
–cluster-replicas 1 集群冗余 1
这里把这些地址改成你虚拟机的地址即可
redis弱点——redis无法保证一致性
- set操作如果主节点成功,就会success
- 主节点自动去同步,如果没同步完主节点挂了
- 获取会得到以前的数据
原因:为了性能考虑
解决方法
- 关键数据不用redis
- set成功后不认为成功,get确认一下
参考微信头像换了之后偶尔换完了之后别人半天刷新不过来
redis主从模式脚本
上面扯了这么多,有很多东西是及其的不方便的,比如redis的控制,现在是三台服务器,100台一个个搞公司离职率会出奇的搞,所以干脆写一个脚本来统一控制一下会很方便。
这里我秉承这linux社区一向“会用用,不会用滚”的这么一个友好的态度,把脚本放出来大家自己会用用不会留言吧,反正我也不会看的。。。。。。
#!/usr/bin/env bash
if [ ! $1 ]
then
echo 'command:' $0 '[cmd]'
exit
fi
cmd=$1;
if [ $cmd == 'initall' ]
then
for item in `cat server_list.txt`
do
echo init $item;
scp redis_sh.sh root@$item:/root/;
ssh root@$item '/root/redis_sh.sh init 7000';
ssh root@$item '/root/redis_sh.sh init 7001';
done
elif [ $cmd == 'startall' ]
then
for item in `cat server_list.txt`
do
echo start $item;
ssh root@$item '/root/redis_sh.sh start 7000';
ssh root@$item '/root/redis_sh.sh start 7001';
done
elif [ $cmd == 'ps' ]
then
for item in `cat server_list.txt`
do
echo $item;
ssh root@$item 'ps -ef | grep [r]edis';
done
elif [ $cmd == 'stopall' ]
then
for item in `cat server_list.txt`
do
echo stopall $item;
ssh root@$item '/root/redis_sh.sh stopall';
done
elif [ $cmd == 'create' ]
then
servers=''
for item in `cat server_list.txt`
do
servers+=$item:7000' ';
servers+=$item:7001' ';
done
redis-cli --cluster create $servers --cluster-replicas 1
else
echo no this command: $1
fi
有什么感兴趣的,或者遇到什么问题可以直接加我好友,咱们一起沟通
微信:Dyy916829411
qq: 916829411