Thứ Hai, 24 tháng 7, 2023

Xử lý lỗi khởi động mySqlRouter

 1. Nếu MySqlRouter không tìm thấy thư mục chứa tập tin  mysqlrouter.pid (chẳng hạn thư mục /var/run/mysqlrouter/ thì tạo thư mục ấy :

$ sudo mkdir /var/run/mysqlrouter/
$ sudo chown -R mysql:mysql /var/run/mysqlrouter/

 

2. Nếu service không khởi động được, ta có thể loại nó ra khỏi systemd rồi sau đó cập nhật tập biến RestartSec của tập tin service
$ sudo systemctl disable mysqlrouter.service


3. Cập nhật mysqlrouter.service để gia hạn thêm thời gian tái khởi động dịch vụ

$ sudo vi /etc/systemd/system/mysqlrouter.service

....

RestartSec=20

....


4. Sau đó cập nhật lại systemd
$ sudo systemctl daemon-reload


5.Rồi khởi động lại dịch vụ
$ sudo systemctl start mysqlrouter.service 



Một số ví dụ về Regex

1. Tìm một cụm chỉ có 5 chữ số :


Regex : ([0-9]{5}$)
Ex : 1234567891 12346 => Tìm thấy "12346"

 

2. Tìm một cụm đầu câu bắt đầu bằng một hoặc nhiều số và theo sau bằng một chữ cái hoặc không :


Regex : ^[0-9]+[aA-zZ]?
Ex : 10
12t
15A  


3. Tìm một cụm đầu câu bắt đầu bằng một hoặc nhiều số và theo sau bằng không hoặc nhiều chữ cái :


Regex : ^[0-9]+[aA-zZ]*.?
Ex : 10
12A
15th 


4. Tìm một từ cuối câu có hoặc không có dấu chấm :


Regex : [aA-zZ]*\.?$
Ex : etc
etc.


5. Tìm một cụm từ bắt đầu bằng 5 chữ số và một chuỗi các từ theo sau đó, có thể có dấu gạch ngang giữa 5 chữ số và chuỗi từ theo sau :


Regex : ([0-9]{5}\s[aA-zZ\-].+)
Ex : 15698 test
98567 - test


6. Tìm một cụm từ có dạng TYPE1.<bất kỳ từ nào>:TYPE2 :


Regex : TYPE1\.[aA-zZ]*.:TYPE2
Ex : TYPE1.TEST:TYPE2


Thứ Hai, 3 tháng 7, 2023

Một số lệnh với keytool

 Dưới đây là một số lệnh với keytool

 

1. Thêm certificat vào keystore

$ sudo keytool -importcert -keystore <đường dẫn đến keystore> -storepass <mật khẩu của keystore> -alias <tên dùng đại diện cho certificat> -file <đường dận tới tập tin certificat>  -noprompt

 

 Ví dụ :

$ sudo keytool -importcert -keystore /opt/java/lib/security/cacerts -storepass changeit -alias toan-test -file /tmp/toan_certif.crt  -noprompt

$ sudo keytool -importcert -storetype PKCS12 -keystore /opt/truststore.p12 -file /tmp/test_cert.pem -alias test-alias


2. Trích xuất certificat từ keystore

$ keytool -exportcert -keystore <đường dẫn đến keystore> -storeType PKCS12 -alias <tên dùng đại diện cho certificat> -file <đường dận tới tập tin certificat trích xuất>


 Ví dụ :

$ keytool -exportcert -keystore /opt/keystore.p12 -storeType PKCS12 -alias test -file ./certificat_cert.pem


3. Liệt kê các certificat trong keystore

$ keytool -list -keystore <đường dẫn đến keystore>


 Ví dụ :

$ keytool -list -keystore /opt/java/lib/security/cacerts -storepass changeit | grep toan

 

4. Xóa một certificat bằng alias trong keystore

 
$ keytool -delete -alias <tên dùng đại diện cho certificat> -keystore <đường dẫn đến keystore>

 

Ví dụ: 


$ keytool -delete -alias toan-test -keystore /opt/truststore.p12


Ngoài lề :

Sao chép tập tin với lệnh scp (hoặc scp.exe trong git bash) certificat


$ scp <đường dẫn đến tập tin gốc để copy> <login>@<địa chỉ ip>:<đường dẫn tới vị trí đích để copy tới đó>


Ví dụ: 

$ scp ./toan_certificat.crt toan@10.10.11.11:/tmp/




Cấu hình để dùng Auto Retry cho Spring Boot ở High Availability : Netflix Zuul, Eureka, Ribbon

 Khi Netflix Zuul được dùng như một gateway để điều hướng những truy vấn nhận được cho các services ở backend, có đôi lúc những truy vấn này có thể không được các service này trả lời.

Để tránh những trường hợp này, ta có thể cấu hình sao cho những truy vấn này được thực thi lại (retry) một cách tự động. Khi dùng Spring Cloud Netflix, ta cần thêm Spring Retry vào tập tin pom.xml của dự án để dùng cấu hình này. Khi Spring Retry được dùng, loadbalancer của Zuul (ở đây là Ribbon) sẽ tự động thực hiện retry những truy vấn thất bại.

Trong tập tin pom.xml thêm Spring Retry vào dự án như sau :


        <!-- enable retry for non-reactive version (load-balanced RestTemplate) -->
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>

 Trong tập tin cấu hình application.xml của zuul, ta cần kích hoạt loadbalancer và retry như sau :

spring:
  cloud:
    # enable retry for reactive version (with WebClient)
    loadbalancer:
      retry:
        enabled: true
      ribbon:
        enabled: true

zuul:
  retryable: true

ribbon:
  OkToRetryOnAllOperations: true
  MaxAutoRetries: 3
  MaxAutoRetriesNextServer: 3
  # 500 (Internal Server Error), 503 (Service Unavailable), 408 (Request Timeout)
  retryableStatusCodes: 500, 503, 408

 

 Trong các tập tin cấu hình application.xml của các services, ta cần cấu hình cho retry như sau :

ribbon:
  OkToRetryOnAllOperations: true
  MaxAutoRetries: 3
  MaxAutoRetriesNextServer: 3
  # 500 (Internal Server Error), 503 (Service Unavailable), 408 (Request Timeout)
  retryableStatusCodes: 500, 503, 408

Giải thích :

- Nếu trong các service, bạn dùng RestTemplate, thì mặc định retry không được kích hoạt. Để kích hoạt retry cho phiên bản non-reactive tức RestTemplate, bạn chỉ cần thêm Spring Retry vào dự án như trên.

- Cho phiên bản reactive tức WebClient, để kích hoạt retry bạn cần phải thêm như sau: spring.cloud.loadbalancer.retry.enabled=true và spring.cloud.loadbalancer.ribbon.enabled=true

- MaxAutoRetries –  Số lần truy vấn thất bại được tái thực thi trên cùng server  (default 0)

- MaxAutoRetriesNextServer – Số server được dùng để thực hiện retry, ngoại trừ server đầu tiên (default 0)

- retryableStatusCodes – danh sách status code của HTTP để thực hiện retry

- OkToRetryOnAllOperations – khi biến này là true, thì mọi loại truy vấn HTTP đều được thực hiện retry, chứ không bải chỉ có loại chi vấn GET được retry ở mặc định.