REDIS主從配置
為了節省資源,本實驗在一台機器進行。即,在一台機器上啟動兩個端口,模擬兩台機器。
機器准備:
[root@adailinux ~]# cp /etc/redis.conf /etc/redis2.conf
[root@adailinux ~]# vim /etc/redis2.conf
port 6380 pidfile /var/run/redis_6380.pid logfile "/tmp/logs/redis2.log" dir /data/redis2 # slaveof <masterip> <masterport> slaveof 127.0.0.1 6379 ###指定主服務器IP和端口 # masterauth <master-password> ###如果主服務器設定了密碼,需要在從服務器上添加該參數
[root@adailinux ~]# mkdir /data/redis2
啟動Redis:
[root@adailinux ~]# redis-server /etc/redis.conf
[root@adailinux ~]# redis-server /etc/redis2.conf
[root@adailinux ~]# ps aux |grep redis
root 2454 0.2 0.4 145244 2356 ? Ssl 17:18 0:00 redis-server 127.0.0.1:6379
root 2459 0.3 0.4 145244 2332 ? Ssl 17:19 0:00 redis-server 127.0.0.1:6380
[root@adailinux ~]# netstat -lntp |grep redis
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 2454/redis-server 1
tcp 0 0 127.0.0.1:6380 0.0.0.0:* LISTEN 2459/redis-server 1
啟動成功!!!
至此,Redis主從搭建完畢!!!
查看SLAVE上的數據
[root@adailinux ~]# redis-cli -p 6380 127.0.0.1:6380> keys * 1) "list1" 2) "hseta" 3) "set1" 4) "set3" 5) "key2" 6) "k1" 7) "set4" 8) "seta" 9) "k2" 10) "k3" 11) "zseta" 12) "setb" 13) "hash1" 14) "set5" 15) "list2" 16) "mykey"
測試主從
在master上創建數據:
[root@adailinux ~]# redis-cli -p 6379 127.0.0.1:6379> del key (integer) 1 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> set test 00001 OK 在slave上查看: [root@adailinux ~]# redis-cli -p 6380 127.0.0.1:6380> select 1 127.0.0.1:6380[1]> keys * 1) "test" 127.0.0.1:6380[1]> get test "00001"
注意: Redis主從和mysql主從不一樣,Redis主從不用事先同步數據,它會自動同步。因為master上設置有參數“slave-read-only yes”,即該slave為只讀數據庫!
20.22 REDIS集群介紹
Redis cluster是分布式集群,支持橫向擴展,Redis從V3.0版本后才支持集群功能。Redis集群的工作原理類似於磁盤的raid5。
- 多個redis節點網絡互聯,數據共享
- 所有的節點都是一主一從(可以是多個從),其中從不提供服務,僅作為備用
- 不支持同時處理多個鍵(如mset/mget),因為redis需要把鍵均勻分布在各個節點上,並發量很高的情況下同時創建鍵值會降低性能並導致不可預測的行為。
- 支持在線增加、刪除節點
- 客戶端可以連任何一個主節點進行讀寫
21.22-21.23 REDIS集群搭建
場景設置
- 兩台機器,分別開啟三個Redis服務(端口)
- A機器上三個端口:7000、7002、7004,全部為主
- B機器上三個端口:7001、7003、7005,全部為從
- 兩台機器上都要編譯安裝Redis,然后編譯並復制三個不同的Redis.conf,分別設置不同的端口號、dir等參數,還需要增加cluster相關參數,然后分別啟動6個Redis服務
准備機器
MASTER(IP:192.168.8.131)
[root@adailinux ~]# vim /etc/redis_7000.conf port 7000 bind 192.168.8.131 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@adailinux ~]# vim /etc/redis_7002.conf port 7002 bind 192.168.8.131 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@adailinux ~]# vim /etc/redis_7004.conf port 7004 bind 192.168.8.131 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@adailinux ~]# mkdir /data/redis_data
[root@adailinux ~]# mkdir /data/redis_data/{7000,7002,7004}
依次啟動Redis服務7000,7002,7004:
[root@adailinux ~]# redis-server /etc/redis_7000.conf
啟動完成后,結果如下:
[root@adailinux ~]# ps aux |grep redis
root 14423 0.6 0.5 145248 2640 ? Ssl 19:35 0:00 redis-server 192.168.8.131:7000 [cluster]
root 14438 3.5 0.5 145248 2636 ? Ssl 19:37 0:00 redis-server 192.168.8.131:7002 [cluster]
root 14443 13.8 0.5 145248 2636 ? Ssl 19:37 0:01 redis-server 192.168.8.131:7004 [cluster]
注: 此處bind應該對應自己服務器的IP。
SLAVE(IP:192.168.8.132)
首先要先安裝好Redis,然后執行如下操作:
[root@adailinux ~]# vim /etc/redis_7001.conf port 7001 bind 192.168.8.132 daemonize yes pidfile /var/run/redis_7001.pid dir /data/redis_data/7001 cluster-enabled yes cluster-config-file nodes_7001.conf cluster-node-timeout 10100 appendonly yes
[root@adailinux ~]# vim /etc/redis_7003.conf port 7003 bind 192.168.8.132 daemonize yes pidfile /var/run/redis_7003.pid dir /data/redis_data/7003 cluster-enabled yes cluster-config-file nodes_7003.conf cluster-node-timeout 10100 appendonly yes
[root@adailinux ~]# vim /etc/redis_7005.conf port 7005 bind 192.168.8.132 daemonize yes pidfile /var/run/redis_7005.pid dir /data/redis_data/7005 cluster-enabled yes cluster-config-file nodes_7005.conf cluster-node-timeout 10100 appendonly yes
創建各配置文件對應的數據庫目錄:
[root@adailinux ~]# mkdir /data/redis_data
[root@adailinux ~]# mkdir /data/redis_data/{7001,7003,7005}
依次啟動Redis服務7001,7003,7005:
[root@adailinux ~]# redis-server /etc/redis_7001.conf
啟動完成后結果如下:
[root@adailinux ~]# ps aux |grep redis
root 5971 0.2 0.5 145248 2632 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7001 [cluster]
root 5976 0.1 0.5 145248 2636 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7003 [cluster]
root 5981 0.1 0.5 145248 2632 ? Ssl 19:41 0:00 redis-server 192.168.8.132:7005 [cluster]
安裝RUBY V2.2(MASTER)
Redis集群需要ruby的支持,需要先安裝ruby(Ruby只需在一台機器上運行)。Redis4.0需要使用Ruby2.2,安裝方法如下(因為本機自帶的是2.0版本的ruby,所以需要使用如下方法把源碼包包制作成yum安裝包,然后借助yum工具安裝ruby2.2——升級ruby版本):
安裝yum開發工具組:
[root@adailinux ~]# yum -y groupinstall "Development Tools"
升級庫文件:
[root@adailinux ~]# yum -y install gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel
[root@adailinux ~]# cd /root/
創建制作rpm包的目錄:
[root@adailinux ~]# mkdir -p rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
下載Ruby的源碼包:
[root@adailinux ~]# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P rpmbuild/SOURCES
下載specs文件,用於制作rpm包:
[root@adailinux ~]# wget https://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P rpmbuild/SPECS
制作rpm包:
[root@adailinux ~]# rpmbuild -bb rpmbuild/SPECS/ruby22x.spec
##此處需要耐心等待…
安裝Ruby2.2:
[root@adailinux ~]# yum -y localinstall rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.centos.x86_64.rpm
[root@adailinux ~]# ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]
至此,ruby 2.2安裝完畢!
注: 除此方法之外,還可以編譯安裝ruby。
配置集群
安裝Redis配置集群的工具:
[root@adailinux ~]# gem install redis
將命令redis-trib.rb加入環境變量目錄下:
[root@adailinux ~]# cp /usr/local/src/redis-4.0.2/src/redis-trib.rb /usr/bin/
[root@adailinux ~]# redis-trib.rb create --replicas 1 192.168.8.131:7000 192.168.8.131:7002 192.168.8.131:7004 192.168.8.132:7001 192.168.8.132:7003 192.168.8.132:7005
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
##注意:redis-trib.rb create --replicas 1 此處的參數“1”
至此,Redis集群配置完成!
21.25 REDIS集群操作
因為Redis集群是分布式結構,所以可以連接任何一個端口。
連接:
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000
##-c:=cluster,表示以集群方式連接
創建數據:
192.168.8.131:7000> set cluster1 adaitest
-> Redirected to slot [8483] located at 192.168.8.132:7001
OK
##該操作會被重定向到192.168.8.132:7001
192.168.8.132:7001> set cluster2 adai222
-> Redirected to slot [4416] located at 192.168.8.131:7000
OK
192.168.8.131:7000> set cluster3 adaitest333
OK
192.168.8.131:7000> set cluster4 adai2323
-> Redirected to slot [12678] located at 192.168.8.131:7002
OK
查看數據:
192.168.8.131:7002> get cluster1
-> Redirected to slot [8483] located at 192.168.8.132:7001
"adaitest"
192.168.8.132:7001> get cluster2
-> Redirected to slot [4416] located at 192.168.8.131:7000
"adai222"
192.168.8.131:7000> get cluster3
"adaitest333"
192.168.8.131:7000> get cluster4
-> Redirected to slot [12678] located at 192.168.8.131:7002
"adai2323"
集群相關的操作
查看集群的狀態:
[root@adailinux ~]# redis-trib.rb check 192.168.8.131:7000
列出節點:
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000
192.168.8.131:7000> cluster nodes
查看集群信息:
192.168.8.131:7000> cluster info
添加節點(執行該操作前先在slave創建redis_7007.conf並啟動):
192.168.8.131:7000> cluster meet 192.168.8.132 7007
OK
192.168.8.131:7000> cluster nodes
52e4b3484838be21fcf53b84198e362efd54bd39 192.168.8.132:7007@17007 master - 0 1507035952000 0 connected
##此時7007以master身份存在
再添加一個節點:
192.168.8.131:7000> cluster meet 192.168.8.131 7006
OK
192.168.8.131:7000> cluster nodes
677f27fb209ce45c823126fe38dbcf0b9fc43d93 192.168.8.131:7006@17006 master - 0 1507036137147 0 connected
##同樣是以master身份存在
##即,使用以上方式添加的新節點都是以master身份存在!
將當前節點設置為指定節點的從:
先更換到要設置的節點:
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7006
設定為7007的從:
192.168.8.131:7006> cluster replicate 52e4b3484838be21fcf53b84198e362efd54bd39
OK
查看:
192.168.8.131:7006> cluster nodes
52e4b3484838be21fcf53b84198e362efd54bd39 192.168.8.132:7007@17007 master - 0 1507036429244 7 connected
677f27fb209ce45c823126fe38dbcf0b9fc43d93 192.168.8.131:7006@17006 myself,slave 52e4b3484838be21fcf53b84198e362efd54bd39 0 1507036429000 0 connected
#對比node號,即7006為7007的從。。
移除某節點:
192.168.8.131:7006> cluster forget 52e4b3484838be21fcf53b84198e362efd54bd39
(error) ERR Can't forget my master!
192.168.8.131:7006> cluster forget 677f27fb209ce45c823126fe38dbcf0b9fc43d93
(error) ERR I tried hard but I can't forget myself...
## 即,不能移除master節點和當前所在節點
[root@adailinux ~]# redis-cli -c -h 192.168.8.131 -p 7000
192.168.8.131:7000> cluster forget 677f27fb209ce45c823126fe38dbcf0b9fc43d93
OK
查看:
192.168.8.131:7000> cluster nodes
#此時7006已經不存在了。
保存當前配置:
192.168.8.131:7000> CLUSTER SAVECONFIG OK