乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      用Docker構(gòu)建分布式Redis集群

       WindySky 2018-04-10

      【編者的話】本文介紹了如何使用Docker搭建Redis集群,很多讀者都在問(wèn)Docker能帶來(lái)哪些實(shí)質(zhì)性的好處,我想本文就是一個(gè)很好的例子。不使用Docker你也可以搭建Redis集群,那使用Docker后會(huì)有怎么樣的優(yōu)勢(shì)了?我想可以用兩個(gè)詞總結(jié):快速和復(fù)用。

      redis_docker.png


      我們經(jīng)常會(huì)遇到這樣一個(gè)問(wèn)題:當(dāng)我們想進(jìn)行一個(gè)完整的測(cè)試的時(shí)候,往往缺少硬件或者其它資源。為了滿足需求,我可能需要三臺(tái)服務(wù),或者說(shuō)三個(gè)虛擬機(jī)。但是我發(fā)現(xiàn)我們沒(méi)有時(shí)間來(lái)創(chuàng)建它們,并且如果要物理機(jī)的話我們也沒(méi)有那么多資源。這也是為什么我對(duì)Docker如此感興趣,因?yàn)樗梢越鉀Q我的問(wèn)題。

      我想在Ubuntu上創(chuàng)建三個(gè)運(yùn)行Redis的Docker容器,并把它們連接起來(lái),然后我就可以自由的在測(cè)試和開發(fā)過(guò)程中水平的擴(kuò)展了, 接下來(lái)我就給你們展示我是怎么做的,以及這樣做的優(yōu)勢(shì)。

      1. 下載和配置基礎(chǔ)鏡像

      我使用的是非常優(yōu)秀的phusion鏡像作為基礎(chǔ)鏡像,它增加了很多Docker忽略的特性, 比如按序啟動(dòng)服務(wù)等等, 關(guān)于這個(gè)鏡像的更多信息,可以點(diǎn)擊這里了解。

      首先,讓我們使用Docker來(lái)pullphusion鏡像(譯者注:建議使用高版本的Docker下載,低版本會(huì)有問(wèn)題)。
      root@server:/home/sam# docker pull phusion/baseimage

      下載完成之后, 你可以通過(guò)docker images命令看到最新下載的鏡像。
      root@server:/home/sam# docker images
      REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
      phusion/baseimage 0.9.15 cf39b476aeec 3 months ago 289.4 MB
      phusion/baseimage latest cf39b476aeec 3 months ago 289.4 MB

      這個(gè)鏡像非常好用,你可以在容器啟動(dòng)的時(shí)候指定特定服務(wù)的啟動(dòng)順序, 在這里我想給這個(gè)鏡像加一個(gè)SSH密碼登錄的功能,而不是使用SSH key。因?yàn)槭窃诒镜剡\(yùn)行,所以不用太擔(dān)心安全的問(wèn)題。我們需要?jiǎng)?chuàng)建一個(gè)phusion的實(shí)例, 然后通過(guò)SSH key登錄, 并且修改配置,重啟SSH,之后我們就可以使用root登錄了。

      首先,用phusion基礎(chǔ)鏡像創(chuàng)建一個(gè)新的容器。
      root@server:/home/sam# docker run -d --name redis phusion/baseimage /sbin/my_init 
      --enable-insecure-key

      /sbin/my_init是允許phusion在容器啟動(dòng)的時(shí)候啟動(dòng)你的服務(wù)。 enable-insecure-key允許我們使用‘insecure key‘ssh進(jìn)新的容器。

      現(xiàn)在我們已經(jīng)部署了容器, 接下來(lái)需要得到它的IP地址,可以使用docker inspect命令。
      root@server:/home/sam# docker inspect redis | grep IPA
      "IPAddress": "172.17.0.46",

      接下來(lái),下載’insecure key‘并使用它登錄這個(gè)容器。
      root@server:/home/sam# curl -o insecure_key -fSL https://github.com/phusion/baseimage-docker/raw/master/image/insecure_key
      root@server:/home/sam# chmod 600 insecure_key
      root@server:/home/sam# ssh -i insecure_key root@<IP address>
      The authenticity of host '172.17.0.52 (172.17.0.52)' can't be established.
      ECDSA key fingerprint is aa:bb:cc:xx:xx:xx:xx:xx:xx:xx:xx:yy:zz:04:bf:04.
      Are you sure you want to continue connecting (yes/no)? yes
      Warning: Permanently added '172.17.0.52' (ECDSA) to the list of known hosts.
      root@c36b4bba7dd4:~#

      祝賀你, 你現(xiàn)在SSH進(jìn)入容器了!下面你需要修改SSH,從而我們不再需要’insecure key‘了,為了做到這個(gè),打開’/etc/ssh/sshd_config‘找到下面這一行, 并去掉注釋。
      PermitRootLogin yes

      保存文件, 我們?cè)僭O(shè)置root的密碼。
      root@c36b4bba7dd4:~# passwd
      Enter new UNIX password:
      Retype new UNIX password:
      passwd: password updated successfully
      root@c36b4bba7dd4:~#

      以上我們做了一些準(zhǔn)備工作,接下來(lái)我們將在這個(gè)容器中安裝Redis。

      2 安裝Redis

      現(xiàn)在我們已經(jīng)有了配置好的鏡像了,接下來(lái)我們需要去下載和安裝Redis,你可以從這里下載到你想要的Redis,在我們的例子中用到的是3.0.0 RC1,下載地址是:https://github.com/antirez/red ... ar.gz。

      注意:你還需要安裝wget、gcc、make以及一些其它的工具??梢允褂孟旅娴拿睿?br>
      apt-get update  #更新系統(tǒng)
      apt-get upgrade  #升級(jí)系統(tǒng)
      apt-get install wget  gcc make#安裝wget、gcc、make

      首先,我們下載Redis 3.0.0 RC1。
      root@e3919192d9e3:/home# wget https://github.com/antirez/redis/archive/3.0.0-rc1.tar.gz

      解壓這個(gè)包并make。
      root@e3919192d9e3:/home# tar -zxvf 3.0.0-rc1.tar.gz
      root@e3919192d9e3:/home# cd redis-3.0.0-rc1/
      root@e3919192d9e3:/home/redis-3.0.0-rc1# make

      最后, 我們把編譯好的代碼中的幾個(gè)可執(zhí)行命令移動(dòng)到/usr/bin/下面
      root@e3919192d9e3:/home/redis-3.0.0-rc1# cd src
      root@e3919192d9e3:/home/redis-3.0.0-rc1/src# mv redis-cli redis-server redis-sentinel /usr/bin/
      root@e3919192d9e3:/home/redis-3.0.0-rc1/src# cd ..
      root@e3919192d9e3:/home/redis-3.0.0-rc1# mkdir -p /etc/redis/
      root@e3919192d9e3:/home/redis-3.0.0-rc1# cp redis.conf /etc/redis/redis.conf

      現(xiàn)在打開文件/etc/redis/redis.conf, 找到‘daemonize no’改為‘daemonize yes‘,然后啟動(dòng)它!
      root@e3919192d9e3:/home/redis-3.0.0-rc1/src# redis-server /etc/redis/redis.conf
      root@e3919192d9e3:/home/redis-3.0.0-rc1/src#

      好了, Redis現(xiàn)在已經(jīng)安裝好了,并且在容器里面運(yùn)行了,使用的配置文件是/etc/redis/redis.conf。

      3. 讓Docker在啟動(dòng)容器的時(shí)候啟動(dòng)Redis服務(wù)

      現(xiàn)在我們的容器正在運(yùn)行Redis,并且也可以使用SSH登錄了,我們還需要讓它在容器啟動(dòng)的時(shí)候自動(dòng)啟動(dòng)Redis服務(wù),使用phusion基礎(chǔ)鏡像來(lái)實(shí)現(xiàn)這點(diǎn)相當(dāng)?shù)娜菀住J紫?,因?yàn)槲覀儐?dòng)容器的時(shí)候使用了/sibn/my_init, 它會(huì)去運(yùn)行任何我們放在/etc/service/*下面的程序。所以,對(duì)于我們來(lái)說(shuō),我們只要去創(chuàng)建一個(gè)目錄以及在這個(gè)目錄里面再創(chuàng)建一個(gè)叫run的文件,像下面這樣:
      root@e3919192d9e3:/etc/service# cd /etc/service
      root@e3919192d9e3:/etc/service# mkdir redis
      root@e3919192d9e3:/etc/service# cd redis
      root@e3919192d9e3:/etc/service/redis# nano run

      在這個(gè)run文件里面,我們加入下面的內(nèi)容:
      #!/bin/sh
      set -e
      exec /usr/bin/redis-server /etc/redis/redis.conf

      最后,記得給run文件添加可執(zhí)行權(quán)限。

      4. 提交鏡像以便于重用

      現(xiàn)在我們的redis容器運(yùn)行良好, 我們想要把它保存為偽模板,以便在Docker上重復(fù)部署。做到這個(gè)非常簡(jiǎn)單,我們只要使用‘docker commit ...’這個(gè)鏡像到我們本地的庫(kù)就可以了,像下面這樣:
      root@server:/home/sam# docker ps -as
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
      e3919192d9e3 phusion/baseimage:0.9.15 "/sbin/my_init --ena 3 hours ago Up 3 hours redis 164.9 MB
      root@server:/home/sam# docker commit redis redis-cluster-node
      root@server:/home/sam# docker images
      REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
      redis-cluster-node latest babfb02edf4d 5 hours ago 561.2 MB


      5. 部署新鏡像的3個(gè)實(shí)例
      為了解釋清楚,我會(huì)刪除之前創(chuàng)建的容器,以免后面搞暈。首先使用docker stop redis,之后再docker rm redis
      root@server:/home/sam# docker stop redis
      redis
      root@server:/home/sam# docker rm redis
      redis
      root@server:/home/sam#

      很簡(jiǎn)單,下面讓我們部署新鏡像的3個(gè)實(shí)例,我們使用了Docker的端口映射機(jī)制,從而我們就可以使用Host服務(wù)器的IP訪問(wèn)這些實(shí)例,我們給這些實(shí)例關(guān)聯(lián)的端口如下:

      node1 - hostip:7001
      node2 - hostip:7002
      node3 - hostip:7003

      所以我們運(yùn)行redis-cli -h 192.168.0.2 -p 7001,它將重定向到172.17.0.x -p 6379,例如下面我們部署了三個(gè)實(shí)例:
      root@server:/home/sam# docker run -d --name node1 -p 7001:6379 redis-cluster-node /sbin/my_init
      cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99
      root@server:/home/sam# docker run -d --name node2 -p 7002:6379 redis-cluster-node /sbin/my_init
      cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99
      root@server:/home/sam# docker run -d --name node3 -p 7003:6379 redis-cluster-node /sbin/my_init
      cd1c1f96346bdf9c1cec04333c2e849992ecbc4375dcea6b30902dd9842d8c99
      root@server:/home/sam#

      現(xiàn)在我們可以運(yùn)行docker ps -as來(lái)查看我們運(yùn)行的三個(gè)Redis容器:
      root@server:/home/sam# docker ps -as
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES SIZE
      a532b4ac60d9 redis-cluster-node:latest "/sbin/my_init" 5 hours ago Up 5 hours 0.0.0.0:7003->6379/tcp node3 2.267 MB
      6c8a87a0a76a redis-cluster-node:latest "/sbin/my_init" 5 hours ago Up 5 hours 0.0.0.0:7002->6379/tcp node2 2.318 MB
      39e02633ccf8 redis-cluster-node:latest "/sbin/my_init" 5 hours ago Up 5 hours 0.0.0.0:7001->6379/tcp node1 2.334 MB
      root@server:/home/sam#

      現(xiàn)在我們看到了3個(gè)容器,分別名字為node1、node2和node3,并且有一個(gè)專門的端口與Redis 服務(wù)的端口相映射。為了測(cè)試這樣的映射是正確的,可以在另外一臺(tái)機(jī)器使用redis-cli登錄到各個(gè)Redis服務(wù)器上面:
      root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7001
      redis 192.168.0.16:7001>
      root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7002
      redis 192.168.0.16:7002>
      root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7003
      redis 192.168.0.16:7003>
      root@server:/home/sam# redis-cli -h 192.168.0.2 -p 7005
      Could not connect to Redis at 192.168.0.2:7005: Connection refused
      not connected>

      正如你看到的, 我們可以使用 hostip+port登錄到對(duì)應(yīng)的Redis服務(wù)器上, 當(dāng)我們嘗試一個(gè)不正確的端口時(shí),卻不行。

      譯者增加: 如果這里驗(yàn)證失敗了的可以登錄進(jìn)容器中檢查下Redis的服務(wù)有沒(méi)有起來(lái):
      docker exec -t -i redis bash -l
      netstat -anp | grep redis  #看看有沒(méi)有網(wǎng)絡(luò)監(jiān)聽,如果沒(méi)有執(zhí)行下面的命令啟動(dòng)redis服務(wù)
      redis-server /etc/redis/redis.conf
      6. 配置Redis的從節(jié)點(diǎn)

      我們有了三個(gè)獨(dú)立的Redis服務(wù)器, 現(xiàn)在我們想把它們連接到一起, 從而我們可以測(cè)試這個(gè)集群的擴(kuò)展性,對(duì)集群的監(jiān)控,或者是做其它的事情。

      我們把node1作為主節(jié)點(diǎn),把node2和node3配置為它的從節(jié)點(diǎn),這可以簡(jiǎn)單的通過(guò)修改/etc/redis/redis.conf這個(gè)文件來(lái)實(shí)現(xiàn)。SSH進(jìn)入node2和node3節(jié)點(diǎn),修改配置文件,然后重啟容器:
      root@server:/home/sam# docker inspect node1 | grep IPA
      "IPAddress": "172.17.0.46",
      root@server:/home/sam# docker inspect node2 | grep IPA
      "IPAddress": "172.17.0.47",
      root@server:/home/sam# ssh root@172.17.0.47
      root@172.17.0.47's password:
      Last login: Tue Jan 13 11:47:31 2015 from 172.17.42.1
      root@6c8a87a0a76a:~# nano /etc/redis/redis.conf

      在這個(gè)配置文件中我們只要找到‘salveof’這一行,然后去掉注釋,修改為node1的ip地址,像下面這樣:
      root@6c8a87a0a76a:~# cat /etc/redis/redis.conf | grep slaveof
      # Master-Slave replication. Use slaveof to make a Redis instance a copy of
      slaveof 172.17.0.46 6379
      root@6c8a87a0a76a:~#

      最后使用命令docker restart node2重啟容器, 現(xiàn)在它就是node1的一個(gè)從節(jié)點(diǎn)了。為了驗(yàn)證這個(gè), 使用redis-cli分別登錄到node1和node2, 在node1上運(yùn)行命令set hello world, 然后在node2上運(yùn)行get hello,如果配置正確的話會(huì)得到下面的結(jié)果:
      root@server:/home/sam# redis-cli -h 192.168.0.16 -p 7001
      redis 192.168.0.12:7001> set hello world
      OK
      redis 192.168.0.12:7001> exit
      root@server:/home/sam# redis-cli -h 192.168.0.16 -p 7002
      redis 192.168.0.12:7002> get hello
      "world"
      redis 192.168.0.12:7002> exit
      root@server:/home/sam#

      對(duì)于node3也做同樣的配置即可。

      恭喜,基于Docker的、擁有三個(gè)節(jié)點(diǎn)且可水平擴(kuò)展的Redis集群就這樣搭好了。

      接下來(lái)的下一篇博客中,我將給大家展示如何使用Opsview去監(jiān)控Redis集群,你可以看到一個(gè)像下面這樣展示你的集群統(tǒng)計(jì)信息的可視化界面:

      redis.png


      原文鏈接:Creating a distributed Redis system using Docker(翻譯:左偉 校對(duì):李穎杰)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多