美文网首页java 大联盟
如何用docker搭建redis集群,来让大佬带你详细了解red

如何用docker搭建redis集群,来让大佬带你详细了解red

作者: 程序媛马小兮 | 来源:发表于2019-12-17 21:50 被阅读0次

    前言

    redis定义

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。

    Docker 简介

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

    一个完整的Docker有以下四个部分组成:DockerClient客户端、Docker Daemon守护进程、Docker Image镜像、DockerContainer容器

    Docker 原理

    Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。

    docker搭建redis集群

    一:搜索redis镜像,拉去镜像

    wangxuandeMacBook-Air:rediswangxuan$dockersearchredis

    NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED

    redisRedisisanopensourcekey-valuestorethat…7393[OK]

    bitnami/redisBitnamiRedisDockerImage128[OK]

    sameersbn/redis77[OK]

    grokzen/redis-clusterRediscluster3.0,3.2,4.0&5.058

    rediscommander/redis-commanderAlpineimageforredis-commander-Redisman…31[OK]

    kubeguide/redis-masterredis-masterwith"HelloWorld!"30

    redislabs/redisClusteredin-memorydatabaseenginecompatib…23

    oliver006/redis_exporterPrometheusExporterforRedisMetrics.Supp…18

    可以看到目前最新版本是5.0,但是我们使用4.0,往往新的版本并不一定好。

    二:拉取镜像

    wangxuandeMacBook-Air:rediswangxuan$dockerpullredis:4.0

    4.0:Pullingfromlibrary/redis

    b8f262c62ec6:Pullcomplete

    93789b5343a5:Pullcomplete

    49cdbb315637:Pullcomplete

    e244975d5eb1:Pullcomplete

    25dca704d939:Pullcomplete

    db11ecc9cf34:Pullcomplete

    Digest:sha256:615b872e3af387206b62ffe66c1052f1653ed31b3afcfaa292a9244c92f2007a

    Status:Downloadednewerimageforredis:4.0

    三:配置redis集群

    配置集群之前,我们必须下载一个配置文件redis.conf,直接使用

    wget-chttp://download.redis.io/redis-stable/redis.conf

    下载,我们先介绍一下其中的关键的配置参数(今天我们配置的是一主两从的集群)

    主配置文件.redis-master.conf

    daemonizeyes

    pidfile/var/run/redis.pid

    bind0.0.0.0

    从配置文件redis-slaveof1.conf ,redis-slaveof2.conf

    daemonizeyes

    pidfile/var/run/redis.pid

    slaveofmaster6379

    bind0.0.0.0

    我们看到slaveof master 6379 这里使用master 有两个原因

    docker容器重启之后,ip地址会发生变化,导致访问失效问题

    还有安全问题的考虑

    这里我们也解释一下bind的这个参数

    默认情况下,如果没有指定bind配置指令,则 Redis 监听来自服务器上所有可用网络接口的连接。可以使用bind配置指令来监听一个或多个选定的接口,在bind后拼接一个或多个 IP 地址即可。例如:

    bind192.168.1.10010.0.0.1

    bind127.0.0.1::1

    这里我们把配置的配置bind 127.0.0.1 改成bind 0.0.0.0,不然我们的容器将会访问不通。

    三:启动redis集群

    dockerrun-it-v/Users/wangxuan/redis/redis-master.conf:/usr/local/bin/redis.conf--nameredis-masterredis:4.0/bin/bash

    dockerrun-it-v/Users/wangxuan/redis/redis-slaveof1.conf:/usr/local/bin/redis.conf--nameredis-slave1--linkredis-master:masterredis:4.0/bin/bash

    dockerrun-it-v/Users/wangxuan/redis/redis-slaveof2.conf:/usr/local/bin/redis.conf--nameredis-slave2--linkredis-master:masterredis:4.0/bin/bash

    这里我们看-v这个参数,这个是因为我们在容器里面修改文件往往不方便,一般容器是没有vim命令,需要我们自行下载,所以-v参数用于将宿主机上的某个目录挂载到容器中,我们在我们的机器上直接可以修改配置文件。

    上述命令中使用--link redis-master:master参数,前面提到的redis-slaveof1.conf配置文件中slaveof配置项,这里使用了一个master作为别名,其效果和使用IP一样(IP地址在/etc/host文件中)

    现在我们先运行主redis容器

    wangxuandeMacBook-Air:rediswangxuan$dockerrun-it-v/Users/wangxuan/redis/redis-master.conf:/usr/local/bin/redis.conf--nameredis-masterredis:4.0/bin/bash

    root@9874f9ec818c:/data#redis-server/usr/local/bin/redis.conf

    root@9874f9ec818c:/data#redis-cli

    127.0.0.1:6379>info

    ....

    #Replication

    role:master

    connected_slaves:0

    master_replid:b435db2264d29c74ddfa6d9b84572f343c03d770

    master_replid2:0000000000000000000000000000000000000000

    master_repl_offset:0

    second_repl_offset:-1

    repl_backlog_active:0

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:0

    repl_backlog_histlen:0

    .....

    此时我们看到主redis的从节点是0

    我们在启动一个从redis容器

    wangxuandeMacBook-Air:rediswangxuan$dockerrun-it-v/Users/wangxuan/redis/redis-slaveof1.conf:/usr/local/bin/redis.conf--nameredis-slave1--linkredis-master:masterredis:4.0/bin/bash

    root@8469ebae122c:/data#redis-server/usr/local/bin/redis.conf

    root@8469ebae122c:/data#redis-cli

    127.0.0.1:6379>info

    #Replication

    role:slave

    master_host:master

    master_port:6379

    master_link_status:up

    master_last_io_seconds_ago:1

    master_sync_in_progress:0

    slave_repl_offset:14

    slave_priority:100

    slave_read_only:1

    connected_slaves:0

    master_replid:1012f0b993083d3ac250a634997ce86827acd939

    master_replid2:0000000000000000000000000000000000000000

    master_repl_offset:14

    second_repl_offset:-1

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:1

    repl_backlog_histlen:14

    发现此时从节点的角色role变成了slave. master_host是master

    同理在启动另外一个从节点

    wangxuandeMacBook-Air:~wangxuan$dockerrun-it-v/Users/wangxuan/redis/redis-slaveof2.conf:/usr/local/bin/redis.conf--nameredis-slave2--linkredis-master:masterredis:4.0/bin/bash

    root@8d31889d7f46:/data#redis-server/usr/local/bin/redis.conf

    root@8d31889d7f46:/data#redis-cli

    127.0.0.1:6379>info

    ...

    #Replication

    role:slave

    master_host:master

    master_port:6379

    master_link_status:up

    master_last_io_seconds_ago:4

    master_sync_in_progress:0

    slave_repl_offset:308

    slave_priority:100

    slave_read_only:1

    connected_slaves:0

    master_replid:1012f0b993083d3ac250a634997ce86827acd939

    master_replid2:0000000000000000000000000000000000000000

    master_repl_offset:308

    second_repl_offset:-1

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:295

    repl_backlog_histlen:14

    ...

    我们现在在看一下主节点的信息

    127.0.0.1:6379>info

    ...

    #Replication

    role:master

    connected_slaves:2

    slave0:ip=172.17.0.3,port=6379,state=online,offset=420,lag=1

    slave1:ip=172.17.0.4,port=6379,state=online,offset=434,lag=0

    master_replid:1012f0b993083d3ac250a634997ce86827acd939

    master_replid2:0000000000000000000000000000000000000000

    master_repl_offset:434

    second_repl_offset:-1

    repl_backlog_active:1

    repl_backlog_size:1048576

    repl_backlog_first_byte_offset:1

    repl_backlog_histlen:434

    ...

    connected_slaves编程了2,上面也记录了两个从节点的ip,port等信息

    我们也验证一下

    主节点

    127.0.0.1:6379>setjiepidog

    OK

    从节点

    127.0.0.1:6379>getjiepi

    "dog"

    127.0.0.1:6379>setjiepipig

    (error)READONLYYoucan'twriteagainstareadonlyslave.

    发现从节点可以获取主节点设置的值,说明从节点把主节点的数据同步了过来,并且从节点仅仅只读。到此docker搭建redis一主两从集群搭建完成。

    总结

    Redis是一个远程内存数据库,它不仅性能强劲,而且还具有复制特性以及为解决问题而生的独一-无二的数据模型。Redis 提供了5种不同类型的数据结构,各式各样的问题都可以很自然地映射到这些数据结构上:Redis的数据结构致力于帮助用户解决问题,而不会像其他数据库那样,要求用户扭曲问题来适应数据库。除此之外,通过复制、持久化( persistence )和客户端分片( lint-side sharding )等特性,用户可以很方便地将Redis 打展成- -个能够包含数百GB数据、每秒处理上百万次请求的系统。

    相关文章

      网友评论

        本文标题:如何用docker搭建redis集群,来让大佬带你详细了解red

        本文链接:https://www.haomeiwen.com/subject/xgwenctx.html