21.22 redis集羣介紹html
21.23/21.24 redis集羣搭建配置node
21.25 redis集羣操做linux
擴展 git
redis 哨兵https://segmentfault.com/a/1190000002680804 http://www.cnblogs.com/jaycekon/p/6237562.htmlgithub
21.22 redis集羣介紹redis
redis在官方叫作redis- cluster(3.0版本以後才支持的架構)。做用於單臺機器不可以知足存放大量的數據,因此要多臺機器構成一個大集羣,用來解決存儲空間、查詢速度、負載過高等相似瓶頸的問題。vim
redis-cluster是分佈式的集羣,支持橫向擴展,就是增長節點僅僅在配置文件中,加入這個集羣就能夠了。segmentfault
codis是第三方的,針對redis集羣的另外一個解決方案。codis相似於lvs作負載均衡同樣,用的是路由這樣的技術centos
1.多個redis節點網絡互聯,數據共享安全
並非說在一個機器上寫,就能同步到其餘機器上去。好比咱們第一次寫可能在A節點,第二次寫可能在B節點,也就是說咱們寫了一個鍵值,他可能存在於A節點也可能存在於B節點。並非這個數據A上有B上也有
可是咱們在寫數據的時候,都是會告訴咱們在哪一個機器上查詢和存取的
2.全部的節點都是一主一從(能夠是多個從),其中從不提供服務,僅做爲備用
目的是增長安全性
3.不支持同時處理多個鍵(如mset/mget),由於redis須要把鍵均勻分佈在各個節點上,併發量很高的狀況下同時建立鍵值會下降性能並致使不可預測的行爲。
只能一個一個的寫
4.支持在線增長、刪除節點
5.客戶端能夠連任何一個主節點進行讀寫
好比咱們鏈接A去讀B機器上的數據
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.23/21.24 redis集羣搭建配置
1.場景設置:
1.1兩臺機器,分別開啓三個Redis服務(端口)
1.2A機器上三個端口7000,7002,7004,所有爲主
1.3B機器上三個端口7001,7003,7005,所有爲從 #這樣至關於有了6臺機器
1.4兩臺機器上都要編譯安裝redis,而後編輯並複製3個不一樣的redis.conf,分別設置不一樣的端口號、dir等參數,還須要增長cluster相關參數,而後分別啓動6個redis服務
具體redis配置文件到https://coding.net/u/aminglinux/p/yuanke_centos7/git/tree/master/21NOSQL下載或者查看
2.安裝ruby2.2 (只須要一臺機器上運行)
#須要ruby2.2.的支持。yum源(yum list |grep ruby)裏面有ruby,可是不是2.2的。一下的操做就是下載源碼包,搞成更高版本的rpm包!!!
2.1yum -y groupinstall "Development Tools"
2.2yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
#安裝對應的包
2.3cd /root/
2.4mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
#建立把源碼包搞成rpm包的幾個目錄
2.5wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
#下載源碼包
wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
#下載SPECS的文件,否則沒辦法執行下面的rpmbuild命令
2.6rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
#把源碼包作成rpm包。實際上也是編譯的過程
2.7yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
#到這就是作成了,安裝這個rpm包了
也能夠ls看一下這個包(或du -sh)
2.8gem install redis
#gem是ruby自帶的工具,用gem去安裝redis相關的redis-trib.rb
2.9cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
#放到/usr/bin下是爲了下一步能夠直接用它
2.10redis-trib.rb create --replicas 1 192.168.208.128:7000 192.168.208.128:7002 192.168.208.128:7004 192.168.208.133:7001 192.168.208.133:7003 192.168.208.133:7005
#以上全部的操做是爲了,讓redis-trib.rb這條命令順利的執行,他會將這6臺機器組成一個cluster。出現兩個綠色的OK就表明已經搭建成功
replicas在這的意思是所謂的redis-cluster
!!在這裏他會建立前三個爲主,若是咱們有指定的就在使用這條命令的時候把想要指定爲主的寫在前面(好比7000、700一、7002)
實例:
1.先來準備場景(測試)機器
由於2機器上尚未安裝redis,步驟以下:
[root@axinlinux-01 ~]# scp -r /usr/local/src/redis-4.0.1 root@192.168.208.133:/usr/local/src/redis-4.0.1.bak #能夠直接在1機器上把編譯過得源碼包拷貝過來
[root@axinlinux-03 redis-4.0.1]# make install #考過來以後,就能夠直接make install了。由於已經在1機器上編譯過了,編譯的過程其實就是生成這些二進制的文件
-----------------------
[root@axinlinux-01 ~]# cd /etc/
[root@axinlinux-01 etc]# vim redis_7000.conf
cat redis_7000.conf
port 7000
bind 192.168.208.128 #這個ip要改成01機器的ip
daemonize yes
pidfile /var/run/redis_7000.pid
dir /data/redis_data/7000
cluster-enabled yes #開啓cluster
cluster-config-file nodes_7000.conf #這個配置文件能夠自動生成的,在dir目錄下
cluster-node-timeout 10100
appendonly yes
[root@axinlinux-01 etc]# cp redis_7000.conf redis_7002.conf #直接拷貝再修改就好了
[root@axinlinux-01 etc]# vim !$
:1,$s/7000/7002/g #全局替換7000改成7002!!!
port 7002
bind 192.168.208.128
daemonize yes
pidfile /var/run/redis_7002.pid
dir /data/redis_data/7002
cluster-enabled yes
cluster-config-file nodes_7002.conf
cluster-node-timeout 10100
appendonly yes
[root@axinlinux-01 etc]# cp redis_7000.conf redis_7004.conf
[root@axinlinux-01 etc]# vim !$
port 7004
bind 192.168.208.128
daemonize yes
pidfile /var/run/redis_7004.pid
dir /data/redis_data/7004
cluster-enabled yes
cluster-config-file nodes_7004.conf
cluster-node-timeout 10100
appendonly yes
[root@axinlinux-03 etc]# vim redis7001.conf #第二臺機器上也要如此
[root@axinlinux-03 etc]# cp redis_7001.conf redis_7003.conf
[root@axinlinux-03 etc]# cp redis_7001.conf redis_7005.conf
[root@axinlinux-03 etc]# vim redis_7003.conf
[root@axinlinux-03 etc]# vim redis_7005.conf
[root@axinlinux-01 src]# mkdir /data/redis_data #兩臺機器分別建立dir目錄
[root@axinlinux-01 src]# mkdir /data/redis_data/{7000,7002,7004} #這個命令能夠在這個目錄下,建立多個目錄!!!
[root@axinlinux-03 etc]# mkdir /data/redis_data
[root@axinlinux-03 etc]# mkdir /data/redis_data/{7000,7002,7004}
[root@axinlinux-01 redis_data]# redis-server /etc/redis_7000.conf #分別開啓1機器上的三個redis
[root@axinlinux-01 redis_data]# redis-server /etc/redis_7002.conf
[root@axinlinux-01 redis_data]# redis-server /etc/redis_7004.conf
[root@axinlinux-01 redis_data]# ps aux |grep redis #能夠看到這三個
root 2059 0.1 0.4 145296 7572 ? Ssl 20:37 0:06 redis-server 127.0.0.1:6379
root 19602 0.3 0.4 145300 7568 ? Ssl 21:38 0:00 redis-server 192.168.208.128:7000 [cluster]
root 19607 0.4 0.4 145300 7568 ? Ssl 21:38 0:00 redis-server 192.168.208.128:7002 [cluster]
root 19612 0.5 0.4 145300 7568 ? Ssl 21:38 0:00 redis-server 192.168.208.128:7004 [cluster]
root 19625 0.0 0.0 112724 980 pts/0 S+ 21:38 0:00 grep --color=auto redis
2機器上也要開啓三個redis
還要注意,兩邊的iptables和selinux都要關閉
2.安裝ruby2.2 (只須要一臺機器上運行)
操做實際上就是安裝更高版本的ruby。可是呢,yum是不帶rpm包的。那隻能去下載源碼包,要麼編譯安裝,要麼把源碼包搞成rpm包。我們這個方法就是要把源碼包搞成rpm包
[root@axinlinux-01 ~]# yum -y groupinstall "Development Tools"
[root@axinlinux-01 ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-deve
[root@axinlinux-01 ~]# cd /root/
[root@axinlinux-01 ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
#建立把源碼包搞成rpm包的幾個目錄
[root@axinlinux-01 ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
[root@axinlinux-01 ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
[root@axinlinux-01 ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec #漫長的過程--
[root@axinlinux-01 ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@axinlinux-01 ~]# gem install redis
[root@axinlinux-01 ~]# cp /usr/local/src/redis-4.0.1/src/redis-trib.rb /usr/bin/
[root@axinlinux-01 ~]# redis-trib.rb create --replicas 1 192.168.208.128:7000 192.168.208.128:7002 192.168.208.128:7004 192.168.208.133:7001 192.168.208.133:7003 192.168.208.133:7005 #前三個端口數字小的爲主。這條命令會將這6個端口(6個機器)組成一個cluster。出現兩個綠色的ok即表明搭建成功
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.25 redis集羣操做
由於是一個cluster(分佈式),因此能夠去連任何一個端口
1.redis-cli -c -h 192.168.133.130 -p 7000//-c說明以集羣的方式登陸
#若是不加-c僅僅只是登陸的130:7000的這臺機器,不能登陸到集羣
任意一個節點均可以建立key,或者查看key(演示)
2.redis-trib.rb check 192.168.133.130:7000//檢測集羣狀態,後面跟任何的一個ip端口
#linux界面下執行
3.cluster nodes//列出節點
4.cluster info//查看集羣信息
5.cluster meet ip port //添加節點
#cluster meet 192.168.208.133 7007
只要是新添加進來的節點都是master
6.cluster forget node_id //移除某個節點
#若是移除的是master,要講他設爲slave才能夠。
移除slave的時候要登陸其餘的機器才能夠,也就是不能在本機上移除本身
7.cluster replicate node_id//將當前節點設置爲指定節點的從
#須要登陸到這個節點裏面去(登陸到這個指定爲從的機器裏面去)
8.cluster saveconfig//保存配置文件。把當前的操做保存到配置文件裏
#執行cluster saveconfig的時候,他保存到dir目錄下的nodesXXXX.conf配置文件裏,每一個機器上都會有
實例:
1.
[root@axinlinux-01 ~]# redis-cli -c -h 192.168.208.128 -p 7000 #必定要加-c(以集羣的方式進來)
192.168.208.128:7000> set key1 123
-> Redirected to slot [9189] located at 192.168.208.133:7001
OK
#以上,咱們set一個數據,他會將這個操做定向到了192.168.208.133:7001上。那麼最終這個key1,也會到這個機器上去。
192.168.208.128:7000> set key3 aerfereq #沒有提示什麼,就表明到了本地機器上
OK
192.168.208.128:7002> get key3
-> Redirected to slot [935] located at 192.168.208.128:7000
"aerfereq"
192.168.208.128:7000> get key4
-> Redirected to slot [13120] located at 192.168.208.128:7002
"efetewtw"
2.
[root@axinlinux-01 ~]# redis-trib.rb check 192.168.208.128:7000 #查看集羣狀態,後面個任何一個ip和端口
>>> Performing Cluster Check (using node 192.168.208.128:7000)
M: e7d5d070595f69aa235a7eb91fbd52825332d89e 192.168.208.128:7000 #誰是master
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 11929bb8ad6625f9c943f8c169beb8fc3c81f25e 192.168.208.128:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 40e060a8d1a7c73495c82b828d2722d432b446ac 192.168.208.133:7005 #誰是slave
slots: (0 slots) slave
replicates 11929bb8ad6625f9c943f8c169beb8fc3c81f25e
M: 72233bb45423a3d98901284feef716a99174ef74 192.168.208.133:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 5333348a617b0a22242d81935156f9645dc1d244 192.168.208.133:7003
slots: (0 slots) slave
replicates e7d5d070595f69aa235a7eb91fbd52825332d89e
S: 24fc94b3752fc129e0dcef478237249251e479d9 192.168.208.128:7004
slots: (0 slots) slave
replicates 72233bb45423a3d98901284feef716a99174ef74
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
3.
192.168.208.128:7000> CLUSTER nodes #列出節點
11929bb8ad6625f9c943f8c169beb8fc3c81f25e 192.168.208.128:7002@17002 master - 0 1542210458000 2 connected 10923-16383
40e060a8d1a7c73495c82b828d2722d432b446ac 192.168.208.133:7005@17005 slave 11929bb8ad6625f9c943f8c169beb8fc3c81f25e 0 1542210457000 6 connected
#查看slave的時候,ip和端口後面這個長長的字符串就是這個slave的master。這個經常的字符串對應的就是第一個master的ip和端口前面的字符串。因此192.168.208.128:7002爲主192.168.208.133:7005爲從
e7d5d070595f69aa235a7eb91fbd52825332d89e 192.168.208.128:7000@17000 myself,master - 0 1542210457000 1 connected 0-5460 #這個是本機本身
72233bb45423a3d98901284feef716a99174ef74 192.168.208.133:7001@17001 master - 0 1542210459471 4 connected 5461-10922
5333348a617b0a22242d81935156f9645dc1d244 192.168.208.133:7003@17003 slave e7d5d070595f69aa235a7eb91fbd52825332d89e 0 1542210459000 5 connected
24fc94b3752fc129e0dcef478237249251e479d9 192.168.208.128:7004@17004 slave 72233bb45423a3d98901284feef716a99174ef74 0 1542210459066 4 connected
4.
192.168.208.128:7000> CLUSTER INFO #查看集羣的信息
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2792
cluster_stats_messages_pong_sent:2857
cluster_stats_messages_sent:5649
cluster_stats_messages_ping_received:2852
cluster_stats_messages_pong_received:2792
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:5649
5.
192.168.208.128:7000> cluster meet 192.168.208.133 7007 #增長一個節點
OK
192.168.208.128:7000> cluster nodes
ae84d3652d3f7de25b13e58036824863afbb438b 192.168.208.133:7007@17007 master - 0 1542211536000 0 connected #能夠看到7007進來就是master的身份
192.168.208.128:7000> cluster meet 192.168.208.128 7006 #咱們在添加一個新的節點進來,看他是什麼角色
OK
192.168.208.128:7000> cluster nodes #結果他仍是master,因此咱們只要添加新的節點進來,他都是master
bb580afa0b3f97d47bf8dbc3f85164cb0f214028 192.168.208.128:7006@17006 master - 0 1542212017000 0 connected
7.
[root@axinlinux-01 etc]# redis-cli -c -h 192.168.208.128 -p 7006 #首先進入到7006記得加-c
192.168.208.128:7006> CLUSTER REPLICATE ae84d3652d3f7de25b13e58036824863afbb438b
OK #後面跟的想要成爲他的master的nodes號
192.168.208.128:7006> cluster nodes #查看一下
bb580afa0b3f97d47bf8dbc3f85164cb0f214028 192.168.208.128:7006@17006 myself,slave ae84d3652d3f7de25b13e58036824863afbb438b 0 1542212361000 0 connected
ae84d3652d3f7de25b13e58036824863afbb438b 192.168.208.133:7007@17007 master - 0 1542212361896 7 connected
8.
192.168.208.128:7006> CLUSTER SAVECONFIG
OK
[root@axinlinux-03 etc]# cat /data/redis_data/7007/nodes_7007.conf
40e060a8d1a7c73495c82b828d2722d432b446ac 192.168.208.133:7005@17005 slave 11929bb8ad6625f9c943f8c169beb8fc3c81f25e 0 1542212351000 2 connected
72233bb45423a3d98901284feef716a99174ef74 192.168.208.133:7001@17001 master - 0 1542212348938 4 connected 5461-10922
bb580afa0b3f97d47bf8dbc3f85164cb0f214028 192.168.208.128:7006@17006 slave ae84d3652d3f7de25b13e58036824863afbb438b 0 1542212350959 7 connected
5333348a617b0a22242d81935156f9645dc1d244 192.168.208.133:7003@17003 slave e7d5d070595f69aa235a7eb91fbd52825332d89e 0 1542212347932 1 connected
ae84d3652d3f7de25b13e58036824863afbb438b 192.168.208.133:7007@17007 myself,master - 0 1542212349000 7 connected
24fc94b3752fc129e0dcef478237249251e479d9 192.168.208.128:7004@17004 slave 72233bb45423a3d98901284feef716a99174ef74 0 1542212350000 4 connected
e7d5d070595f69aa235a7eb91fbd52825332d89e 192.168.208.128:7000@17000 master - 0 1542212350151 1 connected 0-5460
11929bb8ad6625f9c943f8c169beb8fc3c81f25e 192.168.208.128:7002@17002 master - 0 1542212348000 2 connected 10923-16383
vars currentEpoch 7 lastVoteEpoch 0