主從複製,主要優勢在於實現了數據備份(主機和從機數據同步一致)、讀寫分離(主機主要負責寫入數據,從機讀數據,在讀大於寫的項目中提高了性能)。最後也為後續集成哨兵機制和集群的實現提供了依據。
一、多臺伺服器上配置主從複製
Redis從5.0以後主從配置屬性發生了變化,在5.0之前配置的是slaveof,5.0以後變成了replicaof
伺服器用途redis埠號備註centos7 192.168.1.6主機Master(寫)6379redis5.0centos7 192.168.1.4從機Slave(讀)6379redis5.0centos7 192.168.1.5從機Slave(讀)6379redis5.0
第一步:安裝redis
三臺伺服器上分別安裝redis,三臺伺服器redis配置為方便可配置一致
第二步:添加主從配置項
主機(192.168.1.6) 不做任何修改,兩臺從機配置文件分配添加一下內容
# replicaof <masterip> <masterport>replicaof 192.168.1.6 6379如果主機添加了密碼,需要在從機添加masterauth 參數,否則提示驗證失敗。
#主master的redis密碼masterauth 123456第三步:啟動服務,測試配置是否正確
啟動三臺伺服器上redis服務。
向主機(192.168.1.6) 添加數據,連接Redis
#redis沒有設置密碼./redis-cli#redis 設置密碼./redis-cli -a "123456"
在1兩臺從機上分別連接redis後。執行
get k1可以看到結果為主機上寫入的name1的值,表示主從複製配置正確。
或者通過info replication 指定來查看主從配置信息
主節點中 cli中執行 info replication
./redis-cliinfo replication獲取以下信息內容
# Replicationrole:masterconnected_slaves:1slave0:ip=192.168.1.4,port=6379,state=online,offset=1078,lag=1master_replid:485ffa2cd3755449a7d16e0a279d60dae51bf9f5master_replid2:0000000000000000000000000000000000000000master_repl_offset:1078second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:1078connected_slaves:1(說明master node存在一個連接的slave node節點)slave0 (slave0是關於第一個子節點的配置信息)子節點中 cli中執行 info replication
獲取以下信息內容
# Replicationrole:slavemaster_host:192.168.1.6master_port:6379master_link_status:upmaster_last_io_seconds_ago:0master_sync_in_progress:0slave_repl_offset:560slave_priority:100slave_read_only:1connected_slaves:0master_replid:485ffa2cd3755449a7d16e0a279d60dae51bf9f5master_replid2:0000000000000000000000000000000000000000master_repl_offset:560second_repl_offset:-1repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:560role:slave (表明這個是子節點)master_host:192.168.1.6 (顯示master node的IP信息)master_port:6379 (埠號)master_link_status:up (表明是否連接上,up表示連接中,down表示連接失敗)第四步:master_link_status:down,即主從複製失敗問題解決
如果master_link_status:up 跳過此步驟
down大概有以下幾種情況,具體情況查看日誌文件
1、protected-mode配置成了yes
replicaof 192.168.1.6 6379masterauth 123456#開啟該參數後,redis只會本地進行訪問,拒絕外部訪問protected-mode no2、如果設置在主中設置了密碼,從中應該配置密碼
3、bind ip地址 表示可以那些伺服器可以訪問
設置為 0.0.0.0 表示都可以訪問如果是127.0.0.1 表示localhost訪問
4、client-output-buffer-limit slave這個參數配置不當
從機日誌文件:「I/O error trying to sync with MASTER:connection lost』」
原因:負責發數據給slave的client,如果buffer超過256m或者連續60秒超過64m,就會被立刻強行關閉!!! Traffic大的話一定要設大一點。否則就會出現一個很悲劇的循環,Master傳輸一個大的RDB給Slave,Slave努力的裝載,但還沒裝載完,Master對client的緩存滿了,再來一次。
#主機修改參數項值client-output-buffer-limit slave 1024mb 256mb 05、埠,防火牆問題
#防火牆添加6379埠:firewall-cmd --permanent --zone=public --add-port=6379/tcp
#重啟防火牆:firewall-cmd --reload
#查看默認防火牆狀態(關閉後顯示notrunning,開啟後顯示running)firewall-cmd --state
二、單臺伺服器上配置主從複製
單臺伺服器也可以實現主從複製,本質上是同時啟動幾個redis實例來實現。
區別在於複製幾個redis.conf,每個實例具有一個不同的redis.conf文件。其餘配置與多級一致
啟動redis服務,redis.conf 改位每個實例對應的配置文件名稱,或者每個實例新建一個不同名稱的服務./redis-server redis.conf
三、總結
redis主從複製主要作用讀寫分離和數據備份的作用。主機負責寫入數據,從機負責讀取數據。
如果主機節點崩潰了,造成redis服務關閉,需要人為手動啟動redis服務。
後續集成哨兵模式來實現解決這個問題,實現redis的高可用作用。
四、本實例中redis.conf 文件內容
下面是從機redis.conf 文件內容
如果是主機的話,刪除replicaof 192.168.1.7 6379 即可
#bind 127.0.0.1protected-mode noport 6379tcp-backlog 511timeout 0tcp-keepalive 300daemonize yessupervised nopidfile "/var/run/redis_6379.pid"loglevel noticelogfile "/var/log/redis/redis.log"databases 16always-show-logo yessave 900 1save 300 10save 60 10000stop-writes-on-bgsave-error yesrdbcompression yesrdbchecksum yesdbfilename "dump.rdb"dir "/"replicaof 192.168.1.7 6379masterauth "123456"replica-serve-stale-data yesreplica-read-only yesrepl-diskless-sync norepl-diskless-sync-delay 5repl-disable-tcp-nodelay noreplica-priority 100requirepass "123456"lazyfree-lazy-eviction nolazyfree-lazy-expire nolazyfree-lazy-server-del noreplica-lazy-flush noappendonly noappendfilename "appendonly.aof"appendfsync everysecno-appendfsync-on-rewrite noauto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mbaof-load-truncated yesaof-use-rdb-preamble yeslua-time-limit 5000slowlog-log-slower-than 10000slowlog-max-len 128latency-monitor-threshold 0notify-keyspace-events ""hash-max-ziplist-entries 512hash-max-ziplist-value 64list-max-ziplist-size -2list-compress-depth 0set-max-intset-entries 512zset-max-ziplist-entries 128zset-max-ziplist-value 64hll-sparse-max-bytes 3000stream-node-max-bytes 4096stream-node-max-entries 100activerehashing yesclient-output-buffer-limit normal 0 0 0client-output-buffer-limit replica 256mb 64mb 60client-output-buffer-limit pubsub 32mb 8mb 60hz 10dynamic-hz yesaof-rewrite-incremental-fsync yesrdb-save-incremental-fsync yes