Docker學習(五)—— 單機Redis安裝與集羣安裝和分佈式安裝

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場景時,必定要注意下面幾個點:

  • 除非有多機房HA場景的存在,堅持使用單向連接式的master->slave的配置如:node3->node2->node1,把node1設爲master
  • 若是sentinel(哨兵)或者是HA羣重啓,必定要使用如此順序:先啓master,再啓slave,再啓哨兵
  • 第一次配置完成「哨兵」HA羣時每次啓動不須要手動再去每一個redis node中去更改master slave這些參數了,哨兵會在第一次啓動後記錄和動態修改每一個節點間的關係,第一次配置好啓動「哨兵」後由哨兵之後自行維護通常狀況下不須要人爲干涉,若是切換過一次master/slave後也因該記得永遠先起master再起slave再起哨兵這個順序,具體當前哪一個是master能夠直接看哨兵的sentinel.conf文件中最末尾哨兵自行的記錄

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

相關文章
相關標籤/搜索