1. 说明

  在我的物联网平台框架框架中,会用到Redis这个中间件。作为EMQ权限认证的缓存。https://www.cnblogs.com/think-in-java/p/5123884.html

2. 编译&运行

 wget http://download.redis.io/releases/redis-4.0.6.tar.gz
make && make test && make PREFIX=/home/user/workspace/redis install

  编译,测试,安装

 cp ./redis.conf /home/user/workspace/redis
cd /home/user/workspace/redis
./bin/redis-server
ps -c redis-server

3. 主从复制

  一台MASTER(172.16.20.229) 配置,从默认配置拷贝一份,然后修改如下配置项

 port  #这个根据需要,选择默认的6379端口即可
bind 0.0.0.0 #这个绑定,如果是单机测试那么就不用改,如果是多机测试,这个bind选项要注释掉,注释后表示redis监听所有网卡,或者绑定 0.0.0.0
requirepass #密码表示所有连接都要进行授权

  另外一台 SLAVE(172.16.20.203) 配置,同样从默认配置拷贝一份,然后修改如下配置项

 port   #
slaveof 172.16.20.203 #
masterauth #
requirepass #

  配置后,先启动MASTER然后启动SLAVE,可以看到MASTER日志信息如下

  然后通过任意客户端 ./redis-cli -h 172.16.20.229  ./redis-cli -h 172.16.20.203 连接授权后,两者的操作就都是在操作同一份数据了。这样就可以简单的在应用层实现读写分离了。

4. HA高可用

  Redis 算是一个比较流行的中间件了。本身提供了上面的主从复制功能,同时也提供了HA高可用功能。Sentinel哨兵进程。对于普通的企业应用来说,这个功能就够了。

  Redis内置的主从复制和高可用会以来redis.conf和sentinel.conf 这两个配置文件,而且还会在系统主从选举等操作时修改这两个配置文件

  172.16.20.229 redis.conf MASTER

 protected-mode yes
tcp-backlog
timeout
tcp-keepalive
daemonize no
supervised no
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile ""
databases
always-show-logo yes
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/home/user/workspace/emq/redis/bin"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay
repl-disable-tcp-nodelay no
slave-priority
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size -
list-compress-depth
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit slave 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
aof-rewrite-incremental-fsync yes bind 0.0.0.0
port
requirepass
masterauth

  172.16.23.203 redis.conf SLAVE

 protected-mode yes
tcp-backlog
timeout
tcp-keepalive
daemonize no
supervised no
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile ""
databases
always-show-logo yes
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/root/workspace/emq/redis/bin"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay
repl-disable-tcp-nodelay no
slave-priority
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size -
list-compress-depth
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit slave 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
aof-rewrite-incremental-fsync yes bind 0.0.0.0
port
slaveof 172.16.20.229
masterauth
requirepass

  172.16.23.205 redis.conf SLAVE

 protected-mode yes
tcp-backlog
timeout
tcp-keepalive
daemonize no
supervised no
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile ""
databases
always-show-logo yes
save
save
save
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/root/workspace/emq/redis/bin"
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay
repl-disable-tcp-nodelay no
slave-priority
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
slave-lazy-flush no
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no
lua-time-limit
slowlog-log-slower-than
slowlog-max-len
latency-monitor-threshold
notify-keyspace-events ""
hash-max-ziplist-entries
hash-max-ziplist-value
list-max-ziplist-size -
list-compress-depth
set-max-intset-entries
zset-max-ziplist-entries
zset-max-ziplist-value
hll-sparse-max-bytes
activerehashing yes
client-output-buffer-limit normal
client-output-buffer-limit slave 256mb 64mb
client-output-buffer-limit pubsub 32mb 8mb
hz
aof-rewrite-incremental-fsync yes bind 0.0.0.0
port
slaveof 172.16.20.229
masterauth
requirepass

  172.16.20.229 sentinel.conf SENTINEL1

 port 

 sentinel monitor mymaster 172.16.20.229
sentinel auth-pass mymaster
sentinel down-after-milliseconds mymaster
sentinel failover-timeout mymaster

  172.16.23.204 sentinel.conf SENTINEL2

 port 

 sentinel monitor mymaster 172.16.20.229
sentinel auth-pass mymaster

  创建一个MASTER两个SLAVE两个SENTINEL。

5. 实际测试

  (1) 启动 172.16.20.229 redis.conf MASTER

  (2) 启动 172.16.23.203 redis.conf SLAVE

  (3) 启动 172.16.23.205 redis.conf SLAVE

  (4) 启动 172.16.23.204 sentinel.conf SENTINEL

  (5) 启动 172.16.20.229 sentinel.conf SENTINEL

  (6) 上面所有服务都启动后,各个服务的日志信息

  172.16.20.229 redis master

  172.16.23.203 redis slave

  172.16.23.205 redis slave

  172.16.23.204 sentinel

  172.16.23.229 sentinel

  (7) 查看状态 ./redis-cli -p 26379

  (8) 然后可以模拟各种故障情况,看一下效果,一顿操作过后,所有服务都关闭了。再去看各个服务下的配置文件,都会发现,每个服务conf配置文件最下面都会增加一些节点信息。

  (9) 例如关闭172.16.23.229 redis Master ,这个时候

6. 关于HA说明

  好像这个sentinel模式可以做到简单的主从恢复,和主从切换。但是对于HA来说,好像不是那么回事,该挂的节点,还是挂了,对于客户端来说,不是很透明。

  有些人的做法是通过DNS进行解决。这个问题先放着,我觉得还是要等到后面Spring Cloud 学了之后,弄个全局配置中心,来动态获取这些数据,只对配置中心和Nginx负载均衡器做HA,其他的再说。

物联网架构成长之路(11)-Redis缓存主从复制的更多相关文章

  1. 物联网架构成长之路(25)-Docker构建项目用到的镜像1

    0. 前言 现在项目处于初级阶段,按照规划,先构建几个以后可能会用到的Image,并上传到阿里云的Docker仓库.以后博客中用到的Image,大部分都会用到这几个基础的Image,构建一个简单的物联 ...

  2. 物联网架构成长之路(31)-EMQ基于HTTP权限验证

    看过之前的文章就知道,我之前是通过搞插件,或者通过里面的MongoDB来进行EMQ的鉴权登录和权限验证.但是前段时间发现,还是通过HTTP WebHook 方式来调用鉴权接口比较适合实际使用.还是实现 ...

  3. 物联网架构成长之路(6)-EMQ权限控制

    1. 前言 EMQTT属于一个比较小众的开源软件,很多资料不全,很麻烦,很多功能都是靠猜测,还有就是看官方提供的那几个插件,了解. 2. 说明 上一小节的插件 emq_plugin_wunaozai ...

  4. 物联网架构成长之路(13)-SpringBoot入门

    1. 前言 下载最新版的JavaEE eclipse-jee-oxygen-2-win32-x86_64.zip 安装STS插件 Window->Eclipse Marketplace -> ...

  5. 物联网架构成长之路(16)-SpringCloud从入门到吹水

    1.前言 Spring Cloud 现在比较流行,版本更新也是蛮快的,网上资料也是很多.很多参考网上资料就可以学到了.这里给个 http://blog.csdn.net/forezp/article/ ...

  6. 物联网架构成长之路(24)-Docker练习之Compose容器编排

    0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...

  7. 物联网架构成长之路(35)-利用Netty解析物联网自定义协议

    一.前言 前面博客大部分介绍了基于EMQ中间件,通信协议使用的是MQTT,而传输的数据为纯文本数据,采用JSON格式.这种方式,大部分一看就知道是熟悉Web开发.软件开发的人喜欢用的方式.由于我也是做 ...

  8. 物联网架构成长之路(33)-EMQ数据存储到influxDB

    一.前言 时隔一年半,技术变化特别快,学习也要跟上才行.以前写过EMQ数据转存问题,当时用了比较笨的方法,通过写插件的方式,把MQTT里面的数据发送到数据库进行存储.当时也是为了学习erlang和em ...

  9. 物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息

    1. 前言 按照我自己设计的物联网框架,对于MQTT集群中的所有消息,是要持久化到磁盘的,这里采用一个消息队列中间件Kafka作为数据缓冲,缓冲结果存到数据仓库中,以供后续作为数据分析.由于MQTT集 ...

随机推荐

  1. 074 hbase与mapreduce集成

    一:运行给定的案例 1.获取jar包里的方法 2.运行hbase自带的mapreduce程序 lib/hbase-server-0.98.6-hadoop2.jar 3.具体运行 注意命令:mapre ...

  2. 网页图表Highcharts实践教程之认识Highcharts

    网页图表Highcharts实践教程之认识Highcharts 认识Highcharts Highcharts是国际知名的一款图表插件.它完全使用Javascript编写实现.其结构清晰,使用简单.开 ...

  3. UVA.12230.Crossing Rivers(期望)

    题目链接 /* 到达一条河时,船在河中的位置是随机的,所以船到达岸边需要的时间在 0~2l/v 均匀分布,所以船到岸的期望为 (0+2l/v)/2 过河需要 l/v 的时间,所以过一条河总的期望为 ( ...

  4. BZOJ.3809.Gty的二逼妹子序列(分块 莫队)

    题目链接 /* 25832 kb 26964 ms 莫队+树状数组:增加/删除/查询 都是O(logn)的,总时间复杂度O(m*sqrt(n)*logn),卡不过 莫队+分块:这样查询虽然变成了sqr ...

  5. java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servlet.Servlet

    java.lang.ClassCastException: cn.itcase.serviceImpl.servicestudentImpl cannot be cast to javax.servl ...

  6. 【原创】python模拟腾讯网页登录

    近日,研究Tencent网页模拟登录的过程,过程有些忐忑,但最终还是实现了这一功能.先将结果写于此,供大家参考: 其加密过程在c_login_old.js文件中执行,将JS关键代码提取出来如下: fu ...

  7. C++ new

    //#include "stdafx.h" #include <iostream> using namespace std; int main() { , n = , ...

  8. 第二章 flex输入输出

    flex程序默认总是从标准输入读取, 实际上,词法分析程序都从文件读取输入 flex总是通过名为yyin的文件句柄读取输入, 下面的例子,我们修改单词计数程序,使得它能从文件读取输入 /* even ...

  9. android常用工具收集

    1.脱壳工具 https://github.com/DrizzleRisk/drizzleDumper

  10. 哪个中年IT男不是一边面对危机,一边咬牙硬抗【转】

    来自: 懂懂笔记 对于 2017 年年末那则令人哀伤的消息,相信很多同龄人都会触目伤怀.面对公司的强制性劝退,深圳中兴网信科技有限公司某研发组主管从办公楼上一跃而下,用最决绝的方式结束了宝贵的生命. ...