1、单机Redis安装与使用node
[root@localhost ~]# systemctl start docker.service //启动服务git
一、命令安装:github
1)[root@localhost ~]# docker search redisredis
2)[root@localhost ~]# docker pull redis:4.0.11docker
3)[root@localhost ~]# docker images redisbash
二、使用Dockerfile安装服务器
注:官方的 redis 镜像自己不是基于 CentOS,因此不会有 yum 安裝在上面,就算你的 docker engine Host 是在 CentOS 上,你在 docker container 里面执行也不能执行 yum,这是 docker 的基本概念。网络
1)建立Dockerfile(从官网抄用),参考官网的 Dockerfile 文档,https://hub.docker.com/_/redis/app
2)[root@localhost ~]# docker build -t redis:4.0.11 . //后面这个"."必需要,表示当前目录tcp
Removing intermediate container 5f07932b9e00 Step 10 : VOLUME /data ---> Running in 56d0f32dd00b ---> 3421b944f1c0 Removing intermediate container 56d0f32dd00b Step 11 : WORKDIR /data ---> Running in 6597f7ea366f ---> 7b71290f78c6 Removing intermediate container 6597f7ea366f Step 12 : COPY docker-entrypoint.sh /usr/local/bin/ lstat docker-entrypoint.sh: no such file or directory
安装成功。
3)[root@localhost ~]# docker images
[root@localhost ~]# docker tag 7b71290f78c6 redis:4.0.11 //可能没有名称,修改image名称与tag
三、配置
1)在当前目录建立data目录:
[root@localhost ~]# mkdir -p ~/redis ~/redis/data ~/redis/conf
进入新建的redis目录
2)运行容器
为方便配置可在redis的最新安装包中把redis.conf拷贝一份,放入新的~/redis/conf 目录[root@localhost redis]# docker run --name redis4.0.11 -p 6379:6379 -v $PWD/data:/data -v $PWD/conf/redis.conf:/usr/local/etc/redis/redis.conf:ro -d redis:latest redis-server /usr/local/etc/redis/redis.conf --appendonly yes
-p 6379:6379 : 将容器的6379端口映射到主机的6379端口
-v $PWD/data:/data : 将主机中当前目录下的data挂载到容器的/data, :ro 表示只读
-d : 后台运行
--name : 指定容器名称
redis-server --appendonly yes : 在容器执行redis-server启动命令,并打开redis持久化配置
--network host #指定容器网络,host networking模式(分别有none网络、host网络和bridge网络。)
--ip 192.168.0.2 #设定容器ip地址
-h #给容器设置主机名
2)查看容器启动状况:
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 29ffa2cf3321 redis:4.0.11 "redis-server --appen" 47 minutes ago Up 47 minutes 0.0.0.0:6379->6379/tcp mad_saha
3)链接、查看容器
使用redis镜像执行redis-cli命令链接到刚启动的容器,主机IP为192.168.22.151
[root@localhost ~]# docker exec -it cd4de7dcde57 redis-cli
127.0.0.1:6379>quit
4)使用命令查看镜像的ip地址:
[root@localhost ~]# docker inspect e60da5191243|grep -i add
5)命令行查看 redis最大链接数
127.0.0.1:6379> CONFIG GET maxclients
redis-cli命令控制行中获取客户端信息命令
CLIENT LIST获取客户端列表
CLIENT SETNAME 设置当前链接点redis的名称
CLIENT GETNAME 查看当前链接的名称
CLIENT KILL ip:port 杀死指定链接
6)测试远程链接redis服务器:
yum install telnet
yum install telnet-server
而后使用telnet 远程服务器ip 远程redis端口号,如:
telnet 192.168.22.151 6379
若是能链接成功,便可配合上边的查看远程链接命令确认是否链接成功。
使用命令查看镜像的ip地址:
[root@localhost ~]# docker inspect 1291256b93e9|grep -i IPAddress
参考官网:https://hub.docker.com/_/redis/
2、Redis集群安装 部署
本集群基于Redis4.0.11与Sentinel实现,分别建立三个redis容器,IP/Port分别为:192.168.22.152:6301(主),192.168.22.152:6302(备),192.168.22.152:6303(备)
一、[root@localhost redis]# mkdir ~/redis/6301 ~/redis/6302 ~/redis/6303
分别把redis.conf ,sentinel.conf 拷贝放入630一、630二、6303这三个目录中
二、Master主机建立(192.168.22.152:6301)
[root@localhost 6301]# docker run --name redis-master -p 6301:6379 -v $PWD/data:/data -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf -d redis:latest redis-server --appendonly yes
三、Slave备机建立(192.168.22.152:6302\192.168.22.152:6303)
[root@localhost 6302]# docker run --name redis-slave1 -p 6302:6379 -v $PWD/data:/data -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf --link redis-master:master -d redis:latest redis-server /usr/local/etc/redis/redis.conf --appendonly yes
[root@localhost 6303]# docker run --name redis-slave2 -p 6303:6379 -v $PWD/data:/data -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf --link redis-master:master -d redis:latest redis-server /usr/local/etc/redis/redis.conf --appendonly yes
--link 参数指明docker内部链接container redis-master,并alias为master。
[root@localhost 6301]# docker ps //查看是否正常建立
[root@localhost 6301]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e4bcef6a6c78 redis:latest "docker-entrypoint..." 7 seconds ago Up 6 seconds 0.0.0.0:6303->6379/tcp redis-slave2 f099e6d1a3a7 redis:latest "docker-entrypoint..." 52 seconds ago Up 51 seconds 0.0.0.0:6302->6379/tcp redis-slave1 5eb26a7b1f00 redis:latest "docker-entrypoint..." 2 minutes ago Up 2 minutes 0.0.0.0:6301->6379/tcp redis-master
注:要查一个网络与端口是否已经通了,能够在另外的地址上用telnet命令进行测试(若是网络不能,没法创建集群)。
四、查看容器内网的ip地址:
[root@localhost 6301]# docker inspect 5eb26a7b1f00 | grep -i ipaddr
[root@localhost 6301]# docker inspect 5eb26a7b1f00|grep -i ipaddr "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
五、进入备机docker容器内部,查看当前redis角色(主仍是从)
[root@localhost 6302]# docker exec -it f099e6d1a3a7 /bin/bash
root@10d301afd67d:/data# redis-cli
127.0.0.1:6379> info Replication
root@10d301afd67d:/data# redis-cli 127.0.0.1:6379> info Replication # Replication role:master connected_slaves:0 master_replid:1d3fc1c07033d841fbc218a9c118e5ab72b13a30 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0
六、使用redis-cli命令修改redis-6302的主机为172.17.0.2:6379,主机转为了备机。
root@10d301afd67d:/data# redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
127.0.0.1:6379> info Replication
127.0.0.1:6379> info Replication # Replication role:slave master_host:172.17.0.2 master_port:6379
七、另外一台备机作一样的操做
[root@localhost 6303]# [root@localhost 6303]# docker exec -it e4bcef6a6c78 redis-cli
127.0.0.1:6379> SLAVEOF 172.17.0.2 6379
OK
127.0.0.1:6379> info Replication
# Replication role:slave master_host:172.17.0.2 master_port:6379
可查看主机,与备机链接从机状况:
127.0.0.1:6379> info Replication # Replication role:master connected_slaves:2 slave0:ip=172.17.0.4,port=6379,state=online,offset=182,lag=1 slave1:ip=172.17.0.3,port=6379,state=online,offset=182,lag=0 master_replid:c3feef5805625b1f86e74cb3e6689ca45440a4cb master_replid2:0000000000000000000000000000000000000000 master_repl_offset:182 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:182
3、Redis-sentinel(哨兵)集群部署
添加下面3个sentinel(哨兵)容器(192.168.22.151:26301/192.168.22.151:26302/192.168.22.151:26303),最少须要三台组成集群:
一、修改sentinel.conf,修改以下,IP改成Mater容器内部IP,分别放入到各目录中:
[root@localhost redis]# vi sentinel.conf
#修改端口 port 26301 #2表明判断主节点失败至少须要2个Sentinel节点节点赞成 sentinel monitor mymaster 172.17.0.2 6379 2
三个sentinel.conf配置文件都须要修改,port分别修改成:2630一、2630二、26303.
二、建立容器
[root@localhost 26301]# docker run --name redis-sentinel1 -p 26301:26379 -v $PWD/sdata:/data -v $PWD/sentinel.conf:/usr/local/etc/redis/sentinel.conf -itd redis:latest redis-sentinel /usr/local/etc/redis/sentinel.conf //直接启动
[root@localhost 26302]# docker run --name redis-sentinel2 -p 26302:26379 -v $PWD/sdata:/data -v $PWD/sentinel.conf:/usr/local/etc/redis/sentinel.conf -itd redis:latest
[root@localhost 26303]# docker run --name redis-sentinel3 -p 26303:26379 -v $PWD/sdata:/data -v $PWD/sentinel.conf:/usr/local/etc/redis/sentinel.conf -itd redis:latest
三、查看生成状况:
[root@localhost redis]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5f4ce3eda99a redis:latest "docker-entrypoint..." 14 seconds ago Up 13 seconds 6379/tcp, 0.0.0.0:26303->26379/tcp redis-sentinel3 ba92406bcd31 redis:latest "docker-entrypoint..." 44 seconds ago Up 43 seconds 6379/tcp, 0.0.0.0:26302->26379/tcp redis-sentinel2 84f1b1cfc774 redis:latest "docker-entrypoint..." 2 minutes ago Up 2 minutes 6379/tcp, 0.0.0.0:26301->26379/tcp redis-sentinel1
四、进入容器:
[root@localhost redis]# docker exec -it 5f4ce3eda99a /bin/bash
五、启动Redis哨兵
redis-sentinel启动有如下两种方式: redis-sentinel /path/to/sentinel.conf redis-server /path/to/sentinel.conf --sentinel
root@84f1b1cfc774:~# redis-sentinel sentinel.conf
都启动成功后,在sentinel.conf文件会自动生成以下内容:
# Generated by CONFIG REWRITE sentinel known-slave mymaster 172.17.0.4 6379 sentinel known-slave mymaster 172.17.0.3 6379 sentinel known-sentinel mymaster 172.17.0.6 26379 6399d9863adc8518f31accc5ca3b38d917fc2bdb sentinel known-sentinel mymaster 172.17.0.7 26379 8066f8add56ea670faeb16d02588ea9eb707e721 sentinel current-epoch 0
* 若是用于测试,可不另建容器,使用现有三个容器,须要同时开通端口(测试使用)
直接把sentinel.conf拷贝到容器里面(经过/data),放入容器的/root目录,执行启动命令便可。
root@84f1b1cfc774:~# redis-sentinel sentinel.conf
六、测试,关闭Master
4、分布式部署
在上述安装的集群上,再安装一个集群,进行分布式部署
一、 [root@localhost ~]# mkdir ~/redis ~/redis/3604 ~/redis/3605 ~/redis/3606
把redis.conf分别放入这三个目录,文件要有写权限 chmod -R 755 redis.conf
二、因为在不一样网段上安装,须要绑定IP,方便sentinel服务器监控
[root@localhost 6304]# docker run --name redis-master -p 192.168.22.153:6304:6379 -v $PWD/data:/data -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf -itd redis:latest redis-server --appendonly yes
[root@localhost 3605]# docker run --name redis-slave1 -p 192.168.22.153:6305:6379 -v $PWD/data:/data -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf --link redis-master:master -itd redis:latest redis-server /usr/local/etc/redis/redis.conf --appendonly yes --slaveof 192.168.22.153 6304
[root@localhost 6306]# docker run --name redis-slave2 -p 192.168.22.153:6306:6379 -v $PWD/data:/data -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf --link redis-master:master -itd redis:latest redis-server /usr/local/etc/redis/redis.conf --appendonly yes --slaveof 192.168.22.153 6304
[root@localhost 6306]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ccfca5496523 redis:latest "docker-entrypoint..." 4 seconds ago Up 3 seconds 192.168.22.153:6306->6379/tcp redis-slave2 3983a11dad76 redis:latest "docker-entrypoint..." 2 minutes ago Up 2 minutes 192.168.22.153:6305->6379/tcp redis-slave1 06d68cb80535 redis:latest "docker-entrypoint..." 2 minutes ago Up 2 minutes 192.168.22.153:6304->6379/tcp redis-master
三、分别编辑redis-master容器的redis.conf (可直接在突宿主机主编辑)
//查出容器IP [root@localhost 3605]# docker inspect 3983a11dad76 | grep -i ipaddr "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAddress": "172.17.0.3", 设置redis.conf以下: [root@localhost 6304]# vi redis.conf bind 127.0.0.1 172.17.0.2 [root@localhost 6304]# docker restart 06d68cb80535 //重启容器
[root@localhost 6304]# docker exec -it 06d68cb80535 /bin/bash //进入容器
root@06d68cb80535:/data# redis-cli -h 192.168.22.153 -p 6304 //就能够用IP登陆了
若是登陆不成功,须要在宿主机开通端口(CentOS7):
[root@localhost 3604]# firewall-cmd --get-active-zones //查看zone(网卡)名称
[root@localhost 3604]# firewall-cmd --zone=public --add-port=6304/tcp --permanent //开通端口
success
[root@localhost 3604]# firewall-cmd --reload //重启防火墙,运行命令
success
[root@localhost 3604]# firewall-cmd --query-port=6304/tcp //查看端口号是否开启,运行命令 ,也能够在其余机器telnet 192.168.22.153 6304 测试
yes
redis-slave一、redis-slave2一样在宿主机上开通端口(测试过程当中,redis.conf可不用修改)
上述操做经过宿主IP映射到镜像IP,非镜像独立IP。
四、配置sentinel.conf(在 3、Redis-sentinel(哨兵)集群部署 配置机器上修改)
sentinel monitor mymaster 172.17.0.2 6379 2 sentinel monitor secondmaster 192.168.22.153 6304 2 sentinel down-after-milliseconds secondmaster 10000 sentinel failover-timeout secondmaster 180000 sentinel parallel-syncs secondmaster 1
重启sentinel服务,而后检查主节点的监控是否正常:
[root@localhost 26301]# docker exec -it 3e2f1b4208b6 /bin/bash
root@3e2f1b4208b6:/data# redis-cli -p 26301 //使用端口登陆,要在宿主机防火墙开通访问关系
127.0.0.1:26301> sentinel master mymaster // mymaster是sentinel.conf配置名称
在配置Redis Sentinel作Redis的HA场景时,必定要注意下面几个点:
4、问题解决:
安装过程当中出现警告:1:M 14 Sep 03:40:54.841 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
意思是:overcommit_memory参数设置为0!在内存不足的状况下,后台程序save可能失败。建议在文件 /etc/sysctl.conf 中将overcommit_memory修改成1。
临时解决方法:echo "vm.overcommit_memory=1" > /etc/sysctl.conf
永久解决方法:将其写入/etc/sysctl.conf文件中。
参考:http://ifeve.com/redis-sentinel/
https://github.com/antirez/redis-doc/blob/master/topics/sentinel.md
https://blog.csdn.net/jackliu16/article/details/80906515