Docker學習筆記—day008(MySql主從複製和redis集羣配置)

文章目錄

  • Docker學習筆記—day008(MySql主從複製和redis集羣配置)
  • 一、Mysql主從複製(搭建步驟)
  • 1.1、Mysql主從複製的原理
  • 1.2、新建主服務器容器實例3307
  • 1.3、進入/etc/mysql-master/conf 目錄下新建my.cnf
  • 1.4、進入mysql-master容器
  • 1.5、master容器實例內創建數據同步用户
  • 1.6、新建從服務器容器實例3308
  • 1.8、修改配置後重啓slave實例
  • 1.9、在主數據庫中查看主從同步狀態
  • 1.10、進入mysql-slave容器
  • 1.11、在從數據庫中配置主從複製
  • 1.12、在從數據庫中查看主從同步狀態
  • 1.13、在從數據庫中開啓主從同步
  • 1.14、查看從數據庫狀態發現已經同步
  • 1.15、主從複製測試
  • 二、安裝Redis集羣(分佈式存儲)
  • 2.1、分佈式存儲的三種理論依據(重點)
  • 2.1.1、哈希取餘分區
  • 2.1.2、一致性哈希算法
  • 2.1.3、哈希槽分區(經常問)
  • 2.2、3主3從redis集羣配置
  • 2.2.1、關閉防火牆+啓動docker後台服務
  • 2.2.2、新建6台redis容器實例
  • 2.2.3、進入redis-node-1併為6台機器構建集羣關係
  • 2.2.4、鏈接進入6381做為切入點,查看集羣狀態

一、Mysql主從複製(搭建步驟)

1.1、Mysql主從複製的原理

主從複製是用來建立一個和 主數據庫完全一樣的數據庫環境稱為從數據庫;主數據庫一般是準實時的業務數據庫
如果企業中使用的後端MySql數據庫只有一台時候,會存在以下問題:1、單點故障服務不可用;2、無法處理大量的併發數據請求;3、數據丟失

主從複製的作用:

  • 如果主節點出現故障,直接將服務切換到從節點,來保證服務的可用性
  • 如果併發量較大,可以進行讀寫分離,讓主庫負責寫,從庫負責讀
  • 如果主庫數據丟失,從庫還會保存一份,可減少數據丟失的分險

Docker學習筆記_redis


主從數據庫之間的數據複製方式:異步複製、半同步複製、組複製

1.2、新建主服務器容器實例3307

docker run -d -p 3307:3306 --privileged=true \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root\
--name mysql-master \
mysql:5.7

Docker學習筆記_redis_02

1.3、進入/etc/mysql-master/conf 目錄下新建my.cnf

cd /mydata/mysql-master/conf
touch my.cnf

複製mysql的原始配置文件 my.cnf

[mysqld]
## 設置server_id。同一個局域網中需要唯一
server_id=101
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
## 開啓二進制日誌功能
log-bin=mall-mysql-bin
## 設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M
## 設置使用的二進制日誌格式(mixed,statement,row)
binlog_format=mixed
## 二進制日誌國企清理時間。默認為0,表示不自動清理
expire_logs_days=7
## 跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷
## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062

修改完配置後重啓mysql-master容器實例

docker restart mysql-master

1.4、進入mysql-master容器

# docker exec -it 容器ID /bin/bash
docker exec -it b7092ad4a1dd /bin/bash

1.5、master容器實例內創建數據同步用户

# 認證-創建複製賬户
create user 'slave'@'%' identified by '123456'
# 授權-授權複製權限
grant replication slave, replication client on *.* to 'slave'@'%'

1.6、新建從服務器容器實例3308

```shell
docker run -d -p 3308:3306 --privileged=true \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root\
--name mysql-slave \
mysql:5.7
### 1.7、進入/etc/mysql-slave/conf 目錄下新建my.cnf
```shell
 cd /mydata/mysql-slave/conf/
vi my.cnf

添加從機配置

[mysqld]
## 設置server_id。同一個局域網中需要唯一
server_id=102
## 指定不需要同步的數據庫名稱
binlog-ignore-db=mysql
## 開啓二進制日誌功能
log-bin=mall-mysql-bin
## 設置二進制日誌使用內存大小(事務)
binlog_cache_size=1M
## 設置使用的二進制日誌格式(mixed,statement,row)
binlog_format=mixed
## 二進制日誌國企清理時間。默認為0,表示不自動清理
expire_logs_days=7
## 跳過主從複製中遇到的所有錯誤或指定類型的錯誤,避免slave端複製中斷
## 如:1062錯誤是指一些主鍵重複,1032錯誤是因為主從數據庫數據不一致
slave_skip_errors=1062
## relay_log 配置中繼日誌
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave將複製事件寫進自己的二進制日誌
log_slave_updates=1
## slave 設置為只讀(具有super權限的用户除外)
read_only=1

1.8、修改配置後重啓slave實例

docker restart mysql-slave

1.9、在主數據庫中查看主從同步狀態

show master status;

Docker學習筆記_redis_03

1.10、進入mysql-slave容器

docker exec -it mysql-slave /bin/bash
mysql -uroot -p
# 接着輸入密碼

1.11、在從數據庫中配置主從複製

命令格式

change master to master_host='宿主機IP', master_user='slave', master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=617,master_connect_retry=30;
# master_host:主庫的IP地址-從庫需要通過這個地址找到主庫。(需要將'宿主機IP'替換為真實的主庫服務器IP地址)
# master_user:連接主庫時使用的用户名
# master_password:連接主庫時對應用户的密碼(即創建'slave'用户時設置的密碼)
# master_port:主庫監聽的端口
# master_log_file:從那個二進制日誌文件開始複製(這個值必須與在主庫上執行的 show mysql status;命名後得到的file值一致)
# master_log_pos:從二進制日誌的那個位置開始複製(同上)
# master_connect_retry: 連接重試間隔(秒)-如主庫和1從庫連接意外中斷,從庫需要每隔30s嘗試重新連接
change master to master_host='192.168.17.131', master_user='slave', master_password='123456',master_port=3307,master_log_file='mall-mysql-bin.000001',master_log_pos=2129,master_connect_retry=30;
/

1.12、在從數據庫中查看主從同步狀態

show slave status \G;  // 參數\G 會將文件內容以KV鍵值對的形式展現出來

Docker學習筆記_docker_04

1.13、在從數據庫中開啓主從同步

start slave;

1.14、查看從數據庫狀態發現已經同步

show slave status;

Docker學習筆記_redis_05

1.15、主從複製測試

在主機上創建庫、創建表、插入數據

Docker學習筆記_mysql_06


在從數據庫當中進行查看(主從複製)

Docker學習筆記_mysql_07

二、安裝Redis集羣(分佈式存儲)

1-2億條數據需要緩存,請問如何設計這個存儲案例
解決辦法:單機設備不可能實現,使用redis分佈式存儲

2.1、分佈式存儲的三種理論依據(重點)

2.1.1、哈希取餘分區

假設有3台機器構成的一個集羣,用户每次讀寫操作都是根據公式:hash(key)%N個機器台數,計算出哈希值,用來決定數據映射到哪一個節點上。

優點: 簡單有效,只需預估好數據規劃還節點。使用Hash算法讓固定的一部分請求落到同一台服務器上,這樣每一台服務器固定處理一部分請求,起到負載均衡+分而治之的作用。

缺點:進行擴容和縮容比較麻煩,得重新設置映射關係。

Docker學習筆記_mysql_08

2.1.2、一致性哈希算法

由來:為了解決分佈式緩存數據變動和映射問題,某個機器宕機了,分母數量改變了,自然取餘數就不行了。
目的:當服務器個數發生變動時,儘量減少影響客户端到服務器的映射關係

優點: 容錯性高、可擴容
缺點:節點太少,會存在數據傾斜的問題(被緩存的大部分集中在某一台服務器上)

3大步驟

  1. 算法構建一致性哈希環

通過hash函數並按照算法產生hash值,這個算法的所有可能哈希值會構成一個全量集(hash空間)[0-2^32-1],這是一個線性空間。但在算法中,將它的首尾相連,在邏輯上構成一個環形空間
簡單説:一致性hash算法將整個哈希值空間組織稱一個虛擬的環。

  1. 服務器IP節點映射

將集羣中各個IP節點映射到環上的某一個位置

  1. key落到服務器的落鍵規則

當我們需要存儲一個KV鍵值對時,首先計算key的hash值,hash(key),將這個key使用相同的hash函數計算出哈希值並確定此數據在環上的位置,從此位置沿環順時針"行走",第一台遇到的服務器就是其應該定位到的服務器,並將該鍵值對存儲在該節點上。

2.1.3、哈希槽分區(經常問)

緣由:解決一致性哈希算法的數據傾斜問題
哈希槽實質就是一個數組,數組[0-2^14-1]形成hash slot空間

解決均勻分配的問題,在數據和節點之間加入一層,把這層稱為槽(slot),用於管理數據和節點之間的關係,現在就相當於節點上放的是槽,槽裏放的是數據。

Docker學習筆記_docker_09

2.2、3主3從redis集羣配置

2.2.1、關閉防火牆+啓動docker後台服務
# 關閉防火牆
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 啓動並啓用Docker
sudo systemctl start docker
sudo systemctl enable docker
2.2.2、新建6台redis容器實例
# 開啓66個redis容器實例
# --net host  使用宿主機的IP和端口,默認
# --cluster enabled yes  開啓集羣模式
# --appendonly 啓用AOF(Append Only File)持久化
docker run -d --name redis-node-1  --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2  --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3  --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4  --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5  --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6  --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

Docker學習筆記_mysql_10

2.2.3、進入redis-node-1併為6台機器構建集羣關係

進入容器:

docker exec -it redis-node-1 /bin/bash

構建主從關係:

redis-cli --cluster create 192.168.17.131:6381 192.168.17.131:6382 192.168.17.131:6383 192.168.17.131:6384 192.168.17.131:6385 192.168.17.131:6386 --cluster-replicas 1
# --cluster-replicas 1 表示為每一個master創建一個slave節點(一主一從(共三組))

Docker學習筆記_docker_11

2.2.4、鏈接進入6381做為切入點,查看集羣狀態
cluster nodes  # 節點詳細信息

Docker學習筆記_docker_12


通過下面命令我們可以看出那個master掛載的是那個slave

cluster nodes  # 節點詳細信息
# 1-5
# 2-6
# 3-4

Docker學習筆記_redis_13