Redis离线搭建主从结构

版权声明:原创转载请注明出处,谢谢 https://blog.csdn.net/qq_21108311/article/details/84790307

最近给跟总公司那边做项目,权限管理比较严个,服务器不能链接外网没办法yum安装redis服务,写下这篇记录下离线搭建redis过程。

本次搭建的机器属性:centos7.2  root权限下,由于保密协议本文出现的ip地址为修改的虚假地址

redis搭建主从结构,安装包都是一样的,直接从官网下载稳定版本即可,最终主从的实现是通过修改配置文件达到的,redis官网下载地址为:https://redis.io/download

在安装redis之前,必须要先说明依赖;

有许多公司新上的服务器上安装的Linux都是精简版,可能连GCC等依赖都没有安装,若是在可以连网的情况下,可以直接yum install gcc安装依赖,但是本次是在离线下实现,这里顺带讲解下依赖的安装;


redis是基于c上运行的,如果服务器未安装GCC依赖,在编译redis阶段会报错:

/bin/bash:cc:未找到命令

在安装redis之前,我们先检查下服务器是否有安装GCC依赖:

命令:gcc -v

列:
[root@hb-docker17 bin]# gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC) 

如果服务器安装了gcc,则会有例子下的内容显示,如果没有安装GCC则会报错命令不存在

离线安装GCC:

我的GCC来源于centos镜像中的rpm包,当然也可以去网上下载对应的rpm包,为了和服务器版本一致,我下载了centos7.2的dvd镜像,解压得到package文件夹,该文件夹里有许多rpm包,我们需要找到如下图对应的rpm包并上传到服务器进行安装:

rpm包名称是:

mpfr-3.1.1-4.el7.x86_64.rpm
libmpc-1.0.1-3.el7.x86_64.rpm
kernel-headers-3.10.0-123.el7.x86_64.rpm
glibc-headers-2.17-55.el7.x86_64.rpm
glibc-devel-2.17-55.el7.x86_64.rpm
cpp-4.8.2-16.el7.x86_64.rpm
gcc-4.8.2-16.el7.x86_64.rpm

将这些包上传到服务器后,进入对应的目录执行命令安装:

rpm -ivh + 包名

或者使用统一安装命令:

rpm -Uvh *.rpm --nodeps --force

安装完成后,在执行 gcc -v 验证安装成功


安装完gcc后,就可以上传下载好的redis的tar包了,上传到服务器后解压:

tar -xzf redis-4.0.8.tar.gz

--这里我用的是4.0.8版本包

解压完后进入redis目录进行编译:

cd redis-4.0.8

编译,这里编译可以指定到一个文件夹,若不指定,这会直接安装到当前目录,建议有指定安装目录的情况
进行指定安装

编译:
make

如果编译通过,会出现:
......    
INSTALL redis-sentinel
    CC redis-cli.o
    LINK redis-cli
    CC redis-benchmark.o
    LINK redis-benchmark
    INSTALL redis-check-rdb
    INSTALL redis-check-aof

Hint: It's a good idea to run 'make test' ;)


进行编译测试:
make test

如果没有安装GCC,编译这里就会出现之前缺失GCC的报错日志

编译测试还会有一种报错情况出现:

error: jemalloc/jemalloc.h: No such file or directory
该报错原因是:
分配器allocator, 如果有MALLOC  这个 环境变量, 会有用这个环境变量的 去建立Redis。
而且libc 并不是默认的 分配器, 默认的是 jemalloc, 因为 jemalloc 被证明 有更少的 fragmentation problems 比libc。但是如果你又没有jemalloc 而只有 libc 当然 make 出错


解决方法:指定分配器
执行:
make MALLOC=libc

成功后会出现编译成功的提示:Hint: It's a good idea to run 'make test' ;)


编译完成后,安装redis,可以指定目录也可以不指定安装目录;
make install PREFIX=/data/redis  --可以只执行make install,安装到当前目录下

目前redis 已经安装成功了redis 的相关命令都存放在../redis-4.0.8/src(安装到当前目录下情况),同时在/usr/local/bin/ 目录下生成了如下文件:

[root@hb-docker02 bin]# ls
dump.rdb  redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli   redis-sentinel  redis-server

本次我是直接安装到当前目录,未指定到某个安装目录下

 到这里单机redis已经安装完成了,启动单机redis检查是否成功:

# 编译生成的可执行文件都在src目录下
cd src

#指定配置文件运行redis
./redis-server ../redis.conf

出现如下如显示:

由于启动redis不是后台启动,我们验证是否能使用端口,新开一个shell界面,进入到安装的src文件夹:

执行链接测试
./redis-cli -h 127.0.0.1 -p 6379

 能进入代表服务成功

ctrl+c退出redis,执行:

ps -ef|grep redis  

结果如下:

redis运行成功,目前我们配置的redis是在前台执行,接下来进行后台执行 配置;


切换回上一个shell页面,ctrl+c退出redis-server,或者在当前shell执行:./ redis-cli shutdown  关闭redis;

把安装包中的redis配置文件复制到安装完成路径bin目录下,之前已经说过会在/usr/local/bin目录下生成相关执行文件,需要把配置文件复制一份到该目录,之后我们从bin目录下进行启动;

命令:
cp /data/pkdata/redis-4.0.8/redis.conf /usr/local/bin


指定配置文件启动: ./redis-server  redis.conf

最后关闭redis,接下来准备主从配置


主从配置之前,首先各个服务器都需要之前步骤进行redis安装,各个服务器redis安装完成后,这里开始进行主从配置文件调整和主从链接;

在bin目录下编辑conf文件:

vim redis.conf

Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

参数1:daemonize no
     #修改为yes
     daemonize yes

绑定的主机地址,bind后面再添加主机的ip,后面主从复制 从Redis需要通过IP连接

参数2:
bind 127.0.0.1 90.101.22.3  --保密协议,IP这里不是我的真实ip

如果设置了bind 连接还不能生效,可以在配置文件中将redis保护模式关闭,但记得使用密码来保证安全性
可选参数:
protected-mode no

设置Redis 密码

参数3:
# requirepass foobared
  requirepass admin123

设置Redis 端口号,默认是6479,可以指定

参数4:
     port 6379

---------------主节点基本参数如上----------------------------------------------
--------------分割---------------------------从节点额外参数配置----------------

修改slave的redis配置文件

从节点额外参数1:
slaveof 90.101.22.3 6379 (映射到主服务器上,6379是端口号)

加入主节点的密码验证masterauth

从节点额外参数2:
masterauth admin123


接下来启动master服务:

在bin目录下执行: ./redis-server redis.conf 

ctrl+c退出服务让其后台运行

继续执行命令进入redis交互界面:./redis-cli

这里需要注意,如果我们redis配置文件没有配置密码,可以执行输入info参数即可查看redis信息,如果conf文件配置了密码,需要输入密码,否则会报错如下:

Redis (error) NOAUTH Authentication required

解决方法:

1、在交互界面 输入 auth admin123

2、在启动redis-cli时加入密码进行启动:./redis-cli -a admin123

输入info命令,显示如下:

在salve节点会显示role是salve,这里redis主从搭建成功;

注意为了之后的哨兵搭建,建议redis主从的密码一致;


redis远程链接

Redis 远程连接
用法:redis-cli [OPTIONS] [cmd [arg [arg …]]]

-h <主机ip>,默认是127.0.0.1

-p <端口>,默认是6379

-a <密码>,如果redis加锁,需要传递密码

–help,显示帮助信息

如:

redis-cli -h 90.101.22.3 -p 6379 -a admin123


如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接。另外,主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作。为了解决上面的这个不能自动进行故障转移的问题,在2.8版本之后redis正式提供了sentinel(哨兵)架构,关于哨兵,我准备单独写一篇进行记录

猜你喜欢

转载自blog.csdn.net/qq_21108311/article/details/84790307