Redis 集羣的使用測試(Jedis 客戶端的使用) 1、 Jedis 客戶端建議升級到最新版(當前爲 2.7.3) ,這樣對 3.0.x 集羣有比較好的支持。 https://github.com/xetorthio/jedis http://mvnrepository.com/artifact/redis.clients/jedis 2代碼 edu-common-parent edu-demo-redis-cluster edu-demo-redis->src/test/java->wusc.edu.demo.redis->RedisTest.java package wusc.edu.demo.redis; import java.util.HashSet; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPoolConfig; /** * * @描述: Redis集羣測試 . */ public class RedisClusterTest { private static final Log log = LogFactory.getLog(RedisClusterTest.class); public static void main(String[] args) { // 數據庫鏈接池配置 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(100); config.setMaxIdle(50); config.setMinIdle(20); config.setMaxWaitMillis(6 * 1000); config.setTestOnBorrow(true); // Redis集羣的節點集合 Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>(); jedisClusterNodes.add(new HostAndPort("192.168.229.204", 7111)); jedisClusterNodes.add(new HostAndPort("192.168.229.205", 7112)); jedisClusterNodes.add(new HostAndPort("192.168.229.206", 7113)); jedisClusterNodes.add(new HostAndPort("192.168.229.207", 7114)); jedisClusterNodes.add(new HostAndPort("192.168.229.208", 7115)); jedisClusterNodes.add(new HostAndPort("192.168.229.209", 7116)); // 根據節點集創集羣鏈接對象 //JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes); // 集羣各節點集合,超時時間,最多重定向次數,鏈接池 JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes, 2000, 100, config); int num = 1000; String key = "wusc"; String value = ""; for (int i=1; i <= num; i++){ // 存數據 jedisCluster.set(key+i, "WuShuicheng"+i); // 取數據 value = jedisCluster.get(key+i); log.info(key+i + "=" + value); // 刪除數據 //jedisCluster.del(key+i); //value = jedisCluster.get(key+i); //log.info(key+i + "=" + value); } } } Run as->Java Application 登錄集羣驗證 [root@master1 ~]# /usr/local/redis3/bin/redis-cli -c -p 7111 127.0.0.1:7111> get wusc1 -> Redirected to slot [15665] located at 192.168.229.209:7116 "WuShuicheng1" 192.168.229.209:7116> get wusc999 <-進行了重定向 -> Redirected to slot [10657] located at 192.168.229.208:7115 "WuShuicheng999" 192.168.229.208:7115> <-進行了重定向 實際項目中與spring進行結合 edu-demo-redis->src/main/resources/spring/spring-redis.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Jedis鏈接池配置,注意:Jedis版本建議升級到最新(當前最新版爲2.7.3) --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="100" /> <property name="maxIdle" value="20" /> <property name="minIdle" value="10" /> <property name="blockWhenExhausted" value="true"></property> <property name="maxWaitMillis" value="3000" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="testWhileIdle" value="true" /> <property name="minEvictableIdleTimeMillis" value="60000" /> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="numTestsPerEvictionRun" value="-1" /> </bean> <!-- JedisCluster --> <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg index="0"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.229.204" /> <constructor-arg index="1" value="7111" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.229.205" /> <constructor-arg index="1" value="7112" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.229.206" /> <constructor-arg index="1" value="7113" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.229.207" /> <constructor-arg index="1" value="7114" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.229.208" /> <constructor-arg index="1" value="7115" type="int" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg index="0" value="192.168.229.209" /> <constructor-arg index="1" value="7116" type="int" /> </bean> </set> </constructor-arg> <constructor-arg index="1" value="2000" type="int"></constructor-arg> <constructor-arg index="2" value="100" type="int"></constructor-arg> <constructor-arg index="3" ref="jedisPoolConfig"></constructor-arg> </bean> </beans> 測試spring取值 edu-demo-redis->src/test/java->wusc.edu.demo.redis->RedisClusterSpringTest.java Run as -> Java Application # cp redis-trib.rb /usr/local/bin/redis-trib # redis-trib create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116 192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113 2、查看當前集羣各節點的狀態 [root@edu-redis-01 7111]# /usr/local/redis3/bin/redis-cli -c -p 7111 127.0.0.1:7111> cluster nodes 3、使用 demo 應用向集羣寫入 1000 個鍵值數據 使用 /usr/local/redis3/bin/redis-cli -c -p 711X 命令登錄各節點,使用 keys * 查看各節點的所有 key -------------------------------------------------------------------- Redis 集羣的高可用性測試 -------------------------------------------------------------------- 一、Redis 集羣特點 1、集羣架構特點: (1)所有的 redis 節點彼此互聯(PING-PONG 機制),內部使用二進制協議優化傳輸速度和帶寬; (2)節點的 fail 是通過集羣中超過半數的節點檢測失效時才生效; (3)客戶端與 redis 節點直連,不需要中間 proxy 層。客戶端不需要連接集羣所有節點,連接集羣中任何一 個可用節點即可; (4)redis-cluster 把所有的物理節點映射到[0-16383]個 slot(哈希槽)上,cluster 負責維護 node<->slot<->value 。 2、集羣選舉容錯: (1)節點失效選舉過程是集羣中所有 master 參與,如果半數以上 master 節點與當前被檢測 master 節點通 信檢測超時(cluster-node-timeout),就認爲當前 master 節點掛掉; (2):什麼時候整個集羣不可用(cluster_state:fail)? A:如果集羣任意 master 掛掉,且當前 master 沒有 slave。集羣進入 fail 狀態,也可以理解成集羣的 slot 映射[0-16383]不完整時進入 fail 狀態。 ps : redis-3.0.0.rc1 加入 cluster-require-full coverage 參數,默認關閉,打開集羣兼容部分失敗; B:如果集羣超過半數以上 master 掛掉,無論是否有 slave 集羣進入 fail 狀態。ps:當集羣不可用時, 所有對集羣的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤。 4、運行 demo 應用,獲取所有的鍵值數據 如果有空值則停止 5、模擬集羣節點宕機(實現故障轉移,可重點看視頻解說) (1)Jedis 客戶端循環操作集羣數據(模擬用戶持續使用系統) (2)查看 Redis 集羣當前狀態(用於接下來做節點狀態變化對比) 節點狀態 fail? 表示正在判斷是否失敗 節點狀態 fail 表示節點失敗,對應的 slave 節點提升爲 master (5)再查看集羣狀態變化# /usr/local/src/redis-3.0.3/src/redis-trib.rb check 192.168.229.209:7116 由上可見,7114 節點替換 7111,由 slave 變成了 master 此時再執行 demo 應用獲取所有的鍵值數據,依然正常,說明 slave 替換 master 成功,集羣正常。 6、恢復 fail 節點 (1)啓動 7111 # /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf (2)查看集羣狀態 127.0.0.1:7116>cluster nodes 由上可見,7114 節點替換 7111,由 slave 變成了 master 此時再執行 demo 應用獲取所有的鍵值數據,依然正常,說明 slave 替換 master 成功,集羣正常。 6、恢復 fail 節點 (1)啓動 7111 # /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf (2)查看集羣狀態 7、總結: 優點: 在 master 節點下線後,slave 節點會自動提升爲 master 節點,保存集羣持續提供服務; fail 節點恢復後,會自動添加到集羣中,變成 slave 節點; 缺點: 由於 redis 的複製使用異步機制,在自動故障轉移的過程中,集羣可能會丟失寫命令。然而 redis 幾 乎是同時執行(將命令恢復發送給客戶端,以及將命令複製到 slave 節點)這兩個操作,所以實際中,命令 丟失的窗口非常小。 三、集羣高可用測試(重建集羣步驟) 1、重建集羣,步驟: (1)關閉集羣的各節點;查詢集羣各個節點 1.1查詢集羣信息 [root@slave3 ~]# /usr/local/redis3/bin/redis-cli -c -p 7116 127.0.0.1:7116> cluster nodes 5804331faa018ee945faf40b9e80b13d14157488 192.168.229.204:7111 slave c8f1e1e5ea944ae2b46f7c8f45fa626bbd18c779 0 1584433795941 4 connected dca8a5ab378f99fb2245b9063853f5c91bf2ed43 192.168.229.208:7115 master - 0 1584433796949 2 connected 5461-10922 c6dc785b0c0a3ebcc5a5561601a587eff85c4185 192.168.229.206:7113 slave b1565d8e0541389a815bfdedd320060a73ea34b3 0 1584433794936 6 connected c8f1e1e5ea944ae2b46f7c8f45fa626bbd18c779 192.168.229.207:7114 master - 0 1584433793931 1 connected 0-5460 69778143d0208880e52ac0015fa67c3986efd867 192.168.229.205:7112 slave dca8a5ab378f99fb2245b9063853f5c91bf2ed43 0 1584433797955 5 connected b1565d8e0541389a815bfdedd320060a73ea34b3 192.168.229.209:7116 myself,master - 0 0 3 connected 10923-16383 127.0.0.1:7116> 1.2銷燬所有線程 master1 / master2/ master3 / slave1 / slave2 / slave3 [root@master1 ~]# ps -ef | grep redis [root@master1 ~]# kill -9 7986 2刪除各節點數據目錄下的文件 2.1刪除各節點數據目錄下的 nodes.conf、appendonly.aof、dump.rdb; [root@master1 ~]# cd /usr/local/redis3/cluster/7111/ appendonly.aof dump.rdb nodes.conf redis-7111.conf [root@master1 7111]# rm -rf appendonly.aof dump.rdb nodes.conf 2.2重新啓用所有的節點 啓動redis集羣 192.168.229.204 master1 /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7111/redis-7111.conf 192.168.229.205 master2 /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7112/redis-7112.conf 192.168.229.206 master3 /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7113/redis-7113.conf 192.168.229.207 slave1 /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7114/redis-7114.conf 192.168.229.208 slave2 /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7115/redis-7115.conf 192.168.229.209 slave3 /usr/local/redis3/bin/redis-server /usr/local/redis3/cluster/7116/redis-7116.conf 3執行集羣創建命令(只需要在其中一個節點上執行一次則可) [root@master1 ~]# /usr/local/src/redis-3.0.3/src/redis-trib.rb create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116 192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113 報錯如下 /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError) from /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require' from /usr/local/src/redis-3.0.3/src/redis-trib.rb:25:in `<main>' 安裝facter可以不執行,好像沒有關係。 [root@master1 ~]# ansible all -m shell -a 'rpm -ivh https://yum.puppetlabs.com/el/7/products/x86_64/puppetlabs-release-7-10.noarch.rpm' [root@master1 ~]# ansible all -m shell -a 'yum install -y facter' 這一步驟切換Ruby版本 scl enable rh-ruby23 bash [root@master1 ~]# /usr/local/src/redis-3.0.3/src/redis-trib.rb create --replicas 1 192.168.229.207:7114 192.168.229.208:7115 192.168.229.209:7116 192.168.229.204:7111 192.168.229.205:7112 192.168.229.206:7113 驗證 [root@master1 ~]# redis-cli -c -p 7111 127.0.0.1:7111> cluster nodes e52f68a39ccf1503359070cbc31098748e1e6a5d 192.168.229.208:7115 master - 0 1584435921994 2 connected 5461-10922 7d6ef610c1bf5a4012c52f4ce58c28a84887be49 192.168.229.204:7111 myself,slave f5ddf6833e97a52abbd45ced5f045a86458676ef 0 0 4 connected bc0db940ae10d4bfb6754155bbe53fb460cd9ee4 192.168.229.206:7113 slave b21d1b22744ec8d16f2ef9d816dde0b59e45eed9 0 1584435920988 6 connected b21d1b22744ec8d16f2ef9d816dde0b59e45eed9 192.168.229.209:7116 master - 0 1584435924010 3 connected 10923-16383 0989cc50bb191efc0b826e23c22aeb3e7f00f0ca 192.168.229.205:7112 slave e52f68a39ccf1503359070cbc31098748e1e6a5d 0 1584435923002 5 connected f5ddf6833e97a52abbd45ced5f045a86458676ef 192.168.229.207:7114 master - 0 1584435925016 1 connected 0-5460 127.0.0.1:7111> 獲取所有的key 127.0.0.1:7111> keys * 可以運行src/test/java ->wusc.edu.demo.redis中的如下四個文件,前提需要修改Redis地址 RedisTest.java RedisClusterTest.java RedisClusterSpringTest.java RedisClusterFailoverTest.java
Dubbo redis集羣高可用測試 Java訪問,集羣重建
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.