提高Docker的下载速度
- 修改 /etc/docker/daemon.json 文件
vi /etc/docker/daemon.json
- 配置加速器
{
"registry-mirrors": ["https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
]
}
- 重启docker
service docker restart
1、取最新版的 Redis 镜像
docker pull redis:latest
2、查看本地镜像
- 使用以下命令来查看是否已安装了 redis:
docker images
3、Docker挂载配置文件
接下来就是要将redis 的配置文件进行挂载,以配置文件方式启动redis 容器。(挂载:即将宿主的文件和容器内部目录相关联,相互绑定,在宿主机内修改文件的话也随之修改容器内部文件)
- 挂载redis的配置文件
- liunx 下redis.conf文件位置: /home/wq/redis/myredis.conf
- 挂载redis 的持久化文件(为了数据的持久化)。
- liunx 下redis的data文件位置 : /home/wq/redis/data
配置文件可以自定义
- 创建目录
# 不存在就直接创建/home/redis 文件夹
mkdir -p /home/wq/redis/data
4、配置文件
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#bind 127.0.0.1
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 1
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入A0F缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入A0F缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no
# 禁止在rewrite期间做aof,避免因AOF引起的阻塞,性能要求高选择yes/高可用建议选择no
no-appendfsync-on-rewrite yes
# A0F文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
# 利用rename-command修改或者禁用敏感命令
rename-command CONFIG jnacuq9lkncsiajc981
Redis的持久化虽然可以保证数据安全,但也会带来很多额外的开销,因此持久化请遵循下列建议:
- 用来做缓存的Redis实例尽量不要开启持久化功能
- 建议关闭RDB持久化功能,使用AOF持久化
- 利用脚本定期在slave节点做RDB,实现数据备份
- 设置合理的rewrite阈值,避免频繁的bgrewrite
- 配置no-appendfsync-on-rewrite = yes,禁止在rewrite期间做aof,避免因AOF引起的阻塞
- 部署有关建议:
- Redis实例的物理机要预留足够内存,应对fork和rewrite
- 单个Redis实例内存上限不要太大,例如4G或8G。可以加快fork的速度、减少主从同步、数据迁移压力
- 不要与CPU密集型应用部署在一起
- 不要与高硬盘负载应用一起部署。例如:数据库、消息队列
- 慢查询的阈值可以通过配置指定:
- slowlog-log-slower-than:慢查询阈值,单位是微秒。默认是10000,建议1000
- 慢查询会被放入慢查询日志中,日志的长度有上限,可以通过配置指定:
- slowlog-max-len:慢查询日志(本质是一个队列)的长度。默认是128,建议1000
- 禁止线上使用下面命令:keys、flushall、flushdb、config set等命令。
- 可以利用rename-command禁用。
5、启动redis 容器
docker run --restart=always --log-opt max-size=100m --log-opt max-file=2 -p 6379:6379 --name redis -v /home/wq/redis/myredis.conf:/etc/redis/redis.conf -v /home/wq/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass qifeng
–restart=always 总是开机启动
–log是日志方面的
-p 6379:6379 将6379端口挂载出去
–name 给这个容器取一个名字
-v 数据卷挂载
/home/wq/redis/myredis.conf:/etc/redis/redis.conf 这里是将 liunx 路径下的myredis.conf 和redis下的redis.conf 挂载在一起。
/home/wq/redis/data:/data 这个同上
-d redis 表示后台启动redis
redis-server /etc/redis/redis.conf 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录 /etc/redis/redis.conf 也就是liunx下的/home/wq/redis/myredis/myredis.conf
–appendonly yes 开启redis 持久化
–requirepass qifeng 设置密码
6、测试
6.1、通过docker ps指令查看启动状态
docker ps -a |grep redis # 通过docker ps指令查看启动状态,是否成功.
6.2、查看容器运行日志
# 命令:docker logs --since 30m <容器名>
# 此处 --since 30m 是查看此容器30分钟之内的日志情况。
docker logs --since 30m redis
6.3、容器内部连接进行测试
# 命令:docker exec -it <容器名> /bin/bash
# 此处跟着的redis-cli是直接将命令输在上面了。
docker exec -it redis redis-cli
- 直接获取数据会提示需要认证
- (error) NOAUTH Authentication required.
- 认证密码
auth 密码
- 查看当前redis有没有设置密码
config get requirepass
7、删除Redis 容器
7.1、查看所有在运行的容器
docker ps -a
# 停止运行的Redis
docker stop redis
7.2、删除redis 容器
docker rm redis
7.3、删除Redis镜像
7.3.1、查看全部镜像
docker images
7.3.2、删除镜像
docker rmi dc7b40a0bo5d
8、分片集群-Docker安装
8.1、配置
- 创建网卡
docker network create redis-net
- 创建配置文件:redis-cluster.tmpl
cd /home/redis/
vi redis-cluster.tmpl
- 配置文件内容
#port(端口号)
port ${PORT}
#masterauth(设置集群节点间访问密码,跟下面一致)
masterauth qifeng
#requirepass(设置redis访问密码)
requirepass qifeng
#cluster-enabled yes(启动集群模式)
cluster-enabled yes
#cluster-config-file nodes.conf(集群节点信息文件)
cluster-config-file nodes.conf
#cluster-node-timeout 5000(redis节点宕机被发现的时间)
cluster-node-timeout 5000
#cluster-announce-ip(集群节点的汇报ip,防止nat,预先填写为网关ip后续需要手动修改配置文件)
cluster-announce-ip 172.16.156.139
#cluster-announce-port(集群节点的汇报port,防止nat)
cluster-announce-port ${PORT}
#cluster-announce-bus-port(集群节点的汇报bus-port,防止nat)
cluster-announce-bus-port 1${PORT}
#appendonly yes(开启aof)
appendonly yes
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入A0F缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入A0F缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no
no-appendfsync-on-rewrite no
# A0F文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /home/redis/${PORT}/run.log
- 配置文件脚本
vi mkdirConfig.sh
# 内容如下
for port in `seq 6379 6384`; do \
mkdir -p ${port}/conf \
&& PORT=${port} envsubst < redis-cluster.tmpl > ${port}/conf/redis.conf \
&& mkdir -p ${port}/data;\
done
8.2、启动
- 启动文件脚本
vi redisStart.sh
for port in $(seq 6379 6384); do \
docker run -di -p ${port}:${port} -p 1${port}:1${port} \
--restart always --log-opt max-size=100m --log-opt max-file=2 \
--name redis-${port} --net redis-net \
-v /home/redis/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis/${port}/data:/data \
redis redis-server /usr/local/etc/redis/redis.conf; \
done
- 执行 脚本
chmod +x *.sh
./mkdirConfig.sh
./redisStart.sh
8.3、创建集群
- 选择其中一个进入
docker exec -it redis-6384 /bin/bash
- 执行集群创建命令
redis-cli --cluster create 172.16.156.139:6379 172.16.156.139:6380 172.16.156.139:6381 172.16.156.139:6382 172.16.156.139:6383 172.16.156.139:6384 --cluster-replicas 1 -a qifeng
8.4、查看集群状态
# 进入容器
docker exec -it redis-6384 /bin/bash
# 使用 IP
redis-cli -a qifeng --cluster check 172.16.156.139:6382
# 使用容器名称
redis-cli -a qifeng --cluster check redis-6382:6382
8.5、查看集群信息和节点信息
# 进入容器
docker exec -it redis-6384 /bin/bash
# 连接至集群某个节点
redis-cli -c -a qifeng -h redis-6383 -p 6383
# 查看集群信息
cluster info
# 查看集群结点信息
cluster nodes
# 查看状态
info replication
8.6、新增一个节点7004
- 向集群中添加一个新的master节点7004,并向其中存储 num = 10
8.6.1、添加配置
cd /home/redis/
mkdir -p 7004/conf
mkdir -p 7004/data
cd 7004/conf
vi redis.conf
# 内容如下
#port(端口号)
port 7004
#masterauth(设置集群节点间访问密码,跟下面一致)
masterauth qifeng
#requirepass(设置redis访问密码)
requirepass qifeng
#cluster-enabled yes(启动集群模式)
cluster-enabled yes
#cluster-config-file nodes.conf(集群节点信息文件)
cluster-config-file nodes.conf
#cluster-node-timeout 5000(redis节点宕机被发现的时间)
cluster-node-timeout 5000
#cluster-announce-ip(集群节点的汇报ip,防止nat,预先填写为网关ip后续需要手动修改配置文件)
cluster-announce-ip 172.16.156.139
#cluster-announce-port(集群节点的汇报port,防止nat)
cluster-announce-port 7004
#cluster-announce-bus-port(集群节点的汇报bus-port,防止nat)
cluster-announce-bus-port 17004
#appendonly yes(开启aof)
appendonly yes
appendfilename "appendonly.aof"
# 表示每执行一次写命令,立即记录到AOF文件
# appendfsync always
# 写命令执行完先放入A0F缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
appendfsync everysec
# 写命令执行完先放入A0F缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
# appendfsync no
no-appendfsync-on-rewrite no
# A0F文件比上次文件增长超过多少百分比则触发重写
auto-aof-rewrite-percentage 100
# AOF文件体积最小多大以上才触发重写
auto-aof-rewrite-min-size 64mb
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /home/redis/7004/run.log
8.6.2、启动7004节点
docker run -di -p 7004:7004 -p 17004:17004 --restart always --log-opt max-size=100m --log-opt max-file=2 --name redis-7004 --net redis-net -v /home/redis/7004/conf/redis.conf:/usr/local/etc/redis/redis.conf -v /home/redis/7004/data:/data redis redis-server /usr/local/etc/redis/redis.conf
8.6.3、7004加入集群
docker exec -it redis-6384 /bin/bash
redis-cli --cluster add-node 172.16.156.139:7004 172.16.156.139:6381 -a qifeng
8.6.4、查看集群
docker exec -it redis-6384 /bin/bash
redis-cli -c -a qifeng -h redis-6383 -p 6383
cluster nodes
- 可以看到7004并没有分配插槽
8.6.5、移动插槽
- 查看num分配的插槽
docker exec -it redis-6384 /bin/bash
redis-cli -c -a qifeng -h redis-6383 -p 6383
set num 10
- num分配的插槽为2765,在6379上
- 开始移动插槽,给分配7004分配插槽,从6379上分配300个包含了2765
- 重新分配6379的插槽
redis-cli --cluster reshard 172.16.156.139:6379 -a qifeng
- 确定移动插槽
8.6.6、验证
redis-cli -c -a qifeng -h redis-6383 -p 6383
get num
8.6.7、移除7004
- 将插槽移回6379,重新分配7004的插槽
- 移除7004节点
redis-cli --cluster del-node 172.16.156.139:7004 48763ae603dc6844dcae9381b68171182184502f -a qifeng
9、哨兵集群-Linux 源码安装
9.1、单机安装
1、安装依赖
yum install -y gcc tcl
2、下载源码编译
- 下载地址:http://redis.io/download,下载最新稳定版本。
cd /home/redis
wget https://github.com/redis/redis/archive/7.0.5.tar.gz
tar xzf 7.0.5.tar.gz
cd redis-7.0.5/
make && make install
- 执行完 make 命令后,redis-7.0.5 的 src 目录下会出现编译后的 redis 服务程序 redis-server,还有用于测试的客户端程序 redis-cli
3、修改redis.conf文件中的一些配置
# 绑定地址,默认是127.0.0.1,会导致只能在本地访问。修改为0.0.0.0则可以在任意IP访问
bind 0.0.0.0
# 保护模式,关闭保护模式
protected-mode no
# 数据库数量,设置为1
databases 1
4、启动 redis 服务
cd src
./redis-server ../redis.conf
9.2、搭建主从集群
1、创建目录
cd /home/redis
mkdir 7001 7002 7003
2、恢复原始配置
# 开启RDB
# save ""
save 3600 1
save 300 100
save 60 10000
# 关闭AOF
appendonly no
3、拷贝配置文件到每个实例目录
- 然后将redis-7.0.5/redis.conf文件拷贝到三个目录中
cd /home/redis
# 方式一:逐个拷贝
cp redis-7.0.5/redis.conf 7001
cp redis-7.0.5/redis.conf 7002
cp redis-7.0.5/redis.conf 7003
# 方式二:管道组合命令,一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-7.0.5/redis.conf
4、修改每个实例的端口、工作目录
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/home\/redis\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/home\/redis\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/home\/redis\/7003\//g' 7003/redis.conf
5、修改每个实例的声明IP
- 为了避免将来混乱,在redis.conf文件中指定每一个实例的绑定ip信息
# redis实例的声明 IP
replica-announce-ip 172.16.156.139
- 每个目录都要改,我们一键完成修改
cd /home/redis
# 逐一执行
sed -i '1a replica-announce-ip 172.16.156.139' 7001/redis.conf
sed -i '1a replica-announce-ip 172.16.156.139' 7002/redis.conf
sed -i '1a replica-announce-ip 172.16.156.139' 7003/redis.conf
# 或者一键修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 172.16.156.139' {}/redis.conf
6、启动
cd /home/redis/redis-7.0.5/src
# 第1个
./redis-server ../../7001/redis.conf
# 第2个
./redis-server ../../7002/redis.conf
# 第3个
./redis-server ../../7003/redis.conf
7、开启主从关系
现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
有临时和永久两种模式:
- 修改配置文件(永久生效)
- 在redis.conf中添加一行配置:
slaveof <masterip> <masterport>
- 在redis.conf中添加一行配置:
- 使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效)
slaveof <masterip> <masterport>
注意:在5.0以后新增命令replicaof,与salveof效果一致。
- 使用方式二
cd /home/redis/redis-7.0.5/src
# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 172.16.156.139 7001
# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 172.16.156.139 7001
- 然后连接 7001节点,查看集群状态:
# 连接 7001
redis-cli -p 7001
# 查看状态
info replication
9.3、搭建哨兵集群
1、准备实例和配置
# 进入目录
cd /home/redis
# 创建目录
mkdir s1 s2 s3
- 在s1目录创建一个sentinel.conf文件,添加下面的内容:
port 27001
sentinel announce-ip 172.16.156.139
sentinel monitor mymaster 172.16.156.139 7001 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
dir "/home/redis/s1"
解读:
port 27001
:是当前sentinel实例的端口sentinel monitor mymaster 172.16.156.139 7001 2
:指定主节点信息mymaster
:主节点名称,自定义,任意写172.16.156.139 7001
:主节点的ip和端口2
:选举master时的quorum值
- 将s1/sentinel.conf文件拷贝到s2、s3两个目录中(在/home/redis目录执行下列命令)
cd /home/redis
# 方式一:逐个拷贝
cp s1/sentinel.conf s2
cp s1/sentinel.conf s3
# 方式二:管道组合命令,一键拷贝
echo s2 s3 | xargs -t -n 1 cp s1/sentinel.conf
- 修改s2、s3两个文件夹内的配置文件,将端口分别修改为27002、27003:
sed -i -e 's/27001/27002/g' -e 's/s1/s2/g' s2/sentinel.conf
sed -i -e 's/27001/27003/g' -e 's/s1/s3/g' s3/sentinel.conf
2、启动
cd /home/redis
# 第1个
redis-sentinel s1/sentinel.conf
# 第2个
redis-sentinel s2/sentinel.conf
# 第3个
redis-sentinel s3/sentinel.conf