docker安装redis搭建主从复制+哨兵

拉取redis镜像

docker pull redis

redis.conf 文件 (下载redis.confredis.conf中  daemonize  no    #默认no,改为yes会使配置文件方式启动容器失败

################################## NETWORK #####################################
bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问

protected-mode no #默认yes,开启保护模式,限制为本地访问

port 6379 #设置端口



################################# GENERAL #####################################
daemonize no        #默认no,改为yes会使配置文件方式启动容器失败,改为yes意为以守护进程方式启动,可后台运行,除非kill进程

# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)  生产环境
# warning (only very important / critical messages are logged)
loglevel notice  #日志

logfile "" #日志的文件位置名 默认是一个标准的输出

databases 16 #数据库的数量,默认16个数据库

always-show-logo yes  #是否总是显示logo--redis启动时的logo


################################ SNAPSHOTTING  ################################
#持久化规则   持久化,在规定的时间内,执行了多少次操作,则会持久化到文件 .rdb .aof
#redis是内存数据库,如果没有持久化,那么数据断电即失
save 900 1      #如果900s内,至少1个key进行了修改,就会进行持久化操作
save 300 10     #如果300s内,至少10个key进行了修改,就会进行持久化操作
save 60 10000   #如果60s内,至少10000个key进行了修改,就会进行持久化操作


stop-writes-on-bgsave-error yes  # 持久化如果出错,是否还需要继续工作

rdbcompression yes #是否压缩rdb文件,需要消耗一些cpu资源

rdbchecksum yes #保存rdb文件的时候,是否进行错误的检查校验

dir ./  # rdb文件保存的目录



################################### CLIENTS ####################################
maxclients 10000  #默认注释的  设置能连接上redis的最大客户端的数量


############################## MEMORY MANAGEMENT ################################
maxmemory <bytes>  #默认注释的  配置redis最大的内存容量

maxmemory-policy noeviction  #默认注释的  内存达到上限之后的处理策略
    noeviction:默认策略,不淘汰,如果内存已满,添加数据是报错。
    allkeys-lru:在所有键中,选取最近最少使用的数据抛弃。
    volatile-lru:在设置了过期时间的所有键中,选取最近最少使用的数据抛弃。
    allkeys-random: 在所有键中,随机抛弃。
    volatile-random: 在设置了过期时间的所有键,随机抛弃。
    volatile-ttl:在设置了过期时间的所有键,抛弃存活时间最短的数据。


############################## APPEND ONLY MODE ###############################
appendonly no #默认不开启aof模式,默认使用rdb方式持久化的,在大部分所有的情况下,rdb完全够用

appendfilename "appendonly.aof"    #持久化的文件的名字


# appendfsync always    #每次修改都会 sync,消耗性能
appendfsync everysec    #每秒执行一次 sync,可能会丢失这1s的数据
# appendfsync no        #不执行 sync,这个时候操作系统自己同步数据,速度最快

启动容器

docker run --name redis -d -v /data/redis/conf/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data --privileged=true -p 6379:6379 镜像ID redis-server /etc/redis/redis.conf --appendonly yes


#redis-server /etc/redis/redis.conf:指定配置文件启动redis进程

#appendonly yes:开启数据持久化

redis-benchmark性能测试

#进入到容器内
docker exec -it [容器名] bash
#执行命令
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

 

搭建主从复制

概念:主从复制是将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master/leader),后者称为从节点(slave/follower); 数据的复制是单向的,只能由主节点到从节点。Master以写为主,Slave以读为主

默认情况下,每台Redis服务器都是主节点,且一个主节点可以由多个从节点(或没有从节点),但一个从节点只能有一个主节点

主从复制,读写分离,80%的情况下都是在进行读操作,减轻服务器的压力,架构中常常使用,最低配置 一主二从

作用:

1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式

2.故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障修复;实际上是一种服务的冗余

3.负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即 写Redis数据时,应用连接主节点,读Redis数据时,应用连接从节点),分担服务器的负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量

4.高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制时Redis高可用的基础

复制原理

Slave 启动成功连接到 Master 后,会发送一条sync命令;Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,Master 将传送整个数据文件到 Slave,并完成一次完全同步。

全量复制:而 Slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中

增量复制:Master 继续将新的所有收集到的修改命令依次传给 Slave,完成同步

但是只要重新连接 Master ,一次完全同步(全量复制)将会执行,我们的数据一定可以在从机中看到

1.复制2个配置文件,修改对应的信息

1.pid名字

2.log文件名

3.dump.rdb 名字

4.replicaof redis 6379 #从机(Slave)配置主机(Master)ip+端口  主机不需要更改

2.启动 Redis-Slave

docker run --name redis-slave1 -d --link redis -v /data/redis/conf/redis6380.conf:/etc/redis/redis.conf -v /data/redis/data:/data --privileged=true -p 6380:6379 镜像ID redis-server /etc/redis/redis.conf --appendonly yes

docker run --name redis-slave2 -d --link redis -v /data/redis/conf/redis6381.conf:/etc/redis/redis.conf -v /data/redis/data:/data --privileged=true -p 6381:6379 镜像ID redis-server /etc/redis/redis.conf --appendonly yes



--link redis:建立与master节点之间的容器间的通信,可以在配置文件中使用容器名替换ip

# master节点配置  因为启动的时候指定了 --link 所以直接使用容器名
replicaof redis 6379


#查看当前库的信息
127.0.0.1:6379> info replication
# Replication
role:master    #角色:master
connected_slaves:0     #没有从机
master_replid:43e5f2e333b40c70f32d3422cb4d1f1a3a3f5970
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

3.测试主从复制

Master设置k1,Slave1、Slave2都可以获取k1

从节点只能读取

主机停止服务,从机依然连接的是主机,但是没有写操作,这个时候主机重新启动,从机依旧可以直接获取主机写的数据

 

配置哨兵

作用:

1.监控:监控主节点和从节点是否正常运行

2.通知:哨兵检测的服务器出现问题时,会向其他的哨兵发送通知

2.故障转移:当检测到主节点宕机后,断开与宕机主节点连接的所有从节点,在从节点中选取一个作为主节点,然后将其他的从节点连接到这个最新主节点的上。并且告知客户端最新的服务器地址。sentinel.conf 文件 (下载sentinel.conf

按照如下更改sentinel26379.conf、sentinel26380.conf、sentinel26381.conf

注:一般配置奇数台哨兵,防止投票相等的情况,本示例配置了3台

配置主节点的哨兵

#端口
port 26379

#哨兵监控master节点,后面这个2是指几个哨兵发现master宕机了,才进行故障转移
sentinel monitor mymaster redis 6379 2

#设置哨兵多久连接不上master就认为master宕机了的时间, 单位毫秒
sentinel down-after-milliseconds mymaster 3000

#故障转移,新的master出现后,其他follow的slave并行同步的个数,并行的越多同时阻塞的就越多
sentinel parallel-syncs mymaster 1

#添加为后台运行
daemonize yes

#指定日志目录
logfile "/data/sentinel26379.log"

pidfile /var/run/redis-sentinel26379.pid

dir /data

配置从节点的哨兵

#端口
port 26379


#哨兵监控master节点,后面这个2是指几个哨兵发现master宕机了,才进行故障转移
sentinel monitor mymaster redis 6379 2

#设置哨兵多久连接不上master就认为master宕机了的时间, 单位毫秒
sentinel down-after-milliseconds mymaster 3000

#故障转移,新的master出现后,其他follow的slave并行同步的个数,并行的越多同时阻塞的就越多
sentinel parallel-syncs mymaster 1

#添加为后台运行
daemonize yes

#指定日志目录
logfile "/data/sentinel26380.log"

pidfile /var/run/redis-sentinel26380.pid

dir /data

启动哨兵

#主节点哨兵
docker run -d --name sentinel-master --privileged=true -p 26379:26379 --link redis -v /data/redis/sentinel/sentinel26379.conf:/usr/local/etc/redis/sentinel.conf 镜像ID


#进入容器
docker exec -it sentinel bash

#启动哨兵
cd /
redis-sentinel /usr/local/etc/redis/sentinel.conf


#从节点哨兵

docker run -d --name sentinel-slave1 --privileged=true -p 26380:26379 --link redis -v /data/redis/sentinel/sentinel26380.conf:/usr/local/etc/redis/sentinel.conf 镜像ID

#进入容器
docker exec -it sentinel bash

#启动哨兵
cd /
redis-sentinel /usr/local/etc/redis/sentinel.conf

docker run -d --name sentinel-slave2 --privileged=true -p 26381:26379 --link redis -v /data/redis/sentinel/sentinel26381.conf:/usr/local/etc/redis/sentinel.conf 镜像ID

进入哨兵进行状态查询


[root@localhost ~]# docker exec -it sentinel redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "172.17.0.2"
 5) "port"
 6) "6379"
 7) "runid"
 8) "52d5a6f45a72ff6d69820bf6fafa293d4694097d"
 9) "flags"
10) "master" ...


127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "172.17.0.3:6379"
    3) "ip"
    4) "172.17.0.3"
    5) "port"
    6) "6379"
    7) "runid"
    8) "ac7112b612f8ce4c196e349d0aef28f290888686"
    9) "flags"
   10) "slave" ...
2)  1) "name"
    2) "172.17.0.4:6379"
    3) "ip"
    4) "172.17.0.4"
    5) "port"
    6) "6379"
    7) "runid"
    8) "8176aa666ea22672956e378cd6ebc71faa0b57fc"
    9) "flags"
   10) "slave" ...


127.0.0.1:26379> sentinel sentinels mymaster
1)  1) "name"
    2) "c0a9519a567bca2f2dd8efe2fec6ece49f92a845"
    3) "ip"
    4) "172.17.0.6"
    5) "port"
    6) "26379"
    7) "runid"
    8) "c0a9519a567bca2f2dd8efe2fec6ece49f92a845"
    9) "flags"
   10) "sentinel" ...
2)  1) "name"
    2) "eb19c725f1ac8139707be08fdfaabcea5160632a"
    3) "ip"
    4) "172.17.0.7"
    5) "port"
    6) "26379"
    7) "runid"
    8) "eb19c725f1ac8139707be08fdfaabcea5160632a"
    9) "flags"
   10) "sentinel" ...

 

测试哨兵故障转移

从原来的Master(172.17.0.2)切换到172.17.0.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章