上一篇文章 Redis从入门到高可用以及分布式实战(一)介绍了Redis的基本命令、五大数据结构、Redis的到典型应用场景,经过以前的学习咱们对Redis有了一点的了解,接下来这篇文章会讲解Redis的主从复制原理的配置、哨兵选举原理并掌握在Linux上搭建Redis一主二从三哨兵高可用集群环境,废话少说,让咱们开始吧!java
环境与工具mysql
部署工具程序员
开发工具web
我的的redis版为redis-5.0.4,这个看你的选择吧,不须要选最新的,安装路径/opt/redis-5.0.4,建议软件的暗转路径选择/opt下,好比tomcat,mysql等...redis
Linux下安装redis步骤:spring
下载地址:http://download.redis.io/releases/redis-5.0.5.tar.gz 直接使用wget命令下在到安装的目录下sql
第一步:redis的主从配置shell
1.使用vim命令建立redis-6379.conf配置文件(mater主配置文件),修改配置内容:数据库
#演示方便,开放全部的ip链接 bind 0.0.0.0 #后台运行 daemonize yes #pid文件 pidfile /var/run/redis_6379.pid dbfilename dump-6379.rdb #日志文件 logfile "6379.log"
2.使用命令 cp -v redis-6379.conf redis-6380.conf 复制一份redis-6379.conf 到 redis-6380.conf,修改配置文件:vim
bind 0.0.0.0 port 6380 daemonize yes pidfile /var/run/redis_6380.pid dbfilename dump-6380.rdb logfile "6380.log" #slaveof表示做为从库的配置 slaveof 39.106.115.134 6379 #从库只能读操做 slave-read-only yes
3.一样操做,复制一份成redis-6381.conf,修改配置文件:
bind 0.0.0.0 port 6381 daemonize yes pidfile /var/run/redis_6381.pid dbfilename dump-6381.rdb logfile "6381.log" #slaveof表示做为从库的配置 slaveof 39.106.115.134 6379 #从库只能读操做 slave-read-only yes
配置成功后,查看redis信息:
1.查看主库信息:
[root@localhost redis-5.0.4]# ./src/redis-cli -p 6379 info
2.查看从库信息:
3. 想知道redis主从模式是否搭建成功,咱们来实验一下,在主库set,从从库里get,看看能不能实现数据同步,看下面:
咱们发现是成功的,这里注意的是,从库只能读数据,不能写数据,由于咱们在配置文件里配置了(不信你能够试试,会报错,报错以下):
第二步:哨兵配置
建立sentinel配置文件
1.在redis.conf同一级目录下建立sentinel-26379.conf文件,修改配置配置文件为:
port 26379 daemonize yes # sentinel announce-ip <ip> # sentinel announce-port <port> dir /opt/redis-5.0.4/data logfile "26379.log" sentinel monitor mymaster 39.106.115.134 6379 2 # sentinel auth-pass <master-name> <password> sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 # sentinel notification-script <master-name> <script-path>
2. 使用 cp 命令拷贝一份成 sentinel-26380.conf 和一份 sentinel-26381.conf 并修改上面port端口号等几处地方便可,比较机械,我就不演示操做了,建立好哨兵配置文件以后,咱们就要开始启动redis服务了,启动成功以后使用 ps -ef | grep redis 查看redis进程信息,以下所示,代表启动完成:
如今主库、从库、哨兵都启动成功了,咱们能够查看一下配置信息是否正确:
执行 ./src/redis-cli -p 26379.conf info
### 发现咱们的配置已经成功!!
在IDEA建立一个maven项目,在pom文件添加redis客户端Jedis依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.1.0-m1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
在Application中建立main函数入口,键入测试代码:
/** * @Author 林必昭 * @Date 2019/10/22 20:17 */ @SpringBootApplication public class JedisDemoApplication { public static void main(String[] args) { //三个哨兵 Set<String> sentinels = new HashSet<>(); //是阿里云外网ip sentinels.add("39.106.115.134:26379"); sentinels.add("39.106.115.134:26380"); sentinels.add("39.106.115.134:26381"); //初始化哨兵池 JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels); while (true) { Jedis jedis = null; try { //拿到jedis,经过jedis来操做主库 jedis = pool.getResource(); //获取主库的ip String ip = jedis.getClient().getHost(); //获取主库的端口 int port = jedis.getClient().getPort(); String key = "k-" + new Random().nextInt(10000); String value = "v-" + new Random().nextInt(10000); jedis.set(key, value); System.out.println("当前主库:" + ip + ":" + port + "," + key + "value is " + jedis.get(key)); //每秒执行一次 Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } finally { if (jedis != null) { jedis.close(); } } } } }
运行mian函数,能够看到相似的输出:
咱们去查看数据库数据,发现数据已经写入了:
查看咱们的客户端,确实数据已经写入:
注意:测试过程当中要保证测试代码要一致处于运行状态,不要断开,如今测试代码是后台运行不断向主库插入数据,测试高可用:
1.使用 ps -ef | grep redis 查看后台的进程,看看主库的pid进程号:
2. 接下来,咱们要模拟主库宕机的情景了,就是销毁主库进程:
执行命令:kill 8711
看看IDEA控制台的输出:
当 kill 掉主库进程的时候,IDEA就会报错:Connection refused:connect 的错误,持续报错,通过30s以后(这个时间是能够选择的,在配置文件中设置),也就是以前配置的sentinel,有一段配置 sentinel down-after-milliseconds mymaster 30000,设置主库宕机以后通过多久时间进行选举,单位是毫秒,这里设置了30000毫秒,此时主库被切换了,此时从库redis-6381,被选举成新的主库,看到控制台输出,当前主库变为了:39.106.115.134:6381,6379已经被咱们停掉了,这就是redis主库master宕机以后的从新选举过程!!!
3. 咱们能够可查看6381的信息,执行命令:
./src/redis -cli -p 6781 info
咱们能够清楚的看到,6381 role已是master了,也就是是6381已是主节点了,6379已经被咱们他停掉了,因此看不到6379的信息。
4.执行 ./src/redis-cli -p 26379 info;
5. 那么,到这里咱们就会想,6379被虽然咱们 kill 掉了,到时它会变为从节点吗?咱们能够查看一下配置信息,看一下 sentinel-26379.conf 配置文件信息:
从配置文件上能够看出,虽然6379被停掉,主库选举成功,这里的6379最后仍是会被修改为从节点,啊哈哈哈,到这里,证实了咱们redis的高可用测试成功了!!!
其实在搭建的过程当中遇到了不少问题,有一个问题想跟你们分享,避免入坑,一搜网上不少中说法,先把问题贴出来:
实时这个问题的来源主要缘由有两种:
对于配置文件问题的解决的方案是,修改配置文件:
而后再从新启动,这样异常就能解决掉了,个人是第二种状况引发的错误,百度了好久,我还从新配置了几遍,哎555,缘由是以前配置的信息错误,删掉以后从新启动就好了,最后,Redis从入门到高可用以及分布式实战(二)就到这里了,经过这篇文章咱们学习了redis一主二从三哨兵的集群模式,Redis Sentinal着眼于高可用,在master宕机时会自动将slave提高为master,继续提供服务,下一篇文章咱们能够谈谈 redis故障转义的原理和过程,逐步掌握非关系型数据库的原理和应用。
不早了,晚安了,祝你们1024节日快乐,最后,我是程序员,我为本身带盐(哈哈哈)!!