一、MySQL多實例介紹
一台服務器上開啟多個不同的服務端口(3306,3307,3308),運行多個MySQL服務進程,共用一套MySQL安裝程序,多實例MySQL在邏輯上看是各自獨立的
1、多實例主從復制原理圖
2、優點
①有效利用服務器資源
②節約服務器資源
③資源互相搶占問題,其中一個實例並發很高或者慢查詢,其它實例也受影響
3、應用場景
①公司資金緊缺
②並發訪問不是特別大的業務
③門戶網站應用MySQL多實例場景,一般是從庫
4、MySQL多實例常見配置方案
①多配置文件、多啟動程序的方案(常用)
②單一配置文件、單一啟動程序多實例方案(一個配置文件,不好管理,耦合度太高,)
二、MySQL多實例部署
1、環境
[root@MySQL ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@MySQL ~]# uname -r 2.6.32-696.el6.x86_64 [root@MySQL ~]# hostname -I 172.19.5.54 172.16.1.54
2、安裝MySQL
useradd -s /sbin/nologin -M mysql cd /server/tools tar xf mysql-5.6.36-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.36-linux-glibc2.5-x86_64 /application/mysql-5.6.36 ln -s /application/mysql-5.6.36/ /application/mysql chown -R mysql.mysql /application/mysql
3、配置多實例啟動命令和配置文件目錄
mkdir -p /data/{3306,3307}/data
4、unzip data.zip 在/下直接解壓覆蓋/data目錄(注:data.zip是打包好的多實例配置文件、數據、啟動命令)
[root@MySQL data]# tree . ├── 3306 │ ├── data #3306實例數據文件目錄 │ ├── my.cnf #3306實例配置文件 │ └── mysql #3306實例啟動命令 └── 3307 ├── data #3307實例數據文件目錄 ├── my.cnf #3307實例配置文件 └── mysql #3307實例啟動命令
5、授權mysql用戶管理/data目錄
chown -R mysql.mysql /data
6、授權mysql命令執行權限
find /data -type f -name "mysql"|xargs chmod +x
7、配置mysql命令啟動環境變量
方法一:
ln -s /application/mysql/bin/* /usr/local/sbin/ 方法二: echo 'export PATH=/application/mysql/bin:$PATH' >>/etc/profile source /etc/profile
8、初始化多實例數據庫
cd /application/mysql/scripts/ ./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3306/data/ --user=mysql #初始化數據庫3306 ./mysql_install_db --basedir=/application/mysql/ --datadir=/data/3307/data/ --user=mysql #初始化數據庫3307
9、MySQL多實例服務啟動
#啟動服務 /data/3306/mysql start /data/3307/mysql start [root@MySQL data]# netstat -lntup|grep 330 tcp 0 0 :::3306 :::* LISTEN 3848/mysqld tcp 0 0 :::3307 :::* LISTEN 4885/mysqld
10、MySQL多實例設置密碼及登錄
#設置密碼: mysqladmin -uroot password 123456 -S /data/3306/mysql.sock mysqladmin -uroot password 123456 -S /data/3307/mysql.sock #登錄數據庫,指定sock mysql -uroot -p123456 -S /data/3306/mysql.sock mysql -uroot -p123456 -S /data/3307/mysql.sock
三、MySQL多實例配置文件
/data/3306/my.cnf [client] port = 3306 socket = /data/3306/mysql.sock [mysqld] port = 3306 socket = /data/3306/mysql.sock datadir = /data/3306/data
open_files_limit = 1024 back_log = 600 max_connections = 800 max_connect_errors = 3000 table_open_cache = 512 external-locking = FALSE max_allowed_packet =8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_size = 2M query_cache_limit = 1M query_cache_min_res_unit = 2k thread_stack = 192K tmp_table_size = 2M max_heap_table_size = 2M long_query_time = 1 pid-file = /data/3306/mysql.pid log-bin = /data/3306/mysql-bin relay-log = /data/3306/relay-bin relay-log-info-file = /data/3306/relay-log.info binlog_cache_size = 1M max_binlog_cache_size = 1M max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M lower_case_table_names = 1 skip-name-resolve slave-skip-errors = 1032,1062 replicate-ignore-db=mysql server-id = 4 |
/data/3307/my.cnf [client] port = 3307 socket = /data/3307/mysql.sock [mysqld] port = 3307 socket = /data/3307/mysql.sock datadir = /data/3307/data
open_files_limit = 1024 back_log = 600 max_connections = 800 max_connect_errors = 3000 table_open_cache = 512 external-locking = FALSE max_allowed_packet =8M sort_buffer_size = 1M join_buffer_size = 1M thread_cache_size = 100 thread_concurrency = 2 query_cache_size = 2M query_cache_limit = 1M query_cache_min_res_unit = 2k thread_stack = 192K tmp_table_size = 2M max_heap_table_size = 2M long_query_time = 1 pid-file = /data/3307/mysql.pid relay-log = /data/3307/relay-bin relay-log-info-file = /data/3307/relay-log.info binlog_cache_size = 1M max_binlog_cache_size = 1M max_binlog_size = 2M expire_logs_days = 7 key_buffer_size = 16M read_buffer_size = 1M read_rnd_buffer_size = 1M bulk_insert_buffer_size = 1M
lower_case_table_names = 1 skip-name-resolve slave-skip-errors = 1032,1062 replicate-ignore-db=mysql server-id = 5 |
說明:對比兩個配置文件之后,可以發現除了端口、server-id不一樣,3306開啟了log-bin功能,這樣可以做MySQL主復制
四、MySQL多實例啟動命令腳本
#!/bin/sh #init port=3306 mysql_user="root" mysql_pwd="123456" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" #startup function function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & else printf "MySQL is running...\n" exit fi } #stop function function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown fi } #restart function function_restart_mysql() { printf "Restarting MySQL...\n" function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart}\n" esac
五、遇到的錯誤
1、[ERROR] Plugin 'InnoDB' init function returned error
刪除MySQL目錄下的ib_logfile0和ib_logfile1兩個文件,就可以解決問題了
2、5.5.32——>5.6.36配置參數不對導致多實例無法啟動
table_cache——>table_open_cache = 512(5.6改名了)
六、生產環境多實例配置環境
1、一般在1-4個實例之間居多,1-2個最多,大業務占用的機器比較多,機器R510居多,CPU是E5210,48G內存,硬盤12*300G SAS,RAID10
2、內存32G,雙cpu8核,硬盤6X600G,跑2-3個實例