2021年2月15日 星期一

Mysql8 主從複製(Windows)

 一、安裝完注意事項

mysql 安裝完後,執行打 services.msc


在紅框按右鍵內容,綠框的路徑有 my.ini,有改過想生效要按紅框右鍵的重新啟動,我的路徑如下:

"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe" --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" MySQL80

注意 ProgramData 是隱藏資料夾,注意 [mysqld] 裡的 server-id 預設是 1,主和從必需不一樣

主還要在 [mysqld] 增加 binlog-do-db=bruce_test,bruce_test 為想複製的資料庫名稱,複製時是從當下複製,之前有的不會複製

如果有多個資料庫要複製,要寫多個 k=v,不是加逗號


二、網路

我使用 Oracle VM VirtualBox,必需先 ping 通

網路可以使用橋接介面卡或 NAT,兩個都是主機可上網就可以上網,但使用 NAT 時,虛擬機之間不能連線;而橋接都可以

關防火牆或開 port 使機器可以 ping 通


三、讓從機連主機

※主

SELECT * FROM mysql.user; 

可以看到所有使用者和權限

host 欄位:表示什麼 IP 可以連到 mysql server,預設是 localhost,將想給別人用的帳號(主)的 host 內容改成從的 IP,或者用 %,表示任何 IP 都可以連

plugin 欄位:預設是 caching_sha2_password,改成 mysql_native_password 才能被連



也可以新增使用者,這個使用者是要給從的 mysql 連的帳號

CREATE USER '帳號'@'%' IDENTIFIED BY '密碼';

ALTER USER '帳號'@'%' IDENTIFIED BY '密碼';

GRANT REPLICATION SLAVE ON *.* TO '帳號'@'%';

ALTER USER 'aaa'@'%' IDENTIFIED WITH mysql_native_password BY 'aaa';


update mysql.user set host='%' where user='root'; //aaa

show variables like '%safe_updates%';

SET SQL_SAFE_UPDATES=0;  // 預設安全性是開的(1),所以不能下修改的語法

FLUSH PRIVILEGES; // 改完後要重整

show master status; // 每次 flush privileges 後會不一樣


從機會用到 File 和 Position 欄位,Binlog_Do_DB 是要複製的資料庫、Binlog_Ignore_DB 是要忽略的資料庫


※從

從機打指令要下如下的語法才能連

mysql -uroot -p -h192.168.1.104 -P3306 --default-auth=mysql_native_password

mysql 指令在安裝目錄底下的 bin,也可增加環境變數

我的在 C:\Program Files\MySQL\MySQL Server 8.0\bin

有些語法在這一版還能用,但已經 deprecated 了,下面的語法,有註解的是 deprecated

// stop slave;
stop replica;


// change master to master_host='192.168.1.104',master_port=3306,master_user='bbb',master_password='bbb',master_log_file='BRUCE-HOME-bin.000015',master_log_pos=2357;

// 用 SOURCE_USER 和 SOURCE_PASSWORD 會有警告
CHANGE REPLICATION SOURCE to SOURCE_HOST='192.168.1.104',SOURCE_PORT=3306,SOURCE_USER='bbb',SOURCE_PASSWORD='bbb',SOURCE_LOG_FILE='BRUCE-HOME-bin.000015',SOURCE_LOG_POS=2357;

CHANGE REPLICATION SOURCE to SOURCE_HOST='192.168.1.104',SOURCE_PORT=3306,SOURCE_LOG_FILE='主的 FIle',SOURCE_LOG_POS=主的 Position;

// start slave;
start replica USER='bbb' PASSWORD='bbb';

show slave status; // 命令提示字元最後加個 \G,會比較好看
Slave_IO_Running 和 Slave_SQL_Running 為 Yes 就正確了
Slave_SQL_Running 為 No,通常都是 SOURCE_LOG_FILE、SOURCE_LOG_POS 不正確,要對應主的設定
Slave_IO_Running 為 Connecting 通常都是連線不正確,密碼錯誤、網路問題,還有主的一定要改成 mysql_native_password

如果有錯 last_sql_error、last_io_error 可以看到錯誤訊息
有錯要改必需先 stop replica --> 修改 --> start replica


主從複製在主機新增資料庫、表並 insert,從機也能看到就正確了,而在從機做的只有在從機能看到

2021年1月16日 星期六

SpringBoot 整合 Flyway

 maven:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>


yml:

spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/flyway_db?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC
username: root
password: 123456
jpa:
show-sql: true
flyway:
enabled: true # flyway 的開關,一關就等同沒有 flyway
url: ${spring.datasource.url}
user: ${spring.datasource.username}
password: ${spring.datasource.password}
locations: classpath:db/migration # 預設會在這個路徑找 sql 檔,多個可用逗號隔開
check-location: true
encoding: utf-8 # 預設就是 utf-8
table: flyway_schema_history #預設就是這張表,可以改

baseline-on-migrate: true # 如果 table 的表已有,又改了表,在資料庫就會有兩張表,這時就要為 true
baseline-version: 62 # baseline-on-migrate true ,且真的有執行才有用,預設是 1
#table version 欄位,會從這個版本開始往上增加,<=這個版本的sql不會執行


預設在 class 下(src/main/resources) 要有 db/migration,想改照上面的圖改就可以了,裡面的檔案要照一定的格式才可以使用 flyway,不照做在啟動時就會報錯


flyway有兩個版本,commity 和 teams,teams 要付錢

分成 V、U、R,但 U 要付錢的版本才能用,V 和 U 後接版本號,然後再接兩個底線,內容放資料庫的操作

springboot 啟動後就會執行裡面的東西,預設會先創建 flyway_schema_history,想改照上面的 yml 改就行

※以 V 來說會執行數字最小的,然後一直往數字大的執行,可以跳號

※執行到錯誤就停止或執行到最新的一筆

※flyway_schema_history 裡的東西不能改,一啟會報錯,而且還不好抓錯誤

※db/migration 的檔名一執行過就不要改了,一啟動也會報錯,但可以用 flyway repair 後再執行可以解決,下面會說明怎麼安裝

※但 db/migration 檔案裡的內容不在 flyway 的控管範圍,假設用 flyway 創建了一張表,然後自己去資料庫改了欄位名稱,只要在新的內容裡對應好就不會報錯,只是失去了版本控管的意義而已


flyway 指令

官網下載好後解壓,以 windows 為例

conf 可以設定資料庫連線,設定四個就可以玩了,flyway.url   flyway.driver  flyway.user  flyway.password,前面的 # 是註解,要拿掉

在這個資料夾的同一層有 flyway 用在linux    flyway.cmd 用在windows,linux 要在前面加「./」就可以用這個指令了,想在認何地方用這個指令,要自己加環境變數


clean 會將 flyway_schema_history 所在的所有 table,不管是不是版控裡建的,都會drop 掉,可怕的指令

info 會將 flyway_schema_history 表列出來

baseline 和上面的 yml 的作用一樣

repair 最常用的一個指令,如有錯時,大部分都用這個指令,然後再執行就可以解決大部分的事

github 連結


2021年1月11日 星期一

Springboot 整合 XXL Job

文檔連結
下載連結(2.2版)
重大提示:
v2.1.0 移除 quartz 依賴   
v2.2.0 移除 JobHanler,用 @XxlJob 替代
下載後,執行 doc\db 裡的 SQL
xxl-job-admin 的 application.properties,資料庫連線相關的設定一下

doc/db/tables_xxl_job.sql 裡的腳本要先執行

以下為官網說明截取的:
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
    :xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
    :xxl-job-executor-sample-spring:Spring版本,通过Spring容器管理执行器,比较通用;
    :xxl-job-executor-sample-frameless:无框架版本;

先啟動 xxl-job-admin 調度中心,再啟動 executor-samples,如用 sprinboot 就啟動 springboot
http://localhost:8080/xxl-job-admin 預設帳密 admin/123456



至少要有一個執行器,在任務管理新增的時候會用到,綠框有很多功能,舊版的左邊有分執行一次和 cron 的,新版的全部都用 cron 了,且 cron 也有工具,點一點就生成了

2021年1月9日 星期六

反向代理、負載均衡、動靜分離 (nginx 三)

 http {

#負載均衡

upstream clusterNacos {

#負載策略

預設什麼都不寫是輪詢,按時間順序逐一分配,如果伺服器當機,也能自動跳過

weight; #預設為1,數字越大分配的越多

ip_hash; #一個ip固定一個後端伺服器

fair; #後端回應短的優先分配

server 127.0.0.1:9000;

server 127.0.0.1:9001;

server 127.0.0.1:9002;

}


server {

listen 9003;

server_name localhost;

location / {

proxy_pass http://clusterNacos;

}

}

#反向代理

server {

listen 9004;

server_name localhost;

location ~ /xxx/ {

proxy_pass http://127.0.0.1:9003;

}

location ~ /ooo/ {

proxy_pass http://127.0.0.1:9004;

}

}

#動靜分離

server {

listen 9005;

server_name localhost;

location /www/ {

index.html;

}

location /image/ {

root /jpg;

autoindex on;

}

}

}

Sentinel ( SpringCloud 2.x 九)

和 Nacos 一樣,要先下載 sentinel 並啟動,以 1.8 為例

下載連結

下載 sentinel-dashboard-1.8.0.jar 之後,是個 jar 檔,用以下指令啟動:

java -jar -Dserver.port=8080 sentinel-dashboard-1.8.0.jar #-Dserver.port 預設就是8080

登入 localhost:8080,帳密預設都是 sentinel,想改可再加 -D

-Dsentinel.dashboard.auth.username=sentinel

-Dsentinel.dashboard.auth.password=123456

文檔連結


然後在瀏覽器打 localhost:port 加上帳密就可以進去了,但要先有請求,左邊才會長出來讓你設定
所以要在專案增加 maven 和設定

pom.xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

application.yml
server:
port: 8056
spring:
cloud:
sentinel:
transport:
port: 8719
dashboard: localhost:9090 #對應 sentinel port

寫個 controller 並請求,sentinel 的左邊就長出來了;如果没有請求,預設是懶加載,如下的圖,綠框不會出現
如果不想懶加載,可用 spring.cloud.sentinel.eager=true,這時綠框出來了,但最後是(0/1),但只有欄位名而已,如 資源名、通過 QPS…等,如下圖,所以還是要有請求才能做限流







※綠框是長出來的樣子,點擊簇鏈路會出現如上的樣子,四個按鈕對應左邊的選項,是一樣的功能


※流控規則



資源名:如 GetMapping 裡的路徑,包括「/」
針對來源:可針對微服務做限流,寫微服務名,全部都限流就寫 default
閾值類型:QPS 才有最下面的流控效果;線程數只有快速失敗
單機閾值:數字,如 QPS 又寫了2,表示一秒超過兩個請求就會限流,至於哪種限流,要看流控效果,被限流時,網頁會顯示「Blocked by Sentinel (flow limiting)」
線程數+單機閾值為 1 表示線程只有 1 個,如果線程第 1 個還沒處理完又來一個請求,就會限流,可以在方法加 sleep 來試


※關聯


※如上圖,/testRelated 如果每秒超過1個請求,那 /testSentinel 就不能訪問


※鏈路

※如上圖,/testChain1 如果呼叫資源 abcdef,那每秒超過1個請求就會限流
abcdef 是寫在註解上的,這個註解只能放在方法上,blockHandler 是失敗時呼叫的方法
@SentinelResource(value = "abcdef", blockHandler = "chainHandler")

※但使用鏈路時還得抓 maven 和設定,版本用自己下載 sentinel 的版本
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-web-servlet</artifactId>
<version>1.8.0</version>
</dependency>
https://github.com/alibaba/Sentinel/issues/1213
官網說可以用 spring.cloud.sentinel.web-context-unify=false,但我一開始試沒有用,只有用這個網址 main 方法裡的 sentinelFilterRegistration方法才可以
後來發現父 POM 的 spring-cloud-alibaba-dependencies 版本是 2.2.1.RELEASE,下載的 sentinel 是 1.7.1 的,但我用的是 1.8,我改成 2.2.2.RELEASE,會變成 1.8 版本的,這時候就好使了




※預熱


原碼找 WarmUpController,codeFactor 是寫死的3

以此例來說,官網說一開始是 6/3,每秒超過2個請求就會限流,經過5秒後,每秒超過6個請求才會限流,但我沒試出來


※排隊等待


排隊等待會用平均的速度對待每個 request
1000(毫秒數) / 單機閾值,如果寫 1 就是每秒;寫 2 就是每 500 毫秒,依此類推
此例就是平均每秒 1 個 request,超過 5 秒就放棄
單機閾值不能 > 1000


2020年11月13日 星期五

Nacos ( SpringCloud 2.x 八)

下載nacos
下解解壓後,bin 下有開啟和關閉nacos的程式,副檔名cmd用在windows;sh用在linux
有兩種模式,cluster 和 standalone,預設使用cluster,如果什麼都不做直接啟動會失敗(需要有conf/cluster.conf),改成 standalone才可以啟動,以 windows當例子,打開start.cmd,如下修改即可:
紅框是nacos的判斷,只有兩種,copy到綠框改一下即可
啟動後,開啟 localhost:8848/nacos,預設的帳號密碼都是 nacos,想改密碼如下操作:

點擊權限控制的用戶列表,然後對使用者按修改可改密碼
綠框是改界面的語言



<modules>
    <module>DiscoveryConsumer</module>
    <module>DiscoveryProvider</module>
</modules>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.5.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>bruce.home</groupId>
<artifactId>SpringCloudPractice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>SpringCloudPractice</name>
<description>Demo project for Spring Boot</description>
    
<properties>
    <java.version>11</java.version>
    <spring-cloud.version>Hoxton.SR4</spring-cloud.version>
    <nacos.version>2.2.3.RELEASE</nacos.version>
</properties>
    
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>${nacos.version}</version>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>${nacos.version}</version>
        </dependency>
    
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.16</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

主pom下有兩個module
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>
    
<dependencies>
    <!--<dependency>-->
    <!--    <groupId>com.alibaba.cloud</groupId>-->
    <!--    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
    <!--</dependency>-->
    
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

兩個子pom內容一樣


子專按的 spring-boot-start-web 一定要有,否則不會註冊到 nacos,如果註冊成功會在控制台顯示
當然yml也要設定

也可以在nacos控制台看

服務名是 spring.application.name




※改變資料庫

內鍵的資料庫是derby,可以換成 mysql,打開 conf/application.properties,將底下的五行註解打開,帳密資料庫名稱修改一下即可!然後將conf/nacos-mysql.sql 執行到自己的資料庫,結果如下兩張圖,控制台可看到差異




※集群設定
集群至少要三個以上(含)才可以,且一定不能是內鍵資料庫,不然就不能共享了
conf/cluster.conf.example 修改或新增一個檔案成為 cluster.conf,內容如下:

127.0.0.1:9000
127.0.0.1:9001
127.0.0.1:9002

然後將整個 nacos 複製成三份,然後改變 application.properties 的 port 成為以上三個 port
最後用類似 nginx 這種負載均衡的軟體來轉發,nginx.conf 如下,只貼最重要的部分:
http {
        upstream clusterNacos {
server 127.0.0.1:9000;
server 127.0.0.1:9001;
server 127.0.0.1:9002;
}

server {
listen 9003;
server_name localhost;
location / {
proxy_pass http://clusterNacos;
}
}
}

使用 localhost:9003/nacos 就會轉發三台了,「集群管理/節點列表」可看到結果

源碼請看github

Lombok 的 builder 繼承

@Data
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true)
public class Me extends Father {
    private String color;
}

@Data
@EqualsAndHashCode(callSuper = true)
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
@ToString(callSuper = true)
public class Father extends GrandFather {
    private int id;
}

@Data
@SuperBuilder
@AllArgsConstructor
@NoArgsConstructor
public class GrandFather {
    private int age;
}

// test
Me me = Me.builder()
			.color("red")
			.id(555)
			.age(78)
			.build();
	System.out.println(me);
	System.out.println(me.getColor());
	System.out.println(me.getAge());

※必需使用 @SuperBuilder 註解,父子類都要,使用 1.18.16 版本測試的