Redis資料庫之主從複製和叢集部署
主從複製:
目前只能在一臺機子上演示主從複製
第一步 需要啟動兩臺Redis, 複製兩份相同的redis.conf
第二步 分別將兩個redis.conf檔案的port設定為6380和6381
第三步 將6381那臺的slaveof屬性 設定為 127.0.0.1 6380
第四步 啟動兩臺redis
第五步 在主機Redis上建立一個key, 可以通過命令檢視從機Redis上也有相同的key, 說明自動實現主從複製
叢集部署:
第一步: 安裝ruby環境
yum install ruby
yum install rubygems
再安裝ruby和redis的介面程式
需要將redis-3.0.0.gem檔案拷貝至相應的目錄下
gem install /../../redis-3.0.0.gem 目錄地址自定義
第二步: 建立叢集
① 在自定義的路徑下建立6個資料夾用於表示不同的主機
② 將redis的原始碼中的redis.conf拷貝至每個主機資料夾下
③ 將redis的原始碼中的src目錄下的redis-trib.rb檔案拷貝至跟6個資料夾同級的目錄中
④ 修改6個資料夾下的redis.conf的配置:
port 埠號 ===========>指定具體的埠號(當前設定為7001-7006), 不能重複也不能被其他程式佔用
bind [ip] =======>綁定當前主機的ip(我這裡配置為當前主機的ip 192.168.19.130)
cluster-enabled yes ==========>開啟叢集
cluster-config-file nodes-[port].conf ============>生成節點檔案(相對應的port改為7001-7006)
第三步: 啟動每個節點的redis服務
① 啟動6個redis服務
② 呼叫叢集檔案, 建立叢集, 命令如下:
執行redis-trib.rb,此指令碼是ruby指令碼,它依賴ruby環境。
./redis-trib.rb create --replicas 1 192.168.19.130:7001 192.168.19.130:7002 192.168.19.130:7003 192.168.19.130:7004 192.168.19.130:7005 192.168.19.130:7006
說明:
其中192.168.19.130是當前機子的ip地址, 由於6臺redis服務都在同一臺機子上, 所以6個ip地址一樣
redis叢集至少需要3個主節點,每個主節點有一個從節點總共6個節點
replicas指定為1表示每個主節點有一個從節點, 可以看成有3臺機子, 每臺機子都有主從(master/slave)複製
如果執行時報如下錯誤:
[ERR] Node XXXXXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0
解決方法是刪除生成的配置檔案nodes.conf,如果不行則說明現在建立的結點包括了舊叢集的結點資訊,需要刪除redis的持久化檔案後再重啟redis,比如:appendonly.aof、dump.rdb
出現下圖代表成功:
③ 檢視叢集部署:
1) 先用客戶端登入其中一臺服務, 登入命令: ./bin/redis-cli -h 192.168.19.130 -p 7001
2) 檢視叢集狀態命令: cluster info
3) 再鍵入cluster nodes命令檢視叢集部署, 如下圖:
第四步: 用Java程式碼連線Redis的叢集
測試程式碼:
/**
* 測試連線叢集服務
*/
@Test
public void testCluster() {
JedisPoolConfig config = new JedisPoolConfig();
// 最大連線數
config.setMaxTotal(30);
// 最大連線空閒數
config.setMaxIdle(2);
//叢集結點
Set<HostAndPort> jedisClusterNode = new HashSet<HostAndPort>();
jedisClusterNode.add(new HostAndPort("192.168.19.130", 7001));
jedisClusterNode.add(new HostAndPort("192.168.19.130", 7002));
jedisClusterNode.add(new HostAndPort("192.168.19.130", 7003));
jedisClusterNode.add(new HostAndPort("192.168.19.130", 7004));
jedisClusterNode.add(new HostAndPort("192.168.19.130", 7005));
jedisClusterNode.add(new HostAndPort("192.168.19.130", 7006));
JedisCluster jc = new JedisCluster(jedisClusterNode, config);
jc.set("birthday", "today");
String value = jc.get("birthday");
System.out.println(value);
try {
jc.close();
} catch (IOException e) {
e.printStackTrace();
}
}
結果: