前言
redis定義
redis是一個key-value存儲系統(tǒng)户誓。和Memcached類似饼灿,它支持存儲的value類型相對更多,包括string(字符串)帝美、list(鏈表)碍彭、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)悼潭。這些數(shù)據(jù)類型都支持push/pop庇忌、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的舰褪。在此基礎(chǔ)上皆疹,redis支持各種不同方式的排序。與memcached一樣占拍,為了保證效率略就,數(shù)據(jù)都是緩存在內(nèi)存中捎迫。區(qū)別的是redis會周期性的把更新的數(shù)據(jù)寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎(chǔ)上實現(xiàn)了master-slave(主從)同步残制。
Redis 是一個高性能的key-value數(shù)據(jù)庫立砸。?redis的出現(xiàn),很大程度補(bǔ)償了memcached這類key/value存儲的不足初茶,在部 分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用颗祝。它提供了Java,C/C++恼布,C#螺戳,PHP,JavaScript折汞,Perl倔幼,Object-C,Python爽待,Ruby损同,Erlang等客戶端,使用很方便鸟款。
Docker 簡介
Docker 是一個開源的應(yīng)用容器引擎膏燃,讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的Linux機(jī)器或Windows 機(jī)器上,也可以實現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會有任何接口。
一個完整的Docker有以下四個部分組成:DockerClient客戶端何什、Docker Daemon守護(hù)進(jìn)程组哩、Docker Image鏡像、DockerContainer容器
Docker 原理
Docker核心解決的問題是利用LXC來實現(xiàn)類似VM的功能处渣,從而利用更加節(jié)省的硬件資源提供給用戶更多的計算資源伶贰。同VM的方式不同, LXC 其并不是一套硬件虛擬化方法 - 無法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意一個罐栈,而是一個操作系統(tǒng)級虛擬化方法, 理解起來可能并不像VM那樣直觀黍衙。所以我們從虛擬化到docker要解決的問題出發(fā),看看他是怎么滿足用戶虛擬化需求的荠诬。
docker搭建redis集群
一:搜索redis鏡像们豌,拉去鏡像
wangxuandeMacBook-Air:rediswangxuan$dockersearchredis
NAMEDESCRIPTIONSTARSOFFICIALAUTOMATED
redisRedisisanopensourcekey-valuestorethat…7393[OK]
bitnami/redisBitnamiRedisDockerImage128[OK]
sameersbn/redis77[OK]
grokzen/redis-clusterRediscluster3.0,3.2,4.0&5.058
rediscommander/redis-commanderAlpineimageforredis-commander-Redisman…31[OK]
kubeguide/redis-masterredis-masterwith"HelloWorld!"30
redislabs/redisClusteredin-memorydatabaseenginecompatib…23
oliver006/redis_exporterPrometheusExporterforRedisMetrics.Supp…18
可以看到目前最新版本是5.0,但是我們使用4.0,往往新的版本并不一定好浅妆。
二:拉取鏡像
wangxuandeMacBook-Air:rediswangxuan$dockerpullredis:4.0
4.0:Pullingfromlibrary/redis
b8f262c62ec6:Pullcomplete
93789b5343a5:Pullcomplete
49cdbb315637:Pullcomplete
e244975d5eb1:Pullcomplete
25dca704d939:Pullcomplete
db11ecc9cf34:Pullcomplete
Digest:sha256:615b872e3af387206b62ffe66c1052f1653ed31b3afcfaa292a9244c92f2007a
Status:Downloadednewerimageforredis:4.0
三:配置redis集群
配置集群之前望迎,我們必須下載一個配置文件redis.conf,直接使用
wget-chttp://download.redis.io/redis-stable/redis.conf
下載,我們先介紹一下其中的關(guān)鍵的配置參數(shù)(今天我們配置的是一主兩從的集群)
主配置文件.redis-master.conf
daemonizeyes
pidfile/var/run/redis.pid
bind0.0.0.0
從配置文件redis-slaveof1.conf ,redis-slaveof2.conf
daemonizeyes
pidfile/var/run/redis.pid
slaveofmaster6379
bind0.0.0.0
我們看到slaveof master 6379 這里使用master 有兩個原因
docker容器重啟之后凌外,ip地址會發(fā)生變化辩尊,導(dǎo)致訪問失效問題
還有安全問題的考慮
這里我們也解釋一下bind的這個參數(shù)
默認(rèn)情況下,如果沒有指定bind配置指令康辑,則 Redis 監(jiān)聽來自服務(wù)器上所有可用網(wǎng)絡(luò)接口的連接摄欲〗瘟粒可以使用bind配置指令來監(jiān)聽一個或多個選定的接口,在bind后拼接一個或多個 IP 地址即可胸墙。例如:
bind192.168.1.10010.0.0.1
bind127.0.0.1::1
這里我們把配置的配置bind 127.0.0.1 改成bind 0.0.0.0我注,不然我們的容器將會訪問不通。
三:啟動redis集群
dockerrun-it-v/Users/wangxuan/redis/redis-master.conf:/usr/local/bin/redis.conf--nameredis-masterredis:4.0/bin/bash
dockerrun-it-v/Users/wangxuan/redis/redis-slaveof1.conf:/usr/local/bin/redis.conf--nameredis-slave1--linkredis-master:masterredis:4.0/bin/bash
dockerrun-it-v/Users/wangxuan/redis/redis-slaveof2.conf:/usr/local/bin/redis.conf--nameredis-slave2--linkredis-master:masterredis:4.0/bin/bash
這里我們看-v這個參數(shù)迟隅,這個是因為我們在容器里面修改文件往往不方便但骨,一般容器是沒有vim命令,需要我們自行下載智袭,所以-v參數(shù)用于將宿主機(jī)上的某個目錄掛載到容器中,我們在我們的機(jī)器上直接可以修改配置文件奔缠。
上述命令中使用--link redis-master:master參數(shù),前面提到的redis-slaveof1.conf配置文件中slaveof配置項吼野,這里使用了一個master作為別名校哎,其效果和使用IP一樣(IP地址在/etc/host文件中)
現(xiàn)在我們先運(yùn)行主redis容器
wangxuandeMacBook-Air:rediswangxuan$dockerrun-it-v/Users/wangxuan/redis/redis-master.conf:/usr/local/bin/redis.conf--nameredis-masterredis:4.0/bin/bash
root@9874f9ec818c:/data#redis-server/usr/local/bin/redis.conf
root@9874f9ec818c:/data#redis-cli
127.0.0.1:6379>info
....
#Replication
role:master
connected_slaves:0
master_replid:b435db2264d29c74ddfa6d9b84572f343c03d770
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的從節(jié)點是0
我們在啟動一個從redis容器
wangxuandeMacBook-Air:rediswangxuan$dockerrun-it-v/Users/wangxuan/redis/redis-slaveof1.conf:/usr/local/bin/redis.conf--nameredis-slave1--linkredis-master:masterredis:4.0/bin/bash
root@8469ebae122c:/data#redis-server/usr/local/bin/redis.conf
root@8469ebae122c:/data#redis-cli
127.0.0.1:6379>info
#Replication
role:slave
master_host:master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1012f0b993083d3ac250a634997ce86827acd939
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
發(fā)現(xiàn)此時從節(jié)點的角色role變成了slave. master_host是master
同理在啟動另外一個從節(jié)點
wangxuandeMacBook-Air:~wangxuan$dockerrun-it-v/Users/wangxuan/redis/redis-slaveof2.conf:/usr/local/bin/redis.conf--nameredis-slave2--linkredis-master:masterredis:4.0/bin/bash
root@8d31889d7f46:/data#redis-server/usr/local/bin/redis.conf
root@8d31889d7f46:/data#redis-cli
127.0.0.1:6379>info
...
#Replication
role:slave
master_host:master
master_port:6379
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_repl_offset:308
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1012f0b993083d3ac250a634997ce86827acd939
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:308
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:295
repl_backlog_histlen:14
...
我們現(xiàn)在在看一下主節(jié)點的信息
127.0.0.1:6379>info
...
#Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.3,port=6379,state=online,offset=420,lag=1
slave1:ip=172.17.0.4,port=6379,state=online,offset=434,lag=0
master_replid:1012f0b993083d3ac250a634997ce86827acd939
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:434
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:434
...
connected_slaves編程了2,上面也記錄了兩個從節(jié)點的ip,port等信息
我們也驗證一下
主節(jié)點
127.0.0.1:6379>setjiepidog
OK
從節(jié)點
127.0.0.1:6379>getjiepi
"dog"
127.0.0.1:6379>setjiepipig
(error)READONLYYoucan'twriteagainstareadonlyslave.
發(fā)現(xiàn)從節(jié)點可以獲取主節(jié)點設(shè)置的值瞳步,說明從節(jié)點把主節(jié)點的數(shù)據(jù)同步了過來闷哆,并且從節(jié)點僅僅只讀。到此docker搭建redis一主兩從集群搭建完成单起。
總結(jié)
Redis是一個遠(yuǎn)程內(nèi)存數(shù)據(jù)庫阳准,它不僅性能強(qiáng)勁,而且還具有復(fù)制特性以及為解決問題而生的獨一-無二的數(shù)據(jù)模型馏臭。Redis 提供了5種不同類型的數(shù)據(jù)結(jié)構(gòu),各式各樣的問題都可以很自然地映射到這些數(shù)據(jù)結(jié)構(gòu)上:Redis的數(shù)據(jù)結(jié)構(gòu)致力于幫助用戶解決問題讼稚,而不會像其他數(shù)據(jù)庫那樣括儒,要求用戶扭曲問題來適應(yīng)數(shù)據(jù)庫。除此之外锐想,通過復(fù)制帮寻、持久化( persistence )和客戶端分片( lint-side sharding )等特性,用戶可以很方便地將Redis 打展成- -個能夠包含數(shù)百GB數(shù)據(jù)赠摇、每秒處理上百萬次請求的系統(tǒng)固逗。