Redis数据库群集配置实例

redis群集介绍

  • redis群集有三种模式,分别是主从同步/复制、哨兵模式、Cluster,下面会讲解一下三种模式的工作方式,以及如何搭建Cluster群集
  • 通过持久化功能,redis保证了即使在服务器重启的情况下也不会丢失(或少量丢失)数据,因为持久化会把内存中的数据保存到硬盘上,重启会从硬盘上加载数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障等问题,也会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有一台服务器出现故障,其他服务器依然可以继续提供服务,为此,redis提供了复制(replication)功能,可以实现当一台数据库中的数据更新后,自动将更新的数据同步到其他数据库上。
  • 在复制的概念中,数据库分为两类,一类是主数据库(master),另一类是从数据(slave)。主数据可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库,而从数据库一般是只读的,并接受主数据同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库

主从复制:

  • 优势:支持主从复制,主机会自动将数据同步到从机,可以进行读写分离;为了分载master的读操作压力,slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由master来完成;slave同样可以接受其他slaves的连接和同步请求,这样可以有效的分载master的同步压力;master server是以非阻塞的方式为slaves提供服务,所以在master-slave同步期间,客户端仍然可以提交查询或者修改请求;slave server同样是以非阻塞的方式完成数据同步,在数据同步期间,如果有客户端提交查询请求,redis则返回同步之前的数据。
  • 缺点:redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复;主机宕机,宕机前有部分数据未能及时同步到从机,切换ip后还会引入数据不一致的问题,降低了系统的可用性;如果多个Slave断线了,需要重启的时候,尽量不要在同一时间段重启,因为只要slave重启,就会发送sync请求和主机全量同步;redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂

哨兵模式

  • 第一种主从同步/复制模式,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,比较费事,还会造成一段时间内服务不可用。所以更多时候,我们优先考虑哨兵模式
  • 哨兵模式是一种特殊的模式,首先redis提供了哨兵的命令,哨兵就是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待redis服务响应,从而监控运行的多个redis实例
  • 哨兵模式的作用:通过发送命令,redis服务器返回监控其运行状态,包括主服务器和从服务器;当哨兵检测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务,修改配置文件,让它们切换主机;
  • 然而一个哨兵进程对redis服务器进行监控,也可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式
  • 故障切换的过程:假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象称为主观下线,当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的
  • 哨兵模式的优势:哨兵模式是基于主从模式的,所有主从模式的优点,哨兵模式都具有;主从可以自动切换,系统更健壮,可用性更高
  • 哨兵模式的缺点:redis比较难支持在线扩容,在群集容量达到上限时在线扩容会变得很复杂

Cluster群集

  • redis的哨兵模式基本已经可以实现高可用、读写分离,但是在这种模式每台redis服务器都存储相同的数据,很浪费内存资源,所以在redis3.0上加入了Cluster群集模式,实现了redis的分布式存储,也就是说每台redis节点存储着不同的内容
  • 根据官方推荐,集群部署至少要3台以上的master节点,最好使用3主3从六个节点的模式。
  • Cluster群集由多个redis服务器组成的分布式网络服务群集,群集之中有多个master主节点,每一个主节点都可读可写,节点之间会相互通信,两两相连,redis群集无中心节点

实验:安装两台redis服务,一共6个节点,每台服务配置3个网卡模拟6个服务器节点

//安装环境依赖包
yum install gcc gcc-c++ make -y

//解压缩包
tar zxvf redis-5.0.7.tar -C /opt/

//编译安装
make
make PREFIX=/usr/local/redis/ install 

//执行脚本配置redis数据库
cd /opt/redis-5.0.7/utils/
./install_server.sh
一直回车-----path时添加
/usr/local/redis/bin/redis-server 

//主配置文件在
/etc/redis

/建立软连接便于系统识别命令文件
ln -s /usr/local/redis/bin/* /usr/local/bin

//查看服务是否开启 
netstat -ntap | grep 6379

//关闭服务
/etc/init.d/redis.6379 stop   

//开启服务
/etc/init.d/redis.6379 start

//修改主配置文件,群集服务器节点都要更改
vim /etc/6379.conf

注释掉bind项          //redis中bind 选项默认监听所有网卡
89/            	protected mode no  //关闭保护模式
93/            	port 6379
137/          	daemonize yes        //以独立进程启动
833/          	cluster-enabled yes //开启群集功能
841/ 	 	cluster-config-file nodes-6379. conf //开启群集名称文件设置
847/	 	cluster-node-timeout 15000               //开启群集超时时间设置
700/ 	 	appendonly yes                             //开启aof持久化

//重启服务
/etc/init.d/redis_6379 restart

//重启后会生成一个在/var/lib/redis/6379/
一个是appendonly.aof 文件
nodes-6379.conf //节点配置文件
dump.rdb 文件

主服务master配置:

//导入key文件
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3

//安装rvm
curl -sSL https://get.rvm.io | bash -s stable
  • //访问:https://get.rvm.io复制脚本文件
#!/usr/bin/env bash

shopt -s extglob
set -o errtrace
set -o errexit
set -o pipefail

rvm_install_initialize()
{
  DEFAULT_SOURCES=(github.com/rvm/rvm bitbucket.org/mpapis/rvm)

  BASH_MIN_VERSION="3.2.25"
  if
    [[ -n "${BASH_VERSION:-}" &&
      "$(\printf "%b" "${BASH_VERSION:-}\n${BASH_MIN_VERSION}\n" | LC_ALL=C \sort -t"." -k1,1n -k2,2n -k3,3n | \head -n1)" != "${BASH_MIN_VERSION}"
    ]]
  then
    echo "BASH ${BASH_MIN_VERSION} required (you have $BASH_VERSION)"
    exit 1
  fi

  export HOME PS4
  export rvm_trace_flag rvm_debug_flag rvm_user_install_flag rvm_ignore_rvmrc rvm_prefix rvm_path

  PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
}

log()  { printf "%b\n" "$*"; }
debug(){ [[ ${rvm_debug_flag:-0} -eq 0 ]] || printf "%b\n" "$*" >&2; }
warn() { log "WARN: $*" >&2 ; }
fail() { fail_with_code 1 "$*" ; }
fail_with_code() { code="$1" ; shift ; log "\nERROR: $*\n" >&2 ; exit "$code" ; }

rvm_install_commands_setup()
{
  \which which >/dev/null 2>&1 || fail "Could not find 'which' command, make sure it's available first before continuing installation."
  \which grep >/dev/null 2>&1 || fail "Could not find 'grep' command, make sure it's available first before continuing installation."
  if
    [[ -z "${rvm_tar_command:-}" ]] && builtin command -v gtar >/dev/null
  then
    rvm_tar_command=gtar
  elif
    ${rvm_tar_command:-tar} --help 2>&1 | GREP_OPTIONS="" \grep -- --strip-components >/dev/null
  then
    rvm_tar_command="${rvm_tar_command:-tar}"
  else
    case "$(uname)" in
      (OpenBSD)
        log "Trying to install GNU version of tar, might require sudo password"
        if (( UID ))
        then sudo pkg_add -z gtar-1
        else pkg_add -z gtar-1
        fi
        rvm_tar_command=gtar
        ;;
      (Darwin|FreeBSD|DragonFly) # it's not possible to autodetect on OSX, the help/man does not mention all flags
        rvm_tar_command=tar
        ;;
      (SunOS)
        case "$(uname -r)" in
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值