# 查询docker上的redis镜像 huxing@localhost data % docker search redis # 下载redis镜像 huxing@localhost data % docker pull redis二、搭建redis主从配置环境 1. 先创建两个redis的conf目录
huxing@localhost data % mkdir /Users/huxing/Desktop/dev/redis/redis-6379 huxing@localhost data % mkdir /Users/huxing/Desktop/dev/redis/redis-63802. 在这两个目录下创建conf文件
# 跳转到文件夹内 huxing@localhost data % cd /Users/huxing/Desktop/dev/redis/redis-6379 # 创建conf文件 huxing@localhost redis-6379 % touch redis.conf
配置文件中几个关键的配置参数如下:
# 指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求 bind 127.0.0.1 #是否开启保护模式,默认开启。要是配置里没有指定bind和密码。开启该参数后,redis只会本地进行访问, 拒绝外部访问。要是开启了密码和bind,可以开启。否则最好关闭,设置为no protected-mode yes #redis监听的端口号 port 6379 #是否在后台执行,yes:后台运行;no:不是后台运行 daemonize yes #指定了记录日志的文件。空字符串的话,日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null logfile /usr/local/redis/var/redis.log #是否打开记录syslog功能 # syslog-enabled no #syslog的标识符。 # syslog-ident redis #日志的来源、设备 # syslog-facility local0 #数据库的数量,默认使用的数据库是0。可以通过”SELECT 【数据库序号】“命令选择一个数据库,序号从0开始 databases 16 #指定本地数据库文件名,一般采用默认的 dump.rdb dbfilename dump.rdb #数据目录,数据库的写入会在这个目录。rdb、aof文件也会写在这个目录 dir /usr/local/redis/var # 复制选项,slave复制对应的master。 # replicaof3. 在docker中挂在redis容器#如果master设置了requirepass,那么slave要连上master,需要有master的密码才行。masterauth就是用来配置master的密码,这样可以在连上master后进行认证。 # masterauth # 当master不可用,Sentinel会根据slave的优先级选举一个master。最低的优先级的slave,当选master。 而配置成0,永远不会被选举 replica-priority 100 #aof持久化策略的配置 #no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快 #always表示每次写入都执行fsync,以保证数据同步到磁盘 #everysec表示每秒执行一次fsync,可能会导致丢失这1s数据 # appendfsync always appendfsync everysec # appendfsync no # redis6.0以后提供的多线程模式,注:这里的多线程模式是指的redis的连接池采用NIO的模式提供,而不是redis本身保存缓存采用多线程模式 # io-threads 4
docker run 运行命令如下:
docker run --privileged=true -p 6379:6379 --name redis-6379 -v /Users/huxing/Desktop/dev/redis/redis-6379/conf/redis.conf:/etc/redis/redis.conf -v /Users/huxing/Desktop/dev/redis/redis-6379/log:/redis/log -v /Users/huxing/Desktop/dev/redis/redis-6379/data:/usr/local/redis/data -d redis:latest redis-server /etc/redis/redis.conf --appendonly yes # 命令拆解描述 docker run -d 后台运行容器,并返回容器ID; # 容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限 --privileged=true # 指定端口映射,格式:主机(宿主)端口:容器端口 -p 6379:6379 # 指定一个容器名称 --name redis-6379 # 映射配置文件 /Users/huxing/Desktop/dev/redis/redis-6379/conf/redis.conf:/etc/redis/redis.conf # 映射日志目录 /Users/huxing/Desktop/dev/redis/redis-6379/log:/redis/log # 映射数据目录 /Users/huxing/Desktop/dev/redis/redis-6379/data:/usr/local/redis/data # 指定配置文件启动redis-server进程,latest镜像版本,docker images查看 redis-server /etc/redis/redis.conf # 开启数据持久化 --appendonly yes
运行成功以后检查redis是否启动正常:
# 进入docker容器 huxing@localhost dev % docker exec -it redis-6379 /bin/bash # 进入redis client客户端 root@f4ec152b5007:/data# redis-cli # 成功然后查询下当前的key 127.0.0.1:6379> keys *
同样的操作步骤启动一个端口为6380的redis服务.
4. 检查docker内的redis访问是否正常# 尝试直接从宿主机系统访问 127.0.0.1:6379> redis-cli -h 127.0.0.1 -p 6380 Error: Server closed the connection 127.0.0.1:6379> exit; Error: Server closed the connection
这时候提示错误Error: Server closed the connection,原因是因为redis在docker容器内存在虚拟ip,需要通过绑定宿主机的ip地址来实现对应的访问请求
# 查看宿主机的IP地址
huxing@localhost data % docker inspect --format='{{.NetworkSettings.IPAddress}}' redis-6379
172.17.0.4
# 修改redis的配置文件,绑定ip
bind 127.0.0.1 172.17.0.4
修改成功以后,重启redis服务,访问顺利通过。
5. redis主从环境搭建# 直接通过命令行处理 127.0.0.1:6380> slaveof 172.17.0.4 6379 OK 127.0.0.1:6380> keys * 1) "huxing" # 测试在主从备份 127.0.0.1:6379> set hzz 123456 OK 127.0.0.1:6379> get hzz "123456" 127.0.0.1:6380> get hzz "123456"
顺利的完成redis主从相关的配置信息。
三、redis哨兵机制配置首先部署3个docker容器内的redis服务,分别是redis-6379、redis-6380、redis-6381.
1. 配置redis-sentinel哨兵conf文件# 哨兵响应端口号 port 26379 # 默认主节点 和 多少个哨兵认为主节点失效就重新选举 sentinel monitor mymaster 172.17.0.4 6379 2 # 哨兵也默认为一个redis支持连接 daemonize yes2. 在docker容器内运行redis哨兵
# 操作命令 docker run --privileged=true -p 26379:26379 --name redis-26379 -v /Users/huxing/Desktop/dev/redis/redis-26379/conf/sentinel.conf:/etc/redis/sentinel.conf -d redis:latest redis-server /etc/redis/sentinel.conf --sentinel
这里启动了3个哨兵,为了保证选举的可靠性。
现在来验证哨兵的有效性,先检查下目前的redis服务的主从情况,检查如下:
# 主服务 127.0.0.1:6379> info # Replication role:master connected_slaves:2 # 从服务 - 6380 127.0.0.1:6380> info # Replication role:slave master_host:172.17.0.4 master_port:6379 # 从服务 - 6381 127.0.0.1:6380> info # Replication role:slave master_host:172.17.0.4 master_port:6379
把6379服务停止以后,结果如下:
127.0.0.1:6380> info # Replication role:master connected_slaves:1
可以看到6380顺利的提升为主库,接下来测试节点恢复的自动同步
# 在6380增加了如下key 127.0.0.1:6380> keys * 1) "huxing" 2) "hzz" 3) "bbb" 4) "ccc" 5) "aaa" # 重启6379服务 127.0.0.1:6379> keys * 1) "bbb" 2) "huxing" 3) "aaa" 4) "ccc" 5) "hzz"
可以看到,已经同步过来了,重新启动的服务已经自动加载的主从群里面了。
四、redis-cluster集群模式搭建


