redis主從複製
步驟
- 複製一份redis.conf文件並修改名稱,如:cp redis.conf redis6380.conf
- 修改redis6380.conf文件中的
- 端口號
- 進程id號(pidfile /var/run/redis6380.pid)
- slaveof:主從複製信息
- 存放aof、rdb文件的目錄。
啓動從服務器:bin/redis-cli –p 6380
redis集羣(redisCluster)
redis-cluster投票:容錯(過半機制 )
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進制協議優化傳輸速度和帶寬.
(2)節點的fail是通過集羣中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
(4)redis-cluster把所有的物理節點映射到[0-16383]slot上,cluster 負責維護node<->slot<->value
Redis 集羣中內置了 16384 個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時,redis 先對 key 使用 crc16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的節點,下面是三個server分16384個哈希槽
集羣的搭建
集羣中至少應有三個節點(投票系統決定)。保證高可用每個節點需要有個備份節點。至少需要6個節點。
可以在一臺虛擬機上搭建6個redis實例。可以模擬集羣。
在local目錄下建立redis-cluster 裏面裝6個redis
Mkdir redis-cluster
第一步:創建6個redis實例。修改redis的端口號7001-7006
cp -r redisuen redis-cluster/redis01
第二步:修改redis的端口號。和開啓集羣配置。如果節點中包含dump.rdb需要刪除。保證每個節點是乾淨的節點。
開啓集羣:
第三步:啓動每個redis實例
一個一個啓動太麻煩 寫一個批註解
Vim startall.sh
cd redis01
./redis-server redis.conf
cd ..
cd redis02
./redis-server redis.conf
cd ..
cd redis03
./redis-server redis.conf
cd ..
cd redis04
./redis-server redis.conf
cd ..
cd redis05
./redis-server redis.conf
cd ..
cd redis06
./redis-server redis.conf
cd ..
授權 chmod u+x startall.sh
啓動 ./startall.sh
查看端口
ps aux | grep redis
第四步:搭建集羣。需要使用一個工具Ruby腳本。
- 安裝ruby環境
#yum install ruby
#yum install rubygems
- 安裝ruby腳本運行時需要的庫。 Redis-3.0.00.gem(需要自己準備)
# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
- 把redis源碼包的src下的ruby腳本文件複製到集羣目錄下。
[root@localhost redis-3.0.0]# cd src
# ll *.rb
# cp redis-trib.rb /usr/local/redis-cluster/
4、使用redis-trib.rb搭建集羣
執行
[root@linux-redis redis-cluster]# ./redis-trib.rb create --replicas 1 192.168.183.130:7001 192.168.183.130:7002 192.168.183.130:7003 192.168.183.130:7004 192.168.183.130:7005 192.168.183.130:7006
>>> Creating cluster
Connecting to node 192.168.183.130:7001: OK
Connecting to node 192.168.183.130:7002: OK
Connecting to node 192.168.183.130:7003: OK
Connecting to node 192.168.183.130:7004: OK
Connecting to node 192.168.183.130:7005: OK
Connecting to node 192.168.183.130:7006: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.183.130:7001
192.168.183.130:7002
192.168.183.130:7003
Adding replica 192.168.183.130:7004 to 192.168.183.130:7001
Adding replica 192.168.183.130:7005 to 192.168.183.130:7002
Adding replica 192.168.183.130:7006 to 192.168.183.130:7003
M: 5aec995c128afd47d6376e855d8abc1ebd80e27c 192.168.183.130:7001
slots:0-5460 (5461 slots) master
M: 515bdb2a855486498b41a823ccb42ffe2ba1a114 192.168.183.130:7002
slots:5461-10922 (5462 slots) master
M: 20f4886a46127ffd2800f29a7c515067d41d883a 192.168.183.130:7003
slots:10923-16383 (5461 slots) master
S: 28fe17feea97b10032296dd401610778950311e6 192.168.183.130:7004
replicates 5aec995c128afd47d6376e855d8abc1ebd80e27c
S: ddc71632db6d24cefe880efd8b7756c68af491c3 192.168.183.130:7005
replicates 515bdb2a855486498b41a823ccb42ffe2ba1a114
S: 7def39cba79309c611865c673f80bc071591e5b5 192.168.183.130:7006
replicates 20f4886a46127ffd2800f29a7c515067d41d883a
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 192.168.183.130:7001)
M: 5aec995c128afd47d6376e855d8abc1ebd80e27c 192.168.183.130:7001
slots:0-5460 (5461 slots) master
M: 515bdb2a855486498b41a823ccb42ffe2ba1a114 192.168.183.130:7002
slots:5461-10922 (5462 slots) master
M: 20f4886a46127ffd2800f29a7c515067d41d883a 192.168.183.130:7003
slots:10923-16383 (5461 slots) master
M: 28fe17feea97b10032296dd401610778950311e6 192.168.183.130:7004
slots: (0 slots) master
replicates 5aec995c128afd47d6376e855d8abc1ebd80e27c
M: ddc71632db6d24cefe880efd8b7756c68af491c3 192.168.183.130:7005
slots: (0 slots) master
replicates 515bdb2a855486498b41a823ccb42ffe2ba1a114
M: 7def39cba79309c611865c673f80bc071591e5b5 192.168.183.130:7006
slots: (0 slots) master
replicates 20f4886a46127ffd2800f29a7c515067d41d883a
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
如果出錯,請刪除節點下面的dump.rdb和nodes.conf文件,如果還是不行,整個數據庫執行flushdb
完成
如果搭建真正使用服務器的集羣,只需要在一臺服務器上執行命令即可。需要注意每臺服務器的防火牆需要關閉。
搭在多臺上,性能比較高
集羣的客戶端
Redis-cli:
隨便找一個redis,客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連接集羣所有節點,連接集羣中任何一個可用節點即可
[root@localhost redis-cluster]# redis05/redis-cli -h 192.168.183.130 -p 7005 -c
-h:服務器的ip地址
-p:服務的端口號
-c:連接集羣。算法存儲,需要跳轉到對應的端口去
redisDeskTopManager(Redis可視化工具):不支持集羣之間的跳轉。可以連接集羣中某一節點。
如果是redis集羣,數據庫只有一個。
Jedis連接集羣
需要使用JedisCluster對象。自帶連接池。項目中單例使用即可。
//創建一個JedisCluster對象。構造方法是一個set,set中是一個HostAndPort對象的集合。
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.183.130", 7001));
nodes.add(new HostAndPort("192.168.183.130", 7002));
nodes.add(new HostAndPort("192.168.183.130", 7003));
nodes.add(new HostAndPort("192.168.183.130", 7004));
nodes.add(new HostAndPort("192.168.183.130", 7005));
nodes.add(new HostAndPort("192.168.183.130", 7006));
JedisCluster jedisCluster = new JedisCluster(nodes);
//直接使用JedisCluster對象操作redis
jedisCluster.set("name", "hello redis cluster");
String string = jedisCluster.get("name");
System.out.println(string);
//系統結束之前關閉JedisCluster
jedisCluster.close();