【阿里云ECS服务器Linux安装Redis】CentOS上Redis安装与配置


最近买了阿里云服务器,打算自己搭建一套完整java技术链【如有问题欢迎大家指正】,下面是今天在【阿里云ECS】CentOS上Redis安装与配置的操作说明,中间遇到了三个问题已经解决。

PS:关于集群部署、哨兵模式配置等等后续会陆续补充,当前仅针对redis部署及简单配置使用以及Another.Redis.Desktop.Manager客户端的连接。

1. Redis下载与安装

我的Centos版本: CentOS 8.0 64位
我下载的redis版本:redis-6.0.1 【不同版本目录可能有些不同,不过基本原理都一样】

1.1 安装gcc环境

yum install gcc-c++

1.2 进入到目录/usr/local/redis,到 redis官网 获取redis下载地址,然后wget安装

在这里插入图片描述

cd /usr/local/redis
wget http://download.redis.io/releases/redis-6.0.1.tar.gz

1.3 解压安装包

tar -zxvf redis-6.0.1.tar.gz

在这里插入图片描述

1.4 进入到cd redis-6.0.1编译并安装

make
make install 

注意:redis主要工具文件都在src目录下,如: redis-server,redis-cli,redis-benchmark,redis-check-aof,redis-check-rdb,redis-sentinel
在这里插入图片描述

这时可以先起服验证一下
起服:redis-server redis.conf
打开cli客户端:redis-cli
ping一下打印出PONG说明安装成功了
在这里插入图片描述

2. Redis配置文件调整

2.1【防火墙】配置阿里云安全策略6379端口

阿里云服务器上装redis,推荐不要关闭防火墙,只需要新增安全组规则6379
在这里插入图片描述

2.2 开启远程链接:到安装目录cd /usr/local/redis/redis-6.0.1下修改配置文件redis.conf

vi redis.conf
  • 输入i 回车进行编辑
    将 bind 127.0.0.1注释掉,并加一行将 bind 127.0.0.1改为自己的IP+127.0.0.1如下
    在这里插入图片描述
    PS:redis bind表示的是指定本机可以接受连接的网卡地址,不是绑定外部服务器的IP,而是绑定本机可以接受访问的IP;
    一开始第二行没有注释掉,但是不知道为啥这样RedisDesktopManager就没发链接,后来注释掉之后就好了,暂时没有理解,有明白的可以给小编讲解一下,谢谢。
  • 默认为保护模式把 protected-mode yes 改为 protected-mode no
  • 默认为不守护进程模式,把daemonize no 改为daemonize yes变为后台启动
  • requirepass foobared前的“#”去掉,foobared改为你想要设置的密码即可
  • 最后输入:wq回车保存,就可以在客户端登陆了

3. Redis停起服务与验证

3.1 带配置文件起服

这样上面的配置就直接生效了,当然也可以带参数起服,也可以达到同样效果

redis-server redis.conf

在这里插入图片描述

3.2 开启cli客户端

redis-cli

在这里插入图片描述

3.3 密码登录

auth 密码
或直接输入:redis-cli -a 密码

在这里插入图片描述

3.4 验证

1、ping
在这里插入图片描述
2、设置个值然后查询

set name "test"
get name

在这里插入图片描述

  • 停服
redis-cli shutdown

4. Another.Redis.Desktop.Manager客户端工具使用

`这里小编强烈推荐windows客户端工具👍《Another.Redis.Desktop.Manager》,不要用《RedisDesktopManager》, 经过对比,前者十分好用👍
废话少说直接上图,如何配置小编已经在图中标注好了
在这里插入图片描述
链接成功后看一下咱们上面设置的test值把
在这里插入图片描述

5. Redis主从部署与哨兵模式

5.1 Redis 主从部署、主从复制

小知识点:Redis 多路复用【本制轮询API】, 单线程、高并发使用非阻塞IO

5.1.1 配置方式

假设我有三个redis实例,地址分别如下【小编资源有限,用一个虚拟机配置了,大家了解原理即可,也可以多个虚拟机玩】

192.168.91.128:6379   
192.168.91.128:6380   
192.168.91.128:6381
  1. 将 redis.conf 文件更名为 redis6379.conf,方便我们区分,然后把 redis6379.conf 再复制两份, 分别为 redis6380.conf 和 redis6381.conf。如下
    在这里插入图片描述
  2. 打开 redis6379.conf,将如下配置均加上 6379,(默认是6379的不用修改),如下:
port 6379
pidfile /var/run/redis_6379.pid 
logfile "6379.log" 
# RDB 快照文件
dbfilename dump6379.rdb 
# AOF 命令备份文件
appendfilename "appendonly6379.aof"
  1. 同理,分别打开 redis6380.conf 和 redis6381.conf 两个配置文件,将第二步涉及到 6379 的分别 改为 6380 和 6381。
  2. 输入如下命令,启动三个redis实例:
[root@localhost redis-4.0.8]# redis-server redis6379.conf 
[root@localhost redis-4.0.8]# redis-server redis6380.conf 
[root@localhost redis-4.0.8]# redis-server redis6381.conf
  1. 输入如下命令,分别进入三个实例的控制台:
[root@localhost redis-4.0.8]# redis-cli -p 6379
[root@localhost redis-4.0.8]# redis-cli -p 6380
[root@localhost redis-4.0.8]# redis-cli -p 6381
  1. 此时我就成功配置了三个redis实例了。 6. 假设在这三个实例中,6379 是主机,即 master,6380 和 6381 是从机,即 slave,那么如何配 置这种实例关系呢,很简单,分别在 6380 和 6381 上执行如下命令:
127.0.0.1:6381> SLAVEOF 127.0.0.1 6379 
OK

这一步也可以通过在两个从机的 redis.conf 中添加如下配置来解决:
# replicaof <masterip> <masterport> 注释放开,改成主机IP PORT

replicaof 127.0.0.1 6379
  1. 所有实例都打开 master 密码配置(否则链接不上,后面哨兵也需要此配置) redis.conf
    # masterauth <master-password>注释放开,改成自己密码如下
masterauth 密码
  1. 主从关系搭建好后,我们可以通过INFO replication命令可以查看每个实例当前的状态,如下: 3
    role:master ——> 表示当前机为主机
    connected_slaves:2 ——> 有两个从机
127.0.0.1:6379> INFO replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=56,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=56,lag=0
master_replid:26ca818360d6510b717e471f3f0a6f5985b6225d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56

5.1.2 复制原理

  • master 都有一个 replication ID, 当有数据改变时,记录偏移量,发送给 slave,步骤如下:

    1. slave 启动成功连接到 master 后会发送一个 sync 命令。
    2. Master 接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令。
    3. 在后台进程执行完毕之后,master 将传送整个数据文件到 slave,以完成一次完全同步。
    4. 全量复制:而 slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中。
    5. 增量复制:Master 继续将新的所有收集到的修改命令依次传给 slave,完成同步。
    6. 但是只要是重新连接 master,一次完全同步(全量复制)将被自动执行。
  • 常规主从结构
    在这里插入图片描述

  • 一主二仆的主从复制
    6380 此时的角色是一个从机,它的主机是 6379,但是 6380 自己也有一个从机,那就是 6381.
    在这里插入图片描述

5.2 Redis 哨兵模式Sentinel【投票选举】

  1. 发现问题-主观下线和客观下线
    主观下线和客观下线。当有一台 Sentinel 机器发现问题时,它就会主观对它主观下线,但是当多个 Sentinel 都发现有问题的时候,才会出现客观下线。
  2. 投票选举
    主要讲的是领导者选举,如何在 Sentinel 内部多台节点做领导者选举,选出一个领导者。
  3. 解决问题-故障转移
    就能获得 Master断掉 -> 选出新的 Master -> 同步 -> 旧 Master 恢复后成为 Slave,同时同步新的 Master数据这样一整套的流程。

按照前面的主从机制,如果master宕机了,就没有master了,可以通过哨兵模式解决群龙无首问题。

  • 在一主二仆模式基础上,然后在 redis 目录下打开sentinel.conf 文件,做如下配置:

    其中 mymaster 是给要监控的主机取的名字,随意取,后面是主机地址,最后面的 2 表示有多少个 sentinel 认为主机挂掉了,就进行切换(我这里只有一个,因此设置为1)
    注意:
    1. 所有的实例均配置 masterauth (在 redis.conf 配置文件中)
    2. 所有实例均需要配置绑定地址【自己的服务IP】:bind 192.168.91.128 , 否则java客户端连接会有问题
    3. 另外,哨兵配置的时候,监控的 master 也不要直接写 127.0.0.1,按如下方式写

sentinel monitor mymaster 127.0.0.1 6379 1
  • 启动哨兵模式
redis-sentinel sentinel.conf
  • 验证
    然后启动我们的一主二仆架构,启动成功后,关闭 master,观察哨兵窗口输出的日志,如下:
    可以看到,6379 挂掉之后,redis 内部重新举行了选举,6380 重新上位。此时,如果 6379 重启,只能屈身做一个 slave 了。
    在这里插入图片描述

5.2.1 Jedis 操作哨兵模式

启动前面配置好的三个 redis 实例,同时启动哨兵

public class Sentinel {
    public static void main(String[] args) {
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(10);
        config.setMaxWaitMillis(1000);
        String master = "mymaster";
        Set<String> sentinels = new HashSet<>();
        sentinels.add("192.168.91.128:26379");
        JedisSentinelPool sentinelPool = new JedisSentinelPool(master,
sentinels, config, "javaboy");
        Jedis jedis = null;
        while (true) {
            try {
                jedis = sentinelPool.getResource();
                String k1 = jedis.get("k1");
                System.out.println(k1);
           } catch (Exception e) {
                e.printStackTrace();
           } finally {
                if (jedis != null) {
                    jedis.close();
               }
                try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
                    e.printStackTrace();
               }
           }
       }
   }
}

5.2.1 SpringBoot 操作哨兵模式

  • 添加 SpringBoot 依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • yml配置 Redis 连接

PS: 多个哨兵 nodes 用逗号隔开

spring:
 redis:
   password: javaboy
   timeout: 5000
   sentinel:
     master: mymaster
     nodes: 192.168.91.128:26379
  • 测试代码
@SpringBootTest
class SentinelApplicationTests {
    @Autowired
    StringRedisTemplate redisTemplate;
    @Test
    void contextLoads() {
        while (true) {
            try {
                String k1 = redisTemplate.opsForValue().get("k1");
                System.out.println(k1);
           } catch (Exception e) {
           } finally {
                try {
                    Thread.sleep(5000);
               } catch (InterruptedException e) {
                    e.printStackTrace();
               }
           }
       }
   }
}

6. 集群部署-去中心化-投票选举

6.1 集群原理

Redis 集群架构如下图:
在这里插入图片描述
Redis 集群运行原理如下:

  1. 所有的 Redis 节点彼此互联( PING-PONG 机制),内部使用二进制协议优化传输速度和带宽
  2. 节点的 fail 是通过集群中超过半数的节点检测失效时才生效
  3. 客户端与 Redis 节点直连,不需要中间 proxy 层,客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
  4. Redis-cluster 把所有的物理节点映射到 [0-16383] slot 上, cluster (簇)负责维护 node<->slot<->value 。Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,Redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,Redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

6.2 怎么样投票

投票过程是集群中所有 master 参与,如果半数以上 master 节点与 master 节点通信超过 cluster-node-timeout 设置的时间,认为当前 master 节点挂掉。

6.3 怎么样判定节点不可用

1.如果集群任意 master 挂掉,且当前 master 没有 slave, 集群进入 fail 状态,也可以理解成集群的 slot 映射 [0-16383] 不完整时进入 fail 状态。
2.如果集群超过半数以上 master 挂掉,无论是否有 slave ,集群进入 fail 状态,当集群不可用时,所有对集群的操作做都不可用,收到 ((error) CLUSTERDOWN The cluster is down) 错误。

6.4 ruby 环境

Redis 集群管理工具 redis-trib.rb 依赖 ruby 环境,首先需要安装 ruby 环境:
注意:5版本后redis不需要安装ruby, 后文中命令./redis-trib.rb 是指ruby命令,如果redis5版本改为 redis-cli --cluster

yum install ruby
yum install rubygems

但是这种安装方式装好的 ruby 版本可能不适用,如果安装失败,可以参考这篇文章解决 redis requires Ruby version >= 2.2.2。

6.5 集群搭建

  1. 首先我们对集群做一个简单规划,假设我的集群中一共有三个节点,每个节点一个主机一个从机,这样我一共需要 6 个 Redis 实例(三主三从)。首先创建 redis-cluster/redis01 文件夹(我的目录是/usr/local/redis/redis-cluster/redis01),将 /usr/local/bin 目录下的 redis 文件全部拷贝到 redis01 下,用来存放我的 Redis 配置文件,如下:
    在这里插入图片描述
  2. 分别创建六个节点 conf, 26379—26384( 需要放开防火墙以及云服务安全组,同时放开总线端口36379-36384),并按照第四步分别修改各自配置文件端口;每个Redis集群中的节点都需要打开两个TCP连接。一个连接用于正常的给Client提供服务,比如26379,还有一个额外的端口(通过在这个端口号上加10000)作为数据端口,比如36379。第 二个端口(本例中就是36379)用于集群总线。
  3. 集群部署需要修改的配置文件(逐个节点调整端口,以下为 26379 示例)
# bind 127.0.0.1
port 26379
daemonize yes
# 写入pid 的文件位置
pidfile /var/run/redis_26379.pid
# 设置 redis 数据库的文件名字
dbfilename dump26379.rdb
masterauth 主机密码(不然主从切换时需要输入密码)
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
# 开启集群
cluster-enabled yes
# 集群配置的 nodes 文件
cluster-config-file /usr/local/redis/redis-cluster/nodesconf/nodes-26379.conf
# 连接超时时间
cluster-node-timeout 3000
protected no
  1. 执行 redis-cli -c -p 26379 即可进入redis(注意:一定要加上 -c 命令采用集群模式登录才行)
    进入redis 后,输入 auth 密码即可正常使用

  2. 进入 redis 解压目录 /usr/local/redis/redis-6.0.1/src,执行配置集群命令【附图】
    redis-cli -a sinosoft --cluster create --cluster-replicas 1 6.141.107.6:26379 6.141.107.6::26380 6.141.107.6::26381 6.141.107.6::26382 6.141.107.6::26383 6.141.107.6::26384
    在这里插入图片描述

  3. 注意,阿里云服务器搭建集群后,本地访问可能访问到内网ip,此时应查看 /usr/local/bin/nodes.conf
    逐个关闭节点,修改nodes.conf 中内网的ip,然后重启即可
    例如我配置的 node.conf 在 /usr/local/redis/redis-cluster/nodesconf 目录下生成

6.6 查询集群信息

集群创建成功后,我们可以登录到 Redis 控制台查看集群信息,注意登录时要添加 -c 参数,表示以集群方式连接,登录 redis-cli 后,通过 cluster nodes 查看节点cluster info 查看集群信息
启动成功后,我们可以查看 redis 进程,如下:
在这里插入图片描述

6.7 添加主节点

6.9 Jedis 操作 RedisCluster

public class RedisCluster {
    public static void main(String[] args) {
        Set<HostAndPort> nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.91.128", 26379));
        nodes.add(new HostAndPort("192.168.91.128", 26380));
        nodes.add(new HostAndPort("192.168.91.128", 26381));
        nodes.add(new HostAndPort("192.168.91.128", 26382));
        nodes.add(new HostAndPort("192.168.91.128", 26383));
        nodes.add(new HostAndPort("192.168.91.128", 26384));
        nodes.add(new HostAndPort("192.168.91.128", 7007));
        JedisPoolConfig config = new JedisPoolConfig();
        //连接池最大空闲数
        config.setMaxIdle(300);
        //最大连接数
        config.setMaxTotal(1000);
        //连接最大等待时间,如果是 -1 表示没有限制
        config.setMaxWaitMillis(30000);
        //在空闲时检查有效性
        config.setTestOnBorrow(true);
        JedisCluster cluster = new JedisCluster(nodes, 15000, 15000, 5,
"javaboy", config);
        String set = cluster.set("k1", "v1");
        System.out.println(set);
        String k1 = cluster.get("k1");
        System.out.println(k1);
   }
}

好了,redis 集群搭建我们先说这么多,有问题欢迎留言讨论。

7. 遇到的问题

7.1 bind将127.0.0.1配置

配置为自己IP后报错:redis Could not connect to Redis at 127.0.0.1:6379: Connection refused
将 bind 127.0.0.1 改为 bind 自己IP 127.0.0.1模式,不过后来小编把这也注释掉了,原因还没来得及查,大家可以研究一下。

7.2 DNS无法解析主机地址wget: unable to resolve host address “download.redis.io”

解决:编辑/etc/resolv.conf文件:
vim /etc/resolv.conf
增加Google的DNS服务器IP:

#google域名服务器
nameserver 8.8.8.8
nameserver 8.8.4.4

7.3 客户端界面工具连接问题Another.Redis.Desktop.Manager

解决redis desktop manager连接不上linux(centos8)上的redis服务;redis服务已启动,但是用redis desktop manager就是连接不上。
导致原因可能有以下几种:
1. 防火墙禁止了redis端口,可以配置防火墙6379端口, 对于阿里云用户可以配置安全组
2. Redis.conf 下 bind127.0.0.1要注释掉
3. Redis.conf 下 requirepass foobared配置密码
参考网友博客大家可以看一下: https://blog.csdn.net/qq_41986312/article/details/90903197?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

7.4 Linux内存分配策略:vm.overcommit_memory

  • 为什么要优化内存分配:fork进程分配内存不足导致,具体原因看下面的网址了解详情。这里小编直接告诉大家怎么配置 vm.overcommit_memory=1 。
    大家可以点击此链接参考了解详情: Redis的Linux系统优化
vm.overcommit_memory含义
0表示内核将检查是否有足够的可用内存。如果有足够的可用内存,内存申请通过,否则内存申请失败,并把错误返回给应用进程
1表示内核允许超量使用内存直到用完为止; 注意:本文的可用内存代表物理内存与swap之和。
2表示内核决不过量的(“never overcommit”)使用内存,即系统整个内存地址空间不能超过swap+50%的RAM值,50%是overcommit_ratio默认值,此参数同样支持修改
  • 两种报错信息示例
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk. Commands that may modify the data set are disabled, because this instance is configured to report errors during writes if RDB snapshotting fails (stop-writes-on-bgsave-error option). Please check the Redis logs for details about the RDB error.
# WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the 
command 'sysctl vm.overcommit_memory=1' for this to take effect.
  • 如何配置vm.overcommit_memory ?
    编辑 vi /etc/sysctl.conf
    添加 vm.overcommit_memory=1 或者 sysctl vm.overcommit_memory=1
    然后使用 sysctl -p 使新的参数生效
    在这里插入图片描述

参考网址

松哥:http://www.javaboy.org/2019/0615/redis-cluster.html

如果对你有帮助,支持一下吧,嘿嘿😊

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

领航猿1号

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值