docker最基本指令以及如何连接进入docker构建的redis等操作
基本命令
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.01.进入docker 目录
root@Rightsec:~# cd /var/lib/docker
root@Rightsec:/var/lib/docker# ls
builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes2.进入containers,每个序列号都是一个image
root@Rightsec:/var/lib/docker# cd containers/
root@Rightsec:/var/lib/docker/containers# ls
e36d800f663b626aef2c625c48c353555d9b203e13e7e49093d15be2f3a0fb6e3.进入镜像可以看到
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.hash4.进入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中)
methodName | root对象 | 当前被调用的方法名 | #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产生触发时机:
-
save条件触发,或者我们直接调用save命令
-
flushall也会触发,dump.rdb只是一个空的,没数据
-
退出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下通过配置文件启动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
~