您好,登錄后才能下訂單哦!
yum install epel-release.noarch -y
yum install redis -y
主:
vim /etc/redis.conf #修改配置文件
bind 10.1.1.111 #修改監聽IP
requirepass 233233 #添加密碼
masterauth 233233
#為什么要添加認證密碼,假如主掛了,再次上線。此時主就變成從了,它需要認證其它服務器,其它服務器有密碼會無法通過認證,所以預先設置好。
slave-priority 50 #增大選舉權,保證主的掛了,再次線切換時候有足夠權限拿到master
從:
vim /etc/redis.conf #修改配置文件
bind 10.1.1.112 #修改監聽IP
requirepass 233233
#從 也要設置和主一樣密碼,假如主掛了,112提升為主,113認證的還是111的密碼,這樣112和113兩臺機器就無法連接。
slaveof 10.1.1.111 6379 #指定主的ip和端口
masterauth 233233 # 指定主的密碼
另一臺從也這個配置
systemctl start redis #同時啟動三臺主機
redis-cli -h 10.1.1.111 -a 233233 #登陸主服務器
10.1.1.111:6379> INFO replication #查看主從信息
#Replication
role:master
connected_slaves:2
slave0:ip=10.1.1.112,port=6379,state=online,offset=1135,lag=0
slave1:ip=10.1.1.113,port=6379,state=online,offset=1135,lag=1
master_repl_offset:1135
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:1134
10.1.1.111:6379>
在主服務器創建一個鍵值
11.10.1.1.111:6379> set ID 001
OK
10.1.1.111:6379> get ID
"001"
10.1.1.111:6379>
切換到從服務器查看
[root@cs112 ~]# redis-cli -h 10.1.1.112 -a 233233 #登陸112服務器
10.1.1.112:6379> get ID #查看ID鍵值
"001"
10.1.1.112:6379>
命令配置主從 (命令配置會自動同步到配置文件)
[root@web1 ~]# redis-cli -h 10.1.1.233
10.1.1.233:6379> slaveof 10.1.1.111 6379
OK
10.1.1.233:6379> config set masterauth 233233
OK
10.1.1.233:6379>
登陸到主服務器查看主從
10.1.1.111:6379> INFO replication
# Replication
role:master
connected_slaves:3
slave0:ip=10.1.1.112,port=6379,state=online,offset=2602,lag=1
slave1:ip=10.1.1.113,port=6379,state=online,offset=2602,lag=1
slave2:ip=10.1.1.233,port=6379,state=online,offset=2602,lag=1
master_repl_offset:2602
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:2
#可以看到,這邊從服務器已經有三個了,
下面是redis主從復制場景的一些可調參數,需要根據實際環境調整
slave-serve-stale-data yes : 是否可以把不新鮮的數據服務與客戶端
slave-read-only yes : 從節點只讀,啟用slaveof定義后才生效
repl-diskless-sync no :是否同時向多個從節點同時發數據
repl-diskless-sync-delay 5 :發送的延遲時間
repl-ping-slave-period 10 探測從節點狀態
repl-timeout 60 探測節點超時時間
repl-disable-tcp-nodelay no : 啟用nodelay
repl-backlog-size 1mb
slave-priority 100 : 從節點優先級,復制集群中,主節點故障時,sentinel應用場景中的主節點選舉時使用的優先級;數字越小優先級越高,但0表示不參與選舉;
min-slaves-to-write 3:主節點僅允許其能夠通信的從節點數量大于等于此處的值時接受寫操作;
min-slaves-max-lag 10:從節點延遲時長超出此處指定的時長時,主節點會拒絕寫入操作;
先找一臺從服務器把優先級調高
vim /etc/redis.conf #修改112配置,控制選舉
slave-priority 90 #調到90,默認100,越小權限越大,0不參與選舉
systemctl restart redis #重啟一下
找三臺服務器 配置sentinel服務
vim /etc/redis-sentinel.conf
bind 10.1.1.112 #監聽IP,建議不要用0.0.0.0 會出錯
sentinel monitor mymaster 10.1.1.111 6379 2 #設置主服務器ip
sentinel auth-pass mymaster 233233 #主服務器的認證
#其他兩臺除了IP不一樣其他 一樣配置
配置好了 啟動sentinel
如何查看sentinel是否已經正常運行
vim /etc/redis-sentinel.conf #打開sentinel的配置文件
#查看最后幾行,sentinel正常運行的話,能獲取的到局域網其他redis主機信息,其他sentinel主機信息,如圖。
測試
先將主服務器的redis的服務給停掉
redis-cli -h 10.1.112 -p 26379 #登陸sentinel服務
10.1.1.112:26379> SENTINEL masters #查看主服務器狀態
1) 1) "name"
2) "mymaster"
3) "ip"
4) "10.1.1.113"
5) "port"
6) "6379"
7) "runid"
8) "7ee5fe0e808bd06638f0f4c365d95c7694c6770c"
9) "flags"
10) "master"
上面我們已經能看到主的已經轉移到113主機了,打開其他從服務器配置可以發現,配置文件里指向10.1.1.111為主的已經被改成了113了。
redis-cli -h 10.1.1.112 -a 233233 #登錄112的從服務器
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:10.1.1.113
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:1253
slave_priority:70
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
#上面可以看到從 從服務器112 主已經變成了113服務器了
#總結,主服務器掛了再次上線的的角色就變成slave了,除非再次觸發選舉,而且權限要比其他機器權限大。
一個查看sentinel命令
[root@cs11 ~]# redis-cli -h 192.168.0.11 -a 233233 -p 26379 info |tail -1
#登錄到26379端口(這個端口就是默認sentinel運行的端口),運行info命令,取最后一行
master0:name=mymaster,status=ok,address=192.168.0.14:6379,slaves=2,sentinels=3
#表示master是192.168.0.14 有2個從,3個哨兵
配置文件解釋
sentinel monitor mymaster 192.168.0.11 6379 2
#192.168.0.11是master redis的IP地址和端口,2是代表2個sentinel(哨兵)檢測到異常,才判斷是real fail. Mymaster主機組的名稱可以隨便定義
sentinel auth-pass mymaster 233233
#當redis訪問都需要密碼的時候,即在redis.conf有配置requirepass項的時候,需要定義此項
sentinel down-after-milliseconds mymaster 30000
#指定sentinel監控到redis實例持續異常多長時間后,會判決其狀態為down。若實際業務需要sentinel盡快判決出redis實例異常,則可適當配小,單位是毫秒
sentinel can-failover mymaster yes
#在sentinel檢測到O_DOWN后,是否對這臺redis啟動failover機制
sentinel parallel-syncs mymaster 1
#執行故障轉移時,最多可以有多少個從服務器同時對新的主服務器進行同步,這個數字越小,完成故障轉移所需的時間就越長,但越大就意味著越多的從服務器因為復制而不可用。可以通過將這個值設為 1 來保證每次只有一個從服務器處于不能處理命令請求的狀態。
failover-timeout mymaster900000
#若sentinel在該配置值內未能完成failover操作(即故障時master/slave自動切換),則認為本次failover失敗
sentinel notification-script mymaster1 /root/通知.sh
#當sentinel觸發時,切換主從狀態時,需要執行的腳本。當主down的時候可以通知當事人
這里我們要用一臺機器模擬9個主機,每個redis端口不一樣,真實環境,ip不一樣而已,
mkdir /date/700{1,2,3,4,5,6,7,8,9} -p # 創建9個文件夾存放配置log等
vim redis.conf #先修改一個模板,把配置文件cp一份改成下面的一樣
port 6379
bind 127.0.0.1
daemonize yes
#redis后臺運行
cluster-enabled yes
#開啟集群
cluster-config-file nodes_6379.conf
#集群的配置,配置文件首次啟動自動生成
cluster-node-timeout 8000
#請求超時,默認15秒,可自行設置
appendonly yes
#開啟aof持久化模式,每次寫操作請求都追加到appendonly.aof文件中
logfile "/data/6379/redis.log"
#日志路徑
pidfile /var/run/redis_6379.pid
#pid路徑
#端口還是用6379應為這個改的模板,等會后面用sed 批量修改
for((i=1;i<=9;i++));do cp redis.conf /date/700$i/redis.conf ; sed -i "s/6379/700$i/" /date/700$i/redis.conf;done
#批量復制配置文件到各個文件夾,在修改6379 端口號 。
for((i=1;i<=9;i++));do redis-server /date/700$i/redis.conf;done
#批量啟動
ps -ef |grep redis #查看下服務有沒有起來
./redis-cli --cluster create 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 127.0.0.1:7006 127.0.0.1:7007 127.0.0.1:7008 127.0.0.1:7009 --cluster-replicas 1
#創建集群的命令 --replicas 1表示為集群的master節點創建1個slave。那么9個實例里,有4master,有5是slave。
--replicas 0不為集群的master節點創建slave。
#如圖,集群被成功創建,1 2 3 4 被設置了成master ,其他均為slave
./redis-cli -p 7001 -c #登陸到集群里
#上圖,我登陸進去了創建一個鍵值 cs1 ,該鍵值以一創建就被分配到7004端口分片上,后面我無論登陸那個端口,只要我get cs1 都會被重定向到7004端口上
#我又創建一個cs2 ,該鍵值被分配到了7001端口,無論那個端口訪問cs2,都會被重定向到7001,就是redis的分片機制
常見集群命令
127.0.0.1:7004> cluster info #查看集群狀態信息
#按照之前的方法,在復制兩份配置文件,啟動兩個redis 端口為7010 7011
./redis-cli --cluster add-node 127.0.0.1:7010 127.0.0.1:7001
#新增節點命令 前面個地址是需要添加的地址,后面那個是任意已經在集群的節點
./redis-cli -c -p 7001 cluster nodes #查看集群節點
#如圖添加成功,但是新增的節點不會有任何數據,因為他沒有分配任何槽需要為新節點手動分配槽
./redis-cli --cluster reshard 127.0.0.1:7010
./redis-cli -c -p 7001 cluster nodes #在看下節點信息
#此時7010端口已經有槽了,里已經存了 2000/16384的數據了,如果壞了這部數據就會丟失了,所以我們給它加個從節點冗余
./redis-cli --cluster add-node 127.0.0.1:7011 127.0.0.1:7001
#依然是這個命令,增加了一個7011端口的節點
./redis-cli -c -p 7001 cluster nodes #在用查看節點的命令看一下
#上圖能看見7011端口依然上線,角色是master 沒有槽,我們要給他轉變成slave角色
./redis-cli -c -p 7011
127.0.0.1:7011> cluster replicate d7ff265c7293735c5bbf9c5ef34d2bc54fe1a3ea
./redis-cli -c -p 7001 cluster nodes #在用查看節點的命令看一下
#再用查看節點的命令看一下,可以發現7011已經變成了slave 狀態,且后面跟著7010的ID號,表示7011是7010的slave。
添加可能出現的報錯及解決辦法
由于主節點上有槽刪了會丟失數據,所以我們要先移動槽到其他主節點上去
./redis-cli --cluster reshard 127.0.0.1:7001 #啟動程序分槽
How many slots do you want to move (from 1 to 16384)? 2000
#您要移動多少個插槽(從1到16384)?
What is the receiving node ID? 4ef4f52ddff10e66eff50f40d765bb390ab935dd
接收節點ID是什么? 4ef4f52ddff10e66eff50f40d765bb390ab935dd
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
#請輸入所有源節點ID。
?? #鍵入“ all”以將所有節點用作哈希槽的源節點。(抽取所有master的槽均攤2000)
?? #輸入所有源節點ID后,鍵入“ done”。 (只抽取一個ID的槽,這里我們要把7003的槽移空)
Source node #1: dfe430fa679ef9a38aa5e072df4c957b3ed9a92d
#源節點1:dfe430fa679ef9a38aa5e072df4c957b3ed9a92d
Source node #2: done
#源節點2:已完成
Ready to move 2000 slots.
#準備移動2000個插槽。
Source nodes:
#源節點:
M: dfe430fa679ef9a38aa5e072df4c957b3ed9a92d 127.0.0.1:7003
slots: (0 slots) master
#移動完成后,還有多少槽
Destination node:
#目標節點
M: 4ef4f52ddff10e66eff50f40d765bb390ab935dd 127.0.0.1:7002
slots:[0-3115],[5782-8857],[10181-11698],[12181-12953] (8483 slots) master
#移動完成后,還有多少槽
4 additional replica(s)
# 4個其他副本
Resharding plan:
#分片計劃:
Do you want to proceed with the proposed reshard plan (yes/no)? yes
#您是否要繼續執行建議的分片計劃(是/否)? 是
#一點要用cluster nodes 命令確保要刪除的主節點沒槽了,才能執行下面的刪除操作
./redis-cli --cluster del-node 127.0.0.1:7003 dfe430fa679ef9a38aa5e072df4c957b3ed9a92d
#刪除7003節點,要輸入ip+端口+ID
刪除從節點7009
./redis-cli --cluster del-node 127.0.0.1:7009 088ace239a35fbbbb8f7fe68618331383c762c6b
#由于7009節點只是從節點,沒有槽,所以直接刪除即可
#用cluster nodes 查看,可以發現7003 和 7009 節點已經被刪除了
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。