MySQL8.0--------高達300萬QPS泰坦實踐

背景

MySQL 8.0 正式版 8.0.11 已發佈,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,還帶來了大量的改進和更快的性能!

升級至MySQL8.0

從 MySQL 5.7 升級到 MySQL 8.0 僅支持通過使用 in-place 方式進行升級,並且不支持從 MySQL 8.0 降級到 MySQL 5.7(或從某個 MySQL 8.0 版本降級到任意一個更早的 MySQL 8.0 版本)。唯一受支持的替代方案是在升級之前對數據進行備份。

新特性與改進

  • 性能:

    MySQL 8.0 的速度要比 MySQL 5.7 快 2 倍。MySQL 8.0 在以下方面帶來了更好的性能:讀/寫工作負載、IO 密集型工作負載、以及高競爭("hot spot"熱點競爭問題)工作負載。

  • NoSQL

    MySQL 從 5.7 版本開始提供 NoSQL 存儲功能,目前在 8.0 版本中這部分功能也得到了更大的改進。該項功能消除了對獨立的 NoSQL 文檔數據庫的需求,而 MySQL 文檔存儲也爲 schema-less 模式的 JSON 文檔提供了多文檔事務支持和完整的 ACID 合規性。

  • 窗口函數(Window Functions)

    從 MySQL 8.0 開始,新增了一個叫窗口函數的概念,它可以用來實現若干新的查詢方式。窗口函數與 SUM()、COUNT() 這種集合函數類似,但它不會將多行查詢結果合併爲一行,而是將結果放回多行當中。即窗口函數不需要 GROUP BY

  • 隱藏索引

    在 MySQL 8.0 中,索引可以被“隱藏”和“顯示”。當對索引進行隱藏時,它不會被查詢優化器所使用。我們可以使用這個特性用於性能調試,例如我們先隱藏一個索引,然後觀察其對數據庫的影響。如果數據庫性能有所下降,說明這個索引是有用的,然後將其“恢復顯示”即可;如果數據庫性能看不出變化,說明這個索引是多餘的,可以考慮刪掉。

  • 降序索引

    MySQL 8.0 爲索引提供按降序方式進行排序的支持,在這種索引中的值也會按降序的方式進行排序。

  • 通用表表達式(Common Table Expressions CTE)

    在複雜的查詢中使用嵌入式表時,使用 CTE 使得查詢語句更清晰。

  • UTF-8 編碼

    從 MySQL 8 開始,使用 utf8mb4 作爲 MySQL 的默認字符集。

  • JSON

    MySQL 8 大幅改進了對 JSON 的支持,添加了基於路徑查詢參數從 JSON 字段中抽取數據的 JSON_EXTRACT() 函數,以及用於將數據分別組合到 JSON 數組和對象中的 JSON_ARRAYAGG() 和 JSON_OBJECTAGG() 聚合函數。

  • 可靠性

    InnoDB 現在支持表 DDL 的原子性,也就是 InnoDB 表上的 DDL 也可以實現事務完整性,要麼失敗回滾,要麼成功提交,不至於出現 DDL 時部分成功的問題,此外還支持 crash-safe 特性,元數據存儲在單個事務數據字典中。

  • 高可用性(High Availability)

    InnoDB 集羣爲您的數據庫提供集成的原生 HA 解決方案。

  • 安全性

    對 OpenSSL 的改進、新的默認身份驗證、SQL 角色、密碼強度、授權。

下載地址

安裝實踐

環境

[root@sea_bj_master ~]# cat /etc/redhat-release 
CentOS Linux release 7.3.1611 (Core)

[root@sea_bj_master ~]# uname -r
3.10.0-514.21.1.el7.x86_64

下載

[root@sea_bj_master ~]# cd /usr/local/src/

[root@sea_bj_master src]# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar
--2018-06-05 00:19:12--  https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.11-linux-glibc2.12-x86_64.tar

創建mysql用戶名與用戶組

[root@sea_bj_master src]# useradd -r -s /sbin/nologin -c 'mysql application run user'  mysql

解壓MySQL壓縮包,並將解壓包移動至/usr/local目錄下

[root@sea_bj_master src]# tar xf mysql-8.0.11-linux-glibc2.12-x86_64.tar

[root@sea_bj_master src]# ll mysql-*8.0.11-linux-glibc2.12-x86_64.tar*
-rw-r--r-- 1 root root  654131200 Apr  8 14:30 mysql-8.0.11-linux-glibc2.12-x86_64.tar
-rw-r--r-- 1 7161 31415 603019898 Apr  8 16:29 mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz
-rw-r--r-- 1 7161 31415  51099557 Apr  8 16:27 mysql-test-8.0.11-linux-glibc2.12-x86_64.tar.gz

[root@sea_bj_master src]# tar xf mysql-8.0.11-linux-glibc2.12-x86_64.tar.gz 

[root@sea_bj_master src]# mv mysql-8.0.11-linux-glibc2.12-x86_64 /usr/local/ -v
‘mysql-8.0.11-linux-glibc2.12-x86_64’ -> ‘/usr/local/mysql-8.0.11-linux-glibc2.12-x86_64’

創建軟連接, 方便今後升級本體程序不影響配置文件

[root@sea_bj_master src]# ln -s /usr/local/mysql-8.0.11-linux-glibc2.12-x86_64 /usr/local/mysql -v
‘/usr/local/mysql’ -> ‘/usr/local/mysql-8.0.11-linux-glibc2.12-x86_64’

創建MySQL數據導入/導出數據專放目錄文件夾, 修改權限

[root@sea_bj_master src]# mkdir -v /usr/local/mysql/mysql-files
mkdir: created directory ‘/usr/local/mysql/mysql-files’

創建數據文件夾

[root@sea_bj_master src]# mkdir /application/mysql/data -v
mkdir: created directory ‘/application/mysql/data’

修改MySQL目錄所有者和所有組

[root@sea_bj_master src]# chown root.mysql -R /usr/local/mysql-8.0.11-linux-glibc2.12-x86_64

修改 MySQL 數據目錄與 數據導入/導出專放目錄的所屬用戶與所屬組

[root@sea_bj_master src]# chown mysql.mysql -R /application/mysql/data /usr/local/mysql/mysql-files -v
ownership of ‘/application/mysql/data’ retained as mysql:mysql
ownership of ‘/usr/local/mysql/mysql-files’ retained as mysql:mysql

重命名不使用系統自帶 MySQL 配置文件 /etc/my.cnf [ debian類系統在 /etc/mysql/my.cnf ]

[root@sea_bj_master src]# mv /etc/my.cnf{,.old} -v
mv: overwrite ‘/etc/my.cnf.old’? y
‘/etc/my.cnf’ -> ‘/etc/my.cnf.old’

初始化

[root@sea_bj_master src]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/application/mysql/data --basedir=/usr/local/mysql
2018-06-04T16:32:33.389541Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.11) initializing of server in progress as process 681
2018-06-04T16:32:39.406682Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: mD4Tbl#0d8:W
2018-06-04T16:32:42.307915Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.11) initializing of server has completed

啓動ssl連接(可選)

[root@sea_bj_master src]# /usr/local/mysql/bin/mysql_ssl_rsa_setup --user=mysql --datadir=/application/mysql/data --basedir=/usr/local/mysql

創建啓動腳本[systemd]

[root@sea_bj_master src]# cat /usr/lib/systemd/system/mysqld.service 
#  
# Simple MySQL systemd service file  
#  
# systemd supports lots of fancy features, look here (and linked docs) for a full list:   
#   http://www.freedesktop.org/software/systemd/man/systemd.exec.html  
#  
# Note: this file ( /usr/lib/systemd/system/mysql.service )  
# will be overwritten on package upgrade, please copy the file to   
#  
#  /etc/systemd/system/mysql.service   
#    
# to make needed changes.  
#   
# systemd-delta can be used to check differences between the two mysql.service files.  
#  

[Unit]  
Description=MySQL Community Server  
After=network.target  
After=syslog.target  

[Install]  
WantedBy=multi-user.target  
Alias=mysql.service  

[Service]  
User=mysql  
Group=mysql  

# Execute pre and post scripts as root  
PermissionsStartOnly=true  

# Needed to create system tables etc.  
#ExecStartPre=/usr/bin/mysql-systemd-start pre  

# Start main service  
ExecStart=/usr/local/mysql/bin/mysqld_safe  

# Don't signal startup success before a ping works  
#ExecStartPost=/usr/bin/mysql-systemd-start post  

# Give up if ping don't get an answer  
TimeoutSec=600  

Restart=always  
PrivateTmp=false

systemd加載啓動配置文件

[root@sea_bj_master src]# systemctl daemon-reload

創建MySQL配置文件my.cnf, 指定數據目錄

[root@sea_bj_master src]# cat /etc/my.cnf
[mysqld]
user = mysql
bind_address = 0.0.0.0
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
datadir = /application/mysql/data

啓動MySQL服務

[root@sea_bj_master src]# systemctl start mysqld
[root@sea_bj_master src]# systemctl status mysqld
● mysqld.service - MySQL Community Server
   Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled; vendor preset: disabled)
   Active: active (running) since Tue 2018-06-05 00:42:23 CST; 5s ago
 Main PID: 2273 (mysqld_safe)
   CGroup: /system.slice/mysqld.service
           ├─2273 /bin/sh /usr/local/mysql/bin/mysqld_safe
           └─2424 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/application/mysql/data --plugin...

Jun 05 00:42:23 sea_bj_master systemd[1]: Started MySQL Community Server.
Jun 05 00:42:23 sea_bj_master systemd[1]: Starting MySQL Community Server...
Jun 05 00:42:23 sea_bj_master mysqld_safe[2273]: 2018-06-04T16:42:23.125697Z mysqld_safe Logging to '/applicati...rr'.
Jun 05 00:42:23 sea_bj_master mysqld_safe[2273]: 2018-06-04T16:42:23.144258Z mysqld_safe Starting mysqld daemon...data
Hint: Some lines were ellipsized, use -l to show in full.

連接MySQL服務並修改初始密碼

[root@sea_bj_master src]# mysql -p'mD4Tbl#0d8:W'
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.11

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql> set password = '123';
Query OK, 0 rows affected (0.04 sec)

mysql> \s
--------------
mysql  Ver 8.0.11 for linux-glibc2.12 on x86_64 (MySQL Community Server - GPL)

Connection id:      8
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     8.0.11
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:        /tmp/mysql.sock
Uptime:         1 min 0 sec

Threads: 2  Questions: 7  Slow queries: 0  Opens: 238  Flush tables: 2  Open tables: 73  Queries per second avg: 0.116
--------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章