理解並從頭開始建立redis叢集
#部分開發人員工作當中只是在應用程式中使用redis,例如用來做資料結果的緩存。而且現在有很多不錯的redis客戶端工具(redisson),基本上可以不用關注redis指令就可以完成相當部分的功能。所以可能會對以下這些問題關注點不夠:
如何容災?即某個redis節點出了問題如何保證服務的高可用性
如何橫向擴容?當資料量特別大時,如何解決單一redis的效能問題
叢集至少需要幾台機器?或是幾個redis節點
叢集搭建都利用什麼技術,哪些工具?
如何容災?
redis提供了主從熱備機制,主伺服器的資料同步到從伺服器,透過哨兵即時監控主伺服器狀態並負責選舉主伺服器。當發現主伺服器異常時根據一定的演算法重新選舉主伺服器並將問題伺服器從可用清單中移除,最後通知客戶端。主從是一對多的樹型結構,如下圖:
哨兵
哨兵是sentinel的中文名稱,是redis出的一個高可用架構的工具,本身就是一個獨立的進程,可以同時監控一個以上的redis叢集。
哨兵群集
基於高可用的考慮,哨兵本身也是需要支援群集的,如果只有一個哨兵就會有單點問題。
哨兵決策
哨兵有一個數量配置,當多少個哨兵同時認為某個主服務不可用時才進行主從切換,例如總共有5個哨兵,當3個哨兵認為服務不可用時才決定做主從切換。這麼做可以避免一些誤切換,降低切換成本,例如瞬時的網路異常等。
如何橫向擴容?
無論是redis或其它一些資料庫之類的產品,當單節點的資料容量達到一定上限後,服務對外提供的能力會越來越弱。 redis在高版本中提供了redis-trib.rb來實現叢集功能,也可以使用第三方的工具twemproxy。
去中心化,每個節點都是平等的
redis叢集從設計上沒有考慮中心化,這樣可以避免中心節點的單點等問題。每個節點都能掌握整個叢集的狀態,連接任意的節點都可以存取到所有的key,就像單一節點的redis一樣。
集群原理圖
自己理解畫的,如有理解不對的地方可以指出。
key與redis節點的關係
#引進了hasy solt,中文理解為哈希槽。總共16384個,我們操作的key透過取模演算法確認key落在哪個槽上。
HASH_SLOT = CRC16(key) mod 16384
哈希槽與節點之間有一定關係,所以我們就可以將key分配到某個特定的redis節點上了。
詳細的關係可再研究,簡單的例如節點A負責0-5000編號的哈希槽,節點B負責5001-1000
一步一步搭建
#開始搭建三主三從的集群,系統是ubuntu,採用redis提供的集群工具redis-trib.rb。
安裝最新redis
建立redis_cluster目錄,並且建立7000到7005這6個目錄
將redis目錄下的redis.conf複製到上面建立的6個目錄中
分别修改redis.conf文件,对6个文件做类似的修改。
port 7000 //端口7000 bind 127.0.0.1 //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip daemonize yes //后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000 cluster-enabled yes //开启集群 cluster-config-file nodes_7000.conf //集群的配置 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
bind需要注意的就是需要配置为其它机器可以访问的ip,否则无论是创建集群还是客户端连接都会有问题。
启动6个redis
redis-server redis_cluster/7000/redis.conf redis-server redis_cluster/7001/redis.conf redis-server redis_cluster/7002/redis.conf redis-server redis_cluster/7003/redis.conf redis-server redis_cluster/7004/redis.conf redis-server redis_cluster/7005/redis.conf
创建集群
redis的src目录下有个redis-trib.rb,将它复制到/usr/local/bin中,然后执行如下脚本:
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
--replicas后面的1代表从服务器的个数,上面可以理解为前面3个为主服务器,后面三个分别做为从服务器,即三对主从。
执行过程中会遇到提示需要安装ruby,安装完成之后又会提示安装 gem redis。
安装gem redis,折腾了好久,最终发现是因为在国内访问不了某些网站导致通过apt-get install安装不成功,最后通过下载源码的方式安装成功。
再次执行创建集群的脚本,出现如下提示:
输入yes,继续
最少需要多少个主服务器?
可能是基于某些约定,集群约定只有当可用节点数大于半数以上时才具备对外提供服务的能力。首先数量一定是奇数,其实必须大于1,所以最少的主服务器数量为3。
测试集群
连接客户端,由于我的所有节点都是在本地,所以不需要输入ip,但需要加-c的参数。redis-cli -c -p 7000
连接成功后,增加一个key
set mykey 123
有一行提示语,指向到端口7002,这说明虽然我们连接的是7000的实例,但通过hash算法最终会将key分配到7002的实例上。
再连接7005端口查询下key,测试下是否任意一个实例都可以查询到key
get mykey
显示指向到端口7002
更多redis知识请关注redis数据库教程栏目。
以上是redis高可用方案圖文詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!