基于docker的 redis集群之主从复制

    xiaoxiao2021-03-25  82

    环境搭建步骤

    一 准备

    docker环境(centos7 + docker1.12.1)

    redis 3.2.4    wget http://download.redis.io/releases/redis-3.2.4.tar.gz

    172.17.0.2:6379  主    172.17.0.3:6379  从     172.17.0.4:6379 从

    遗留问题:

    1 实现主从后,读写分离,客户端连接代码如何写?

    2 主从切换后,客户端代码需要调整吗?

    二 制作镜像

    Dockerfile内容如下:

    FROM centos:6.7 MAINTAINER loomz loomz@163.com ENV REFRESHED_AT 2017-03-08 ENV REDIS_HOME /opt/redis/redis_default ADD redis-3.2.4.tar.gz /opt/redis/ RUN ln -s /opt/redis/redis-3.2.4 $REDIS_HOME RUN yum -y install gcc WORKDIR $REDIS_HOME RUN make && make install EXPOSE 6379 ENTRYPOINT [ "/usr/local/bin/redis-server", "/etc/redis/redis.conf" ]

    相关命令:  docker命令总结

    三 容器启动

    三个启动脚本和配置文件内容如下:

    主master

    start.-6379.sh

    #!/bin/bash docker run -d -p 6379:6379 --restart always -h redis-6379 --name redis-6379 -v /home/loomz/dockerfiles/redis_3.2_cluster/redis_cluster/6379:/etc/redis/:ro redis:v3.2.4

    redis.conf

    port 6379 bind 172.17.0.2 daemonize no pidfile /var/run/redis.pid appendonly yes

    从slave

    start-6380.sh

    #!/bin/bash docker run -d -p 6380:6379 --restart always -h redis-6380 --name redis-6380 -v /home/loomz/dockerfiles/redis_3.2_cluster/redis_cluster/6380:/etc/redis/:ro redis:v3.2.4

    redis.conf

    port 6379 bind 172.17.0.3 daemonize no pidfile /var/run/redis.pid appendonly yes slaveof 172.17.0.2 6379

    从slave

    start-6381.sh

    #!/bin/bash docker run -d -p 6381:6379 --restart always -h redis-6381 --name redis-6381 -v /home/loomz/dockerfiles/redis_3.2_cluster/redis_cluster/6381:/etc/redis/:ro redis:v3.2.4

    redis.conf

    port 6379 bind 172.17.0.4 daemonize no pidfile /var/run/redis.pid appendonly yes slaveof 172.17.0.2 6379

    通过客户端命令查看节点情况

    redis-cli > info replication # Replication role:slave master_host:172.17.0.4 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:1 master_link_down_since_seconds:1489327889 slave_priority:100 slave_read_only:1 connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0

    以上方式即实现主从,但如果主的挂掉,从数据库升级为主数据需要手工处理,使用命令slaveof no one即可提升为主数据库。

    使用哨兵方式:

    在任意一个节点使用增加配置文件sentinel.conf,内容如下:

    sentinel monitor mymaster_loomz 172.17.0.2 6379 1

    参数说明:

    mymaster_loomz  主数据库名字,自定义即可

    172.17.0.2  主数据库地址

    6379  主数据库端口

    1   哨兵最低通过票数

    启动sentinel进程:

    /usr/local/bin/sentinel /etc/redis/sentinel.conf

    当然生产环境哨兵也需要做集群,避免单点故障,按照上面的方式启动多个哨兵进程即可,或者每个节点启动一个哨兵进程。注意sentinel.conf最后一个参数“哨兵最低通过票数”设置为哨兵总数的超过半数即可,如N / 2 +1

    四 客户端连接代码

    public static void main(String[] args) { JedisPoolConfig poolconfig = new JedisPoolConfig(); poolconfig.setMaxIdle(30); poolconfig.setMaxTotal(1000); Set<String> sentinels = new HashSet<String>(); sentinels.add("172.17.0.1:26379"); JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("master_loomz", sentinels, poolconfig, 3000, "redispass"); HostAndPort currentHostMaster = jedisSentinelPool.getCurrentHostMaster(); System.out.println("currentHostMaster : " + currentHostMaster.getHost() + " port: " + currentHostMaster.getPort()); Jedis resource = jedisSentinelPool.getResource(); resource.setDataSource(jedisSentinelPool); String value = resource.get("aa"); System.out.println(value); resource.close(); }

    转载请注明原文地址: https://ju.6miu.com/read-26158.html

    最新回复(0)