redis配置、安装、集群

前言


Redis 是咱们目前大规模使用的缓存中间件,因为它强大高效而又便捷的功能,获得了普遍的使用。单节点的Redis已经就达到了很高的性能,为了提升可用性咱们可使用Redis集群。 固然了,如今集群的方式有不少,隧道模式(还有更高级的虚拟隧道模式)、行星模型、智能路由、P2P模式,各类各样的,算是各有各的好处吧,也有官方给了一种cluster工具,不过本文不用官方的,由于他的官方的这个是在一个服务器上折腾。。。一台机器死了,直接全崩,有点不必,本文主要讲 主从模式的redis.node

redis简介


  • 分布式 - linux

    1. 所谓的分布式就是否是单独跑在一台服务器上的,无论公司花多少钱一台服务器多牛,它也是有极限的,1000t内存也是极限,因此单台服务器风险仍是比较大的,万一它死了,整个公司彻底瘫了也不合适。
    2. 因此分布式就是说让我这一个服务是部署在一个一个的服务器上,这样的话就算是有一个服务器由于各类各样的缘由瘫了,不要紧,继续跑,只不过整个系统性能会有所降低,而后过一段时间等这些节点从新恢复了它又能够接入分布式的系统当中。
  • 内存数据存储 - noSQLredis

    1. 我们知道跟数据库全部的打交道都须要用SQL语言来完成,结构化查询语言。
    2. 它有的时候也叫noSQL,由于我们那个数据库,说实话它很强,各类关系,各类乱七八糟的东西,可是数据库,它更适合复杂的查询,对于简单的查询,性能反不如noSQL,由于noSQL是为了这种简单的 好比 key value对儿的这种简单查询优化过的。因此它的性能反而会更高,在这种场景下。

分布式原理


请求、数据、计算分散出去数据库

好比有十我的,一人负责一种数据,如今有一堆数据在等着,数据末尾是1的找第一我的,数据末尾是2的找第二我的。。。提及来很简单,可是这个怎么分散,以及分散以后万一有人挂了备份怎么备,怎么找,备份机器也挂了该怎么办,学文仍是不少的。vim

安装、配置redis


本文须要用到至少三个服务器最好是四个,由于一台单独的机器去控制方便查看,你们请自行配好防火墙网关等配置且克隆,若是遇到问题可留言缓存

  1. 下载 - wget download.redis.io/releases/re…
  2. 解压 - tar -zxf redis-5.0.5.tar.gz
  3. 安装基础依赖
  4. yum install tcl gcc make -y

如今完这些后在服务器中先打开刚刚解压的redis文件: bash

cd redis-5.0.5
复制代码

而后能够ls看一下里面的目录,有一个deps文件夹,也打开它:服务器

cd deps
复制代码

接下来我们就能够make了,编译redis里的几个模块,它里面有四大模块,接下来还有另外一件事,就是把这些编译好的模块组装成程序。在linux下不少东西都是这样,先编译再组装,不少玩法。微信

make hiredis jemalloc linenoise lua
复制代码

安装markdown

make install
复制代码

配置redis

  1. ./install_server.sh
  2. 问题
  3. Please select the redis port for this instance:  指定一个端口
  4. Please select the redis config file name  指定一个配置文件
  5. Please select the redis log file name   指定一个日志文件
  6. Please select the data directory for this instance 指定磁盘文件的位置
  7. Please select the redis executable path  可执行文件放哪里
  8. 设置随机启动

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
复制代码

若是没问题的话,你会看到这个页面 image.png刚才我们说了我们的模式是是主从模式,有了一个主节点以后,还须要一个从节点,直接

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没法保证一致性


  1. set操做若是主节点成功,就会success
  2. 主节点自动去同步,若是没同步完主节点挂了
  3. 获取会获得之前的数据

缘由:为了性能考虑

解决方法

  1. 关键数据不用redis
  2. 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

相关文章
相关标签/搜索