MySQL中間件之ProxySQL(2):初試讀寫分離

来源:https://www.cnblogs.com/f-ck-need-u/archive/2018/07/07/9278839.html
-Advertisement-
Play Games

1.實現一個簡單的讀寫分離 這裡通過一個簡單的示例實現ProxySQL的讀寫分離功能,算是ProxySQL的快速入門。即使是快速入門,需要配置的內容也很多,包括:後端MySQL配置、監控配置、發送SQL語句的用戶、SQL語句的路由規則。所以,想要實現一個ProxySQL+MySQL,即使只實現最基本 ...


1.實現一個簡單的讀寫分離

這裡通過一個簡單的示例實現ProxySQL的讀寫分離功能,算是ProxySQL的快速入門。即使是快速入門,需要配置的內容也很多,包括:後端MySQL配置、監控配置、發送SQL語句的用戶、SQL語句的路由規則。所以,想要實現一個ProxySQL+MySQL,即使只實現最基本的功能,步驟也是挺多的,不過配置的邏輯都很簡單。

實驗環境:

角色 主機IP server_id 數據狀態
Proxysql 192.168.100.21 null
Master 192.168.100.22 110 剛安裝的全新MySQL實例
Slave1 192.168.100.23 120 剛安裝的全新MySQL實例
Slave2 192.168.100.24 130 剛安裝的全新MySQL實例

為了演示完整的過程,這裡把後端MySQL主從複製的基本配置步驟也列出來了。如瞭解配置過程,可跳過主從配置的部分。

註意點:slave節點需要設置read_only=1。如果後端是PXC/MGR/MariaDB Galera,則無需手動設置,因為會自動設置。

1.1 配置後端的主從複製

提供3個MySQL節點的配置文件。

# 以下是Master的配置文件
[mysqld]
datadir=/data
socket=/data/mysql.sock
server-id=110            
log-bin=/data/master-bin 
sync-binlog=1            
log-error=/data/error.log
pid-file=/data/mysqld.pid


# 以下是slave1的配置文件
[mysqld]
datadir=/data
socket=/data/mysql.sock  
server-id=120            
relay_log=/data/relay-log
log-error=/data/error.log
pid-file=/data/mysqld.pid
read_only=1

# 以下是slave2的配置文件
[mysqld]
datadir=/data
socket=/data/mysql.sock
server-id=130            
relay_log=/data/relay-log
log-error=/data/error.log
pid-file=/data/mysqld.pid
read_only=1

為3個MySQL節點提供數據目錄/data

mkdir /data
chown -R mysql.mysql /data

初始化三個MySQL節點。

mysqld --initialize-insecure --user=mysql --datadir=/data

啟動3個MySQL節點的mysqld服務。

systemctl start mysqld

連上master,修改root密碼,創建用於複製的用戶repl。

# 以下在master上執行
mysql> alter user root@localhost identified by 'P@ssword1!';

mysql> create user repl@'192.168.100.%' identified by 'P@ssword1!';
mysql> grant replication slave on *.* to repl@'192.168.100.%';

連上兩個slave,開啟複製線程。

# 以下在兩個slave節點上都執行
change master to 
    master_host='192.168.100.22',
    master_user='repl',
    master_password='P@ssword1!',
    master_port=3306,
    master_log_file='master-bin.000001',
    master_log_pos=4;

start slave;

如此配置之後,3個MySQL節點就保持了同步。

1.2 向ProxySQL中添加MySQL節點

首先啟動ProxySQL。

service proxysql start

啟動後會監聽兩個埠,預設為6032和6033。6032埠是ProxySQL的管理埠,6033是ProxySQL對外提供服務的埠。

[root@s1 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
tcp        0      0 0.0.0.0:6032   0.0.0.0:*        LISTEN  1231/proxysql   
tcp        0      0 0.0.0.0:6033   0.0.0.0:*        LISTEN  1231/proxysql   
tcp        0      0 0.0.0.0:22     0.0.0.0:*        LISTEN  1152/sshd       
tcp        0      0 127.0.0.1:25   0.0.0.0:*        LISTEN  2151/master     
tcp6       0      0 :::22          :::*             LISTEN  1152/sshd       
tcp6       0      0 ::1:25         :::*             LISTEN  2151/master  

然後使用mysql客戶端連接到ProxySQL的管理介面(admin interface),該介面的預設管理員用戶和密碼都是admin。

[root@s1 ~]# mysql -uadmin -padmin -P6032 -h127.0.0.1 --prompt 'admin> '

我這裡重新設置了提示符。

admin> show databases;
+-----+---------------+-------------------------------------+
| seq | name          | file                                |
+-----+---------------+-------------------------------------+
| 0   | main          |                                     |
| 2   | disk          | /var/lib/proxysql/proxysql.db       |
| 3   | stats         |                                     |
| 4   | monitor       |                                     |
| 5   | stats_history | /var/lib/proxysql/proxysql_stats.db |
+-----+---------------+-------------------------------------+
5 rows in set (0.00 sec)

ProxySQL提供了幾個庫,每個庫都有各自的意義。本文只是快速入門文章,不會詳細介紹每個庫中的每個表以及每個欄位,不過在接下來的文章中,我會詳細介紹到每個欄位,因為每個欄位都重要。

在本文,主要修改main和monitor資料庫中的表。

admin> show tables from main;
+--------------------------------------------+
| tables                                     |
+--------------------------------------------+
| global_variables                           |
| mysql_collations                           |
| mysql_group_replication_hostgroups         |
| mysql_query_rules                          |
| mysql_query_rules_fast_routing             |
| mysql_replication_hostgroups               |
| mysql_servers                              |
| mysql_users                                |
| proxysql_servers                           |
| runtime_checksums_values                   |
| runtime_global_variables                   |
| runtime_mysql_group_replication_hostgroups |
| runtime_mysql_query_rules                  |
| runtime_mysql_query_rules_fast_routing     |
| runtime_mysql_replication_hostgroups       |
| runtime_mysql_servers                      |
| runtime_mysql_users                        |
| runtime_proxysql_servers                   |
| runtime_scheduler                          |
| scheduler                                  |
+--------------------------------------------+

admin> show tables from monitor;
+------------------------------------+
| tables                             |
+------------------------------------+
| mysql_server_connect_log           |
| mysql_server_group_replication_log |
| mysql_server_ping_log              |
| mysql_server_read_only_log         |
| mysql_server_replication_lag_log   |
+------------------------------------+

runtime_開頭的是運行時的配置,這些是不能修改的。要修改ProxySQL的配置,需要修改了非runtime_表,修改後必須執行LOAD ... TO RUNTIME才能載入到RUNTIME生效,執行save ... to disk才能將配置持久化保存到磁碟。具體操作見後文。

insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.22',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.23',3306);
insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.24',3306);

註:上面語句中沒有先切換到main庫也執行成功了,因為ProxySQL內部使用的SQLite3資料庫引擎,和MySQL的解析方式是不一樣的。即使執行了USE main語句也是無任何效果的,但不會報錯。

查看這3個節點是否插入成功,以及它們的狀態。請認真讀一讀每個欄位的名稱,混個眼熟。

admin> select * from mysql_servers\G
*************************** 1. row ***************************
       hostgroup_id: 10
           hostname: 192.168.100.22
               port: 3306
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 1000
max_replication_lag: 0
            use_ssl: 0
     max_latency_ms: 0
            comment: 
*************************** 2. row ***************************
       hostgroup_id: 10
           hostname: 192.168.100.23
               port: 3306
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 1000
max_replication_lag: 0
            use_ssl: 0
     max_latency_ms: 0
            comment: 
*************************** 3. row ***************************
       hostgroup_id: 10
           hostname: 192.168.100.24
               port: 3306
             status: ONLINE
             weight: 1
        compression: 0
    max_connections: 1000
max_replication_lag: 0
            use_ssl: 0
     max_latency_ms: 0
            comment: 
3 rows in set (0.00 sec)

修改後,載入到RUNTIME,並保存到disk。

load mysql servers to runtime;
save mysql servers to disk;

1.3 監控後端MySQL節點

添加節點之後,還需要監控後端節點。對於後端是主從複製的環境來說,這是必須的,因為ProxySQL需要通過每個節點的read_only值來自動調整它們是屬於讀組還是寫組。

首先在後端master節點上創建一個用於監控的用戶名(只需在master上創建即可,因為會複製到slave上),這個用戶名只需具有USAGE許可權即可。如果還需要監控複製結構中slave是否嚴重延遲於master(先混個眼熟:這個俗語叫做"拖後腿",術語叫做"replication lag"),則還需具備replication client許可權。這裡直接賦予這個許可權。

# 在master上執行:
mysql> create user monitor@'192.168.100.%' identified by 'P@ssword1!';
mysql> grant replication client on *.* to monitor@'192.168.100.%';

然後回到ProxySQL上配置監控。

set mysql-monitor_username='monitor';
set mysql-monitor_password='P@ssword1!';

以上設置實際上是在修改global_variables表,它和下麵兩個語句是等價的:

UPDATE global_variables SET variable_value='monitor'
 WHERE variable_name='mysql-monitor_username';

UPDATE global_variables SET variable_value='P@ssword1!'
 WHERE variable_name='mysql-monitor_password';

修改後,載入到RUNTIME,並保存到disk。

load mysql variables to runtime;
save mysql variables to disk;

驗證監控結果:ProxySQL監控模塊的指標都保存在monitor庫的log表中。

以下是連接是否正常的監控(對connect指標的監控):(在前面可能會有很多connect_error,這是因為沒有配置監控信息時的錯誤,配置後如果connect_error的結果為NULL則表示正常)

admin> select * from mysql_server_connect_log;
+----------------+------+------------------+-------------------------+---------------+
| hostname       | port | time_start_us    | connect_success_time_us | connect_error |
+----------------+------+------------------+-------------------------+---------------+
| 192.168.100.22 | 3306 | 1530968712977867 | 4174                    | NULL          |
| 192.168.100.23 | 3306 | 1530968712988986 | 4908                    | NULL          |
| 192.168.100.24 | 3306 | 1530968713000074 | 3044                    | NULL          |
| 192.168.100.22 | 3306 | 1530968772978982 | 3407                    | NULL          |
| 192.168.100.23 | 3306 | 1530968772989627 | 3404                    | NULL          |
| 192.168.100.24 | 3306 | 1530968773000778 | 3444                    | NULL          |
+----------------+------+------------------+-------------------------+---------------+

以下是對心跳信息的監控(對ping指標的監控):

admin> select * from mysql_server_ping_log;       
+----------------+------+------------------+----------------------+-------------+
| hostname       | port | time_start_us    | ping_success_time_us | ping_error  |
+----------------+------+------------------+----------------------+-------------+
| 192.168.100.22 | 3306 | 1530968712666540 | 452                  | NULL        |
| 192.168.100.23 | 3306 | 1530968712668779 | 458                  | NULL        |
| 192.168.100.24 | 3306 | 1530968712671541 | 324                  | NULL        |
| 192.168.100.22 | 3306 | 1530968722667071 | 1190                 | NULL        |
| 192.168.100.23 | 3306 | 1530968722669574 | 1162                 | NULL        |
| 192.168.100.24 | 3306 | 1530968722673162 | 1380                 | NULL        |
| 192.168.100.22 | 3306 | 1530968732668840 | 1065                 | NULL        |
| 192.168.100.23 | 3306 | 1530968732670709 | 1054                 | NULL        |
| 192.168.100.24 | 3306 | 1530968732672703 | 1040                 | NULL        |
+----------------+------+------------------+----------------------+-------------+

但是,read_only和replication_lag的監控日誌都為空。

admin> select * from mysql_server_read_only_log;
Empty set (0.00 sec)

admin> select * from mysql_server_replication_lag_log;
Empty set (0.00 sec)

這是因為還沒有對ProxySQL中的節點分組:writer_hostgroup、reader_hostgroup。設置分組信息,需要修改的是main庫中的mysql_replication_hostgroups表,該表只有3個欄位:第一個欄位名為writer_hostgroup,第二個欄位為reader_hostgroup,第三個欄位為註釋欄位,可隨意寫。

例如,指定寫組的id為10,讀組的id為20。

insert into mysql_replication_hostgroups values(10,20);

在該配置載入到RUNTIME生效之前,先查看下各mysql server所在的組。

admin> select hostgroup_id,hostname,port,status,weight from mysql_servers; 
+--------------+----------------+------+--------+--------+
| hostgroup_id | hostname       | port | status | weight |
+--------------+----------------+------+--------+--------+
| 10           | 192.168.100.22 | 3306 | ONLINE | 1      |
| 10           | 192.168.100.23 | 3306 | ONLINE | 1      |
| 10           | 192.168.100.24 | 3306 | ONLINE | 1      |
+--------------+----------------+------+--------+--------+

3個節點都在hostgroup_id=10的組中。

現在,將剛纔mysql_replication_hostgroups表的修改載入到RUNTIME生效。

load mysql servers to runtime;
save mysql servers to disk;

一載入,Monitor模塊就會開始監控後端的read_only值,當監控到read_only值後,就會按照read_only的值將某些節點自動移動到讀/寫組。

例如,此處所有節點都在id=10的寫組,slave1和slave2都是slave,它們的read_only=1,這兩個節點將會移動到id=20的組。如果一開始這3節點都在id=20的讀組,那麼移動的將是Master節點,會移動到id=10的寫組。

看結果:

admin> select hostgroup_id,hostname,port,status,weight from mysql_servers;
+--------------+----------------+------+--------+--------+
| hostgroup_id | hostname       | port | status | weight |
+--------------+----------------+------+--------+--------+
| 10           | 192.168.100.22 | 3306 | ONLINE | 1      |
| 20           | 192.168.100.23 | 3306 | ONLINE | 1      |
| 20           | 192.168.100.24 | 3306 | ONLINE | 1      |
+--------------+----------------+------+--------+--------+
admin> select * from mysql_server_read_only_log;
+----------------+------+------------------+-----------------+-----------+--------+
| hostname       | port | time_start_us    | success_time_us | read_only | error  |
+----------------+------+------------------+-----------------+-----------+--------+
| 192.168.100.22 | 3306 | 1530970372197917 | 8487            | 0         | NULL   |
| 192.168.100.23 | 3306 | 1530970372198992 | 7907            | 1         | NULL   |
| 192.168.100.24 | 3306 | 1530970372199835 | 8064            | 1         | NULL   |
| 192.168.100.22 | 3306 | 1530970373698824 | 10078           | 0         | NULL   |
| 192.168.100.23 | 3306 | 1530970373699825 | 9845            | 1         | NULL   |
| 192.168.100.24 | 3306 | 1530970373700786 | 10745           | 1         | NULL   |
+----------------+------+------------------+-----------------+-----------+--------+

1.4 配置mysql_users

上面的所有配置都是關於後端MySQL節點的,現在可以配置關於SQL語句的,包括:發送SQL語句的用戶、SQL語句的路由規則、SQL查詢的緩存、SQL語句的重寫等等。

本小節是SQL請求所使用的用戶配置,例如root用戶。這要求我們需要先在後端MySQL節點添加好相關用戶。這裡以root和sqlsender兩個用戶名為例。

首先,在master節點上執行:(只需master執行即可,會複製給兩個slave)

grant all on *.* to root@'192.168.100.%' identified by 'P@ssword1!';
grant all on *.* to sqlsender@'192.168.100.%' identified by 'P@ssword1!';

然後回到ProxySQL,配置mysql_users表,將剛纔的兩個用戶添加到該表中。

insert into mysql_users(username,password,default_hostgroup) values('root','P@ssword1!',10);
insert into mysql_users(username,password,default_hostgroup) values('sqlsender','P@ssword1!',10);
load mysql users to runtime;
save mysql users to disk;

mysql_users表有不少欄位,最主要的三個欄位為usernamepassworddefault_hostgroup

  • username:前端連接ProxySQL,以及ProxySQL將SQL語句路由給MySQL所使用的用戶名。
  • password:用戶名對應的密碼。可以是明文密碼,也可以是hash密碼。如果想使用hash密碼,可以先在某個MySQL節點上執行select password(PASSWORD),然後將加密結果複製到該欄位。
  • default_hostgroup:該用戶名預設的路由目標。例如,指定root用戶的該欄位值為10時,則使用root用戶發送的SQL語句預設情況下將路由到hostgroup_id=10組中的某個節點。
admin> select * from mysql_users\G
*************************** 1. row ***************************
              username: root
              password: P@ssword1!
                active: 1            #  註意本行
               use_ssl: 0
     default_hostgroup: 10
        default_schema: NULL
         schema_locked: 0
transaction_persistent: 1            #  註意本行
          fast_forward: 0
               backend: 1
              frontend: 1
       max_connections: 10000
*************************** 2. row ***************************
              username: sqlsender
              password: P@ssword1!
                active: 1
               use_ssl: 0
     default_hostgroup: 10
        default_schema: NULL
         schema_locked: 0
transaction_persistent: 1
          fast_forward: 0
               backend: 1
              frontend: 1
       max_connections: 10000

雖然本文不詳細介紹mysql_users表,但上面標註了"註意本行"的兩個欄位必須要引起註意。

只有active=1的用戶才是有效的用戶。

至於transaction_persistent欄位,當它的值為1時,表示事務持久化:當某連接使用該用戶開啟了一個事務後,那麼在事務提交/回滾之前,所有的語句都路由到同一個組中,避免語句分散到不同組。在以前的版本中,預設值為0,不知道從哪個版本開始,它的預設值為1。我們期望的值為1,所以在繼續下麵的步驟之前,先查看下這個值,如果為0,則執行下麵的語句修改為1。

update mysql_users set transaction_persistent=1 where username='root';
update mysql_users set transaction_persistent=1 where username='sqlsender';
load mysql users to runtime;
save mysql users to disk;

然後,另開一個終端,分別使用root用戶和sqlsender用戶測試下它們是否能路由到預設的hostgroup_id=10(它是一個寫組)讀、寫數據。

[root@s1 ~]# mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
|         110 |
+-------------+

[root@s1 ~]# mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e "create database proxy_test"

[root@s1 ~]# mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e "show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| proxy_test         |
| sys                |
+--------------------+

[root@s1 ~]# mysql -usqlsender -pP@ssword1! -P6033 -h127.0.0.1 -e '\
                        use proxy_test;\
                        create table t(id int);' 

[root@s1 ~]# mysql -usqlsender -pP@ssword1! -P6033 -h127.0.0.1 -e 'show tables from proxy_test;'
+-------------------------+
| Tables_in_proxy_test    |
+-------------------------+
| t                       |
+-------------------------+

1.5 讀寫分離:配置路由規則

ProxySQL的路由規則非常靈活,可以基於用戶、基於schema以及基於每個語句實現路由規則的定製。

本文作為入門文章,實現一個最簡單的語句級路由規則,從而實現讀寫分離。必須註意,這隻是實驗,實際的路由規則絕不應該僅根據所謂的讀、寫操作進行分離,而是從各項指標中找出壓力大、執行頻繁的語句單獨寫規則、做緩存等等

和查詢規則有關的表有兩個:mysql_query_rulesmysql_query_rules_fast_routing,後者是前者的擴展表,1.4.7之後才支持該快速路由表。本文只介紹第一個表。

插入兩個規則,目的是將select語句分離到hostgroup_id=20的讀組,但由於select語句中有一個特殊語句SELECT...FOR UPDATE它會申請寫鎖,所以應該路由到hostgroup_id=10的寫組。

insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply)
VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),
       (2,1,'^SELECT',20,1);

load mysql query rules to runtime;
save mysql query rules to disk;

select ... for update規則的rule_id必須要小於普通的select規則的rule_id,因為ProxySQL是根據rule_id的順序進行規則匹配的。

再來測試下,讀操作是否路由給了hostgroup_id=20的讀組。

[root@s1 ~]# mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e 'select @@server_id'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|         120 |
+-------------+

[root@s1 ~]# mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e 'select @@server_id'
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------+
| @@server_id |
+-------------+
|         130 |
+-------------+

讀操作已經路由給讀組,再看看寫操作。這裡以事務持久化進行測試。

[root@s1 ~]# mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e '\
                        start transaction;\
                        select @@server_id;\
                        commit;\
                        select @@server_id;'

+-------------+
| @@server_id |
+-------------+
|         110 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|         120 |
+-------------+

顯然,一切都按照預期進行。

最後,如果想查看路由的信息,可查詢stats庫中的stats_mysql_query_digest表。以下是該表的一個輸出格式示例(和本文無關)。

admin> SELECT hostgroup hg,
              sum_time,
              count_star,
              digest_text 
       FROM stats_mysql_query_digest
       ORDER BY sum_time DESC;
+----+----------+------------+-------------------------------------------------------------+
| hg | sum_time | count_star | digest_text                                                 |
+----+----------+------------+-------------------------------------------------------------+
| 2  | 14520738 | 50041      | SELECT c FROM sbtest1 WHERE id=?                            |
| 1  | 3142041  | 5001       | COMMIT                                                      |
| 1  | 2270931  | 5001       | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? ORDER BY c |
| 1  | 2021320  | 5003       | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+?            |
| 1  | 1768748  | 5001       | UPDATE sbtest1 SET k=k+? WHERE id=?                         |
| 1  | 1697175  | 5003       | SELECT SUM(K) FROM sbtest1 WHERE id BETWEEN ? AND ?+?       |
| 1  | 1346791  | 5001       | UPDATE sbtest1 SET c=? WHERE id=?                           |
| 1  | 1263259  | 5001       | DELETE FROM sbtest1 WHERE id=?                              |
| 1  | 1191760  | 5001       | INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?, ?, ?)     |
| 1  | 875343   | 5005       | BEGIN                                                       |
+----+----------+------------+-------------------------------------------------------------+

至此,MySQL的讀寫分離嘗鮮結束。該系列後面的文章將詳細介紹ProxySQL的各個方面。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第11章 示波器設計—功能模塊劃分 二代示波器的界面上做了五個按鈕,分別用於不同功能的配置,本章節就為大家講解這五個按鈕實現的功能。 11.1 主界面上的五個按鈕 11.2 Measure測量功能 11.3 ADC電壓測量功能 11.4 DAC信號發生器 11.5 Math數字信號處理 11.6 S ...
  • 說明:1、emWin底層中最重要的一個優化就是16bpp繪製,特此為其增加DMA加速,已經支持RA8875和ili9488。2、使用中務必將emWin任務設置為除了空閑任務,統計任務以外的最低優先順序,這樣就可以有效的發揮DMA的優勢,CPU可以解放出來處理其他任務。操作說明:1. 所有界面支持按鍵操 ...
  • 方法一:在/usr/share/applications/目錄下創建 .desktop文件,其中Icon 和 Exec是指向啟動圖標和啟動文件。 方法二:使用 gnome-desktop-item-edit 創建快捷方式。 1. 未安裝的先安裝gnome-desktop-item-edit, Ubu ...
  • Dockerfile 語法 1.ADD ADD命令有兩個參數,源和目標。它的基本作用是從源系統的文件系統上複製文件到目標容器的文件系統。如果源是一個URL,那該URL的內容將被下載並複製到容器中 2.ENTRYPOINT 配置容器啟動後執行的命令,並且不可被 docker run 提供的參數覆蓋,每 ...
  • 主要: 基礎 基本概念 1) 資料庫分類 層次資料庫,網狀資料庫,關係資料庫 常見:SQL Server, Oracle,infomix,sybase,ibmDB2,Mysql 2)資料庫存儲的本質和表現: 存儲本質: 將 數據值 通過數據管理系統進行有序的存儲 存儲表現: 每個資料庫對應一個文件夾 ...
  • 1 . Hive 命令行 輸入$HIVE_HOME/bin/hive –H 或者 –help 可以顯示幫助選項: 說明: 1、 -i 初始化 HQL 文件。 2、 -e 從命令行執行指定的 HQL 3、 -f 執行 HQL 腳本 4、 -v 輸出執行的 HQL 語句到控制台 5、 -p <port> ...
  • 在以前,資料庫的集群配置一直很難,難點在於MySQL主從結構的高可用和讀寫分離。萬幸的是,Galera/GR的出現,讓整個集群的配置都極大程度地簡化了。 以下是一個簡單的MySQL集群拓撲圖: 1.MySQL中間件:對MySQL Server的讀寫操作進行路由(即讀寫分離);分庫分表(shardin ...
  • 1. Load 在將數據載入到表中時,Hive 不會進行任何轉換。載入操作是將數據文件移動到與 Hive表對應的位置的純複製/移動操作。 語法結構: 說明: 1、 filepath 相對路徑,例如:project/data1 絕對路徑,例如:/user/hive/project/data1 完整 U ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...