docker安裝redis搭建主從複製+哨兵

拉取redis鏡像

docker pull redis

redis.conf 文件 (下載redis.confredis.conf中  daemonize  no    #默認no,改爲yes會使配置文件方式啓動容器失敗

################################## NETWORK #####################################
bind 127.0.0.1 #註釋掉這部分,這是限制redis只能本地訪問

protected-mode no #默認yes,開啓保護模式,限制爲本地訪問

port 6379 #設置端口



################################# GENERAL #####################################
daemonize no        #默認no,改爲yes會使配置文件方式啓動容器失敗,改爲yes意爲以守護進程方式啓動,可後臺運行,除非kill進程

# Specify the server verbosity level.
# This can be one of:
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)  生產環境
# warning (only very important / critical messages are logged)
loglevel notice  #日誌

logfile "" #日誌的文件位置名 默認是一個標準的輸出

databases 16 #數據庫的數量,默認16個數據庫

always-show-logo yes  #是否總是顯示logo--redis啓動時的logo


################################ SNAPSHOTTING  ################################
#持久化規則   持久化,在規定的時間內,執行了多少次操作,則會持久化到文件 .rdb .aof
#redis是內存數據庫,如果沒有持久化,那麼數據斷電即失
save 900 1      #如果900s內,至少1個key進行了修改,就會進行持久化操作
save 300 10     #如果300s內,至少10個key進行了修改,就會進行持久化操作
save 60 10000   #如果60s內,至少10000個key進行了修改,就會進行持久化操作


stop-writes-on-bgsave-error yes  # 持久化如果出錯,是否還需要繼續工作

rdbcompression yes #是否壓縮rdb文件,需要消耗一些cpu資源

rdbchecksum yes #保存rdb文件的時候,是否進行錯誤的檢查校驗

dir ./  # rdb文件保存的目錄



################################### CLIENTS ####################################
maxclients 10000  #默認註釋的  設置能連接上redis的最大客戶端的數量


############################## MEMORY MANAGEMENT ################################
maxmemory <bytes>  #默認註釋的  配置redis最大的內存容量

maxmemory-policy noeviction  #默認註釋的  內存達到上限之後的處理策略
    noeviction:默認策略,不淘汰,如果內存已滿,添加數據是報錯。
    allkeys-lru:在所有鍵中,選取最近最少使用的數據拋棄。
    volatile-lru:在設置了過期時間的所有鍵中,選取最近最少使用的數據拋棄。
    allkeys-random: 在所有鍵中,隨機拋棄。
    volatile-random: 在設置了過期時間的所有鍵,隨機拋棄。
    volatile-ttl:在設置了過期時間的所有鍵,拋棄存活時間最短的數據。


############################## APPEND ONLY MODE ###############################
appendonly no #默認不開啓aof模式,默認使用rdb方式持久化的,在大部分所有的情況下,rdb完全夠用

appendfilename "appendonly.aof"    #持久化的文件的名字


# appendfsync always    #每次修改都會 sync,消耗性能
appendfsync everysec    #每秒執行一次 sync,可能會丟失這1s的數據
# appendfsync no        #不執行 sync,這個時候操作系統自己同步數據,速度最快

啓動容器

docker run --name redis -d -v /data/redis/conf/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/data --privileged=true -p 6379:6379 鏡像ID redis-server /etc/redis/redis.conf --appendonly yes


#redis-server /etc/redis/redis.conf:指定配置文件啓動redis進程

#appendonly yes:開啓數據持久化

redis-benchmark性能測試

#進入到容器內
docker exec -it [容器名] bash
#執行命令
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

 

搭建主從複製

概念:主從複製是將一臺Redis服務器的數據,複製到其他的Redis服務器。前者稱爲主節點(master/leader),後者稱爲從節點(slave/follower); 數據的複製是單向的,只能由主節點到從節點。Master以寫爲主,Slave以讀爲主

默認情況下,每臺Redis服務器都是主節點,且一個主節點可以由多個從節點(或沒有從節點),但一個從節點只能有一個主節點

主從複製,讀寫分離,80%的情況下都是在進行讀操作,減輕服務器的壓力,架構中常常使用,最低配置 一主二從

作用:

1.數據冗餘:主從複製實現了數據的熱備份,是持久化之外的一種數據冗餘方式

2.故障恢復:當主節點出現問題時,可以由從節點提供服務,實現快速的故障修復;實際上是一種服務的冗餘

3.負載均衡:在主從複製的基礎上,配合讀寫分離,可以由主節點提供寫服務,由從節點提供讀服務(即 寫Redis數據時,應用連接主節點,讀Redis數據時,應用連接從節點),分擔服務器的負載;尤其是在寫少讀多的場景下,通過多個從節點分擔讀負載,可以大大提高Redis服務器的併發量

4.高可用(集羣)基石:除了上述作用以外,主從複製還是哨兵和集羣能夠實施的基礎,因此說主從複製時Redis高可用的基礎

複製原理

Slave 啓動成功連接到 Master 後,會發送一條sync命令;Master 接到命令,啓動後臺的存盤進程,同時收集所有接收到的用於修改數據集命令,在後臺進程執行完畢之後,Master 將傳送整個數據文件到 Slave,並完成一次完全同步。

全量複製:而 Slave 服務在接收到數據庫文件數據後,將其存盤並加載到內存中

增量複製:Master 繼續將新的所有收集到的修改命令依次傳給 Slave,完成同步

但是隻要重新連接 Master ,一次完全同步(全量複製)將會執行,我們的數據一定可以在從機中看到

1.複製2個配置文件,修改對應的信息

1.pid名字

2.log文件名

3.dump.rdb 名字

4.replicaof redis 6379 #從機(Slave)配置主機(Master)ip+端口  主機不需要更改

2.啓動 Redis-Slave

docker run --name redis-slave1 -d --link redis -v /data/redis/conf/redis6380.conf:/etc/redis/redis.conf -v /data/redis/data:/data --privileged=true -p 6380:6379 鏡像ID redis-server /etc/redis/redis.conf --appendonly yes

docker run --name redis-slave2 -d --link redis -v /data/redis/conf/redis6381.conf:/etc/redis/redis.conf -v /data/redis/data:/data --privileged=true -p 6381:6379 鏡像ID redis-server /etc/redis/redis.conf --appendonly yes



--link redis:建立與master節點之間的容器間的通信,可以在配置文件中使用容器名替換ip

# master節點配置  因爲啓動的時候指定了 --link 所以直接使用容器名
replicaof redis 6379


#查看當前庫的信息
127.0.0.1:6379> info replication
# Replication
role:master    #角色:master
connected_slaves:0     #沒有從機
master_replid:43e5f2e333b40c70f32d3422cb4d1f1a3a3f5970
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

3.測試主從複製

Master設置k1,Slave1、Slave2都可以獲取k1

從節點只能讀取

主機停止服務,從機依然連接的是主機,但是沒有寫操作,這個時候主機重新啓動,從機依舊可以直接獲取主機寫的數據

 

配置哨兵

作用:

1.監控:監控主節點和從節點是否正常運行

2.通知:哨兵檢測的服務器出現問題時,會向其他的哨兵發送通知

2.故障轉移:當檢測到主節點宕機後,斷開與宕機主節點連接的所有從節點,在從節點中選取一個作爲主節點,然後將其他的從節點連接到這個最新主節點的上。並且告知客戶端最新的服務器地址。sentinel.conf 文件 (下載sentinel.conf

按照如下更改sentinel26379.conf、sentinel26380.conf、sentinel26381.conf

注:一般配置奇數臺哨兵,防止投票相等的情況,本示例配置了3臺

配置主節點的哨兵

#端口
port 26379

#哨兵監控master節點,後面這個2是指幾個哨兵發現master宕機了,才進行故障轉移
sentinel monitor mymaster redis 6379 2

#設置哨兵多久連接不上master就認爲master宕機了的時間, 單位毫秒
sentinel down-after-milliseconds mymaster 3000

#故障轉移,新的master出現後,其他follow的slave並行同步的個數,並行的越多同時阻塞的就越多
sentinel parallel-syncs mymaster 1

#添加爲後臺運行
daemonize yes

#指定日誌目錄
logfile "/data/sentinel26379.log"

pidfile /var/run/redis-sentinel26379.pid

dir /data

配置從節點的哨兵

#端口
port 26379


#哨兵監控master節點,後面這個2是指幾個哨兵發現master宕機了,才進行故障轉移
sentinel monitor mymaster redis 6379 2

#設置哨兵多久連接不上master就認爲master宕機了的時間, 單位毫秒
sentinel down-after-milliseconds mymaster 3000

#故障轉移,新的master出現後,其他follow的slave並行同步的個數,並行的越多同時阻塞的就越多
sentinel parallel-syncs mymaster 1

#添加爲後臺運行
daemonize yes

#指定日誌目錄
logfile "/data/sentinel26380.log"

pidfile /var/run/redis-sentinel26380.pid

dir /data

啓動哨兵

#主節點哨兵
docker run -d --name sentinel-master --privileged=true -p 26379:26379 --link redis -v /data/redis/sentinel/sentinel26379.conf:/usr/local/etc/redis/sentinel.conf 鏡像ID


#進入容器
docker exec -it sentinel bash

#啓動哨兵
cd /
redis-sentinel /usr/local/etc/redis/sentinel.conf


#從節點哨兵

docker run -d --name sentinel-slave1 --privileged=true -p 26380:26379 --link redis -v /data/redis/sentinel/sentinel26380.conf:/usr/local/etc/redis/sentinel.conf 鏡像ID

#進入容器
docker exec -it sentinel bash

#啓動哨兵
cd /
redis-sentinel /usr/local/etc/redis/sentinel.conf

docker run -d --name sentinel-slave2 --privileged=true -p 26381:26379 --link redis -v /data/redis/sentinel/sentinel26381.conf:/usr/local/etc/redis/sentinel.conf 鏡像ID

進入哨兵進行狀態查詢


[root@localhost ~]# docker exec -it sentinel redis-cli -p 26379
127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "172.17.0.2"
 5) "port"
 6) "6379"
 7) "runid"
 8) "52d5a6f45a72ff6d69820bf6fafa293d4694097d"
 9) "flags"
10) "master" ...


127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "172.17.0.3:6379"
    3) "ip"
    4) "172.17.0.3"
    5) "port"
    6) "6379"
    7) "runid"
    8) "ac7112b612f8ce4c196e349d0aef28f290888686"
    9) "flags"
   10) "slave" ...
2)  1) "name"
    2) "172.17.0.4:6379"
    3) "ip"
    4) "172.17.0.4"
    5) "port"
    6) "6379"
    7) "runid"
    8) "8176aa666ea22672956e378cd6ebc71faa0b57fc"
    9) "flags"
   10) "slave" ...


127.0.0.1:26379> sentinel sentinels mymaster
1)  1) "name"
    2) "c0a9519a567bca2f2dd8efe2fec6ece49f92a845"
    3) "ip"
    4) "172.17.0.6"
    5) "port"
    6) "26379"
    7) "runid"
    8) "c0a9519a567bca2f2dd8efe2fec6ece49f92a845"
    9) "flags"
   10) "sentinel" ...
2)  1) "name"
    2) "eb19c725f1ac8139707be08fdfaabcea5160632a"
    3) "ip"
    4) "172.17.0.7"
    5) "port"
    6) "26379"
    7) "runid"
    8) "eb19c725f1ac8139707be08fdfaabcea5160632a"
    9) "flags"
   10) "sentinel" ...

 

測試哨兵故障轉移

從原來的Master(172.17.0.2)切換到172.17.0.2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章