redis5.0單機,哨兵和Cluster


日常學習。。。。redis單機部署和高可用。通過docker部署,均未做數據持久化。

一,單機

dockerfile文件如下

from centos:7
RUN yum install vim net-tools tcl make gcc -y
ADD redis-5.0.7.tar.gz /opt/
RUN cd /opt/redis-5.0.7 \
  && make \
  && make test \
  && make install
RUN cp /opt/redis-5.0.7/redis.conf /etc/redis.conf \
  && sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /etc/redis.conf \
  && sed -i 's/daemonize no/daemonize yes/g' /etc/redis.conf \
  && sed -i 's/appendonly no/appendonly yes/g' /etc/redis.conf \
  && sed -i '$a\requirepass redis' /etc/redis.conf
RUN echo -e "#!/bin/bash\nredis-server /etc/redis.conf \nsh " >> /root/run.sh
RUN chmod a+x /root/run.sh
CMD ["/root/run.sh"]

創建鏡像

[root@dou redis]# docker build -t redis:v1 .
Sending build context to Docker daemon 202.4 MB
Step 1/8 : FROM centos:7
 ---> 08d05d1d5859
Step 2/8 : RUN yum install vim net-tools tcl make gcc -y
 ---> Using cache
 ---> ad582facf64d
Step 3/8 : ADD redis-5.0.7.tar.gz /opt/
 ---> Using cache
 ---> af8c2ddf726f
Step 4/8 : RUN cd /opt/redis-5.0.7   && make   && make test   && make install
 ---> Using cache
 ---> 48b3bfd1d32a
Step 5/8 : RUN cp /opt/redis-5.0.7/redis.conf  /etc/redis.conf    &&  sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /etc/redis.conf  &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/redis.conf     &&  sed -i '$a\requirepass redis'  /etc/redis.conf
 ---> Using cache
 ---> 8338a3cc7d2b
Step 6/8 : RUN echo -e "#!/bin/bash\nredis-server /etc/redis.conf \nsh " >> /root/run.sh
 ---> Using cache
 ---> ecc27472d84f
Step 7/8 : RUN chmod a+x /root/run.sh
 ---> Using cache
 ---> f177325dec1b
Step 8/8 : CMD /root/run.sh
 ---> Using cache
 ---> d5ac3fc2210a
Successfully built d5ac3fc2210a
[root@dou redis]#

運行容器

docker run -itd --network doufy --ip 172.19.0.30 --name redis01 -h redis01 redis:v1

連接測試

[root@redis01 /]# redis-cli -h 172.19.0.30 -p 6379 -a redis
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.19.0.30:6379> ping
PONG
172.19.0.30:6379>

二,主從復制

 docker file文件如下

[root@dou redis]# more Dockerfile-master
from centos:7
RUN yum install vim net-tools tcl make gcc -y
ADD redis-5.0.7.tar.gz /opt/
RUN cd /opt/redis-5.0.7  \
    && make       \
    && make test  \
    && make install
RUN  cp /opt/redis-5.0.7/redis.conf  /etc/redis.conf \
    &&  sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /etc/redis.conf \
    &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/redis.conf \
    &&  sed -i 's/appendonly no/appendonly yes/g'  /etc/redis.conf \
    &&  sed -i '$a\requirepass redis'  /etc/redis.conf
COPY run.sh  /root/run.sh
RUN chmod a+x /root/run.sh
CMD ["/root/run.sh"]

[root@dou redis]# more Dockerfile-slave
from centos:7
RUN yum install vim net-tools tcl make gcc -y
ADD redis-5.0.7.tar.gz /opt/
RUN cd /opt/redis-5.0.7  \
    && make       \
    && make test  \
    && make install
RUN  cp /opt/redis-5.0.7/redis.conf  /etc/redis.conf \
    &&  sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /etc/redis.conf \
    &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/redis.conf \
    &&  sed -i 's/appendonly no/appendonly yes/g'  /etc/redis.conf \
    &&  sed -i '$a\requirepass redis'  /etc/redis.conf \
    &&  sed -i '$a\replicaof 172.19.0.51 6379'  /etc/redis.conf \
    &&  sed -i '$a\masterauth redis'  /etc/redis.conf
COPY run.sh /root/run.sh
RUN chmod a+x /root/run.sh
CMD ["/root/run.sh"]

[root@dou redis]# more docker-compose.yml
version: '3.4'
x-logging:
  &default-logging
  options:
    max-size: '12m'
    max-file: '5'
  driver: json-file
services:
  master1:
    image: redis:m2
    logging: *default-logging
    restart: "no"
    hostname: master
    networks:
       doufy:
         ipv4_address: 172.19.0.51
    volumes:
      -  /etc/localtime:/etc/localtime:ro
      #測試不持久化了
  slave1:
    image: redis:s2
    logging: *default-logging
    restart: "no"
    hostname: slave1
    networks:
       doufy:
         ipv4_address: 172.19.0.52
    volumes:
      -  /etc/localtime:/etc/localtime:ro
  slave2:
    logging: *default-logging
    image: redis:s2
    restart: "no"
    hostname: slave2
    networks:
       doufy:
         ipv4_address: 172.19.0.53
    volumes:
      -  /etc/localtime:/etc/localtime:ro
networks:
    doufy:
      external: true
View Code

創建鏡像

docker build -t redis:m2 -f Dockerfile-master .
docker build -t redis:s2 -f Dockerfile-slave .

運行容器

docker-compose up -d

連接測試

[root@dou redis]# docker-compose up -d
Creating redis_slave2_1  ... done
Creating redis_slave1_1  ... done
Creating redis_master1_1 ... done
[root@dou redis]# docker exec -it redis_master1_1 bash -c "echo 'info replication'|redis-cli -a redis"
# Replication
role:master
connected_slaves:2
slave0:ip=172.19.0.52,port=6379,state=online,offset=420,lag=1
slave1:ip=172.19.0.53,port=6379,state=online,offset=420,lag=1
master_replid:bbe4270c4f3f5e7e72923413ba5907dc9d5513c7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:420
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:420
[root@dou redis]#

測試

在master節點設置key,slave節點獲取key

master節點
    [root@master /]# redis-cli -a redis
    127.0.0.1:6379> set doufy caiji
    OK
    127.0.0.1:6379> get doufy
    "caiji"
    127.0.0.1:6379>
slave節點
[root@slave1 /]# redis-cli -a redis

    127.0.0.1:6379> get doufy
    "caiji"
    127.0.0.1:6379>

master刪除,slave也沒了,主從復制到此結束

三, 哨兵模式

 docker file如下

[root@dou redis]# more Dockerfile-master
from centos:7
RUN yum install vim net-tools tcl make gcc -y
ADD redis-5.0.7.tar.gz /opt/
RUN cd /opt/redis-5.0.7  \
    && make       \
    && make test  \
    && make install
RUN  cp /opt/redis-5.0.7/redis.conf  /etc/redis.conf \
    &&  sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /etc/redis.conf \
    &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/redis.conf \
    &&  sed -i 's/appendonly no/appendonly yes/g'  /etc/redis.conf \
    &&  sed -i '$a\requirepass redis'  /etc/redis.conf
RUN  cp /opt/redis-5.0.7/sentinel.conf  /etc/sentinel.conf  \
    &&  sed -i '$a\bind  0.0.0.0'  /etc/sentinel.conf \
    &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/sentinel.conf \
    &&  sed -i 's/logfile \"\"/logfile \"\/var\/log\/redis\/sentine.log\"/g'  /etc/sentinel.conf \
    &&  sed -i 's/30000/3000/g'  /etc/sentinel.conf \
    &&  sed -i 's/180000/18000/g'  /etc/sentinel.conf \
    &&  sed -i 's/mymaster 127.0.0.1/mymaster 172.19.0.71/g'  /etc/sentinel.conf  \
    &&  sed -i '$a\sentinel auth-pass mymaster redis'  /etc/sentinel.conf
RUN mkdir  /var/log/redis &&  touch /var/log/redis/sentine.log  && chmod 755 /var/log/redis -R
COPY run.sh  /root/run.sh
RUN chmod a+x /root/run.sh
CMD ["/root/run.sh"]


[root@dou redis]# more Dockerfile-slave
from centos:7
RUN yum install vim net-tools tcl make gcc -y
ADD redis-5.0.7.tar.gz /opt/
RUN cd /opt/redis-5.0.7  \
    && make       \
    && make test  \
    && make install
RUN  cp /opt/redis-5.0.7/redis.conf  /etc/redis.conf \
    &&  sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /etc/redis.conf \
    &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/redis.conf \
    &&  sed -i 's/appendonly no/appendonly yes/g'  /etc/redis.conf \
    &&  sed -i '$a\requirepass redis'  /etc/redis.conf \
    &&  sed -i '$a\replicaof 172.19.0.71 6379'  /etc/redis.conf \
    &&  sed -i '$a\masterauth redis'  /etc/redis.conf
RUN  cp /opt/redis-5.0.7/sentinel.conf  /etc/sentinel.conf  \
    &&  sed -i '$a\bind  0.0.0.0'  /etc/sentinel.conf \
    &&  sed -i 's/daemonize no/daemonize yes/g'  /etc/sentinel.conf \
    &&  sed -i 's/logfile \"\"/logfile \"\/var\/log\/redis\/sentine.log\"/g'  /etc/sentinel.conf \
    &&  sed -i 's/30000/3000/g'  /etc/sentinel.conf \
    &&  sed -i 's/180000/18000/g'  /etc/sentinel.conf \
    &&  sed -i 's/mymaster 127.0.0.1/mymaster 172.19.0.71/g'  /etc/sentinel.conf \
    &&  sed -i '$a\sentinel auth-pass mymaster redis'  /etc/sentinel.conf
RUN mkdir  /var/log/redis &&  touch /var/log/redis/sentine.log  && chmod 755 /var/log/redis -R
COPY run.sh /root/run.sh
RUN chmod a+x /root/run.sh
CMD ["/root/run.sh"]


[root@dou redis]# more run.sh
#!/bin/bash
echo "#######開啟程序######"
redis-server /etc/redis.conf
echo "#######開啟哨兵######"
redis-sentinel /etc/sentinel.conf
echo "#######查看端口######"
netstat -ntulp
echo "#######查看進程######"
ps -aux
while true
do
        sleep 1h
done


[root@dou redis]# more docker-compose.yml
version: '3.4'
x-logging:
  &default-logging
  options:
    max-size: '12m'
    max-file: '5'
  driver: json-file
services:
  master1:
    image: redis:m3
    logging: *default-logging
    restart: "no"
    hostname: master
    networks:
       doufy:
         ipv4_address: 172.19.0.71
    volumes:
      -  /etc/localtime:/etc/localtime:ro
      #測試環境,不持久化了
  slave1:
    image: redis:s3
    logging: *default-logging
    restart: "no"
    hostname: slave1
    networks:
       doufy:
         ipv4_address: 172.19.0.72
    volumes:
      -  /etc/localtime:/etc/localtime:ro
  slave2:
    logging: *default-logging
    image: redis:s3
    restart: "no"
    hostname: slave2
    networks:
       doufy:
         ipv4_address: 172.19.0.73
    volumes:
      -  /etc/localtime:/etc/localtime:ro
networks:
    doufy:
      external: true
View Code

創建鏡像

docker build -t redis:m3 -f Dockerfile-master .
docker build -t redis:s3 -f Dockerfile-slave .

運行容器

[root@dou redis]# docker-compose up -d
Creating redis_master1_1 ... done
Creating redis_slave1_1  ... done
Creating redis_slave2_1  ... done

查看狀態

#主節點,如下一切正常
[root@dou redis]# docker exec -it redis_master1_1 bash -c "echo 'info replication'|redis-cli -a redis"
# Replication
role:master
connected_slaves:2
slave0:ip=172.19.0.72,port=6379,state=online,offset=3325,lag=1
slave1:ip=172.19.0.73,port=6379,state=online,offset=3325,lag=1
master_replid:49c58e94a1346ab8d59091690f55f0314e225198
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:3325
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:3325
#從節點1,如下一切正常
[root@dou redis]# docker exec -it redis_slave1_1 bash -c "echo 'info replication'|redis-cli -a redis"
# Replication
role:slave
master_host:172.19.0.71
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:30222
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:49c58e94a1346ab8d59091690f55f0314e225198
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:30222
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:30222
#從節點2,如下一切正常
[root@dou redis]# docker exec -it redis_slave2_1 bash -c "echo 'info replication'|redis-cli -a redis"
# Replication
role:slave
master_host:172.19.0.71
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:31469
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:49c58e94a1346ab8d59091690f55f0314e225198
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:31469
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:31469

測試

關閉主節點

docker exec -it redis_master1_1 bash -c "echo 'shutdown'|redis-cli -a redis"

查看從節點

#由此可見,從節點自動升級為主節點,哨兵配置完成
[root@dou redis]# docker exec -it redis_slave1_1 bash -c "echo 'info replication'|redis-cli -a redis"
# Replication
role:master
connected_slaves:1
slave0:ip=172.19.0.73,port=6379,state=online,offset=90397,lag=1
master_replid:4a3e4ea435ccdf0be6f05c2072b5e55fd994ec44
master_replid2:49c58e94a1346ab8d59091690f55f0314e225198
master_repl_offset:90397
second_repl_offset:81962
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:90397

 查看日志

 

 

四,Cluster

 

持續更新**********

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM