分布式系统:
分布式操作系统是以全局方式管理系统资源的,它可以为用户任意调度网络资源,并且调度过程是“透明”的。当用户提交一个作业时,分布式操作系统能够根据需要在系统中选择最合适的处理器,将用户的作业提交到该处理程序,在处理器完成作业后,将结果传给用户。在这个过程中,用户并不会意识到有多个处理器的存在,这个系统就像是一个处理器一样。
介绍:
Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。
虽然 Redis Sentinel 释出为一个单独的可执行文件 redis-sentinel , 但实际上它只是一个运行在特殊模式下的 Redis 服务器, 你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动 Redis Sentinel 。
Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API
向管理员或者其他应用程序发送通知。 - 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作,
它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器;
当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器
搭建:
1.搭建docker-machine
我使用的是docker-machine搭建的,因为可以减少搭建系统、重新搭建docker的多诸多繁琐步骤。
(1)首先安装docker-machine:
curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \
install /tmp/docker-machine /usr/local/bin/docker-machine
(2)完成后,查看版本信息。
docker-machine -v
docker-machine version 0.14.0, build 89b8332
(3)创建虚拟机:
docker-machine create -d virtualbox master
docker-machine create -d virtualbox slave
docker-machine create -d virtualbox sentinel
(4)获取IP
docker-machine ls
xqkang@xqkang:~$ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
master - virtualbox Running tcp://192.168.99.100:2376 v19.03.5
sentinel - virtualbox Running tcp://192.168.99.102:2376 v19.03.5
slave - virtualbox Running tcp://192.168.99.101:2376 v19.03.5
(5)连接虚拟机
docker-machine ssh master
docker-machine ssh slave
docker-machine ssh sentinel
搭建redis哨兵模式
设计思想:
id | 主从 |
---|---|
192.168.99.100 | 主redis |
192.168.99.101 | 从redis |
一、主redis搭建
在主节点master上的/qj/redis/data目录下创建redis.conf文件,文件配置如下
bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass qj12345678@
masterauth qj12345678@
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync always
docker启动命令
docker run -d --name redis --restart=always -p 6380:6380 -v /qj/redis/data/:/data -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone redis:latest redis-server redis.conf
二、从redis搭建
在从节点/qj/redis/data目录下,创建redis.conf配置文件
配置内容如下所示:
bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass qj12345678@
masterauth qj12345678@
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly yes
appendfsync always
slaveof 192.168.99.100 6380
docker启动命令如下:
docker run -d --name redis --restart=always -p 6380:6380 -v /qj/redis/data/:/data -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone redis:latest redis-server redis.conf
搭建哨兵集群:
服务器名称 | IP | 端口 |
---|---|---|
sentinel-1 | 192.168.99.100 | 26379 |
sentinel-2 | 192.168.99.101 | 26379 |
sentinel-3 | 192.168.99.102 | 26379 |
配置文件目录:/qj/sentinel/sentinel.conf
192.168.99.100搭建sentinel-1
sentinel.conf配置文件如下所示:
daemonize no
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10
docker启动命令如下所示:
docker run -d -p 26379:26379 --name sentinel-1 --network host -v /qj/sentinel/sentinel.conf:/data/sentinel.conf -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone --restart=always redis:latest redis-sentinel sentinel.conf
192.168.99.101搭建sentinel-2
sentinel.conf配置文件如下所示:
daemonize no
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10
docker启动命令如下所示:
docker run -d -p 26379:26379 --name sentinel-2 --network host -v /qj/sentinel/sentinel.conf:/data/sentinel.conf -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone --restart=always redis:latest redis-sentinel sentinel.conf
192.168.99.102搭建sentinel-3
sentinel.conf配置文件如下所示:
daemonize no
port 26379
dir "/tmp"
sentinel monitor mymaster 192.168.99.100 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10
docker启动命令如下所示:
docker run -d -p 26379:26379 --name sentinel-3 --network host -v /qj/sentinel/sentinel.conf:/data/sentinel.conf -v /etc/localtime:/ete/localtime -v /etc/timezone:/etc/timezone --restart=always redis:latest redis-sentinel sentinel.conf
4.检测哨兵集群是否成功
查看sentinel.conf文件,当出现如下内容代表搭建成功:
aemonize no
port 26379
dir "/tmp"
sentinel myid 2a8f24182fde40322890851d5e0c1558c0ae5ef6
sentinel deny-scripts-reconfig yes
sentinel monitor mymaster 192.168.99.100 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster qj12345678@
#Generated by CONFIG REWRITE
sentinel config-epoch mymaster 10
sentinel leader-epoch mymaster 10
sentinel known-replica mymaster 192.168.99.101 6380
sentinel known-sentinel mymaster 192.168.99.102 26379 1d9fe6afcd83efc6c73ca997da8b236bc90da25d
sentinel known-sentinel mymaster 192.168.99.100 26379 db7a72938a470e372d87fa0c7c564d5bb161950b
sentinel current-epoch 10
检查主从是否搭建成功:
进入主redis,出现以下代表成功:
docker@master:/qj/redis$ docker exec -it redis bash
root@2f11645ef4de:/data# redis-cli -p 6380
127.0.0.1:6380> AUTH qj12345678@
OK
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.99.101,port=6380,state=online,offset=32998,lag=0
master_replid:436241f908c8f739b972f87ba4ed886a1f784efc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:32998
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:32998
127.0.0.1:6380>
查看从redis,出现一下代表成功:
docker@slave:/qj/sentinel$ docker exec -it redis bash
root@7511a0387088:/data# redis-cli -p 6380
127.0.0.1:6380> AUTh qj12345678@
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:192.168.99.100
master_port:6380
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:402953
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:436241f908c8f739b972f87ba4ed886a1f784efc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:402953
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:5099
repl_backlog_histlen:397855