1. 使用Docker搭建redis主从复制集群

安装参照 Docker 搭建redis 集群

启动服务

docker run --name redis-master -p 6379:6379 -d redis
docker run --link redis-master:redis-master -v /data/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis-slave1 -d redis redis-server /usr/local/etc/redis/redis.conf
docker run --link redis-master:redis-master -v /data/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis-slave2 -d redis redis-server /usr/local/etc/redis/redis.conf
docker run --link redis-master:redis-master -v /data/docker/redis/redis.conf:/usr/local/etc/redis/redis.conf --name redis-slave3 -d redis redis-server /usr/local/etc/redis/redis.conf

本地客户端查看

D:\redis\redis-cli.exe -h xxx.xxx.xxx.xxx -p 6379
xxx.xxx.xxx.xxx:6379> info
# Replication
role:master
connected_slaves:3
slave0:ip=172.17.0.4,port=6379,state=online,offset=58278,lag=0
slave1:ip=172.17.0.5,port=6379,state=online,offset=58278,lag=0
slave2:ip=172.17.0.3,port=6379,state=online,offset=58278,lag=1
master_replid:b8a0697619cb49c9e82cdf57d404b998e7f92615
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:58278
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:58278

性能测试,10000次太慢,100并发测试

PS E:\> D:\redis\redis-benchmark.exe -h xxx.xxx.xxx.xxx -p 6379 -n 100 -q
PING_INLINE: 813.01 requests per second
PING_BULK: 813.01 requests per second
SET: 840.34 requests per second
GET: 746.27 requests per second
INCR: 819.67 requests per second
LPUSH: 724.64 requests per second
RPUSH: 793.65 requests per second
LPOP: 833.33 requests per second
RPOP: 806.45 requests per second
SADD: 806.45 requests per second
SPOP: 826.45 requests per second
LPUSH (needed to benchmark LRANGE): 819.67 requests per second
LRANGE_100 (first 100 elements): 684.93 requests per second
LRANGE_300 (first 300 elements): 49.07 requests per second
LRANGE_500 (first 450 elements): 23.69 requests per second
LRANGE_600 (first 600 elements): 22.81 requests per second
MSET (10 keys): 819.67 requests per second

关掉一个从服务:

#查看所有运行容器
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ab06a9f786a redis "docker-entrypoint..." 34 minutes ago Up 34 minutes 6379/tcp redis-slave3
8bfdd1cd2e60 redis "docker-entrypoint..." 34 minutes ago Up 34 minutes 6379/tcp redis-slave2
89fc61fb4804 redis "docker-entrypoint..." 36 minutes ago Up 36 minutes 6379/tcp redis-slave1
e32817e5e65c redis "docker-entrypoint..." 40 minutes ago Up 6 minutes 0.0.0.0:6379->6379/tcp redis-master
[root@VM_128_25_centos ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ab06a9f786a redis "docker-entrypoint..." 34 minutes ago Up 34 minutes 6379/tcp redis-slave3
8bfdd1cd2e60 redis "docker-entrypoint..." 34 minutes ago Up 34 minutes 6379/tcp redis-slave2
89fc61fb4804 redis "docker-entrypoint..." 36 minutes ago Up 36 minutes 6379/tcp redis-slave1
e32817e5e65c redis "docker-entrypoint..." 40 minutes ago Up 6 minutes 0.0.0.0:6379->6379/tcp redis-master #停到一个从服务,可用name也可以用id
$ docker stop redis-slave3
redis-slave3 #再次查看确实停掉了
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8bfdd1cd2e60 redis "docker-entrypoint..." 35 minutes ago Up 35 minutes 6379/tcp redis-slave2
89fc61fb4804 redis "docker-entrypoint..." 37 minutes ago Up 37 minutes 6379/tcp redis-slave1
e32817e5e65c redis "docker-entrypoint..." 42 minutes ago Up 7 minutes 0.0.0.0:6379->6379/tcp redis-master

再次测试发现区别不大, docker start redis-slave3启动刚才停掉的容器。

$  docker start redis-slave3
redis-slave3
$docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0ab06a9f786a redis "docker-entrypoint..." 3 hours ago Up 1 second 6379/tcp redis-slave3
8bfdd1cd2e60 redis "docker-entrypoint..." 3 hours ago Up 3 hours 6379/tcp redis-slave2
89fc61fb4804 redis "docker-entrypoint..." 3 hours ago Up 3 hours 6379/tcp redis-slave1
e32817e5e65c redis "docker-entrypoint..." 3 hours ago Up About an hour 0.0.0.0:6379->6379/tcp redis-master

看到,又有了第三个从服务redis-slave3

p.s. 修改了配置/data/docker/redis.conf后,可以关掉redis-master容器再开启用来生效配置。

换一台机子搭建从服务器。

2. 配置另一台服务器为从服务器

用阿里的一个闲置服务器,这里就不用docker了,玩不太懂,还是乖乖yum安装redis

2.1 安装配置redis

#安装
yum install redis
#启动
service redis start
#配置文件在
/etc/redis.conf

安装redis之后,发现客户端连接无反应,配置规则并关闭防火墙后,,提醒redis受保护模式拒绝访问,配置中 daemonize no 改为yes,再次访问发现奇怪的错误在驱动器 %1 上插入软盘,redis添加密码 requirepass 123456,解决错误。

客户端再次访问redis-cli.exe -h yyy.yyy.yyy.yyy -p 6379 -a 123456,访问成功。

可以用service redis restart重启,但是无法用service redis stop停止,可能是有密码的原因,可以进客户端然后shutdown掉

$ redis-cli -a 123456
127.0.0.1:6379> SHUTDOWN
not connected> exit

也可以直接用redis-cli -p 6380 -a 123456 shutdown删除,这里带-p是因为我改了端口,默认为6379则不用-p,如果没密码的话,那也不用-a直接redis-cli shutdown即可关闭。

2.2 配置从服务器

配置中slaveof <masterip> <masterport>改为主服务器ip

slaveof xxx.xxx.xxx.xxx 6379

试了好久无法获取到master的值,查看redis日志

37358 22528:S 03 May 18:08:23.521 * MASTER <-> SLAVE sync: Loading DB in memory
37359 22528:S 03 May 18:08:23.521 # Can't handle RDB format version 8
37360 22528:S 03 May 18:08:23.521 # Failed trying to load the MASTER synchronization DB from disk

查看两个redis版本

从服务器直接安装的redis,查看很简单

$redis-server --version
Redis server v=3.2.11 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=6ad59

主服务器docker下版本查看

$docker run redis redis-server --version
Redis server v=4.0.9 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=22c6ee

是不一样,怎么办呢,搜了几个,都是删除rdb文件,我删了也不行。再安装一次redis吧。

从服务器再次安装redis 4.0.9,安装并再次配置后客户端连接会有错误

Error: Server closed the connection,配置更改注释bind也没用,发现没有指定文件,再次启动redis

./src/redis-server /root/redis-4.0.9/redis.conf

,可以连接并可访问主服务器数据。

试验一下,xxx为主服务器IP,yyy为从服务器IP:

PS E:\> D:\redis\redis-cli.exe -h xxx.xxx.xxx.xxx -p 6379
xxx.xxx.xxx.xxx:6379> set day 3
OK PS E:\> D:\redis\redis-cli.exe -h yyy.yyy.yyy.yyy -p 6379 -a 123456
yyy.yyy.yyy.yyy:6379> get day
"3"
yyy.yyy.yyy.yyy:6379> set day2 111
(error) READONLY You can't write against a read only slave.
yyy.yyy.yyy.yyy:6379>

可以看到从服务器slave不能写,只能读。

3. 性能测试

先关闭调主服务器之前建的三个slave,

$ docker stop redis-slave1
redis-slave
$ docker stop redis-slave2
redis-slave2
$ docker stop redis-slave3
redis-slave3

开始测试,

没有使用从服务器的slave时,

PS E:\> D:\redis\redis-benchmark.exe -h xxx.xxx.xxx.xxx -p 6379 -n 1000 -q
PING_INLINE: 1204.82 requests per second
PING_BULK: 1191.90 requests per second
SET: 1219.51 requests per second
GET: 1213.59 requests per second
INCR: 1209.19 requests per second
LPUSH: 1210.65 requests per second
RPUSH: 1183.43 requests per second
LPOP: 1197.60 requests per second
RPOP: 1222.49 requests per second
SADD: 1144.16 requests per second
SPOP: 1210.65 requests per second
LPUSH (needed to benchmark LRANGE): 1215.07 requests per second
LRANGE_100 (first 100 elements): 102.64 requests per second
LRANGE_300 (first 300 elements): 29.06 requests per second
LRANGE_500 (first 450 elements): 25.27 requests per second
LRANGE_600 (first 600 elements): 15.88 requests per second
MSET (10 keys): 1201.92 requests per second

启动从服务器,使用从服务器slave

PS E:\> D:\redis\redis-benchmark.exe -h xxx.xxx.xxx.xxx -p 6379 -n 1000 -q
PING_INLINE: 1184.83 requests per second
PING_BULK: 1207.73 requests per second
SET: 1203.37 requests per second
GET: 1156.07 requests per second
INCR: 1184.83 requests per second
LPUSH: 1203.37 requests per second
RPUSH: 1201.92 requests per second
LPOP: 1223.99 requests per second
RPOP: 1200.48 requests per second
SADD: 1179.25 requests per second
SPOP: 1132.50 requests per second
LPUSH (needed to benchmark LRANGE): 1190.48 requests per second
LRANGE_100 (first 100 elements): 103.00 requests per second
LRANGE_300 (first 300 elements): 30.63 requests per second
LRANGE_500 (first 450 elements): 26.52 requests per second
LRANGE_600 (first 600 elements): 14.22 requests per second
MSET (10 keys): 1233.05 requests per second

查看主服务器信息

info
# Replication
role:master
connected_slaves:1
slave0:ip=yyy.yyy.yyy.yyy,port=6379,state=online,offset=814862,lag=1
master_replid:600f93df98b7eff6799a0e0cdb6c6d85fd401793
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:814862
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:814862

看到slave0就是从服务器的slave,可是性能怎么没有提升么,读也没有提升多少啊,可能是我测试的姿势不对?还是服务器太渣。以后再深究吧。

感谢你阅读到了这里,这篇笔记太凌乱又因鄙人不才,本不成文章,可是放到私人笔记里也帮助不到任何人(包括自己),请多多批评。

其他参考

redis集群尝试的更多相关文章

  1. Redis集群案例与场景分析

    1.背景 Redis的出现确实大大地提高系统大并发能力支撑的可能性,转眼间Redis的最新版本已经是3.X版本了,但我们的系统依然继续跑着2.8,并很好地支撑着我们当前每天5亿访问量的应用系统.想当年 ...

  2. Redis集群~windows下搭建Sentinel环境及它对主从模式的实际意义

    回到目录 关于redis-sentinel出现的原因 Redis集群的主从模式有个最大的弊端,就是当主master挂了之前,它的slave从服务器无法提升为主,而在redis-sentinel出现之后 ...

  3. [个人翻译]Redis 集群教程(中)

    上一篇:http://www.cnblogs.com/li-peng/p/6143709.html 官方原文地址:https://redis.io/topics/cluster-tutorial  水 ...

  4. [个人翻译]Redis 集群教程(上)

    官方原文地址:https://redis.io/topics/cluster-tutorial  水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢.        这是 ...

  5. Redis集群研究和实践(基于redis 3.0.5)

    前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的2.x的稳定版本是2.8.19,也是我们项目中普遍用到的版本. redis在年初发布了3.0. ...

  6. 就publish/subscribe功能看redis集群模式下的队列技术(一)

    Redis 简介 Redis 是完全开源免费的,是一个高性能的key-value数据库. Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中 ...

  7. 高性能网站架构设计之缓存篇(6)- Redis 集群(中)

    昨天晚上钓鱼回来,大发神经,写了篇概括程序员生活现状的文章,没想到招来众多人的口诛笔伐,大有上升到政治层面的趋势. 我也许不会再发表任何冲击心灵的文章,我希望给大家带来更多的正能量,所以那篇文章已被我 ...

  8. Redis集群搭建&访问

    集群搭建步骤 1.创建多个节点: 2.为每个节点指派槽,并将多个节点连接起来,组成一个集群: 3.当集群数据库的16384个槽都有节点在处理时,集群进入上线状态: 要求:搭建一个包含6个节点的Redi ...

  9. Redis 集群实现

    Nosql,作为程序员在当下不了解点儿,还真不行,出去聊起来别人就会说你土.那么就聊聊其中一个比较火的redis.redis单机版没得说,但是一直没有集群版,有也是山寨的.前段时间对redis的实现进 ...

随机推荐

  1. Block Design 小技巧之添加RTL代码到block_design

    Block Design 小技巧之添加RTL代码到block_design 1.首先得打开Block Design,右击RTL文件,才会出现Add module to Block Design选项. ...

  2. windows环境下把Python代码打包成独立执行的exe

    windows环境下把Python代码打包成独立执行的exe可执行文件   有时候因为出差,突然急需处理一批数据.虽然写好的脚本存储在云端随用随取,然而编译的环境还需要重新搭建,模块也需要重新装载,从 ...

  3. 持续集成之Jenkins+Gitlab实现持续集成 [二]

    持续集成之Jenkins+Gitlab实现持续集成 [二] 项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将 ...

  4. JTextArea利用JScrollpane增加文本域滚轮(滚动条)

    JTextArea加滚轮的几种方法 JTextArea txaDisplay = new JTextArea(); JScrollPane scroll = new JScrollPane(txaDi ...

  5. 黄聪:php7配置php.ini使其支持<? ?>

    <? ?>这种写在php配置文件里php.ini法叫short_tags,默认是不打开的,也就是,在默认配置的php里,这样写法不被认为是php脚本的,除非设置 short_open_ta ...

  6. 关于Java与Map的那点事

    Java将Map拼接成“参数=值&参数=值”: 把一个map的键值对拼接成“参数=值&参数=值”即“username=angusbao&password=123456”这种形式 ...

  7. Qt error: stray '\241' in program

    转载:iGoforward 报错的意思是c++中的产生了编译错误. 该错误是指源程序中有非法字符,需要将非法字符去掉.一般是由于编程者(不用程序员这个名词是因为这种错误太低级)使用中文输入法 或者从别 ...

  8. vc++post方式登录网站

    以http://www.idc3389.com为例: 效果图: 使用Fiddler工具进行抓包,截图: 可以发现: 1.并没有使用cookie并没有用作用户身份识别,因为登录前后的cookie并没有发 ...

  9. PAT 甲级 1011 World Cup Betting (20)(20 分)

    1011 World Cup Betting (20)(20 分)提问 With the 2010 FIFA World Cup running, football fans the world ov ...

  10. springmvc学习(五)

    这次主要是记录一下 springmvc 关于异常处理 和 拦截的回顾 关于springmvc  异常处理:springmvc 提供了 HandlerExceptionResolver  异常处理解析接 ...