主頁 > 資料庫 > Mariadb之主從復制的讀寫分離

Mariadb之主從復制的讀寫分離

2020-09-12 00:43:38 資料庫

  首先我們來回顧下代理的概念,所謂代理就是指的是一端面向客戶端,另外一端面向服務端,代理客戶端訪問服務端,我們把這種代理叫正向代理;代理服務端回應客戶端我們叫做反向代理,這個我們在之前nginx系列博客中闡述過這樣的概念;不管是正向代理還是反向代理他們都是代理,他們都有一個共同點就是代表一端(客戶端/服務端)訪問或回應另一端;簡單講代理就是即充當服務端角色又充當客戶端角色;在mariadb的主從復制集群中,讀的能力被擴展了,而寫的能力始終沒有被擴展;這樣一來對于主服務器就存在單點的問題,通常除了做雙主可解決主節點單點的問題,我們還可以給主節點做高可用;而對于mariadb的主從復制集群來講,雖然讀的能力提升了,但通常情況后端資料庫服務器是直接面向程式,這意味著程式要知道讀請求和寫請求該發往不同的資料庫服務器上;在用戶發來讀請求,這個程式它會分析用戶的請求,然后把用戶的請求代理到后端server上;也就是說我們需要一個程式能夠決議用戶的讀寫操作,把對應的操作代理到后端不同的節點上;這樣一來用戶的讀操作始終均衡的被調度到從節點,寫操作調度到主節點;proxysql這款軟體就有我們上面說的功能,它能夠將用戶發來的讀寫操作,通過proxysql的陳述句路由,把對應請求分別發送到不同節點執行;如下圖所示:

  從上面的圖片可以看到,proxysql就是一代理,面向程式它就是一資料庫服務器,程式把讀操作和寫操作都發送給它,然后proxysql通過我們定義的路由規則,把對應陳述句再代理到不同的后端主從架構節點上執行;接下來我們來看看proxysql的配置和使用吧;以下實驗室基于mariadb的主從復制集群上做的,有關主從復制的配置請參考https://www.cnblogs.com/qiuhom-1874/tag/mariadb%E4%B8%BB%E4%BB%8E%E5%A4%8D%E5%88%B6/;

  1、安裝proxysql(添加yum源,直接用yum安裝)

  2、查看proxysql的簡介

[root@lxc ~]# yum info proxysql
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Available Packages
Name        : proxysql
Arch        : x86_64
Version     : 2.0.12
Release     : 1
Size        : 9.8 M
Repo        : proxysql_repo/7
Summary     : A high-performance MySQL proxy
URL         : https://proxysql.com/
License     : GPL+
Description : A high-performance MySQL proxy

[root@lxc ~]# 

  提示:如果添加了yum直接yum info proxysql能夠看到以上資訊,表示我們添加到yum源已經生效;

  3、安裝proxysql

[root@lxc ~]# yum install proxysql
Loaded plugins: fastestmirror
proxysql_repo                                                                                                                                 | 2.9 kB  00:00:00     
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package proxysql.x86_64 0:2.0.12-1 will be installed
--> Processing Dependency: libgnutls.so.28(GNUTLS_3_1_0)(64bit) for package: proxysql-2.0.12-1.x86_64
--> Processing Dependency: libgnutls.so.28(GNUTLS_3_0_0)(64bit) for package: proxysql-2.0.12-1.x86_64
--> Processing Dependency: gnutls for package: proxysql-2.0.12-1.x86_64
--> Processing Dependency: libgnutls.so.28(GNUTLS_1_4)(64bit) for package: proxysql-2.0.12-1.x86_64
--> Processing Dependency: libgnutls.so.28()(64bit) for package: proxysql-2.0.12-1.x86_64
--> Running transaction check
---> Package gnutls.x86_64 0:3.3.29-9.el7_6 will be installed
--> Processing Dependency: trousers >= 0.3.11.2 for package: gnutls-3.3.29-9.el7_6.x86_64
--> Processing Dependency: libnettle.so.4()(64bit) for package: gnutls-3.3.29-9.el7_6.x86_64
--> Processing Dependency: libhogweed.so.2()(64bit) for package: gnutls-3.3.29-9.el7_6.x86_64
--> Running transaction check
---> Package nettle.x86_64 0:2.7.1-8.el7 will be installed
---> Package trousers.x86_64 0:0.3.14-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================================================================================================
 Package                              Arch                               Version                                     Repository                                 Size
=====================================================================================================================================================================
Installing:
 proxysql                             x86_64                             2.0.12-1                                    proxysql_repo                             9.8 M
Installing for dependencies:
 gnutls                               x86_64                             3.3.29-9.el7_6                              base                                      680 k
 nettle                               x86_64                             2.7.1-8.el7                                 base                                      327 k
 trousers                             x86_64                             0.3.14-2.el7                                base                                      289 k

Transaction Summary
=====================================================================================================================================================================
Install  1 Package (+3 Dependent packages)

Total download size: 11 M
Installed size: 41 M
Is this ok [y/d/N]: y
Downloading packages:
(1/4): gnutls-3.3.29-9.el7_6.x86_64.rpm                                                                                                       | 680 kB  00:00:00     
(2/4): nettle-2.7.1-8.el7.x86_64.rpm                                                                                                          | 327 kB  00:00:00     
(3/4): trousers-0.3.14-2.el7.x86_64.rpm                                                                                                       | 289 kB  00:00:00     
warning: /var/cache/yum/x86_64/7/proxysql_repo/packages/proxysql-2.0.12-1-centos7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 79953b49: NOKEYMB  00:00:04 ETA 
Public key for proxysql-2.0.12-1-centos7.x86_64.rpm is not installed
(4/4): proxysql-2.0.12-1-centos7.x86_64.rpm                                                                                                   | 9.8 MB  00:28:05     
---------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                6.7 kB/s |  11 MB  00:28:05     
Retrieving key from https://repo.proxysql.com/ProxySQL/repo_pub_key
Importing GPG key 0x79953B49:
 Userid     : "rene cannnao (Proxysql Repository) <[email protected]>"
 Fingerprint: 1448 bf69 3ca6 00c7 99eb 9358 04a5 62fb 7995 3b49
 From       : https://repo.proxysql.com/ProxySQL/repo_pub_key
Is this ok [y/N]: y
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : trousers-0.3.14-2.el7.x86_64                                                                                                                      1/4 
  Installing : nettle-2.7.1-8.el7.x86_64                                                                                                                         2/4 
  Installing : gnutls-3.3.29-9.el7_6.x86_64                                                                                                                      3/4 
  Installing : proxysql-2.0.12-1.x86_64                                                                                                                          4/4 
warning: group proxysql does not exist - using root
warning: group proxysql does not exist - using root
Created symlink from /etc/systemd/system/multi-user.target.wants/proxysql.service to /etc/systemd/system/proxysql.service.
  Verifying  : gnutls-3.3.29-9.el7_6.x86_64                                                                                                                      1/4 
  Verifying  : proxysql-2.0.12-1.x86_64                                                                                                                          2/4 
  Verifying  : nettle-2.7.1-8.el7.x86_64                                                                                                                         3/4 
  Verifying  : trousers-0.3.14-2.el7.x86_64                                                                                                                      4/4 

Installed:
  proxysql.x86_64 0:2.0.12-1                                                                                                                                         

Dependency Installed:
  gnutls.x86_64 0:3.3.29-9.el7_6                         nettle.x86_64 0:2.7.1-8.el7                         trousers.x86_64 0:0.3.14-2.el7                        

Complete!
[root@lxc ~]# 

  提示:除此以上方式安裝proxysql,當然也可以直接使用wget 去github上的專案地址下載

[root@lxc ~]# wget https://github.com/sysown/proxysql/releases/download/v2.0.12/proxysql-2.0.12-1-centos7.x86_64.rpm

  提示:下載好proxysql 包后,然后通過yum直接安裝即可;推薦使用yum來安裝下載好的包,它可以解決依賴關系,不推薦使用rpm 安裝;

  4、查看proxysql包安裝的檔案串列

[root@lxc ~]# rpm -ql proxysql
/etc/logrotate.d/proxysql
/etc/proxysql.cnf
/etc/systemd/system/proxysql-initial.service
/etc/systemd/system/proxysql.service
/usr/bin/proxysql
/usr/share/proxysql/tools/proxysql_galera_checker.sh
/usr/share/proxysql/tools/proxysql_galera_writer.pl
[root@lxc ~]# 

  提示:從上面的資訊可以看到proxysql的組態檔是/etc/proxysql.cnf,二進制檔案是/usr/bin/proxysql,unit file是/etc/systemd/system/proxysql.service

  5、配置proxysql

[root@lxc ~]# cat /etc/proxysql.cnf
########################################################################################

datadir="/var/lib/proxysql"
errorlog="/var/lib/proxysql/proxysql.log"

admin_variables=
{
        admin_credentials="admin:admin"
#       mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
        mysql_ifaces="0.0.0.0:6033"
#       refresh_interval=2000
#       debug=true
}

mysql_variables=
{
        threads=4
        max_connections=2048
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
#       interfaces="0.0.0.0:6033;/tmp/proxysql.sock"
        interfaces="0.0.0.0:3306"
        default_schema="information_schema"
        stacksize=1048576
        server_version="5.5.30"
        connect_timeout_server=3000
# make sure to configure monitor username and password
# https://github.com/sysown/proxysql/wiki/Global-variables#mysql-monitor_username-mysql-monitor_password
        monitor_username="monitor"
        monitor_password="monitor"
        monitor_history=600000
        monitor_connect_interval=60000
        monitor_ping_interval=10000
        monitor_read_only_interval=1500
        monitor_read_only_timeout=500
        ping_interval_server_msec=120000
        ping_timeout_server=500
        commands_stats=true
        sessions_sort=true
        connect_retries_on_failure=10
}


# defines all the MySQL servers
mysql_servers =
(
        {
                address = "192.168.0.22" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
                port = 3306           # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
                hostgroup = 3           # no default, required
                status = "ONLINE"     # default: ONLINE
                weight = 1            # default: 1
                compression = 0       # default: 0
                max_replication_lag = 10  # default 0 . If greater than 0 and replication lag passes such threshold, the server is shunned
        },
        {
                address = "192.168.0.23" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
                port = 3306           # no default, required . If port is 0 , address is interpred as a Unix Socket Domain
                hostgroup = 4           # no default, required
                status = "ONLINE"     # default: ONLINE
                weight = 1            # default: 1
                compression = 0       # default: 0
                max_replication_lag = 10  # default 0 . If greater than 0 and replication lag passes such threshold, the server is shunned
        }
)


# defines all the MySQL users
mysql_users:
(
        {
                username = "root" # no default , required
                password = "admin123.com" # default: ''
                default_hostgroup = 3 # default: 0
                active = 1            # default: 1
        }
)



#defines MySQL Query Rules
mysql_query_rules:
(
        {
                rule_id=1
                active=1
                match_pattern="^SELECT .* FOR UPDATE$"
                destination_hostgroup=3
                apply=1
        },
        {
                rule_id=2
                active=1
                match_pattern="^SELECT"
                destination_hostgroup=4
                apply=1
        }
)



mysql_replication_hostgroups=
(
        {
                writer_hostgroup=3
                reader_hostgroup=4
                comment="test repl 1"
       }
)

[root@lxc ~]# 

  提示:proxysql組態檔分幾個大段,admin_variables這個段里主要配置管理相關變數,比如管理用戶名和密碼,監聽的地址和埠等等;mysql_variables配置proxysql連接后端mysql相關配置,里面有連接后端的server監聽的埠,執行緒數,最大連接數,以及監控相關引數;mysql_servers配置后端mysql/mariadb服務器的地址埠,以及權重,所屬組等;mysql_users配置連接后端mysql/mariadb所需的賬號和密碼以及默認連接到的組;mysql_query_rules配置查詢規則,那些陳述句是寫操作,那些陳述句是讀操作;mysql_replication_hostgroups配置寫操作對應的組號和讀操作對應組號;這里需要注意一點,如果一個配置段中有多個大括號,相互之間用逗號隔離,如果是最后一個大括號需要把后面的逗號去掉;

  6、在主從復制節點創建上面配置的賬號資訊

  創建root賬號

[root@docker_node01 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 5.5.65-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select user,host,password from mysql.user;
+---------+-------------------+-------------------------------------------+
| user    | host              | password                                  |
+---------+-------------------+-------------------------------------------+
| root    | localhost         |                                           |
| root    | docker\_node01.io |                                           |
| root    | 127.0.0.1         |                                           |
| root    | ::1               |                                           |
| rpluser | 192.168.0.%       | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
+---------+-------------------+-------------------------------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> grant all on *.* to 'root'@'192.168.0.%' identified by 'admin123.com' with grant option;
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> select user,host,password from mysql.user;                                              
+---------+-------------------+-------------------------------------------+
| user    | host              | password                                  |
+---------+-------------------+-------------------------------------------+
| root    | localhost         |                                           |
| root    | docker\_node01.io |                                           |
| root    | 127.0.0.1         |                                           |
| root    | ::1               |                                           |
| rpluser | 192.168.0.%       | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| root    | 192.168.0.%       | *2D9AC2437F9E59A51BE8BA89A3D59E76F32F55E8 |
+---------+-------------------+-------------------------------------------+
6 rows in set (0.00 sec)

MariaDB [(none)]> 

  提示:在主節點創建賬號會自動同步到從節點,所以從節點可以不用再創建;

  創建monitor賬號

MariaDB [(none)]> grant all on *.* to 'monitor'@'192.168.0.%' identified by 'monitor' with grant option;                
Query OK, 0 rows affected (0.01 sec)

MariaDB [(none)]> select user,host,password from mysql.user;                                            
+---------+-------------------+-------------------------------------------+
| user    | host              | password                                  |
+---------+-------------------+-------------------------------------------+
| root    | localhost         |                                           |
| root    | docker\_node01.io |                                           |
| root    | 127.0.0.1         |                                           |
| root    | ::1               |                                           |
| rpluser | 192.168.0.%       | *4ACFE3202A5FF5CF467898FC58AAB1D615029441 |
| root    | 192.168.0.%       | *2D9AC2437F9E59A51BE8BA89A3D59E76F32F55E8 |
| monitor | 192.168.0.%       | *1975D095AC033CAF4E1BF94F7202A9BBFEEB66F1 |
+---------+-------------------+-------------------------------------------+
7 rows in set (0.00 sec)

MariaDB [(none)]> 

  7、啟動proxysql

  提示:可以看到我們配置的proxysql管理端監聽在6033,啟動4個執行緒來連接后端mariadb服務器,對應的埠都已經處于監聽狀態了;

  8、連接管理埠

[root@lxc ~]# mysql -uadmin -padmin -h192.168.0.21 -P6033
ERROR 1040 (42000): User 'admin' can only connect locally
[root@lxc ~]# mysql -uadmin -padmin -h127.0.0.1 -P6033   
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 7
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> 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.001 sec)

MySQL [(none)]> 

  提示:管理介面默認只能本地連接,但是我們配置管理介面監聽在本機所有地址上,所以連接時指定主機地址要使用127.0.0.1才可以,如果使用localhost,它默認會通過sock檔案去連接;從上面的結果可以看到,在proxysql上有5個庫,其中main庫主要存放我們剛才配置相關的表在里面;如下

MySQL [(none)]> use main
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [main]> show tables;
+----------------------------------------------------+
| tables                                             |
+----------------------------------------------------+
| global_variables                                   |
| mysql_aws_aurora_hostgroups                        |
| mysql_collations                                   |
| mysql_firewall_whitelist_rules                     |
| mysql_firewall_whitelist_sqli_fingerprints         |
| mysql_firewall_whitelist_users                     |
| mysql_galera_hostgroups                            |
| mysql_group_replication_hostgroups                 |
| mysql_query_rules                                  |
| mysql_query_rules_fast_routing                     |
| mysql_replication_hostgroups                       |
| mysql_servers                                      |
| mysql_users                                        |
| proxysql_servers                                   |
| restapi_routes                                     |
| runtime_checksums_values                           |
| runtime_global_variables                           |
| runtime_mysql_aws_aurora_hostgroups                |
| runtime_mysql_firewall_whitelist_rules             |
| runtime_mysql_firewall_whitelist_sqli_fingerprints |
| runtime_mysql_firewall_whitelist_users             |
| runtime_mysql_galera_hostgroups                    |
| 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_restapi_routes                             |
| runtime_scheduler                                  |
| scheduler                                          |
+----------------------------------------------------+
32 rows in set (0.001 sec)

MySQL [main]> select * from mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 3            | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.23 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2 rows in set (0.001 sec)

MySQL [main]> 

  提示:main庫中的表以runtime開頭的表示當前生效的配置,如果我們要運行時修改配置,我們需要先修改不是runtime開頭的表,然后通過load 加載到runtime開頭的表中,然后在save存盤到檔案;

  proxysql的多層配置系統

+-------------------------+
|         RUNTIME         |
+-------------------------+
       /|\          |
        |           |
    [1] |       [2] |
        |          \|/
+-------------------------+
|         MEMORY          |
+-------------------------+ _
       /|\          |      |\
        |           |        \
    [3] |       [4] |         \ [5]
        |          \|/         \
+-------------------------+  +-------------------------+
|          DISK           |  |       CONFIG FILE       |
+-------------------------+  +-------------------------+

  提示:從上面的圖可以看到proxysql的配置系統分三層,最上面一層是runtime層,該層主要是說通過讀取第二層的memory層,而memory主要通過disk或configfile層來獲取配置;第一次啟動proxysql時,它會從config file層讀取組態檔內容到memory層,然后runtime層讀取memory層,隨后我們就可以通過修改memory層,然后通過load加載到runtime層,或者save存盤到disk層;

  在各層間移動配置

MySQL user相關操作:
	LOAD MYSQL USERS FROM MEMORY / LOAD MYSQL USERS TO RUNTIME
	將MySQL user從記憶體資料庫加載到運行時資料結構,反之亦然
	SAVE MYSQL USERS TO MEMORY / SAVE MYSQL USERS FROM RUNTIME
	將MySQL user從運行時持久化到記憶體資料庫
	LOAD MYSQL USERS TO MEMORY / LOAD MYSQL USERS FROM DISK
	將持久化的MySQL user從磁盤資料庫加載到記憶體資料庫
  	SAVE MYSQL USERS FROM MEMORY / SAVE MYSQL USERS TO DISK
	將MySQL user從記憶體資料庫持久化到磁盤資料庫
	LOAD MYSQL USERS FROM CONFIG
	從組態檔中將MySQL user加載到記憶體資料庫中

MySQL server相關操作:
	LOAD MYSQL SERVERS FROM MEMORY / LOAD MYSQL SERVERS TO RUNTIME
	將MySQL server從記憶體資料庫加載到運行時
	SAVE MYSQL SERVERS TO MEMORY / SAVE MYSQL SERVERS FROM RUNTIME
	將MySQL server從運行時持久化到記憶體資料庫
	LOAD MYSQL SERVERS TO MEMORY / LOAD MYSQL SERVERS FROM DISK
	將MySQL server從磁盤資料庫加載到記憶體資料庫
	SAVE MYSQL SERVERS FROM MEMORY / SAVE MYSQL SERVERS TO DISK
	將MySQL server從記憶體資料庫持久化到磁盤資料庫
	LOAD MYSQL SERVERS FROM CONFIG
	從組態檔將服務器加載到記憶體資料庫中

MySQL query rules相關操作:
	LOAD MYSQL QUERY RULES FROM MEMORY / LOAD MYSQL QUERY RULES TO RUNTIME
	將MySQL查詢規則從記憶體資料庫加載到運行時資料結構
	SAVE MYSQL QUERY RULES TO MEMORY / SAVE MYSQL QUERY RULES FROM RUNTIME
	將MySQL查詢規則從運行時資料結構持久化到記憶體資料庫
	LOAD MYSQL QUERY RULES TO MEMORY / LOAD MYSQL QUERY RULES FROM DISK
	將MySQL查詢規則從磁盤資料庫加載到記憶體資料庫
	SAVE MYSQL QUERY RULES FROM MEMORY / SAVE MYSQL QUERY RULES TO DISK
	將MySQL查詢規則從記憶體資料庫持久化到磁盤資料庫
	LOAD MYSQL QUERY RULES FROM CONFIG
	從組態檔查詢規則加載到記憶體資料庫中

MySQL variables相關操作:
	LOAD MYSQL VARIABLES FROM MEMORY / LOAD MYSQL VARIABLES TO RUNTIME
	將MySQL變數從記憶體資料庫加載到運行時資料結構
	SAVE MYSQL VARIABLES FROM MEMORY / SAVE MYSQL VARIABLES TO DISK
	將MySQL變數從記憶體資料庫持久化到磁盤資料庫
	LOAD MYSQL VARIABLES TO MEMORY / LOAD MYSQL VARIABLES FROM DISK
	將MySQL變數從磁盤資料庫加載到記憶體資料庫
	SAVE MYSQL VARIABLES TO MEMORY / SAVE MYSQL VARIABLES FROM RUNTIME
	將MySQL變數從運行時資料結構持久存盤到記憶體資料庫中
	LOAD MYSQL VARIABLES FROM CONFIG
	將組態檔變數加載到記憶體資料庫中

admin variables相關操作:
	LOAD ADMIN VARIABLES FROM MEMORY / LOAD ADMIN VARIABLES TO RUNTIME
	將記憶體資料庫中的管理變數加載到運行時
	SAVE ADMIN VARIABLES TO MEMORY / SAVE ADMIN VARIABLES FROM RUNTIME
	將管理變數從運行時持久化到記憶體資料庫
	LOAD ADMIN VARIABLES TO MEMORY / LOAD ADMIN VARIABLES FROM DISK
	將管理變數從磁盤資料庫加載到記憶體資料庫
	SAVE ADMIN VARIABLES FROM MEMORY / SAVE ADMIN VARIABLES TO DISK
	將管理變數從記憶體資料庫持久化到磁盤資料庫
	LOAD ADMIN VARIABLES FROM CONFIG
	將組態檔管理變數加載到記憶體資料庫中


注意:以上命令允許使用以下快捷方式:
MEM for MEMORY
RUN for RUNTIME

例如,這兩個命令是等效的:
SAVE ADMIN VARIABLES TO MEMORY
SAVE ADMIN VARIABLES TO MEM

  提示:以上命令在配置更改加載到RUNTIME之前不會激活任何修改,也就是說只有runtime中的配置生效;

  測驗:在線增加后端mysql server的地址

[root@lxc ~]# mysql -uadmin -padmin -h127.0.0.1 -P6033
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.30 (ProxySQL Admin Module)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> select * from mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 3            | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.23 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2 rows in set (0.001 sec)

MySQL [(none)]> insert into mysql_servers values (4,'192.168.0.21',3307,0,'ONLINE',1,0,1000,10,0,0,'');
Query OK, 1 row affected (0.001 sec)

MySQL [(none)]> select * from mysql_servers;                                                           
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 3            | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.23 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.21 | 3307 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.001 sec)

MySQL [(none)]> 

  提示:以上操作只在memory層中修改,并未加載到runtime,所以在runtime_mysql_servers表中還是兩臺后端server

  加載mysql server memory層到runtime層

MySQL [(none)]> show tables;
+----------------------------------------------------+
| tables                                             |
+----------------------------------------------------+
| global_variables                                   |
| mysql_aws_aurora_hostgroups                        |
| mysql_collations                                   |
| mysql_firewall_whitelist_rules                     |
| mysql_firewall_whitelist_sqli_fingerprints         |
| mysql_firewall_whitelist_users                     |
| mysql_galera_hostgroups                            |
| mysql_group_replication_hostgroups                 |
| mysql_query_rules                                  |
| mysql_query_rules_fast_routing                     |
| mysql_replication_hostgroups                       |
| mysql_servers                                      |
| mysql_users                                        |
| proxysql_servers                                   |
| restapi_routes                                     |
| runtime_checksums_values                           |
| runtime_global_variables                           |
| runtime_mysql_aws_aurora_hostgroups                |
| runtime_mysql_firewall_whitelist_rules             |
| runtime_mysql_firewall_whitelist_sqli_fingerprints |
| runtime_mysql_firewall_whitelist_users             |
| runtime_mysql_galera_hostgroups                    |
| 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_restapi_routes                             |
| runtime_scheduler                                  |
| scheduler                                          |
+----------------------------------------------------+
32 rows in set (0.001 sec)

MySQL [(none)]> select * from runtime_mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 3            | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.23 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
2 rows in set (0.006 sec)

MySQL [(none)]> select * from mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 3            | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.23 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.21 | 3307 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.001 sec)

MySQL [(none)]> load mysql servers to runtime; 
Query OK, 0 rows affected (0.015 sec)

MySQL [(none)]> select * from runtime_mysql_servers;
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| hostgroup_id | hostname     | port | gtid_port | status | weight | compression | max_connections | max_replication_lag | use_ssl | max_latency_ms | comment |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
| 3            | 192.168.0.22 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.21 | 3307 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
| 4            | 192.168.0.23 | 3306 | 0         | ONLINE | 1      | 0           | 1000            | 10                  | 0       | 0              |         |
+--------------+--------------+------+-----------+--------+--------+-------------+-----------------+---------------------+---------+----------------+---------+
3 rows in set (0.006 sec)

MySQL [(none)]> 

  提示:可以看到執行load操作后,runtime_mysql_servers就加載進去了;此時我們就把memory層的資訊加載到runtime層生效了;

  驗證:通過連接proxysql所在主機的3306埠,執行寫操作,看看是否能夠同步到其他從節點?

  提示:可以看到在proxysql所在主機連接3306執行緒,是可以連接到主庫,因為默認配置連接是到主庫,然后在其上創建一個mydb的資料庫,也能夠及時的同步到其他從庫;

  測驗:讀寫操作是否分別調度到不同的節點上?

[root@lxc ~]# for i in {1..10} ;do mysql -uroot -padmin123.com -P3306 -h192.168.0.21 -e "select @@server_id" ; done
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           2 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           3 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           3 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           3 |
+-------------+
[root@lxc ~]# for i in {1..10} ;do mysql -uroot -padmin123.com -P3306 -h192.168.0.21 -e "select @@server_id for update" ; done
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
+-------------+
| @@server_id |
+-------------+
|           1 |
+-------------+
[root@lxc ~]# 

  提示:可以看到當執行有寫鎖時,就立刻把操作調度到server_id=1的主庫上去操作;讀操作是隨機調度到各個節點上進行處理;

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/8687.html

標籤:MySQL

上一篇:MySQL學習筆記(16):命令列工具

下一篇:Mysql的學習

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more