redis 默認都是master
redis集群中,必須使用相同版本的redis,最好精確到小版本
一、開啟redis服務,並使用redis客戶端連接redis服務
1 redis-server 2 redis-cli
二、使用SLAVEOF 將角色轉換為slave,並指向redis 主服務器的IP和對應的端口(redis 中不區分大小寫)
SLAVEOF 192.168.1.4 6379
輸入:SLAVEOF ,后面會自動顯示灰色的host 和port表示對方的主機和端口
三、INFO查看
127.0.0.1:6379> info
# Replication role:slave master_host:192.168.1.4 master_port:6379 master_link_status:down
1、查看當前的redis中都有哪些key
127.0.0.1:6379> keys * 1) "a"
如果和master建立了連接,就會清空當前redis上的所有數據庫,以master為准
四、配置連接密碼
127.0.0.1:6379> CONFIG SET masterauth 12345678 OK
CONFIG SET masterauth 后面跟上的12345678就是master redis的密碼
如果版本不一樣,就會提示錯誤,我這里使用的是redis5.0.12
slave 模式下是不能寫數據的,只能從master那邊同步過來
五、永久有效,直接寫到配置中
低版本redis 修改slaveof <masterip> <masterport>
高版本redis修改replicaof <masterip> <masterport>
replicaof 192.168.1.4 6379
2、修改master認證密碼
# masterauth <master-password> 修改為: masterauth 123456
注意:在redis 5.0版本中IP地址和對應的端口,密碼,兩邊的<>符號必須去掉,否則會導致連不上對應的端口,密碼無效。
六、手動提升slave服務器為master服務器
1、在需要提升的從服務器上執行slaveof no one
127.0.0.1:6379> slaveof no one
2、info查看狀態
# Replication role:master connected_slaves:0 master_replid:ec04796a5c4f1edf3a76cb6cb63e1fd3410fae85 master_replid2:b77f70eeb9f8b8837e146ad0bb0991eeeedbee0e master_repl_offset:120
這里就變成了master redis了這個時候之前作為從服務器的redis機器才能開始寫東西
3、修改配置文件,注釋下面兩行
vim /apps/redis/etc/redis.conf
replicaof 192.168.1.4 6379 masterauth 123456
避免重啟服務器后,還是做為slave角色去嘗試連接master,版本不一樣這里的replicaof 也可能是slaveof
七、實現從1服務器同步主1 服務器,從2服務器同步從1服務器,
主1 服務器IP地址:192.168.1.4
從1 服務器IP地址:192.168.1.6
從2 服務器IP地址:192.168.1.7
1.1、修改從2服務器的redis配置文件,使其同步主1 服務器的數據
vim /apps/redis/etc/redis.conf
replicaof 192.168.1.4 6379 masterauth 123456
1.2、手動殺掉進程,重啟redis服務,並指定對應的配置文件
1 kill -9 `ps -ef |grep redis|grep 6379|tr -s " "|cut -d' ' -f2` 2 redis-server /apps/redis/etc/redis.conf
1.3、使用info查看信息
127.0.0.1:6379> info
顯示如下則表示成功,自動開始同步主服務器上的數據
# Replication role:slave master_host:192.168.1.4 master_port:6379 master_link_status:up
2、修改從2 服務器實現同步從1 服務器數據
vim /apps/redis/etc/redis.conf
replicaof 192.168.1.6 6379 masterauth 123456
注意:此處從服務器必須設置密碼,否則也會連接不上的
以上就完成了,主服務器同步數據至從服務器,從服務器在同步數據至從服務器
在有 slave 的”master”查看狀態:
# Replication role:slave #當前服務器角色,slave表示從服務器,master表示主服務器 master_host:192.168.1.4 #主服務器IP地址 master_port:6379 #主服務器端口 master_link_status:up #當前連接狀態, down表示沒連接成功 master_last_io_seconds_ago:9 #最近一次與master 通信已經過去多少秒。
master_sync_in_progress:0 #是否正在與master 通信。 ,0表示沒有,1表示正在同步 slave_repl_offset:5334 #當前同步的偏移量。 slave_priority:100 #slave 優先級,master 故障后值越小越優先同步。
slave_read_only:1 #slave 開啟只讀狀態,表示slave服務器不能直接寫數據 connected_slaves:1 #當前有幾個節點連接進來
slave0:ip=192.168.1.6,port=6379,state=online,offset=4223,lag=1 #連接的slave的機器地址,端口,狀態,偏移量
master_replid:b77f70eeb9f8b8837e146ad0bb0991eeeedbee0e #第一個masterID(當前的master ID)
master_replid2:0000000000000000000000000000000000000000 #第二個master ID(如果機器切換過master,之前的master ID值就會被移動到這)
報錯解決辦法:
1、(error) READONLY You can't write against a read only replica
因為連接的是從節點,從節點只有讀的權限,沒有寫的權限
解決辦法:
進入redis.conf配置文件,修改配置文件的slave-read-only為no, 那么從節點也就可以進行寫的操作了
2、編譯失敗之后可以試着清理下殘留試試看
make distclean
3、日志錯誤如下
1117:S 15 Jul 2021 10:09:59.963 * Connecting to MASTER 192.168.1.6:6379 1117:S 15 Jul 2021 10:09:59.963 * MASTER <-> REPLICA sync started 1117:S 15 Jul 2021 10:09:59.963 # Error condition on socket for SYNC: Connection refused
3.1、解決辦法
排查redis主服務器監聽的端口是否是0.0.0.0
vim /apps/redis/etc/redis.conf
bind 0.0.0.0
4、輸入密碼