--http://www.javashuo.com/article/p-edvbrwii-u.htmlhtml
經過redis.conf 支持多實例的數據庫功能node
建立多個配置文件 一主兩從 架構redis
redis-6379.conf (主庫)shell
port 6379 # 指定啓動端口 daemonize yes # 後臺運行
redis-6380.conf (從庫)數據庫
port 6380 # 指定啓動端口 daemonize yes # 後臺運行 slaveof 127.0.0.1 6379 # 指定主庫ip端口
redis-6381.conf (從庫)vim
port 6381 # 指定啓動端口 daemonize yes # 後臺運行 slaveof 127.0.0.1 6379 # 指定主庫ip端口
查看狀態ruby
127.0.0.1:6379> INFO replication
[root@mrcarzy-pc redisconf]# redis-cli -p 6379 info replication
[root@mrcarzy-pc redisconf]# redis-cli -p 6379 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=2242,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=2242,lag=0 master_replid:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2242 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2242
[root@mrcarzy-pc redisconf]# redis-cli -p 6380 info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:1 master_sync_in_progress:0 slave_repl_offset:2368 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:2368 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2368
kill -9
2個從庫功能都還尚好,數據也在,第一步應該數據持久化,防止數據丟失架構
6380 6381 兩個從庫還活着,登陸某一個數據,進行持久化,創建6380是主庫,6381是新的從庫工具
##### 更改 6380 庫爲主庫測試
save
SLAVEOF no one
[root@mrcarzy-pc redisconf]# redis-cli -p 6380 127.0.0.1:6380> save OK 127.0.0.1:6380> SLAVEOF no one OK 127.0.0.1:6380> info replication # Replication role:master connected_slaves:0 master_replid:48199a8324b6bc6a6645e86601e140221d44cf71 master_replid2:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_repl_offset:2872 second_repl_offset:2873 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2872
更改 6381 庫爲新的從庫
SLAVEOF 127.0.0.1 6380
127.0.0.1:6381> SLAVEOF 127.0.0.1 6380 OK 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:3 master_sync_in_progress:0 slave_repl_offset:2886 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:48199a8324b6bc6a6645e86601e140221d44cf71 master_replid2:d59da86065ab4cbb450b12ca0e17eca09b3aa486 master_repl_offset:2886 second_repl_offset:2873 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:2886
Redis-Sentinel是redis官方推薦的高可用性解決方案, 當用redis做master-slave的高可用時,若是master自己宕機,redis自己或者客戶端都沒有實現主從切換的功能。 而redis-sentinel就是一個獨立運行的進程,用於監控多個master-slave集羣, 自動發現master宕機,進行自動切換slave > master。
三個redis數據庫之間是端口的區分,和slaveof參數的區分 [root@mrcarzy-pc redisconf]# ll -rw-r--r-- 1 root root 28 Apr 20 19:52 redis-6379.conf -rw-r--r-- 1 root root 50 Apr 20 19:53 redis-6380.conf -rw-r--r-- 1 root root 51 Apr 20 19:54 redis-6381.conf 三個哨兵配置如出一轍,僅僅是端口的區分 -rw-r--r-- 1 root root 0 Apr 20 19:51 redis-sentinel-26379.conf -rw-r--r-- 1 root root 0 Apr 20 19:51 redis-sentinel-26380.conf -rw-r--r-- 1 root root 0 Apr 20 19:51 redis-sentinel-26381.conf
port 6379 daemonize yes
port 6380 daemonize yes slaveof 127.0.0.1 6379
[root@mrcarzy-pc redisconf]# sed "s/6380/6381/g" redis-6380.conf > redis-6381.conf
port 6381 daemonize yes slaveof 127.0.0.1 6379
手動建立 數據文件夾 mkdir -p /var/redis/data/
// Sentinel節點的端口 port 26379 dir /var/redis/data/ logfile "26379.log" daemonize yes # 後臺運行 // 當前Sentinel節點監控 192.168.119.10:6379 這個主節點 // 2表明判斷主節點失敗至少須要2個Sentinel節點節點贊成 // mymaster是主節點的別名 sentinel monitor mymaster 127.0.0.1 6379 2 //每一個Sentinel節點都要按期PING命令來判斷Redis數據節點和其他Sentinel節點是否可達,若是超過30000毫秒30s且沒有回覆,則斷定不可達 sentinel down-after-milliseconds mymaster 30000 //當Sentinel節點集合對主節點故障斷定達成一致時,Sentinel領導者節點會作故障轉移操做,選出新的主節點, 原來的從節點會向新的主節點發起復制操做,限制每次向新的主節點發起復制操做的從節點個數爲1 sentinel parallel-syncs mymaster 1 //故障轉移超時時間爲180000毫秒 sentinel failover-timeout mymaster 180000
sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf
sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf [root@mrcarzy-pc redisconf]# cat redis-sentinel-26381.conf rt 26381 dir /var/redis/data/ logfile "26381.log" daemonize yes sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
[root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26379.conf [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26380.conf [root@mrcarzy-pc redisconf]# redis-sentinel redis-sentinel-26381.conf
[root@mrcarzy-pc redisconf]# cat redis-sentinel-26379.conf port 26379 dir "/var/redis/data" logfile "26379.log" sentinel myid 53ac9e9a246c54c11d6c92aa862c58a5c9f5dcd8 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel config-epoch mymaster 0 sentinel leader-epoch mymaster 0 daemonize yes # Generated by CONFIG REWRITE sentinel known-slave mymaster 127.0.0.1 6380 sentinel known-slave mymaster 127.0.0.1 6381 sentinel known-sentinel mymaster 127.0.0.1 26380 618de2b19912ba8e444ad6e587885c73c440b826 sentinel known-sentinel mymaster 127.0.0.1 26381 5d36281121910c88cc87f67719e0c75e6ef515d0 sentinel current-epoch 0
kill -9 主庫PID
30秒後自動變化[root@mrcarzy-pc redisconf]# cat redis-6381.conf port 6381 daemonize yes # Generated by CONFIG REWRITE dir "/opt/redisconf"
[root@mrcarzy-pc redisconf]# redis-cli -p 6381 info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=138576,lag=0 slave1:ip=127.0.0.1,port=6379,state=online,offset=138310,lag=0 master_replid:96f2514d0e655f7121a4d58428e82c80b677672c master_replid2:1c92f73ca5eebf54f7a08a827d5370f88b99b120 master_repl_offset:138576 second_repl_offset:91379 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:138576
至少須要六個 redis 節點 六個配置文件
[root@mrcarzy-pc rediscluster]# ll total 28 -rw-r--r--. 1 root root 181 May 10 22:30 redis-7000.conf -rw-r--r--. 1 root root 181 May 10 22:31 redis-7001.conf -rw-r--r--. 1 root root 181 May 10 22:31 redis-7002.conf -rw-r--r--. 1 root root 181 May 10 22:32 redis-7003.conf -rw-r--r--. 1 root root 181 May 10 22:32 redis-7004.conf -rw-r--r--. 1 root root 181 May 10 22:32 redis-7005.conf
mkdir -p /opt/redis/data
port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #開啓集羣模式 cluster-config-file nodes-7000.conf #集羣內部的配置文件 cluster-require-full-coverage no #redis cluster須要16384個slot都正常的時候才能對外提供服務,換句話說,只要任何一個slot異常那麼整個cluster不對外提供服務。 所以生產環境通常爲no
使用 sed "s/7000/7005/g" redis-7000.conf > redis-7005.conf
命令快速建立文件
啓動 六個 redis 節點
[root@mrcarzy-pc rediscluster]# redis-server redis-7000.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7001.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7002.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7003.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7004.conf [root@mrcarzy-pc rediscluster]# redis-server redis-7005.conf
安裝ruby
wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz #安裝ruby tar -xvf ruby-2.3.1.tar.gz ./configure --prefix=/opt/ruby231/ make && make install # 配置環境變量 vim /etc/profile source /etc/profile
安裝ruby gem 包管理工具
wget http://rubygems.org/downloads/redis-3.3.0.gem [root@mrcarzy-pc opt]# gem install -l redis-3.3.0.gem #查看gem有哪些包 gem list -- check redis gem
安裝 redis-trib.rb 腳本
[root@mrcarzy-pc opt]# find /opt/ -name redis-trib.rb /opt/redis-4.0.10/src/redis-trib.rb
開啓集羣
[root@mrcarzy-pc opt]# /opt/redis-4.0.10/src/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 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 Adding replica 127.0.0.1:7004 to 127.0.0.1:7000 Adding replica 127.0.0.1:7005 to 127.0.0.1:7001 Adding replica 127.0.0.1:7003 to 127.0.0.1:7002 >>> Trying to optimize slaves allocation for anti-affinity [WARNING] Some slaves are in the same host as their master M: fc017020a99e6af623b3c0718e2d402794b93a61 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 83bea3b50fd3308ef80c33f132b9cd4331e7dbbe 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: 1cb509c18550215502cac929de166d5949acd2e0 127.0.0.1:7002 slots:10923-16383 (5461 slots) master S: ebb04c8a8cb8a04369da0292ef151160d3ad37d2 127.0.0.1:7003 replicates 83bea3b50fd3308ef80c33f132b9cd4331e7dbbe S: c90340015d1f2e53097ae35b7e40e54080767f85 127.0.0.1:7004 replicates 1cb509c18550215502cac929de166d5949acd2e0 S: 23436a5e09055815a08430ae22500c7474b5ddd8 127.0.0.1:7005 replicates fc017020a99e6af623b3c0718e2d402794b93a61 Can I set the above configuration? (type 'yes' to accept):
輸入 yes
[root@mrcarzy-pc opt]# redis-cli -p 7000 -c 127.0.0.1:7000> set name zhangfei -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001>
查看集羣狀態
[root@mrcarzy-pc opt]# redis-cli -p 7000 cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:569 cluster_stats_messages_pong_sent:551 cluster_stats_messages_sent:1120 cluster_stats_messages_ping_received:546 cluster_stats_messages_pong_received:569 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:1120