高并發多級緩存架構實現思路

目錄

1.整體架構

3.安裝環境

1.1?使用docket安裝redis

1.2 配置redis緩存鏈接:

1.3 使用redisTemplate實現

1.4 緩存注解優化

1.4.1 常用緩存注解簡紹

1.4.2 @EnableCaching注解的使用

1.4.3使用@Cacheable

1.4.4@CachePut注解的使用

1.4.5 優化

2.安裝Nginx

2.1 安裝OpenRest使用Nginx

2.2 Nginx實現動靜分離站點架構

2.2.1Nginx實現緩存

2.2.2 Cache_Purge代理緩存清理

3. 緩存一致性

3.1實現原理講解

3.1 Canal安裝


1.整體架構

三級緩存框架圖(redis,nginx,mysql)


在大并發場景下,通過引入緩存機制,減輕后端Tomcat服務的壓力,避免因請求過多導致Tomcat宕機,同時提高系統的整體響應速度和性能。優化流程如下:

  1. 請求到達Nginx?Nginx作為代理層,具有極強的抗壓能力,能夠承載大量的并發請求。

  2. 緩存策略實施

    • 第一道緩存:Redis緩存

      • 請求到達Nginx后,首先查詢Redis緩存。

      • 如果Redis中存在緩存數據,則直接返回緩存數據給用戶,無需再進行后續處理。

    • 第二道緩存:Nginx緩存

      • 如果Redis中沒有緩存數據,則查詢Nginx自身的緩存。

      • 如果Nginx緩存中有數據,也直接返回給用戶。

    • 請求路由到Tomcat

      • 如果Redis和Nginx緩存中都沒有數據,則將請求路由到后端的Tomcat服務。

  3. Tomcat處理與緩存更新

    • Tomcat接收到請求后,從數據庫中加載數據。

    • 加載完成后,將數據存入Redis緩存(以便后續請求可以直接從Redis獲取)。

    • 同時,響應數據給用戶。

  4. 后續請求處理

    • 當用戶再次發起相同查詢請求時,會優先查詢Redis緩存。

    • 如果Redis緩存中存在數據,直接返回,避免再次訪問Tomcat。

    • 如果Redis緩存失效或不存在,再按照上述流程查詢Nginx緩存或路由到Tomcat。

  5. 最終效果

    • 通過Redis和Nginx的雙重緩存機制,大幅減少了后端Tomcat服務被調用的次數,降低了Tomcat的負載。

    • 提高了系統的整體性能和響應速度,增強了系統的穩定性和可靠性。

關鍵點

  • 緩存優先級:優先使用Redis緩存,因為Redis的性能更高,適合存儲熱點數據。Nginx緩存作為補充,用于進一步減輕后端壓力。

  • 緩存更新:Tomcat加載數據后及時更新Redis緩存,確保緩存數據的時效性和準確性。

  • 緩存失效策略:需要合理設置Redis和Nginx緩存的失效時間,以平衡緩存命中率和數據新鮮度。

上面這套緩存架構被多個大廠應用,除了可以有效提高加載速度、降低后端服務負載之外,還可以防止緩存雪崩,為服務穩定健康打下了堅實的基礎,這也就是鼎鼎有名的多級緩存架構體系。

現在來思考以下問題:
1.如何實現多級緩存?
2.如何優化redis緩存?
3.nginx如何讀取緩存的數據?
4.redis如何和數據庫保持同步?

3.安裝環境

1.1?使用docket安裝redis

docker直接拉取rides

[root@localhost ~]# docker pull redis:7.0.5

配置容器以及說明

docker run  -p 6379:6379 --name redis --restart=always \-v /usr/local/redis/redis.conf:/etc/redis/redis.conf \-v /usr/local/redis/data:/data \-d redis:7.0.5 redis-server /etc/redis/redis.conf \--appendonly yes --requirepass 123456參數說明:-restart=always 總是開機啟動-p 宿主機端口和容器端口映射-v 掛載數據卷-d 后臺啟動redis- -appendonly yes 開啟持久化--requirepass 123456 設置密碼

查看是否啟動成功

[root@localhost ~]# docker ps

1.2 配置redis緩存鏈接:

修改bootstrap.yml,增加配置Redis緩存鏈接,如下:

  # Redis配置redis:host: 192.168.31.135    #換成自己虛擬機的ipport: 6379password:123456

1.3 使用redisTemplate實現

引入 RedisTemplate 來進行緩存的讀取和寫入操作,將確保在查詢數據庫之前先嘗試從 Redis 中獲取數據,并在獲取到數據庫結果后將其存儲到 Redis 中。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;@Service
public class SkuService {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;@Autowiredprivate AdItemsMapper adItemsMapper;@Autowiredprivate SkuMapper skuMapper;private static final String CACHE_NAME = "ad-items-skus";// 方法參數類型應與緩存鍵的類型一致,這里假設id是String類型的,如果不是,請調整public List<Sku> typeSkuItems(String id) {// 嘗試從Redis中獲取緩存數據List<Sku> skus = (List<Sku>) redisTemplate.opsForValue().get(CACHE_NAME + ":" + id);if (skus == null) {System.out.println("查詢數據庫!!!");// 如果Redis中沒有緩存的數據,則查詢數據庫QueryWrapper<AdItems> adItemsQueryWrapper = new QueryWrapper<AdItems>();adItemsQueryWrapper.eq("type", Integer.parseInt(id));List<AdItems> adItems = this.adItemsMapper.selectList(adItemsQueryWrapper);// 獲取所有SkuIdList<String> skuIds = adItems.stream().map(adItem -> adItem.getSkuId()).collect(Collectors.toList());// 批量查詢Skuskus = skuMapper.selectBatchIds(skuIds);// 將查詢結果存入Redis,并設置過期時間(例如1小時)//redisTemplate.opsForValue().set(CACHE_NAME + ":" + id, skus, 1, TimeUnit.HOURS);// 設置永不過期redisTemplate.opsForValue().set(CACHE_NAME + ":" + id, skus);}return skus;}
}

思考:

redisTemplate雖然可以實現,但是代碼耦合性高,如何簡化并實現相同效果??

1.4 緩存注解優化

1.4.1 常用緩存注解簡紹

@EnableCaching: 開關性注解,在項目啟動類或某個配置類上使用此注解后,則表示允許使用注解的方式進行緩存操作。

@Cacheable: 會判斷緩存是否存在,可用于類或方法上;在目標方法執行前,會根據key先去緩存中查詢看是否有數據,有就直接返回緩存中的key對應的value值。不再執行目標方法;無則執行目標方法,并將方法的返回值作為value,并以鍵值對的形式存入緩存。

@CacheEvict: 刪除緩存,可用于類或方法上;在執行完目標方法后,清除緩存中對應key的數據(如果緩存中有對應key的數據緩存的話)。

@CachePut: 不會判斷緩存是否存在,可用于類或方法上;在執行完目標方法后,并將方法的返回值作為value,并以鍵值對的形式存入緩存中。

@Caching: 三合一,此注解即可作為@Cacheable、@CacheEvict、@CachePut三種注解中的的任何一種或幾種來使用。

@CacheConfig: 可以用于配置@Cacheable、@CacheEvict、@CachePut這三個注解的一些公共屬性,例如cacheNames、keyGenerator。

1.4.2 @EnableCaching注解的使用

1.4.3使用@Cacheable

?測試

第一次查詢:

第二次測試:

使用緩存注解存儲數據到redis緩存中,key的過期時間是多久呢?
答案是:-1??永不過期!

注意:
對應的實體類要進行序列化 implements Serializeable,否則會報錯!

實體類序列化:

1.4.4@CachePut注解的使用

測試:
?

第一次

觀察控制臺,會發現它是查了數據庫

redis中也存了緩存

第二次

觀察控制臺,會發現它仍然是查了數據庫

redis中也存了緩存

第三次

觀察控制臺,會發現它還是走數據庫查詢

redis中也存了緩存

經過連續測試三次,會發現 CachePut 注解,就是將數據放進redis緩存中,并不存在判斷緩存操作!!!

1.4.5 優化

2.安裝Nginx

多級緩存架構圖思路:

首先用戶請求先進入到Nginx ,Nginx攔截后,先找redis是否有緩存,如果redis 有數據,就直接響應給用戶。如果redis緩存無數據,就會去查詢nginx緩存數據。

2.1 安裝OpenRest使用Nginx

???OpenResty 是一個基于 Nginx 與 Lua 的高性能 Web 平臺,其內部集成了大量精良的 Lua 庫、第三方模塊以及大多數的依賴項。用于方便地搭建能夠處理超高并發、擴展性極高的動態 Web 應用、Web 服務和動態網關。OpenResty? 通過匯聚各種設計精良的 Nginx 模塊(主要由 OpenResty 團隊自主開發),從而將 Nginx 有效地變成一個強大的通用 Web 應用平臺。這樣,Web 開發人員和系統工程師可以使用 Lua 腳本語言調動 Nginx 支持的各種 C 以及 Lua 模塊,快速構造出足以勝任 10K 乃至 1000K 以上單機并發連接的高性能 Web 應用系統。OpenResty? 的目標是讓你的Web服務直接跑在 Nginx 服務內部,充分利用 Nginx 的非阻塞 I/O 模型,不僅僅對 HTTP 客戶端請求,甚至于對遠程后端諸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都進行一致的高性能響應。

Nginx并發能力強 、穩定、消耗資源小

Lua:所有腳本語言中最強的

安裝

進行安裝包:
?

#進入安裝包
cd openresty-1.11.2.5#安裝
?[root@localhost openresty-1.11.2.5]# ./configure --prefix=/usr/local/openresty --with-luajit --without-http_redis2_module --with-http_stub_status_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --add-module=/usr/local/openrestyDir/ngx_cache_purge-2.3/

參數說明:
?

--prefix=/usr/local/openresty:安裝路徑
?
--with-luajit:安裝luajit相關庫,luajit是lua的一個高效版,LuaJIT的運行速度比標準Lua快數十倍。
?
--without-http_redis2_module:現在使用的Redis都是3.x以上版本,這里不推薦使用Redis2,表示不安裝redis2支持的lua庫
?
--with-http_stub_status_module:Http對應狀態的庫
?
--with-http_v2_module:對Http2的支持
?
--with-http_gzip_static_module:gzip服務端壓縮支持
?
--with-http_sub_module:過濾器,可以通過將一個指定的字符串替換為另一個字符串來修改響應
?
--add-module=/usr/local/openrestyDir/ngx_cache_purge-2.3/:Nginx代理緩存清理工具

會報錯:

解決方案,安裝Nginx代理緩存工具:

mkdir -p  /usr/local/openrestyDir cd /usr/local/openrestyDir wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gztar -xvf ngx_cache_purge-2.3.tar.gz

再次安裝:
?

?[root@localhost openresty-1.11.2.5]# ./configure --prefix=/usr/local/openresty --with-luajit --without-http_redis2_module --with-http_stub_status_module --with-http_v2_module --with-http_gzip_static_module --with-http_sub_module --add-module=/usr/local/openrestyDir/ngx_cache_purge-2.3/

報錯解決:

測試訪問:

[root@localhost openresty-1.11.2.5]# cd /usr/local/openresty
[root@localhost openresty]# ll
總用量 240
drwxr-xr-x.  2 root root    123 8月   7 19:32 bin
-rw-r--r--.  1 root root  22924 8月   7 19:32 COPYRIGHT
drwxr-xr-x.  6 root root     56 8月   7 19:32 luajit
drwxr-xr-x.  6 root root     70 8月   7 19:32 lualib
drwxr-xr-x.  6 root root     54 8月   7 19:32 nginx
drwxr-xr-x. 43 root root   4096 8月   7 19:32 pod
-rw-r--r--.  1 root root 216208 8月   7 19:32 resty.index
drwxr-xr-x.  5 root root     47 8月   7 19:32 site

瀏覽器地址欄訪問: http://192.168.31.134:80?

注意: 檢查自己linux服務器的 80 端口是否被放開?

或者 直接關閉了防火墻 也可以 !

2.2 Nginx實現動靜分離站點架構

我們打開京東商城,搜索手機,查看網絡可以發現響應頁面后,頁面又會發起很多請求,還沒有查看多少信息就已經有393個請求發出了,而多數都是圖片,一個人請求如此,人多了對后端造成的壓力是非比尋常的,該如何降低靜態資源對服務器的壓力呢?

項目完成后,項目上線如果所有請求都經過Tomcat,并發量很大的時候,對項目而言將是滅頂之災,電商項目中一個請求返回的頁面往往會再次發起很多請求,而絕大多數都是圖片或者是css樣式、js等靜態資源,如果這些靜態資源都去查詢Tomcat,Tomcat的壓力會增加數十倍甚至更高。

這時候我們需要采用動靜分離的策略:

1、所有靜態資源,經過Nginx,Nginx直接從指定磁盤中獲取文件,然后IO輸出給用戶
2、如果是需要查詢數據庫數據的請求,就路由到Tomcat集群中,讓Tomcat處理,并將結果響應給用戶

例如我的門戶代碼放到front上,將front上傳到/usr/local/shangpinmall/web/static目錄下,再修改/usr/local/openresty/nginx/conf/nginx.conf,配置如下:

#門戶發布
server {listen       80;server_name  www.shangpinyungou.com;location / {root   /usr/local/shangpinmall/web/static/frant;}
}

配置結束后一定要進行刷新:nginx -s reload

訪問 www.shangpinyungou.com 效果如下:

2.2.1Nginx實現緩存

1)開啟Proxy_Cache緩存:

我們需要在nginx.conf中配置才能開啟緩存:

proxy_cache_path /usr/local/openresty/nginx/cache levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m use_temp_path=off;

參數說明:

【proxy_cache_path】指定緩存存儲的路徑,緩存存儲在/usr/local/openresty/nginx/cache目錄 【levels=1:2】設置一個兩級目錄層次結構存儲緩存,在單個目錄中包含大量文件會降低文件訪問速度,因此我們建議對大多數部署使用兩級目錄層次結構。 如果 levels 未包含該參數,Nginx 會將所有文件放在同一目錄中。 keys_zone 緩存空間的名字 叫做: proxy_cache key是 10M 【keys_zone=proxy_cache:10m】設置共享內存區域,用于存儲緩存鍵和元數據,例如使用計時器。擁有內存中的密鑰副本,Nginx 可以快速確定請求是否是一個 HIT 或 MISS 不必轉到磁盤,從而大大加快了檢查速度。1 MB 區域可以存儲大約 8,000 個密鑰的數據,因此示例中配置的 10 MB 區域可以存儲大約 80,000 個密鑰的數據。 max_size 緩存數據的大小 【max_size=1g】設置緩存大小的上限。它是可選的; 不指定值允許緩存增長以使用所有可用磁盤空間。當緩存大小達到限制時,一個稱為緩存管理器的進程將刪除最近最少使用的緩存,將大小恢復到限制之下的文件。 // 表達一個緩存多久沒去使用后,就會過期 【inactive=60m】指定項目在未被訪問的情況下可以保留在緩存中的時間長度。在此示例中,緩存管理器進程會自動從緩存中刪除 60 分鐘未請求的文件,無論其是否已過期。默認值為 10 分鐘(10m)。非活動內容與過期內容不同。Nginx 不會自動刪除緩存 header 定義為已過期內容(例如 Cache-Control:max-age=120)。過期(陳舊)內容僅在指定時間內未被訪問時被刪除。訪問過期內容時,Nginx 會從原始服務器刷新它并重置 inactive 計時器。 // 不使用臨時目錄 【use_temp_path=off】表示NGINX會將臨時文件保存在緩存數據的同一目錄中。這是為了避免在更新緩存時,磁盤之間互相復制響應數據,我們一般關閉該功能。

2)Proxy_Cache屬性:

proxy_cache:設置是否開啟對后端響應的緩存,如果開啟的話,參數值就是zone的名稱,比如:proxy_cache。proxy_cache_valid:針對不同的response code設定不同的緩存時間,如果不設置code,默認為200,301,302,也可以用any指定所有code。proxy_cache_min_uses:指定在多少次請求之后才緩存響應內容,這里表示將緩存內容寫入到磁盤。proxy_cache_lock:默認不開啟,開啟的話則每次只能有一個請求更新相同的緩存,其他請求要么等待緩存有數據要么限時等待鎖釋放;nginx 1.1.12才開始有。
配套著proxy_cache_lock_timeout一起使用。proxy_cache_key:緩存文件的唯一key,可以根據它實現對緩存文件的清理操作。

Nginx代理緩存熱點數據應用

1)開啟代理緩存

修改nginx.conf,添加如下配置:

proxy_cache_path /usr/local/openresty/nginx/cache levels=1:2 keys_zone=proxy_cache:10m max_size=1g inactive=60m use_temp_path=off;

修改nginx.conf,添加如下配置:


# lua 推廣產品操作location /sku/aditems/type {# 查找redis緩存#content_by_lua_file /usr/local/openresty/nginx/lua/aditem.lua;# 找nginx緩存rewrite_by_lua_file /usr/local/openresty/nginx/lua/aditem.lua;#啟用緩存openresty_cacheproxy_cache proxy_cache;#針對指定請求緩存#proxy_cache_methods GET;#設置指定請求會緩存proxy_cache_valid 200 304 60s;#最少請求1次才會緩存proxy_cache_min_uses 1;#如果并發請求,只有第1個請求會去服務器獲取數據#proxy_cache_lock on;#唯一的keyproxy_cache_key $host$uri$is_args$args;#動態代理 去找后端微服務 查數據  這里的地址是填寫你當前windows的ip地址服務器 (我們去看我們nacos中服務注冊的ip就可以了)proxy_pass http://192.168.18.1:8081;}# 門戶靜態頁location / {root   /usr/local/web/frant;index  index.html index.htm;}

重啟nginx或者重新加載配置文件nginx -s reload,再次測試

進行測試,關閉運行的代碼,只要不關閉虛擬機再次刷新我們發現數據仍然顯示出來,說明緩存起到作用

我們可以找一下nginx代理緩存的存儲位置

可以發現cache目錄下多了目錄和一個文件,這就是Nginx緩存:

可以發現下面個規律:

1:先查找Redis緩存

2:Redis緩存沒數據,直接找Nginx緩存

3:Nginx緩存沒數據,則找真實服務器

2.2.2 Cache_Purge代理緩存清理

很多時候我們如果不想等待緩存的過期,想要主動清除緩存,可以采用第三方的緩存清除模塊清除緩存 nginx_ngx_cache_purge。

安裝nginx的時候,需要添加purge模塊,purge模塊我們已經下載了,在 /usr/local/openrestyDir 目錄下,添加該模塊 --add-module=/usr/local/openrestyDir/ngx_cache_purge-2.3/,這一個步驟我們在安裝OpenRestry的時候已經實現了。

在實際部署中,你需要確保Nginx已經安裝并啟用了Purge模塊。你可以通過運行nginx -V來檢查是否已經啟用了--with-http_purge_module

#清理緩存
location ~ /purge(/.*) {#清理緩存  匹配  http://192.168.31.136/sku/aditems/type?id=1proxy_cache_purge proxy_cache $host$1$is_args$args;
}1$  表示第一個路徑 /purge 后面的路徑匹配 (/sku/aditems/type,不包含/purge自己)    http://192.168.25.136/sku/aditems/type?id=1

此時訪問 http://192.168.31.136/purge/sku/aditems/type?id=1,表示清除緩存,如果出現如下效果表示清理成功:

怎么確定,nginx代理緩存被清除了呢?

我們可以再次去看nginx代理數據對象數據,還是否存在

3. 緩存一致性

3.1實現原理講解

上面我們雖然實現了多級緩存架構但是問題也出現了,如果數據庫中數據發生變更,如何更新Redis緩存呢?如何更新Nginx緩存呢?我們可以使用阿里巴巴的技術解決方案Canal來實現,通過Canal監聽數據庫變更,并實時消費變更數據,并更新緩存。

MySQL主備復制原理
  • MySQL master 將數據變更寫入二進制日志( binary log, 其中記錄叫做二進制日志事件binary log events,可以通過 show binlog events 進行查看)
  • MySQL slave 將 master 的 binary log events 拷貝到它的中繼日志(relay log)
  • MySQL slave 重放 relay log 中事件,將數據變更反映它自己的數據
Canal 工作原理
  • canal 模擬 MySQL slave 的交互協議,偽裝自己為 MySQL slave ,向 MySQL master 發送dump 協議
  • MySQL master 收到 dump 請求,開始推送 binary log 給 slave (即 canal )
  • canal 解析 binary log 對象(原始為 byte 流)
  • 再發送到存儲目的地,比如MySQL,Kafka,ElasticSearch等等。
總結

?canal的好處在于對業務代碼沒有侵入,因為是基于監聽binlog日志去進行同步數據的。而且能做到同步數據的實時性,是一種比較好的數據同步方案。

????以上只是canal的原理和入門,實際項目并不是這樣玩的,在實際項目中我們是配置MQ模式,配合RabbitMQ或者Kafka,canal會把數據發送到MQ中的topic,然后通過消息隊列的消費者進行處理。

3.1 Canal安裝

MySQL開啟binlog

對于MySQL , 需要先開啟 Binlog 寫入功能,配置 binlog-format 為 ROW 模式,my.cnf 中配置如下:
docker exec -it mysql /bin/bash
cd /etc/mysql/
vim mysqld.cnf


[mysqld]
# 修改容器中的MySQL時間不同步的問題
default_time_zone='+8:00'
# 修改容器中的MySQL分組only_full_group_by問題
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
#修改表名不區分大小寫問題
lower_case_table_names=1
# 設置服務器的排序規則為 utf8_general _ci
collation-server=utf8_general_ci
#設置服務器的默認字符集為 utf8
character-set-server=utf8# 開啟 binlog
log-bin=mysql-bin
# 選擇 ROW 模式 
binlog-format=ROW  
# 配置 MySQL replaction 需要定義,不要和 canal 的 slaveId 重復
server_id=1 [client]
# 設置客戶端的默認字符集為 utf8
default-character-set=utf8

注:docker默認沒有vim工具,可以在數據卷下進行操作,也可以安裝工具

授權canal

權 canal 鏈接 MySQL 賬號具有作為 MySQL slave 的權限, 如果已有賬戶可直接 grant:

先進入到 docker 中mysql 容器內部

docker exec -it mysql mysql -uroot -p

CREATE USER canal IDENTIFIED BY 'canal';GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES;

重新啟動MySQL即可

Canal安裝

linux硬盤空間不夠的排查與清理

linux硬盤空間不夠的排查與清理_linux清理磁盤空間-CSDN博客

我們采用docker安裝方式:

[root@localhost ~]# docker pull canal/canal-server:v1.1.7

docker安裝canal: docker環境下Canal的安裝使用_docker 安裝canal-CSDN博客

# 提前創建 /usr/local/docker/canal/conf 目錄,接著來執行拷貝配置文件命令
docker cp canal:/home/admin/canal-server/conf/example/instance.properties  /usr/local/docker/canal/conf
docker cp canal:/home/admin/canal-server/conf/canal.properties  /usr/local/docker/canal/conf# 刪除原先的canal服務
docker rm -f canaldocker run --name canal \
-p 11111:11111  \
--restart=always \
-v /usr/local/docker/canal/conf/instance.properties:/home/admin/canal-server/conf/example/instance.properties \
-v /usr/local/docker/canal/conf/canal.properties:/home/admin/canal-server/conf/canal.properties \
-d canal/canal-server:v1.1.7
[root@localhost ~]# docker exec -it canal /bin/bash[root@6adf5de6d4df admin]# lsapp.sh  bin  canal-server  health.sh  node_exporter  node_exporter-1.6.1.linux-amd64[root@6adf5de6d4df admin]# cd canal-server/
[root@6adf5de6d4df canal-server]# ls
bin  conf  lib  logs  plugin[root@6adf5de6d4df canal-server]# cd conf/
[root@6adf5de6d4df conf]# ls
canal.properties  canal_local.properties  example  logback.xml  metrics  spring

進入 example

[root@6adf5de6d4df conf]# cd example/
[root@6adf5de6d4df example]# ls
h2.mv.db  instance.properties

入容器,修改核心配置canal.properties 和instance.properties,canal.properties 是canal自身的配置,instance.properties是需要同步數據的數據庫連接配置。

[root@localhost conf]# ls
canal.properties  instance.properties
[root@localhost conf]# 
[root@localhost conf]# vim canal.properties 

[root@6adf5de6d4df example]# vim instance.properties

修改配置如下:

# position info canal.instance.master.address=192.168.25.136:3306

另一處配置:

找到 canal.instance.filter.regex 這里 進行修改

注:
# table regex #canal.instance.filter.regex=.*\\..* 任意數據庫的任意表 #監聽配置 canal.instance.filter.regex=shop_goods.ad_items

配置完畢重啟即可!

bootstrap.yml:

server:port: 8083
spring:application:name: mall-canal-servicecloud:nacos:config:file-extension: yaml# nacos 配置中心地址server-addr: 192.168.254.131:8848discovery:#Nacos的注冊地址server-addr: 192.168.254.131:8848
#Canal配置
canal:server: 192.168.254.131:11111  # canal的服務器ipdestination: example  # canal 中配置的實例目錄
#日志配置
logging:pattern:console: "%msg%n"level:root: error

以上就是本期的分享啦,希望能夠幫到你

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901628.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901628.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901628.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Qt QML實現Windows桌面顏色提取器

前言 實現一個簡單的小工具&#xff0c;使用Qt QML實現Windows桌面顏色提取器&#xff0c;實時顯示鼠標移動位置的顏色值&#xff0c;包括十六進制值和RGB值。該功能在實際應用中比較常見&#xff0c;比如截圖的時候&#xff0c;鼠標移動就會在鼠標位置實時顯示坐標和顏色值&a…

vue3+vite 多個環境配置

同一套代碼 再也不用在不同的環境里來回切換請求地址了 然后踩了一個坑 就是env的文件路徑是在當前項目下 不是在views內 因為公司項目需求只有dev和pro兩個環境 雖然我新增了3個 但是只在這兩個里面配置了 .env是可以配置一些公共配置的 目前需求來說不需要 所以我也懶得配了。…

AI賦能PLC(一):三菱FX-3U編程實戰初級篇

前言 在工業自動化領域&#xff0c;三菱PLC以其高可靠性、靈活性和廣泛的應用場景&#xff0c;成為眾多工程師的首選控制設備。然而&#xff0c;傳統的PLC編程往往需要深厚的專業知識和經驗積累&#xff0c;開發周期長且調試復雜。隨著人工智能技術的快速發展&#xff0c;利用…

XSS 跨站Cookie 盜取表單劫持網絡釣魚溯源分析項目平臺框架

漏洞原理&#xff1a;接受輸入數據&#xff0c;輸出顯示數據后解析執行 基礎類型&#xff1a;反射 ( 非持續 ) &#xff0c;存儲 ( 持續 ) &#xff0c; DOM-BASE 拓展類型&#xff1a; jquery &#xff0c; mxss &#xff0c; uxss &#xff0c; pdfxss &#xff0c; flashx…

鴻蒙應用(醫院診療系統)開發篇2·Axios網絡請求封裝全流程解析

一、項目初始化與環境準備 1. 創建鴻蒙工程 src/main/ets/ ├── api/ │ ├── api.ets # 接口聚合入口 │ ├── login.ets # 登錄模塊接口 │ └── request.ets # 網絡請求核心封裝 └── pages/ └── login.ets # 登錄頁面邏輯…

ADAS高級駕駛輔助系統詳細介紹

ADAS&#xff08;高級駕駛輔助系統&#xff09;核心模塊&#xff0c;通過 “監測→預警→干預” 三層邏輯提升行車安全。用戶選擇車輛時&#xff0c;可關注傳感器配置&#xff08;如是否標配毫米波雷達&#xff09;、功能覆蓋場景&#xff08;如 AEB 是否支持夜間行人&#xff…

Prometheus+Grafana+K8s構建監控告警系統

一、技術介紹 Prometheus、Grafana及K8S服務發現詳解 Prometheus簡介 Prometheus是一個開源的監控系統和時間序列數據庫&#xff0c;最初由SoundCloud開發&#xff0c;現已成為CNCF(云原生計算基金會)的畢業項目?。它專注于實時監控和告警&#xff0c;特別適合云原生和分布式…

MATLAB腳本實現了一個三自由度的通用航空運載器(CAV-H)的軌跡仿真,主要用于模擬升力體在不同飛行階段(初始滑翔段、滑翔段、下壓段)的運動軌跡

%升力體:通用航空運載器CAV-H %讀取數據1 升力系數 alpha = [10 15 20]; Ma = [3.5 5 8 10 15 20 23]; alpha1 = 10:0.1:20; Ma1 = 3.5:0.1:23; [Ma1, alpha1] = meshgrid(Ma1, alpha1); CL = readmatrix(simulation.xlsx, Sheet, Sheet1, Range, B2:H4); CL1 = interp2(…

Day09【基于jieba分詞和RNN實現的簡單中文分詞】

基于jieba分詞和RNN實現的中文分詞 目標數據準備主程序預測效果 目標 本文基于給定的中文詞表&#xff0c;將輸入的文本基于jieba分詞分割為若干個詞&#xff0c;詞的末尾對應的標簽為1&#xff0c;中間部分對應的標簽為0&#xff0c;同時將分詞后的單詞基于中文詞表做初步序列…

Linux-服務器添加審計日志功能

#查看audit軟件是否在運行(狀態為active而且為綠色表示已經在運行) systemctl start auditd #如果沒有在運行的話,查看是否被系統禁用 (audit為0表示被禁用) cat /proc/cmdline | grep -w "audit=0" #修改/etc/default/grub里面audit=0 改為audit=1 #更新GRUB…

uniappx項目上架各手機平臺

前段時間用uniappx開發的App&#xff0c;領導要求要在各個主要手機平臺上上架了&#xff0c;本來不是我的任務&#xff0c;后來其他人沒有空交給我了&#xff0c;上架小白一枚&#xff0c;哭唧唧的自己研究吧&#xff0c;根據領導發的賬號密碼登錄各個平臺上架&#xff0c;花費…

第4次課 前綴和與差分 A

課堂學習 前綴和數組 前1個收購點&#xff1a;3箱 前2個收購點&#xff1a;325箱 前3個收購點&#xff1a;32510箱 以此類推… 數組a存儲10個收購點的箱數。 收購點編號從1~10&#xff0c;數組下標也從1開始使用。 下標0位置直接賦值0 #include<bits/stdc.h> using nam…

MySQL部分總結

mysql學習筆記&#xff0c;如有不足還請指出&#xff0c;謝謝。 外連接&#xff0c;內連接&#xff0c;全連接 外連接&#xff1a;左外、右外 內連接&#xff1a;自己和自己連接 全連接&#xff1a;左外連接右外鏈接 mysql unique字段 unique可以在數據庫層面避免插入相同…

Spring MVC 請求處理流程詳解

步驟1&#xff1a;用戶發起請求 所有請求首先被 DispatcherServlet&#xff08;前端控制器&#xff09;攔截&#xff0c;它是整個流程的入口。 DispatcherServlet 繼承自 HttpServlet&#xff0c;通過 web.xml 或 WebApplicationInitializer 配置映射路徑&#xff08;如 /&…

Vue 高級技巧深度解析

Vue 高級技巧深度解析 mindmaproot(Vue2高級技巧)組件通信EventBusprovide/inject$attrs/$listeners性能優化虛擬DOM優化函數式組件按需加載狀態管理Vuex模塊化持久化存儲嚴格模式高級指令自定義指令動態組件異步組件渲染控制作用域插槽渲染函數JSX支持一、組件通信的進階之道 …

2024年React最新高頻面試題及核心考點解析,涵蓋基礎、進階和新特性,助你高效備戰

以下是2024年React最新高頻面試題及核心考點解析&#xff0c;涵蓋基礎、進階和新特性&#xff0c;助你高效備戰&#xff1a; 一、基礎篇 React虛擬DOM原理及Diff算法優化策略 ? 必考點&#xff1a;虛擬DOM樹對比&#xff08;同級比較、Key的作用、組件類型判斷&#xff09; ?…

Zookeeper單機三節點集群部署(docker-compose方式)

前提: 服務器需要有docker鏡像zookeeper:3.9.3 或能連網拉取鏡像 服務器上面新建文件夾: mkdir -p /data/zk-cluster/{data,zoo-cfg} 創建三個zookeeper配置文件zoo1.cfg、zoo2.cfg、zoo3.cfg,配置文件里面內容如下(三個文件內容一樣): tickTime=2000 initLimit=10 …

面試題之數據庫-mysql高階及業務場景設計

最近開始面試了&#xff0c;410面試了一家公司 針對自己薄弱的面試題庫&#xff0c;深入了解下&#xff0c;也應付下面試。在這里先祝愿大家在現有公司好好沉淀&#xff0c;定位好自己的目標&#xff0c;在自己的領域上發光發熱&#xff0c;在自己想要的領域上&#xff08;技術…

數字內容體驗案例解析與行業應用

數字內容案例深度解析 在零售行業頭部品牌的實踐中&#xff0c;數字內容體驗的革新直接推動了用戶行為模式的轉變。某國際美妝集團通過搭建智能內容中臺&#xff0c;將產品信息庫與消費者行為數據實時對接&#xff0c;實現不同渠道的動態內容生成。其電商平臺首頁的交互式AR試…

4.15 代碼隨想錄第四十四天打卡

99. 島嶼數量(深搜) (1)題目描述: (2)解題思路: #include <iostream> #include <vector> using namespace std;int dir[4][2] {0, 1, 1, 0, -1, 0, 0, -1}; // 四個方向 void dfs(const vector<vector<int>>& grid, vector<vector<bool&g…