redis集群( 缓存集群 )的安装配置
前言
redis集群的使用以及核心算法一致性hash问题:
链接: Redis分布式算法原理—Hash一致性理解.
一.单节点安装
- 首先下载redis
wget http://download.redis.io/releases/redis-5.0.7.tar.gz - 解压压缩包
tar -zxvf redis-5.0.7.tar.gz - yum安装gcc依赖
yum install gcc - 跳转到redis解压目录下
cd redis-5.0.7 - 编译安装
make MALLOC=libc - 将/usr/local/redis-4.0.6/src目录下的文件加到/usr/local/bin目录
cd src && make install
启动redis 方式
先切换到redis src目录下
方式一: 直接启动redis
./redis-server
方式二: 以后台进程方式启动redis(方式三同样需要修改redis.conf配置)
./redis-server ./redis-5.0.7/redis.conf
方式三: 开机自启
- 在/etc目录下新建redis目录
mkdir redis - 将/opt/redis-5.0.7/redis.conf 文件复制一份到/etc/redis目录下,并命名为6379.conf
cp /opt/redis-5.0.7/redis.conf /etc/redis/6379.conf - 将redis的启动脚本复制一份放到/etc/init.d目录下
cp /opt/redis-5.0.7/utils/redis_init_script /etc/init.d/redisd - 设置redis开机自启动
先切换到/etc/init.d目录下
cd /etc/init.d
执行自启命令
chkconfig redisd on
如果有错误: service redisd does not support chkconfig
使用vi编辑redisd文件,在第一行下面加入如下两行注释,保存退出
#chkconfig: 2345 90 10
#description: Redis is a persistent key-value database
意思: redis服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。
再次执行开机自启命令,成功
chkconfig redisd on
- 其它服务操作命令
ps -aux|grep redis 查看进程
service redisd start 启动服务
service redisd stop 关闭服务
ps:不建议使用kill -9杀死进程,这会导致redis服务非法的关闭,没有删除 pid文件,下次无法启动需要手动删除6379.pid文件
以上是redis单节点的安装配置,我们安装redis集群是3主3从的结构,由于我手里只有4个节点node1,node2,node3,node4所以在node1和node2上面进行伪分布式安装将两个从节点分别安装在node1和node2上。
二.redis集群的安装
为什么要用主从结构?
Redis主从复制的功能非常强大,它有以下好处:
1.避免Redis单点故障
2.构建读写分离架构,满足读多写少的应用场景,保证Redis的高可用,提高Redis的读写性能
1.主从架构
1.1 Redis主从架构拓扑图结构
分片及一致性hash
问题一: 在分片的集群中,如一台机器出问题,则会丢失数据,如何处理?
方案:结合上面的主从结构,读写分离来完成.,每个分片也是一个小集群,完成主从复制的过程
问题二: 分布式系统每个节点都有可能失效,并且新的节点很可能动态的增加进来的情况,如何保证当系统的节点数目发生变化的时候,我们的系统仍然能够对外提供良好的服务,那么这就是一致性hash算法的解决方案了.
2. 集群配置
先关闭node1上的redis准备配置成集群的环境
按照上面的单节点安装把其他3个节点也装上redis,修改配置并全部设置成开机自启动。
service redisd start启动4个节点的redis
ps aux|grep 6379 查看服务是否开启
关闭以下四个节点所有的服务.
service redisd stop
3. 安装ruby和ruby gem工具
(以下操作只需要在一台机器上安装即可,这里我选用 node2 上安装 )
-
在 redis安装目录的 src 目录下有一个文件: redis-trib.rb 这是一个ruby版的 redis服务安装脚本,为了使用它,请首先安装 ruby. 安装ruby和ruby gem工具(redis3集群配置需要ruby的gem工具,类似yum)
yum -y install ruby rubygems -
使用gem下载redis集群的配置脚本
gem install redis
(错误: 没有反应,访问不到 gem的源 解决方案: 使用淘宝的一个镜像就可以安装redis了)
gem sources -a https://ruby.taobao.org/
gem install redis
以上又出现了第二个错误: Fetching: redis-4.2.1.gem (100%)ERROR: Error installing redis:redis requires Ruby version >= 2.3.0.
(错误分析: ruby的版本太低了,要求 2.3以上,当前用命令查一下: ruby --version)
更新一下curl命令的协议版本
yum update -y nss curl libcurl
sudo yum update nss nss-util nss-sysinit nss-tools
修改hosts文件, 加上 美国的ip和raw.githubusercontent.com
sudo vi /etc/hosts sudo
在hosts文件中加入
199.232.68.133 raw.githubusercontent.com
- 安装RAM: RAM(Ruby Version Manager )是一款RAM的命令行工具,可以使用RAM轻松安装,管理Ruby版本。RVM包含了Ruby的版本管理和Gem库管理(gemset)
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
curl -sSL https://get.rvm.io | bash -s stable
(如果上面出错的话,请编辑一下 脚本文件 abc.sh 保存到 ~ 目录, 文件内容)
#!/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
(5.10)
log "Trying to install GNU version of tar, might require sudo password"