MySQL-CentOS 7.5 中 MySQL 5.7 的多實例部署

CentOS 7.5 中 MySQL 5.7 的多實例部署(基於 mysqld)

1. 準備工作

1.1 創建 mysql 用戶

使用如下命令創建 mysql 用戶和 mysql 用戶組。執行完 useradd -g mysql mysql 命令後,會在 mysql 用戶組中新增 mysql 用戶,同時在 /home 目錄下會新增 mysql 用戶目錄。mysql 用戶主要用於各個 MySQL 實例的初始化。

# 創建 mysql 用戶組
groupadd mysql

# 向 mysql 用戶組中新增 mysql 用戶
useradd -g mysql mysql

1.2 下載並解壓 MySQL 5.7 安裝包

使用 mysql 用戶登錄系統,執行如下命令下載並解壓 MySQL 5.7 安裝包,並將其解壓到 /usr/local 目錄

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz

# 解壓 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 文件到 /usr/local/ 目錄
tar zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

# 修改 mysql-5.7.29-linux-glibc2.12-x86_64/ 目錄的所屬用戶爲 mysql,所屬組爲 mysql
cd /usr/local
chown -R mysql.mysql /usr/local/mysql-5.7.29-linux-glibc2.12-x86_64/

1.3 MySQL 環境變量的配置

修改 /etc/profile 文件,配置 MySQL 環境變量。

# 使用 vim 編輯 /etc/profile 文件
vim /etc/profile

# 配置 MySQL 環境變量
export MYSQL_HOME=/usr/local/mysql-5.7.29-linux-glibc2.12-x86_64
export PATH=${MYSQL_HOME}/bin:$PATH

# source 文件,使配置生效
source /etc/profile

2. 初始化 3306 實例

2.1 相關目錄的創建

# 創建 /data/3306 目錄,用於存放 3306 實例的相關數據文件、配置文件、日誌文件
mkdir -vp /data/3306

cd /data/3306
mkdir -v data 	# 創建 /data/3306/data 目錄,用於存放 3306 實例的數據文件
mkdir -v log  	# 創建 /data/3306/log 目錄,用於存放 3306 實例的日誌文件

# 修改 /data 目錄的所屬用戶爲 mysql,所屬組爲 mysql
chown -R mysql.mysql /data

2.2 3306 實例配置文件 my.cnf 的創建

在 /data/3306 目錄下創建 my.cnf 文件,該文件內容如下:

[mysqld]
port=3306
basedir=/usr/local/mysql-5.7.29-linux-glibc2.12-x86_64
datadir=/data/3306/data
socket=/data/3306/mysql.sock
user=mysql
symbolic-links=0

server-id=1
log-bin=mysql-bin
binlog-do-db=oadb
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys

# mysql清除過期日誌的時間,默認值0,不自動清理,而是使用滾動循環的方式。
expire_logs_days=7

#數據庫默認字符集,主流字符集支持一些特殊表情符號(特殊表情符佔用4個字節)
character-set-server=utf8

skip_name_resolve=1

# 最大連接數,可設最大值16384,一般考慮根據同時在線人數設置一個比較綜合的數字,鑑於該數值增大並不太消耗系統資源,建議直接設10000
# 如果在訪問時經常出現Too Many Connections的錯誤提示,則需要增大該參數值
max_connections=10000

# 默認值100,最大錯誤連接數,如果有超出該參數值個數的中斷錯誤連接,則該主機將被禁止連接。如需對該主機進行解禁,執行:FLUSH HOST
# 考慮高併發場景下的容錯,建議加大。
max_connect_errors=10000

# 事務隔離級別,默認爲可重複讀(REPEATABLE-READ)。(此級別下可能參數很多間隙鎖,影響性能,但是修改又影響主從複製及災難恢復,建議還是修改代碼邏輯吧)
# 隔離級別可選項目:READ-UNCOMMITTED  READ-COMMITTED  REPEATABLE-READ  SERIALIZABLE
transaction_isolation=READ-COMMITTED

# 此緩衝被使用來優化全聯合(full JOINs 不帶索引的聯合)
# 類似的聯合在極大多數情況下有非常糟糕的性能表現,但是將此值設大能夠減輕性能影響.
# 通過 “Select_full_join” 狀態變量查看全聯合的數量
# 注意,該緩衝區是每個連接獨佔的,所以總緩衝區大小爲 1M*連接數;極端情況1M*maxconnectiosns,會超級大。所以要考慮日常平均連接數。
# 默認值256kb;建議值:16G內存,設置8M.
join_buffer_size=256KB 

# 內存臨時表的最大值,默認16M,此處設置成128M
tmp_table_size=128M

tmpdir=/tmp

# MySQL默認的wait_timeout  值爲8個小時, interactive_timeout參數需要同時配置才能生效
# MySQL連接閒置超過一定時間後(單位:秒,此處爲1800秒)將會被強行關閉
wait_timeout=3600 

# 爲每個掃描MyISAM的線程分配參數設置的內存大小緩衝區。 
# 默認值128kb,建議值:16G內存建議1M,4G:128kb或者256kb吧
# 注意,該緩衝區是每個連接獨佔的,所以總緩衝區大小爲 128kb*連接數;極端情況128kb*maxconnectiosns,會超級大,所以要考慮日常平均連接數。
# 一般不需要太關心該數值,稍微增大就可以了,
read_buffer_size=256KB 

# 支持任何存儲引擎
# MySQL的隨機讀緩衝區大小,適當增大,可以提高性能。
# 默認值256kb;建議值:得參考連接數,16G內存,有人推薦8M
# 注意,該緩衝區是每個連接獨佔的,所以總緩衝區大小爲128kb*連接數;極端情況128kb*maxconnectiosns,會超級大,所以要考慮日常平均連接數。
read_rnd_buffer_size=256KB

# order by或group by時用到 
# 支持所有引擎,innodb和myisam有自己的innodb_sort_buffer_size和myisam_sort_buffer_size設置
# 默認值256kb;建議值:得參考連接數,16G內存,有人推薦8M.
# 注意,該緩衝區是每個連接獨佔的,所以總緩衝區大小爲 1M*連接數;極端情況1M*maxconnectiosns,會超級大。所以要考慮日常平均連接數。
sort_buffer_size=256KB

# 開啓慢查詢
slow_query_log=1

# 錯誤日誌文件地址
log_error=/data/3306/log/error.log
# 開啓慢查詢時間,此處爲1秒,達到此值才記錄數據
long_query_time=3

# 慢查詢日誌文件地址
slow_query_log_file=/data/3306/log/slow.log

log_queries_not_using_indexes=1
log_slow_admin_statements=1
log_slow_slave_statements=1
log_throttle_queries_not_using_indexes=10
min_examined_row_limit=100
# 是否對sql語句大小寫敏感,默認值爲0,1表示不敏感
lower_case_table_names=1

# 說明:InnoDB使用一個緩衝池來保存索引和原始數據, 不像MyISAM.這裏你設置越大,你在存取表裏面數據時所需要的磁盤I/O越少.
# 在一個獨立使用的數據庫服務器上,你可以設置這個變量到服務器物理內存大小的60%-80%
# 注意別設置的過大,會導致system的swap空間被佔用,導致操作系統變慢,從而減低sql查詢的效率
# 默認值:128M,建議值:物理內存的60%-80%
innodb_buffer_pool_size=1G

# 說明:只有當設置 innodb_buffer_pool_size 值大於1G時纔有意義,小於1G,instances默認爲1,大於1G,instances默認爲8
# 但是網絡上有評價,最佳性能,每個實例至少1G大小。
# 默認值:1或8,建議值:innodb_buffer_pool_size/innodb_buffer_pool_instances >= 1G
innodb_buffer_pool_instances=1

# 在啓動時把熱數據加載到內存。默認值爲on,不修改
innodb_buffer_pool_load_at_startup=1

# 在關閉時把熱數據dump到本地磁盤。默認值爲on,不修改
innodb_buffer_pool_dump_at_shutdown=1

# 說明:影響Innodb緩衝區的刷新算法,建議從小到大配置,直到zero free pages;
# innodb_lru_scan_depth * innodb_buffer_pool_instances defines the amount of work performed by the page cleaner thread each second.
# 默認值1024,建議值: 未知
innodb_lru_scan_depth=1024

# 說明:設置了Mysql後臺任務(例如頁刷新和merge dadta from buffer pool)每秒io操作的上限。
# 默認值:200,建議值:方法一,單盤sata設100,sas10,raid10設200,ssd設2000,fushion-io設50000;方法二,通過測試工具獲得磁盤io性能後,設置IOPS數值/2。
innodb_io_capacity=1000
# 說明:該參數是所有緩衝區線程io操作的總上限。
# 默認值:innodb_io_capacity的兩倍。建議值:例如用iometer測試後的iops數值就好
innodb_io_capacity_max=2000

# 說明:事務等待獲取資源等待的最長時間,單位爲秒,看具體業務情況,一般默認值就好
# 默認值:50,建議值:看業務。
innodb_lock_wait_timeout = 30

innodb_file_format=Barracuda
innodb_file_format_max=Barracuda
innodb_strict_mode=1

# 說明:定義undo使用的回滾段數量。5.7.19後棄用
# 默認值128,建議不動,以後棄用了。
innodb_undo_logs=128

# 說明:日誌文件的大小
# 默認值:48M,建議值:根據你係統的磁盤空間和日誌增長情況調整大小
innodb_log_file_size=128M

# 此參數確定些日誌文件所用的內存大小,以M爲單位。緩衝區更大能提高性能,但意外的故障將會丟失數據。MySQL開發人員建議設置爲1-8M之間
innodb_log_buffer_size=8M

# 默認值爲4,建議不變。InnoDB中的清除操作是一類定期回收無用數據的操作。mysql 5.5之後,支持多線程清除操作。
innodb_purge_threads=4
innodb_large_prefix=1
# 默認設置爲 0,表示不限制併發數,這裏推薦設置爲0,更好去發揮CPU多核處理能力,提高併發量
innodb_thread_concurrency=0
innodb_print_all_deadlocks=1
innodb_sort_buffer_size=16M

[mysqld_safe]

[client]
#數據庫默認字符集,主流字符集支持一些特殊表情符號(特殊表情符佔用4個字節)
character-set-server=utf8

在 my.cnf 文件中,主要配置如下參數:

  • port
  • user

2.3 初始化 3306 實例

在 /home/mysql/ 目錄下創建 sbin 目錄,並在該目錄中創建 init_db.sh 腳本,腳本內容如下:
init_db.sh

#!/bin/bash

INSTANCE_HOME=/data/$1

mysqld --initialize-insecure --user=mysql --datadir=$INSTANCE_HOME/data --basedir=$MYSQL_HOME

使用如下命令執行該腳本,初始化 3306 數據庫實例

sh init_db.sh 3306

2.4 啓動 3306 實例

start_db.sh

#!/bin/bash

INSTANCE_HOME=/data/$1

nohup mysqld_safe --defaults-file=$INSTANCE_HOME/my.cnf --user=mysql --datadir=$INSTANCE_HOME/data --basedir=$MYSQL_HOME --ledir=$MYSQL_HOME/bin --log-error=$INSTANCE_HOME/log/error.log --pid-file=$INSTANCE_HOME/$1.pid > $INSTANCE_HOME/log/nohup.log 2>&1 &

2.5 3306 實例的登錄測試

3. 初始化 3307 實例

CentOS 7 中 MySQL 5.7 多實例部署(基於 mysqld_multi)

1. 準備工作

1.1 下載並解壓MySQL安裝包

MySQL 下載

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz

# 解壓 mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz 文件到 /usr/local/ 目錄
tar zxvf mysql-5.7.28-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

1.2 相關用戶及目錄的創建

# 創建鏈接 /usr/local/mysql,
# 鏈接到實際目錄 /usr/local/mysql-5.7.28-linux-glibc2.12-x86_64/
# 注意 : 這一步必須完成,否則會在後面調用 mysqld_multi 程序時報錯
ln -sv /usr/local/mysql-5.7.28-linux-glibc2.12-x86_64/ /usr/local/mysql

# 創建不可登錄的用戶mysql, 該用戶主要用於各個MySQL實例的初始化,並沒有其他用途
useradd -r -s /sbin/nologin mysql	

# 創建 3306 數據庫實例的數據文件夾
mkdir -vp /data/3306
cd /data/3306
mkdir data log

# 修改 /data 目錄的所屬用戶和組爲 mysql
# 注意 : 這一步必須完成,否則 mysqld_multi
chown -R mysql.mysql /data

1.3 添加 MySQL 環境變量

vim /etc/profile

export MYSQL_HOME=/usr/local/mysql
export PATH=${MYSQL_HOME}/bin:$PATH

source /etc/profile

2. 初始化 3306 實例

2.1 MySQL 配置文件 my.cnf 的準備

在 /etc 目錄中創建 my.cnf 文件,作爲初始化 MySQL 實例時的配置文件,文件內容如下:

# mysqld_multi 程序模塊
[mysqld_multi]
	# mysqld 程序的路徑
mysqld     = /usr/local/mysql/bin/mysqld   
	# mysqladmin 程序的路徑
mysqladmin = /usr/local/mysql/bin/mysqladmin
	# mysqld_multi 程序的日誌的路徑
log        = /data/mysql_multi.log

# mysqld1 程序的路徑,mysqld1 即爲此處初始化的第一個 MySQL 實例,也即 3306 實例
[mysqld1]
	# 設置 3306 實例的數據目錄
datadir = /data/3306/data
	# 設置 3306 實例的 socket 文件名
socket = /data/3306/mysql.sock
	# 設置 3306 實例的端口
port = 3306
	# 設置運行用戶
user = mysql
	# 關閉監控
performance_schema = off
	# 設置 innodb 緩存大小
innodb_buffer_pool_size = 32M
	# 設置監聽地址
bind_address = 0.0.0.0
	# 關閉 DNS 反向解析
skip-name-resolve = 0

2.2 3306 實例初始化

調用 mysqld 程序,進行實例初始化。

mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

實例初始化時相關參數如下:
	--defaults-file=/etc/my.cnf : 指定數據庫實例初始化時的配置文件
	--initialize : 初始化mysql實例
		--initialize 爲安全初始化,初始化時會生成隨機密碼並顯示在log中
		--initialize-insecure 爲非安全初始化,初始化後的實例沒有密碼
	--user=mysql : 指定初始化 MySQL 的用戶
	--basedir=/usr/local/mysql : mysql安裝包所在目錄
	--datadir=/data/3306/data : 設置實例的數據存放目錄

2.3 開啓 3306 實例SSL連接

調用 mysql_ssl_rsa_setup 程序,開啓各個實例的SSL安全連接。

mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/3306/data

開啓實例 SSL 連接時相關參數如下:
	--user=mysql :
	--basedir=/usr/local/mysql :
	--datadir=/data/3306/data :

2.4 多實例管理腳本添加至服務管理

# 複製多實例腳本到服務管理目錄下 [ /etc/init.d/ ]
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi

# 添加腳本執行權限
chmod +x /etc/init.d/mysqld_multi

# mysqld_multi腳本添加至service服務管理
chkconfig --add mysqld_multi

2.5 多實例啓動

/etc/init.d/mysqld_multi report 			# 查看多實例的狀態

/etc/init.d/mysqld_multi start				# 啓動多實例
/etc/init.d/mysqld_multi start 1			# 啓動實例 1, 即 mysqld1

/etc/init.d/mysqld_multi stop				# 關閉多實例(通常不起作用)
killall -u mysql							# 關閉多實例
kill -9	mysql_pid							# 關閉單個mysql實例

netstat -lntp | grep mysqld					# 查看多實例端口狀態
ss -tulpn | grep mysqld						# 查看多實例端口狀態

2.6 3306 實例連接

mysql -uroot -p'wcooqTfm-3t:' -S /data/3306/mysql.sock # 使用初始化實例時生成的隨機密碼登錄實例
set password = '123456';		# 設置root用戶密碼
flush privileges;				# 刷新權限
exit

3. 初始化 3307 實例

3.1 相關目錄的創建

# 創建 3307 數據庫實例的數據文件夾
cd /data
mkdir -v 3307
cd /data/3307
mkdir data log

# 修改 /data/3307 目錄的所屬用戶和組爲 mysql
# 注意 : 這一步必須完成,否則 mysqld_multi
chown -R mysql.mysql /data/3307

3.2 MySQL 配置文件 my.cnf 的準備

修改 /etc/my.cnf 文件,在文件末尾添加如下內容

[mysqld2]
datadir = /data/3307/data
socket = /data/3307/mysql.sock
port = 3307
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0

3.3 3307 實例初始化

調用 mysqld 程序,進行實例初始化。

mysqld --defaults-file=/etc/my.cnf --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data

3.4 開啓實例SSL連接

調用 mysql_ssl_rsa_setup 程序,開啓各個實例的SSL安全連接。

mysql_ssl_rsa_setup --user=mysql --basedir=/usr/local/mysql --datadir=/data/3307/data

3.5 3307 實例啓動

/etc/init.d/mysqld_multi start 2		# 啓動實例 2, 即 mysqld2

3.6 3307 實例連接

mysql -uroot -p'wcooqTfm-3t:' -S /data/3307/mysql.sock # 使用初始化實例時生成的隨機密碼登錄實例
set password = '123456';		# 設置root用戶密碼
flush privileges;				# 刷新權限
exit

4. 其他相關操作

允許遠程連接MySQL

GRANT ALL PRIVILEGES ON *.* TO 'mysql'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
FLUSH PRIVILEGES;

5. 參考文檔

Linux6.3安裝Mysql5.7多實例並實現讀寫分離
useradd -s /sbin/nologin -M -g mysql mysql 是什麼意思
【乾貨】MySQL 5.7 多實例(多進程)配置教程
MySQL多實例部署與優化
CentOS下mysql多實例操作指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章