redis 主从模式
单体应用,系统中只有一台redis服务器,只有一台时候有单点的问题。
redis升级 主从形式:
升级主从后,从redis 服务器不对外提供服务,只是从主服务器哪里同步数据;一旦主redis服务器不能提供服务后,前台运维人员手动切换直接配置调用从Redis服务器。
这样主从升级后还可以进行读写分离,让读取redis服务直接调用从redis服务器数据,写数据调用主Redis服务器。
但是这种方式需要运维人员手动切换主从模式。需要系统自动切换就需要哨兵模式。
redis 哨兵模式
一旦主redis服务挂了,哨兵节点会直接在redis服务器群中再次选举一个主redis服务。网络访问通过负载均衡直接先到哨兵节点。哨兵节点再次转发请求到redis服务器。
哨兵模式一大缺点是 :写的服务只有一台,哨兵节点(哨兵节点也可高可用部署,多实例)的单点问题,特别是在主从切换时候有访问瞬断的情况。
redis 高可用集群模式
源码安装步骤
第一阶段命令
- 安装好gcc编译器
- 下载redis 源码安装包
- 将下载的压缩包解压缩到一个目录下,
- 进入解压缩的目录,然后执行
make
命令 - 进入src目录下检查是有生成
redis-cli
和redis-server
文件命令文件 - 在src目录执行
sudo make install
命令检查是否可以输出如下信息说明执行源码安装成功了。
运维最佳实践
不想每次进入src目录下去执行redis-cli命令以及redis-server命令。一般运维人员会将常用命令已经配置文件拿出来放置在另外一个目录下:
新建etc目录和bin目录
redis-4.0.8 现在安装在目录/home/vc/dev/redis
目录下,在这个和redis-4.0安装目录下相同目录下新建etc目录当作redis配置文件的配置目录。新建bin目录当作启动的脚本的配置目录。
第二阶段命令 将配置文件复制一份到刚才新建的目录中
- 进入redis安装目录
cp redis.conf ../etc/
执行cp命令复制到刚才新建的etc目录。 - 进入redis安装目录下的src目录执行:
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server ../../bin/
命令将可执行命令复制到刚才新建的bin目录下。(修改配置文件项:daemonize yes
将redis以后台进程形式启动 ) - 进入bin目录:
redis-server ../etc/redis.conf
执行这个命令启动单个redis实例 - 通过
ps -ef | grep redis
命令或者netstat -tunpl| grep 6379
命令 检查是否有redis服务以及查看redis服务监听端口。 - 进入bin目录执行
redis-cli
命令执行redis客户端连接redis服务。并可以通过quit
命令断开和redis服务的连接 - 杀死redis服务进程
-
pkill redis-server
杀死redis-server 进程名称的进程 -
kill -9 进程号
-
redis-cli shutdown
命令也可以停止redis服务进程,但是有一个问题是必须进入到redis-cli命令所在目录。
-
上面已经对单实例redis已经启动起来了,下面搭建集群redis服务
集群的话,至少需要三个master主节点。为了集群选举
在单台机器上建立 “三主三从” 的 伪分布式Redis集群。
建立集群操作命令步骤 在/home/vc/dev/redis
目录下
-
mkdir redis-cluster
新建集群目录 - 进入redis-cluster目录 新建
mkdir 8001,mkdir 8002,mkdir 8003,mkdir 8004,mkdir 8005,mkdir 8006
新建六个目录分别放置六个redis实例的启动配置文件 -
把之前的redis.conf配置文件copy 到 8001目录下,修改如下命令参数
daemonize yes
-
port 8001
-
bind 192.168.0.5
绑定当前redis 的ip地址,redis服务监听当前主机的192.168.0.5网络端口请求。 -
dir /home/vc/dev/redis/redis-cluster/8001
指定数据持久化文件存放位置 -
cluster-enabled yes
开启集群模式 -
cluster-config-file nodes-8001.conf
(集群每个节点有一个集群配置文件,这里800X最好和port对应上) -
cluster-node-timeout 5000
集群节点间通信的超时时间限制(毫秒) -
appendonly yes
表示日志是尾加的日志信息。 - 设置每个节点redis日志存放位置
logfile "/home/vc/dev/redis/redis-cluster/8006/redis-8006.log"
文件安装redis-8xxx.log命令,以端口结尾。
将8001目录下修改后的配置文件,分别复制到800x目录下,然后对每个配置文件进行修改,只需要修改 第 2, 4, 6 项里面的端口号即可,可以用批量替换
Linux下文本批量修改
:%s/源字符串/目的字符串/g
:%s/8001/8005/g
- 分别启动 6个redis实例
/home/vc/dev/redis/bin/redis-server /home/vc/dev/redis/redis-cluster/8006/redis.conf
-
由于redis 3.0之后官方提供了搭建集群的ruby脚本,所以需要安装ruby命令
sudo apt-get install ruby
-
sudo apt-get install rubygems
ruby插件 -
sudo gem install redis
这步出错了。redis requires Ruby version >= 2.2.2.
ruby 需要2.2.2版本的,现在是1.8.7版本。更新ruby版本可以先安装RVM–> ubuntu_rvm去管理ruby版本升级,目前没有成功。
1.不通过RVM,直接手动更新ruby 到2.4 命令脚本:使用brightbox ppa仓库安装
$ sudo apt-add-repository ppa:brightbox/ruby-ng $ sudo apt-get update $ sudo apt-get install ruby2.4 $ ruby -v
将创建的六个单独运行实例 联合起来成为redis集群实例
- 进入redis安装目录
/home/vc/dev/redis/redis-4.0.8/src
执行如下命令:./redis-trib.rb create --replicas 1 192.168.0.5:8001 192.168.0.5:8002 192.168.0.5:8003 192.168.0.5:8004 192.168.0.5:8005 192.168.0.5:8006
创建集群成功
验证集群
- 通过局域网里面任何的客户端机器连接机器中任务一个redis节点即可。
redis-cli.exe -c -h 192.168.0.5 -p 8006
(-c 表示以连接的是集群节点,注意每个节点都设置为监听192.168.0.5网络端口网络请求,所以redis-cli连接-h 参数务必写bind 参数设置的网络端口。)
java 代码连接集群库并测试设置kv值
package org.vincent;
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
/** * @Package: org.vincent <br/> * @Description: TODO <br/> * @author: PengRong <br/> * @Date: Created in 2018/6/3 1:44 <br/> * @Company: PLCC <br/> * @Copyright: Copyright (c) 2018 <br/> * @Version: 1.0 <br/> * @Modified By: <br/> * @Created by PengRong on 2018/6/3. <br/> */
public class RedisCluster {
public static void main(String[] args){
Set<HostAndPort> jedisConfig=new HashSet<>();
jedisConfig.add(new HostAndPort("192.168.0.5",8001));
jedisConfig.add(new HostAndPort("192.168.0.5",8002));
jedisConfig.add(new HostAndPort("192.168.0.5",8003));
jedisConfig.add(new HostAndPort("192.168.0.5",8004));
jedisConfig.add(new HostAndPort("192.168.0.5",8005));
jedisConfig.add(new HostAndPort("192.168.0.5",8006));
JedisPoolConfig config=new JedisPoolConfig();
config.setMaxTotal(100);
config.setMaxIdle(10);
config.setTestOnBorrow(true);
JedisCluster cluster=new JedisCluster(jedisConfig,6000,10,config);
System.out.println(cluster.set("student","aaaa"));
System.out.println(cluster.set("age","18"));
System.out.println(cluster.get("student"));
System.out.println(cluster.get("age"));
}
}
redis 集群关闭
每个节点分别关闭 redis-cli.exe -c -h 192.168.0.5 -p 800x shutdown