docker最基本指令以及如何连接进入docker构建的redis等操作

文档链接:https://pan.baidu.com/s/18F5sB5PObmjKmNcoZTvWzA 提取码:1234

Docker

基本命令

ip addr:查看网络ip

uname -r:查看center os 版本

yum install docker:安装docker(centeros7可以,8版本不支持)

systemctl start docker:启动docker

systemctl stop docker:停止docker

docker -v:查看docker版本号

systemctl enable docker:设置docker开机自启动

docker常用操作

docker search 关键字:搜索docker hub上是否有对应的镜像

docker pull 镜像名:tag:其中:tage是可选的,代表版本号,默认latest

docker images:查看所有本地镜像

docker rmi image-id:删除指定的本地镜像

docker容器相关操作

docker run --name container-name -d image-name:创建docker容器

  • --name 起名字

  • -d 后台运行

  • -p 主机->服务器 映射端口

docker ps:查看运行中的容器

docker ps -a:查看所有容器

docker rm container-id:移除指定容器

docekr start container-id/container-name:开启某个容器

docker stop container-id/container-name:关闭某个容器

-p 8888:8080: -p代表端口映射 主机端口8888:容器端口8080【docker run --name mytomcat -d -p 8887:8080 tomcat:8.5.59

docker logs container-id/container -name:查看容器日志

docker开启数据库

访问docker官方 如Mysql:https://registry.hub.docker.com/_/mysql

docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

位置

docker pull下来的镜像放哪儿了?

本机docker版本
docker –version
Docker version 18.09.0

1.进入docker 目录

root@Rightsec:~# cd /var/lib/docker
root@Rightsec:/var/lib/docker# ls
builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes

2.进入containers,每个序列号都是一个image

root@Rightsec:/var/lib/docker# cd containers/
root@Rightsec:/var/lib/docker/containers# ls
e36d800f663b626aef2c625c48c353555d9b203e13e7e49093d15be2f3a0fb6e

3.进入镜像可以看到

root@Rightsec:/var/lib/docker/containers# cd e36d800f663b626aef2c625c48c353555d9b203e13e7e49093d15be2f3a0fb6e/
root@Rightsec:/var/lib/docker/containers/e36d800f663b626aef2c625c48c353555d9b203e13e7e49093d15be2f3a0fb6e# ls
checkpoints                                                               hostconfig.json mounts
config.v2.json                                                             hostname         resolv.conf
e36d800f663b626aef2c625c48c353555d9b203e13e7e49093d15be2f3a0fb6e-json.log hosts           resolv.conf.hash

4.进入image文件夹,里面有repositories.json的文件,详细记录了各镜像的一些信息:

复制代码

root@Rightsec:/var/lib/docker# cd image/
root@Rightsec:/var/lib/docker/image# ls
overlay2
root@Rightsec:/var/lib/docker/image# cd overlay2/
root@Rightsec:/var/lib/docker/image/overlay2# ls
distribution imagedb layerdb repositories.json

 

Docker高级篇

-p 6379:6319 -d -ip 192.168.1.1 -D 等等其他命令

[docker命令参考博客

 

高级篇

缓存的SPEL表达式

(springboot中)

methodNameroot对象当前被调用的方法名#root.methodname
method root对象 当前被调用的方法 #root.method.name
target root对象 当前被调用的目标对象实例 #root.target
targetClass root对象 当前被调用的目标对象的类 #root.targetClass
args root对象 当前被调用的方法的参数列表 #root.args[0]
caches root对象 当前方法调用使用的缓存列表 #root.caches[0].name
Argument Name 执行上下文 当前被调用的方法的参数,如findArtisan(Artisan artisan),可以通过#artsian.id获得参数 #artsian.id
result 执行上下文 方法执行后的返回值(仅当方法执行后的判断有效,如 unless cacheEvict的beforeInvocation=false) #result

 

Redis

参考文档

docker进入

docker ps
docker exec -it 1568d96bcfcc redis-cli

命令参考链接

docker exec -it 1568d96bcfcc(容器id) redis-cli

使用exit退出,回到root

select 1:选择1号数据库(切换数据库)

dbsize:当前数据库大小

😄

 

String

下方的name就是我设置的key

set name 宁新杰

get name

append msg hello append msg JD! :append追加(append msg ' ')可以追加空格

keys * :查看数据库所有的key

exists name:是否存在name这个key

flushdb :清空当前数据库

flushall:清空全部数据库

del name:删除当前key

move name 1:将本数据库下name这个key移动到1号数据库

expire name 10:设置当前key的过期时间为10s

tt1 name:查看当前key的剩余过期时间(time to live 生存时间)

type name:查看当前key类型

strlen name:获取当前key的长度

incr view:数字向上递增1(即使type view类型是string)

decr view:数字向下递减1

incrby view 5:递增5

decrby view 3:递减3

getrange name 0 2:截取索引0~2(包括2,这里注意和java有点区别)【闭区间】

getrange name 0 -1:截取整个,这个和直接get name是一样的

getrange name 0 -2:截取到倒数第二个(也就是不要最后一个字符)

substr name 0 2:截取字符串0~2索引闭区间的字符 (nxj)

setrange key1 0 qq:从0开始将前两个字符替换成qq 【abcd-->qqcd】

setnx k2 'ouhou':如果k2这个key不存在则设置键为k2值为ouhou,否则不做设置

setex k3 20 'nale':设置k3的值并且给定过期时间(如果key存在则覆盖)

rename k1 k2:将k1重命名为k2

加上m救是multi

mset k1 v1 k2 v1 [...等等]:可以一次性放多个键值

mget k1 k2 :一次性get多个键的值

msetnx k4 v4 k3 k5:这里如果有一个key是存在的,整个设置都是不成功的,也就是该语句保证了这个操作的原子性

getset k3 value3:也就是先get然后set,返回的是get的结果,然后再调用set,如果key开始不存在,那么get为null

😄

 

List

(一般都以L开头)

lpush/rpush list 1 2 3 str:向列表从左(右)边push元素进去

lrange 0 -1:查看当前列表元素

lpop/rpop list:左(右)边移除一个元素

lindex list 0:获取列表第0(i)个索引

llen list:获取列表的长度

lrem list 3 str:(lrem key count element)(list remove)移除list中元素为1的并且移除3个(从左往右找,不足3个则一直找,知道够为止,如果到达末尾还不够则返回移除的个数)

ltrim list 1 2:通过下标,截取list元素为当前list的[1,2]元素

rpoplpush list newlist:移除list最右边的元素并将这个元素从左边加入到newlist中

lset list 0 vnew:将list第0个索引的值替换为vnew

LINSERT list before\after v3 mystr:往list中v3字符串之前或者之后插入字符mystr(如果有多个,则从前往后找第一个,如果list中没有v3这个则插入失败,返回-1)

😄

 

Set

set中的值不能重复(一般以s开头)

去重,且顺序和我们add进去的顺序不一定相同(无序 不重复)

sadd set nxj hello jd!:向set中添加元素

smembers set:查看set中的元素

sismember set hello:判断hello是不是set中的成员

scard set:查看set中有多少个元素

SREM set hello2:将hello2元素从集合中移除

srandmember set 1:(srandmember key count)随机取出count个元素 count>=scard set就是取出全部

SPOP set 2:随机移除2个元素

smove set set1 enheng:将set中的enheng元素移动到set1中

sdiff set1 set2:返回set1中与set2中不同的元素(差集)

sinter set1 set2:返回二者的交集

SUNION set1 set2:返回二者的并集

😄

 

Hash

key和Map,其中map就是键值对(一般以h开头)(方法基本上都可以和String差不多)

(map的设置和String基本没啥区别,因此命令和String就很像了)

hset hash f1 v1:设置hash的map->key为f1,value为v1

hmset hash f1 v0 f2 v1:设置hash的f1值为v0,f2值为v1

hgetall hash:得到所有hash的所有键值对

hdel hash f1:删除hash中的指定的key(f1)字段,对应value当然也就没有了

hexists hash f1:判断hash中是否存f1这个字段

hkeys hash:返回hash中全部的key

hvals hash:返回hash中全部的值

hincrby hash num 2:将hash中的num的值加2

hincrby hash num -3:将hash中的num的值减3

hincrbyfloat hash num 1.1:将hash中的num的值增加1.1

hsetnx hash f4 v4:对应和String的setnx一样,不存在则添加

hmset user02 name nxj age 25:这样的话我们就可以将我们数据对应放入进来

由此可见hash和String好多方法都是类似的,Hash适合存储对象,String适合存储键值对

😄

 

Zset

zadd zset 1 one:score设置为1,向zset加入one

zrange zset 0 -1:仍然是查看

zrangebyscore salary -inf +inf:将salary这个set按照score排序(inf就是代表无穷 [-inf +inf]就是代表负无穷到正无穷)

ZREVRANGEBYSCORE salary inf -inf:按照score降序排

zrange salary 0 -1 withscores:查询并打印score

zrem zset one:移除zset中的one这个元素

zcard zset:返回zset中元素数量

zcount zset 0 1:返回score为[0,1]区间值的个数

其余的都可以参考文档来完成我们需要做的事情

😄

 

Geo

geoadd city 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania":【GEOADD key 纬度 精度 name】

geopos city Palermo:查询维度和精度

georadius city 12 37 200 km:搜索纬度为12 精度为37 为中心,附近半径为200km之内的城市

georadius city 12 37 200 km withcoord withdist withhash count 2:count指定为2代表结果最多返回2个

GEORADIUSBYMEMBER city Catania 10000 km withcoord count 2:可以指定member为中心查找附近的

我们可以通过使用zrange等,zrem等操作当前Geoadd 的key

zrange city 0 -1

zrem city Catania

😄

 

HyperLogLog

主要用于基数统计(统计网站用户浏览量),错误率有0.81%,但是对于统计浏览量这种错误率我们是可以接受的

放入了2^64数据,我们大约需要12kb左右内存,对于统计用户浏览量(同一个用户浏览多次也算一个)是很有用的

127.0.0.1:6379> pfadd views u1 u2 u3 u4 u5 #加入
(integer) 1
127.0.0.1:6379> pfcount views#统计数量
(integer) 5
127.0.0.1:6379> pfadd views02 u1 u5 u7
(integer) 1
127.0.0.1:6379> pfcount views02
(integer) 3
127.0.0.1:6379> pfmerge newview views views02#合并,并将结果移到一个新的中去
OK
127.0.0.1:6379> pfcount newview
(integer) 6
127.0.0.1:6379>

如果不允许容错,我们只能使用set等来存储

😄

 

Bitmap

存储方式为位存储

活跃/不活跃 登陆/未登录 ... 这种具有两种状态的都可以使用bitmaps

它是通过操作二进制位进行记录,只有0和1两种状态

setbit sign 0 1:设置sign的0位置标示为1(代表打卡)

getbit sign 0:获取sign的0位置标示(是否打卡)

bitcount sign:统计打卡的天数

 

事务

Redis事务不保证原子性,整个过程为:

(事务执行按照从前到后一个个执行,即使当前命令错误,也不会影响下面继续执行,但是如果是编译时异常,也就是命令有问题,那么所有的都不会执行)

1.开启事务(multi)

2.命令入队(...)

3.执行事务(exec)

127.0.0.1:6379> multi#开启事务
OK
127.0.0.1:6379> set k2 v2 v2#命令入队
QUEUED
127.0.0.1:6379> set k1 v1#命令入队
QUEUED
127.0.0.1:6379> exec #执行事务
1) (error) ERR syntax error
2) OK
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1
"v1"

#下方代码就能够看得出,事务的执行是顺序执行的
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> flushdb
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
127.0.0.1:6379> keys *
1) "k2"

multi:开启事务

discard:取消事务

exec:执行事务

因此能够看出redis的事务,并不能类比Mysql,它的事务更像是一组命令的集合,但是命令之间(编译异常不考虑)没有任何影响

 

乐观锁

127.0.0.1:6379> watch money #使用watch监控money这个key,如果其他事务修改了这个key,而本线程的事务还没提交,那么事务就提交失败,返回(nil)
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379>
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> exec #从监控事务开始,有另外的事务修改了money,事务执行失败!
(nil)

只要watch了这个key,其与线程修改了这个key,那么事务就提交不成功

每次都需要设置watch,因此事务执行完一次后,watch就自动失效了(必须是事务内才会生效)

也就是说,本事务watch之后,不在multi事务内是可以修改的,但是如果期间有任何一个其他的事务(可以不在multi内)修改了这个key,那么multi内执行事务是失败的,并且无论是否执行成功,watch自动失效;(完成了乐观锁的功能)

也就是watch的时候我获取了这个值,以后在执行事务更新的时候,我会带上这个值,和版本号有点像,此时事务内全部不成功

unwatch:解除监视

若我们执行了exec或者discard后就没必要unwatch了,因为此时已经被unwatch了

 

Jedis

//操作命令和redis中基本保持一致,强!
Jedis jedis = new Jedis("47.98.189.228",6379);
//String ping = jedis.ping();
//System.out.println(ping);
//jedis.lpush();
//String watch = jedis.watch();

Transaction multi = jedis.multi();
multi.set("k1","v1");
multi.lpush("list","a","b","c");
multi.exec();

 

Docker下Redis持久化

rdb
#也就是若100s内更改了2次则触发save生成dump.rdb或者900s内更改了1次则触发,个人理解是每过这个周期触发一次,如果900s内已经触发一次,那么下次触发时机,单单对于900 1来讲需要过900s后再触发(不知道这个理解对不对呢)
config set save "100 2 900 1"

直接在控制台输入(不要在redis客户端哦):
find / -name dump.rdb #寻找dump.rdb位置
ps -ef|grep redis  #查看运行状态
#我的阿里云服务器的位置在:
#/var/lib/docker/volumes/1914d0e8ff887c879fb6bc48d8ce8a82f6716e335a9ecf5b8d854172da09f0b4/_data/dump.rdb

#设置完了以后,如果有dump.rdb文件,当服务器宕机再重启,则会自动恢复
shutdown nosave/save  #nosave/save标识是否保存成rdb
docker start container-id
keys * #会发现恢复了dump.rdb中
#果我们将dump.rdb删除,则keys *返回为null

dump.rdb产生触发时机:

  1. save条件触发,或者我们直接调用save命令

  2. flushall也会触发,dump.rdb只是一个空的,没数据

  3. 退出redis,也就是执行shutdown的时候,也会生成rdb文件(会保存我们退出前的数据(当然这是我们正常退出,如果宕机那肯定没有啦))【当然shutdown nosave也是不会生产rdb的】

 

aof

 

发布订阅

下表列出了 redis 发布订阅常用命令:

序号命令及描述
1 [PSUBSCRIBE pattern pattern ...] 订阅一个或多个符合给定模式的频道。
2 PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态。
3 PUBLISH channel message 将信息发送到指定的频道。
4 PUNSUBSCRIBE [pattern [pattern ...]] 退订所有给定模式的频道。
5 [SUBSCRIBE channel channel ...] 订阅给定的一个或多个频道的信息。
6 UNSUBSCRIBE [channel [channel ...]] 指退订给定的频道。
  • 开启本地 Redis 服务,开启两个 redis-cli 客户端。

  • 第一个 redis-cli 客户端输入 SUBSCRIBE runoobCha,意思是订阅 runoobChat 频道。

  • 第二个 redis-cli 客户端输入 PUBLISH runoobChat "Redis PUBLISH test" 往 runoobChat 频道发送消息,这个时候在第一个 redis-cli 客户端就会看到由第二个 redis-cli 客户端发送的测试消息。

 

 

主从复制

主机负责写操作,从机负责读操作

默认生成的redis容器都是主机,一个容器可以有0~多个从机,但是最多只能有1个主机

info replication:查看当前库的信息 replication(复制)

config get dbfilename:查看备份的rdb文件名,默认为dumo.rdb

config set dbfilename "dump_6379.rdb":设置备份的rdb文件名为dump_6379.rdb

配置多个容器

(因为docker各个容器间是沙箱隔离机制,各个容器之间互不干扰)

docker run --name myredis -d -p 6379:6379 redis

docker run --name myredis01 -d -p 6380:6379 redis

docker run --name myredis02 -d -p 6381:6379 redis

进入到每个客户端后进行设置:

config set dbfilename "dump_6379.rdb"

config set dbfilename "dump_6380.rdb"

config set dbfilename "dump_6381.rdb"

设置一主二从

设置一主(6379)二从(6380 6381)

6380/6381客户端输入:slaveof 47.98.189.228 6379:认47.98.189.228:6379当主机(也就是隶属于这个下方)(slaveof ip port)

通过info replication:查看发现二者的role:slave,查看6379则role:master connected_slaves:2,说明主从设置成功,它仍是主机,切下面连接两个从机

当我们对主机进行写的时候,会自动同步到从机上(和我看的面经一样rdb->发送写命令),同时我们也不能在从库上进行写命令,因为从库是只读的。

如果不设置哨兵,主机断开后,从机仍然是从机,他所连接的主机仍然是断开的主机,因此此时只能进行读操作,不能进行写操作了,但是数据会保留,当主机重新连接回来,往主机再写的时候仍然会同步到从机

当从机断开,主机设置值,从机再次连接的时候,我们在这个从机中拿不到值?通过info replication可以发现从机启动后就变成了主机了,因此如果我们仅从命令层进行设置,当关闭后所有配置全部重置,因此看出配置文件的重要性,只有通过配置文件启动,在配置文件中设置为从机,这样才会保证即使shutdown后仍然是从机

只要变为从机,数据就会立马和主机同步(过程就是先rdb(传数据[全量复制]),再缓存命令(传命令[增量复制])期间如果断开再连接,则把断开期间的命令再进行同步发送)

slaveof no one:设置自己为主节点(自己当老大)

 

哨兵模式

哨兵就是可以监控我们各个客户端运行是否正常,当主库出现问题的时候会根据投票数,自动将从库转为主库。

 

重要,包含了下方docker整个配置,和下方链接是一样的

阿里云主从配置(但是配置文件版还是不行,我的天啊)

Docker下通过配置文件启动redis

https://blog.csdn.net/qq_41948178/article/details/106585244

(这样通过配置文件启动,我的主从复制无法接受,why?)

#启动redis镜像同时配合容器卷
docker run -p 6382:6379 --name myconfigredis -v /var/lib/docker/containers/redis.conf:/etc/redis/redis.conf -v /var/lib/docker/containers/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes
#其中-v挂载目录 (我将我的redis.conf放在/var/lib/docker/containers/redis.conf) redis是沙箱,不能随意加载外部文件,使用-v挂载就可以使用了(个人理解) 如果不设置设置完会发现端口号并未成功设置
#redis-server /etc/redis/redis.conf 挂载映射的位置,这样通过配置文件开启redis
#--appendonly yes 设置aof开启,我们也可以不设置,直接在配置文件中改,或者config set appendonly "yes"

Docker下启动哨兵

https://blog.csdn.net/qq_41948178/article/details/106585244

/var/lib/docker/containers/sentinel.conf
/var/lib/docker/containers/sentinel/sentinel.conf
#启动哨兵
docker run --name mysentinel -p 26379:26379 -v /var/lib/docker/containers/sentinel/sentinel.conf:/etc/redis/redis-sentinel.conf -v /home/docker/redis/sentinel/sentinel-data:/data -d redis redis-sentinel /etc/redis/redis-sentinel.conf

Docker下redis搭建单机版集群

docker run -p 6379:6379 --name myredis01 -v /var/lib/docker/containers/conf/redis_6379.conf:/etc/redis/redis_6379.conf -v /var/lib/docker/containers/conf/data_6379:/data_6379 -d redis redis-server /etc/redis/redis_6379.conf

docker run -p 6380:6380 --name myredis02 -v /var/lib/docker/containers/conf/redis_6380.conf:/etc/redis/redis_6380.conf -v /var/lib/docker/containers/conf/data_6380:/data_6380 -d redis redis-server /etc/redis/redis_6380.conf

docker run -p 6381:6379 --name myredis03 -v /var/lib/docker/containers/conf/redis_6381.conf:/etc/redis/redis.conf -v /var/lib/docker/containers/conf/data:/data -d redis redis-server /etc/redis/redis.conf

 

#哨兵下
docker exec -it container-id /bin/bash  
#redis-cli -p 6380
或者
docker exec -it 671d02d4e620 redis-cli -p 6380

#正常容器下
docker exec -it container-id bash

 

#####

info sentinel

 

 

 

docker run --name mysentinel -p 26379:26379 -v /var/lib/docker/containers/sentinel/sentinel.conf:/etc/redis/redis-sentinel.conf -d redis redis-sentinel /etc/redis/redis-sentinel.conf

 

test

127.0.0.1:6379> config get save
1) "save"
2) "3600 1 300 100 60 10000"

config set appendonly "yes" #设置aof持久化打开


直接在控制台输入(不要在redis客户端哦):
find / -name dump.rdb #寻找dump.rdb位置
ps -ef|grep redis  #查看运行状态
我的阿里云服务器的位置在:
/var/lib/docker/volumes/1914d0e8ff887c879fb6bc48d8ce8a82f6716e335a9ecf5b8d854172da09f0b4/_data/dump.rdb
redis.conf
放到自己指定的目录:

/home/docker/redis/config
/var/lib/docker/containers/redis.conf

 

   # 运行服务
  docker run -it --name redis-master -v /var/lib/docker/containers/conf/redis_master.conf:/usr/local/etc/redis/redis.conf -d -p 6300:6379 redis /bin/bash
   # 进入容器
  docker exec -it redis-master bash
   # 加载配置
  redis-server /usr/local/etc/redis/redis.conf
   # 测试连接
  redis-cli -a <master-password>
 # 运行服务
  docker run -it --name redis-slave -v /var/lib/docker/containers/conf/redis_slave.conf:/usr/local/etc/redis/redis.conf -d -p 6301:6379 redis /bin/bash
   # 进入容器
  docker exec -it redis-slave bash
   # 加载配置
  redis-server /usr/local/etc/redis/redis.conf
   # 测试连接
  redis-cli
   # 密码认证
  auth <slave-password>

 

 

大神网址,可以按配置设置成功

大神网址(https://www.cnblogs.com/fan-gx/p/11463400.html)

网址是多个主机,我做的是单机版的集群

配置集群

配置文件主机就是redis-master.conf

从机就是redis-slave.conf,这个不用变,因为是沙箱的,存放的位置是不同的

docker run -it --name redis-1 -v /var/lib/docker/containers/myconf/redis_1.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis /bin/bash

 

阿里云Docker+Redis单机版搭建集群(主从)配置最详细记录

参考来源:https://www.cnblogs.com/fan-gx/p/11463400.html

原文是测试多台服务器,我的只有单台,仿照这个,自己探索了一番,搞出来了,非常详细的记录如下:

 

主机配置文件(6379)

# 注释这一行,表示Redis可以接受任意ip的连接
# bind 127.0.0.1

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6379

# 关闭保护模式
protected-mode no

# 让redis服务后台运行
daemonize yes

# 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码. 只是练习配置,就不使用密码认证了)
# requirepass masterpassword

# 配置日志路径,为了便于排查问题,指定redis的日志文件目录
logfile "/mylog/redis-master.log"

 

从机1配置文件(6380)

# 注释这一行,表示Redis可以接受任意ip的连接
# bind 127.0.0.1

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6380

# 关闭保护模式
protected-mode no

# 让redis服务后台运行
daemonize yes

# 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码)
requirepass masterpassword

# 设定主库的密码,用于认证,如果主库开启了requirepass选项这里就必须填相应的密码
masterauth <master-password>

# 设定master的IP和端口号,redis配置文件中的默认端口号是6379
# 低版本的redis这里会是slaveof,意思是一样的,因为slave是比较敏感的词汇,所以在redis后面的版本中不在使用slave的概念,取而代之的是replica
# 将35.236.172.131做为主,其余两台机器做从。ip和端口号按照机器和配置做相应修改。
replicaof 35.236.172.131 6379

# 配置日志路径,为了便于排查问题,指定redis的日志文件目录
logfile "/mylog/redis-slave.log"

 

从机2配置文件(6382)【只修改port即可】

# 注释这一行,表示Redis可以接受任意ip的连接
# bind 127.0.0.1

# Accept connections on the specified port, default is 6379 (IANA #815344).
# If port 0 is specified Redis will not listen on a TCP socket.
port 6382

# 关闭保护模式
protected-mode no

# 让redis服务后台运行
daemonize yes

# 设定密码(可选,如果这里开启了密码要求,slave的配置里就要加这个密码)
requirepass masterpassword

# 设定主库的密码,用于认证,如果主库开启了requirepass选项这里就必须填相应的密码
masterauth <master-password>

# 设定master的IP和端口号,redis配置文件中的默认端口号是6379
# 低版本的redis这里会是slaveof,意思是一样的,因为slave是比较敏感的词汇,所以在redis后面的版本中不在使用slave的概念,取而代之的是replica
# 将35.236.172.131做为主,其余两台机器做从。ip和端口号按照机器和配置做相应修改。
replicaof 35.236.172.131 6379

# 配置日志路径,为了便于排查问题,指定redis的日志文件目录
logfile "/mylog/redis-slave.log"

 

安装主机(6379)

#其中/var/lib/docker/containers/myconf/redis_1.conf是我放置主机配置文件位置
docker run -it --name redis-1 -v /var/lib/docker/containers/myconf/redis_1.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis /bin/bash

安装从机(6380)

docker run -it --name redis-2 -v /var/lib/docker/containers/myconf/redis_2.conf:/usr/local/etc/redis/redis.conf -d -p 6380:6379 redis /bin/bash

安装从机(6382)

docker run -it --name redis-4 -v /var/lib/docker/containers/myconf/redis_4.conf:/usr/local/etc/redis/redis.conf -d -p 6382:6379 redis /bin/bash

 

启动redis服务器(主6379)

# 以交互模式进入容器redis-1
$ docker exec -it redis-1 bash

# 创建日志文件目录(这里如果不写,直接从下方redis-server开始会报错,错误就是没有这个)
# 这里的/mylog/redis-master.log就是我的配置文件中的logfile
$ mkdir /mylog
$ touch /mylog/redis-master.log

# 启动redis服务器,如果没有任何输出,就说明成功了
$ redis-server /usr/local/etc/redis/redis.conf

# 在容器里启动一个redis客户端
$ redis-cli

# 执行info命令,查看服务器状态
127.0.0.1:6379> info replication

# 最后退出容器
$ exit

 

启动redis服务器(从6380)

# 以交互模式进入容器redis-2
$ docker exec -it redis-2 bash

# 创建日志文件目录(这里如果不写,直接从下方redis-server开始会报错,错误就是没有这个)
# 这里的/mylog/redis-slave.log就是我的配置文件中的logfile
$ mkdir /mylog
$ touch /mylog/redis-slave.log

# 启动redis服务器,如果没有任何输出,就说明成功了
$ redis-server /usr/local/etc/redis/redis.conf

# 在容器里启动一个redis客户端
$ redis-cli -p 6380

# 执行info命令,查看服务器状态(看到前方127.0.0.1:【6380】了没,这就ok啦,哈哈)
127.0.0.1:6380> info replication

# 最后退出容器
$ exit

 

启动redis服务器(从6382)

# 以交互模式进入容器redis-4
$ docker exec -it redis-4 bash

# 创建日志文件目录(这里如果不写,直接从下方redis-server开始会报错,错误就是没有这个)
# 这里的/mylog/redis-slave.log就是我的配置文件中的logfile
$ mkdir /mylog
$ touch /mylog/redis-slave.log

# 启动redis服务器,如果没有任何输出,就说明成功了
$ redis-server /usr/local/etc/redis/redis.conf

# 在容器里启动一个redis客户端
$ redis-cli -p 6382

# 执行info命令,查看服务器状态(看到前方127.0.0.1:【6382】了没,这就ok啦,哈哈)
127.0.0.1:6382> info replication

# 最后退出容器
$ exit

 

然后在主机下面info replication就会发现跟了两个从机,yeah!

127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=我的ip保密,port=6380,state=online,offset=1688,lag=0
slave1:ip=我的ip保密,port=6382,state=online,offset=1688,lag=1
master_replid:a8708b275e0694e97cf18aea3db4f683b536925a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1688
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1688

部署哨兵(这个单机上并没有起作用)

部署配置

#分别配置26379 26380 26381三个
port 26379

# 让sentinel服务后台运行
daemonize yes

# 修改日志文件的路径
logfile "/var/log/redis/sentinel.log"

# 修改监控的主redis服务器
# 最后一个2表示,两台机器判定主被动下线后,就进行failover(故障转移)
#sentinel monitor mymaster 主库ip 端口 几台机器判定后就进行故障转移
sentinel monitor mymaster 35.236.172.131 6379 2

启动哨兵容器

docker run -it --name mysentinel -p 26379:26379 -v /var/lib/docker/containers/sentinel/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash

docker run -it --name mysentinel2 -p 26380:26379 -v /var/lib/docker/containers/sentinel/sentinel2.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash

docker run -it --name mysentinel4 -p 26382:26379 -v /var/lib/docker/containers/sentinel/sentinel4.conf:/usr/local/etc/redis/sentinel.conf -d redis /bin/bash

启动哨兵

# 进入容器
$ docker exec -it mysentinel bash

# 创建日志目录和文件
root@43c5af082afd:/data# mkdir /mylog
root@43c5af082afd:/data# touch /mylog/sentinel.log

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

# 查看日志,哨兵成功监听到一主和两从的机器(通过find / -name sentinel.log来查询位置)
18:X 11 Jul 2019 13:25:55.416 # +monitor master mymaster 35.236.172.131 6379 quorum 2
18:X 11 Jul 2019 13:25:55.418 * +slave slave 35.201.200.251:6379 35.201.200.251 6379 @ mymaster 35.236.172.131 6379
18:X 11 Jul 2019 13:25:55.421 * +slave slave 34.80.172.42:6379 34.80.172.42 6379 @ mymaster 35.236.172.131 6379
-- INSERT --                                                                                                                               1,6           All
16:X 27 Oct 2020 11:54:07.644 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
16:X 27 Oct 2020 11:54:07.644 # Redis version=6.0.8, bits=64, commit=00000000, modified=0, pid=16, just started16:X 27 Oct 2020 11:54:07.644 # Configuration loaded
16:X 27 Oct 2020 11:54:07.646 * Running mode=sentinel, port=26379.
16:X 27 Oct 2020 11:54:07.646 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of
128.
16:X 27 Oct 2020 11:54:07.648 # Sentinel ID is 9a2f7a7969c7d85862a11e87d619f3f73c262e3a
16:X 27 Oct 2020 11:54:07.648 # +monitor master mymaster 47.98.189.228 6379 quorum 1
16:X 27 Oct 2020 11:54:07.654 * +slave slave 47.98.189.228:6380 47.98.189.228 6380 @ mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:54:07.656 * +slave slave 47.98.189.228:6382 47.98.189.228 6382 @ mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:54:37.691 # +sdown slave 47.98.189.228:6380 47.98.189.228 6380 @ mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:54:37.691 # +sdown slave 47.98.189.228:6382 47.98.189.228 6382 @ mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:56:56.053 * +sentinel sentinel 21b9654dccd674cb4c625bf15e7758fed9042daf 172.18.0.7 26380 @ mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:58:05.211 # +sdown master mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:58:05.211 # +odown master mymaster 47.98.189.228 6379 #quorum 1/1
16:X 27 Oct 2020 11:58:05.211 # +new-epoch 1
16:X 27 Oct 2020 11:58:05.211 # +try-failover master mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:58:05.213 # +vote-for-leader 9a2f7a7969c7d85862a11e87d619f3f73c262e3a 1
16:X 27 Oct 2020 11:58:05.217 # 21b9654dccd674cb4c625bf15e7758fed9042daf voted for 9a2f7a7969c7d85862a11e87d619f3f73c262e3a 1
16:X 27 Oct 2020 11:58:05.268 # +elected-leader master mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:58:05.268 # +failover-state-select-slave master mymaster 47.98.189.228 6379
16:X 27 Oct 2020 11:58:05.321 # -failover-abort-no-good-slave master mymaster 47.98.189.228 6379
witch6:X 27 Oct 2020 11:58:05.397 # Next failover delay: I will not start a failover before Tue Oct 27 12:04:05 2020
~                                                                                                                        

我docker kill -s kill redis-1 后 sentinel.log中如上所示,并没有选举出来一个,搞不太懂呢...有搞出来的小伙伴可以留言

posted @ 2020-10-23 16:56  程序杰杰  阅读(579)  评论(0编辑  收藏  举报