博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Docker学习(五)—— 单机Redis安装与集群安装和分布式安装
阅读量:6801 次
发布时间:2019-06-26

本文共 12704 字,大约阅读时间需要 42 分钟。

hot3.png

一、单机Redis安装与使用

[root ~]# systemctl start  docker.service //启动服务

1、命令安装:

1)[root ~]# docker search redis

2)[root ~]# docker pull redis:4.0.11

3)[root ~]# docker images redis

2、使用Dockerfile安装

注:官方的 redis 镜像本身不是基于 CentOS,所以不会有 yum 安裝在上面,就算你的 docker engine Host 是在 CentOS 上,你在 docker container 里面执行也不能执行 yum,这是 docker 的基本概念。

1)创建Dockerfile(从官网抄用),参考官网的 Dockerfile 文档,https://hub.docker.com/_/redis/

2)[root ~]# docker build  -t redis:4.0.11 .   //后面这个"."必须要,表示当前目录

Removing intermediate container 5f07932b9e00Step 10 : VOLUME /data ---> Running in 56d0f32dd00b ---> 3421b944f1c0Removing intermediate container 56d0f32dd00bStep 11 : WORKDIR /data ---> Running in 6597f7ea366f ---> 7b71290f78c6Removing intermediate container 6597f7ea366fStep 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

3、配置

1)在当前目录创建data目录:

[root ~]#  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                    NAMES29ffa2cf3321        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

e82b07e1bbdbd3c4e99b65aab0cc49a1c17.jpg

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

9c7107c80f12504c116a90d8c8623109eac.jpg

参考官网:https://hub.docker.com/_/redis/

二、Redis集群安装 部署

b2980d6b95070b87f455d9560d3747785c1.jpg

本集群基于Redis4.0.11与Sentinel实现,分别创建三个redis容器,IP/Port分别为:192.168.22.152:6301(主),192.168.22.152:6302(备),192.168.22.152:6303(备)

1、[root@localhost redis]# mkdir ~/redis/6301 ~/redis/6302 ~/redis/6303

分别把redis.conf ,sentinel.conf 拷贝放入6301、6302、6303这三个目录中

2、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

3、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 psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMESe4bcef6a6c78        redis:latest        "docker-entrypoint..."   7 seconds ago       Up 6 seconds        0.0.0.0:6303->6379/tcp   redis-slave2f099e6d1a3a7        redis:latest        "docker-entrypoint..."   52 seconds ago      Up 51 seconds       0.0.0.0:6302->6379/tcp   redis-slave15eb26a7b1f00        redis:latest        "docker-entrypoint..."   2 minutes ago       Up 2 minutes        0.0.0.0:6301->6379/tcp   redis-master

注:要查一个网络与端口是否已经通了,可以在另外的地址上用telnet命令进行测试(如果网络不能,无法建立集群)。

4、查看容器内网的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",

5、进入备机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-cli127.0.0.1:6379> info Replication# Replicationrole:masterconnected_slaves:0master_replid:1d3fc1c07033d841fbc218a9c118e5ab72b13a30master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

6、使用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# Replicationrole:slavemaster_host:172.17.0.2master_port:6379

7、另一台备机做同样的操作

[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

# Replicationrole:slavemaster_host:172.17.0.2master_port:6379

可查看主机,与备机连接从机情况:

127.0.0.1:6379> info Replication# Replicationrole:masterconnected_slaves:2slave0:ip=172.17.0.4,port=6379,state=online,offset=182,lag=1slave1:ip=172.17.0.3,port=6379,state=online,offset=182,lag=0master_replid:c3feef5805625b1f86e74cb3e6689ca45440a4cbmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:182second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:182

三、Redis-sentinel(哨兵)集群部署

添加下面3个sentinel(哨兵)容器(192.168.22.151:26301/192.168.22.151:26302/192.168.22.151:26303),最少需要三台组成集群:

1、修改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

9240306de18197998a8c8dd88faea4f6b20.jpg

三个sentinel.conf配置文件都需要修改,port分别修改为:26301、26302、26303.

2、创建容器

[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

3、查看生成情况:

[root@localhost redis]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                NAMES5f4ce3eda99a        redis:latest        "docker-entrypoint..."   14 seconds ago      Up 13 seconds       6379/tcp, 0.0.0.0:26303->26379/tcp   redis-sentinel3ba92406bcd31        redis:latest        "docker-entrypoint..."   44 seconds ago      Up 43 seconds       6379/tcp, 0.0.0.0:26302->26379/tcp   redis-sentinel284f1b1cfc774        redis:latest        "docker-entrypoint..."   2 minutes ago       Up 2 minutes        6379/tcp, 0.0.0.0:26301->26379/tcp   redis-sentinel1

4、进入容器:

[root@localhost redis]# docker exec -it  5f4ce3eda99a /bin/bash

5、启动Redis哨兵

redis-sentinel启动有以下两种方式:redis-sentinel /path/to/sentinel.confredis-server /path/to/sentinel.conf --sentinel

root@84f1b1cfc774:~# redis-sentinel sentinel.conf

a59fe11ffa4e47c99cef7300e219b02b80c.jpg

都启动成功后,在sentinel.conf文件会自动生成如下内容:

# Generated by CONFIG REWRITEsentinel known-slave mymaster 172.17.0.4 6379sentinel known-slave mymaster 172.17.0.3 6379sentinel known-sentinel mymaster 172.17.0.6 26379 6399d9863adc8518f31accc5ca3b38d917fc2bdbsentinel known-sentinel mymaster 172.17.0.7 26379 8066f8add56ea670faeb16d02588ea9eb707e721sentinel current-epoch 0

* 如果用于测试,可不另建容器,使用现有三个容器,需要同时开通端口(测试使用)

直接把sentinel.conf拷贝到容器里面(通过/data),放入容器的/root目录,执行启动命令即可。

root@84f1b1cfc774:~# redis-sentinel sentinel.conf

6、测试,关闭Master

四、分布式部署

在上述安装的集群上,再安装一个集群,进行分布式部署

1、 [root@localhost ~]# mkdir ~/redis ~/redis/3604 ~/redis/3605 ~/redis/3606

把redis.conf分别放入这三个目录,文件要有写权限 chmod -R 755 redis.conf

2、由于在不同网段上安装,需要绑定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 psCONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMESccfca5496523        redis:latest        "docker-entrypoint..."   4 seconds ago       Up 3 seconds        192.168.22.153:6306->6379/tcp   redis-slave23983a11dad76        redis:latest        "docker-entrypoint..."   2 minutes ago       Up 2 minutes        192.168.22.153:6305->6379/tcp   redis-slave106d68cb80535        redis:latest        "docker-entrypoint..."   2 minutes ago       Up 2 minutes        192.168.22.153:6304->6379/tcp   redis-master

3、分别编辑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.confbind 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-slave1、redis-slave2同样在宿主机上开通端口(测试过程中,redis.conf可不用修改)

上述操作通过宿主IP映射到镜像IP,非镜像独立IP。

4、配置sentinel.conf(在 三、Redis-sentinel(哨兵)集群部署 配置机器上修改)

sentinel monitor mymaster 172.17.0.2 6379 2sentinel monitor secondmaster 192.168.22.153 6304 2sentinel down-after-milliseconds secondmaster 10000sentinel failover-timeout secondmaster 180000sentinel 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配置名称

af059d52eb24f8a1e85e3970a33655ed3e6.jpg

在配置Redis Sentinel做Redis的HA场景时,一定要注意下面几个点:

  • 除非有多机房HA场景的存在,坚持使用单向链接式的master->slave的配置如:node3->node2->node1,把node1设为master
  • 如果sentinel(哨兵)或者是HA群重启,一定要使用如此顺序:先启master,再启slave,再启哨兵
  • 第一次配置完成“哨兵”HA群时每次启动不需要手动再去每个redis node中去更改master slave这些参数了,哨兵会在第一次启动后记录和动态修改每个节点间的关系,第一次配置好启动“哨兵”后由哨兵以后自行维护一般情况下不需要人为干涉,如果切换过一次master/slave后也因该记得永远先起master再起slave再起哨兵这个顺序,具体当前哪个是master可以直接看哨兵的sentinel.conf文件中最末尾哨兵自行的记录

四、问题解决:

安装过程中出现警告: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

转载于:https://my.oschina.net/u/1253780/blog/1936836

你可能感兴趣的文章
sudo
查看>>
11月机房技术指标
查看>>
功能表单之人员构造器字段类型详解——JEPLUS软件快速开发平台
查看>>
全球积分宝:混币圈需要怎么样的活法?
查看>>
李开复:人工智能对人类真正的威胁是什么?
查看>>
CentOS 6.*/7 防火墙放行端口
查看>>
docker pipework 实现跨宿主主机容器互联
查看>>
Hutool之正则表达式工具类——ReUtil
查看>>
execute、executeQuery和executeUpdate之间的区别
查看>>
Windows及Apache Struts2 高危漏洞安全公告及解决方案
查看>>
企业网站建设,手机网站建设,专业的网站建设,网站建网站建设企业,网页建设与制作...
查看>>
您如何创建AWS图表?
查看>>
iOS多线程编程
查看>>
HTTP参数中Etag的重要性
查看>>
T-MBA·沟通·倾听·V1 | 7天学习倾听,6月14日开营,包学会!
查看>>
java架构程序员月入破3万到底是怎么炼成的,一篇文章让你了解
查看>>
mongoDB JAVA操作
查看>>
python基础进阶
查看>>
高级GLSL
查看>>
【27】非阻塞算法
查看>>