Redis主從複製及集羣

redis主從複製

步驟

  1. 複製一份redis.conf文件並修改名稱,如:cp redis.conf redis6380.conf
  2. 修改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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章