您好,登錄后才能下訂單哦!
mysql多實例,簡單理解就是在一臺服務器上,mysql服務開啟多個不同的端口(如3306、3307,3308),運行多個服務進程。這些 mysql 服務進程通過不同的 socket來監聽不同的數據端口,進而互不干涉的提供各自的服務。
在同一臺服務器上,mysql 多實例會去共用一套 mysql 應用程序,因此在部署 mysql的時候只需要部署一次 mysql程序即可,無需多次部署。但是,mysql多實例之間會各自使用不同的 my.cnf 配置文件、啟動程序和數據文件。在提供服務方面,mysql多實例在邏輯上看起來是各自獨立,互不干涉的,并且多個實例之間是根據配置文件的設定值,來獲取相關服務器的硬件資源。
當一個公司業務訪問量不太大,又想節儉成本,并且還希望不同業務的數據庫服務能夠各自盡量獨立,提供服務能夠互相不受影響。另外還需要應用主從同步等技術來提供數據庫備份或讀寫分離服務,以及方便后期業務量增大時,數據庫架構的擴展和遷移。
公司業務訪問量不是太大的時候,服務器的資源基本都是過剩狀態。此時就很適合 mysql 多實例的應用。如果對 SQL語句 優化做的比較好,mysql 多實例 是一個很值得去使用的技術。
mysql 多實例常規來講,有三種方案可以實現,這三種方案各有利弊,如下:
優點:邏輯簡單,配置簡單
缺點:管理起來不方便
優點: 便于集中管理管理
缺點: 不方便針對每個實例配置進行定制
優點:便于集中管理
缺點:耦合度高。IM一掛,實例全掛
不方便針對每個實例配置進行定制
本章內容采用第一種方式來是實現,(個人傾向于這種方式),數據庫采用mariadb來代替mysql,過程都一樣
系統與安裝版本信息
操作系統:Centos6.9
數據庫:mariadb-10.2.15.tar.gz
三個實例:3306,3307,3308
yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boost-devel gcc gcc-c++ cmake libevent-devel gnutls-devel libaio-devel openssl-devel ncurses-devel libxml2-devel
創建mysql用戶組
useradd -r mysql
創建實例數據庫目錄
各實例的數據庫目錄,配置文件目錄,啟動程序目錄都存放在單獨的目錄位置,結構如下:
[root@localhost ~]# mkdir -p /data/mysql/{3306,3307,3308}/{data,etc,log,socket,bin}
[root@localhost ~]# tree /data
/data
├── lost+found
└── mysql
├── 3306
│?? ├── bin
│?? ├── data
│?? ├── etc
│?? ├── log
│?? └── socket
├── 3307
│?? ├── bin
│?? ├── data
│?? ├── etc
│?? ├── log
│?? └── socket
├── 3308
│?? ├── bin
│?? ├── data
│?? ├── etc
│?? ├── log
│?? └── socket
└── mysqld
解壓安裝源碼包
[root@localhost ~]# tar zxvf mariadb-10.2.15
[root@localhost ~]# cd mariadb-10.2.15
#編譯
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DCMAKE-USER=mysql -DCMAKE-GROUP=mysql -DMYSQL_DATADIR=/data/mysql -DWITHOUT_TOKUDB=1
如果執行cmake提示:CMake Error at storage/tokudb/PerconaFT/cmake_modules/TokuSetupCompiler.cmake:183 (message):
添加編譯參數:-DWITHOUT_TOKUDB=1
make -j 4
make install
安裝成功后先不初始化,把配置文件,啟動腳本文件都配置完成后再執行初始化
復制配置文件到各實例的etc目錄下
配置文件在源碼包解壓目錄下
[root@localhost support-files]# cp my-huge.cnf /data/mysql/3306/etc/my.cnf
[root@localhost support-files]# cp my-huge.cnf /data/mysql/3307/etc/my.cnf
[root@localhost support-files]# cp my-huge.cnf /data/mysql/3308/etc/my.cnf
修改配置文件內容,3306,3307,3308各實例配置文件修改my.cnf內容,修改端口,socket路徑,數據存放目錄等
[client]
#password = your_password
port = 3306
socket = /data/mysql/3306/socket/mysql.sock
[mysqld]
port = 3306
socket = /data/mysql/3306/socket/mysql.sock
datadir=/data/mysql/3306
同樣,3307,3308實例也要修改相同的配置
編寫服務啟動腳本
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/local/mysql/bin"
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
# ${cmd_path}/mysqladmin -u ${mysql_user} -S ${mysql_sock} shutdown
${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}
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: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
上面的腳本要準備三份,因為mysql實例是各自獨立管理的,將上面的腳本參數port變量修改成3307,3308即可,放在 各自實例的bin目錄,服務啟動是從各自實例的bin目錄下執行這腳本
port=3307
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/local/mysql/bin"
mysql_basedir="/data/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock"
初始化數據庫
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/3306/data
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/3307/data
[root@localhost mysql]# scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/3308/data
修改mysql實例目錄屬主
chown -R mysql:mysql /data/mysql
啟動各實例服務
[root@localhost ~]# /data/mysql/3306/bin/mysqld start
[root@localhost ~]# /data/mysql/3307/bin/mysqld start
[root@localhost ~]# /data/mysql/3308/bin/mysqld start
[root@localhost mysql]# ss -tnl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 80 :::3306 :::*
LISTEN 0 80 :::3307 :::*
LISTEN 0 80 :::3308 :::*
LISTEN 0 128 :::22 :::*
測試登錄
[root@localhost ~]# mysql -S /data/mysql/3306/socket/mysql.sock
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.15-MariaDB-log Source distribution
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)]>
至此mysql的多實例安裝完成,在這種多實例的環境下,可以單獨使用個實例進行數據存儲,也可以將各實例配置成主從架構進行使用,下面順便把mysql的主從也介紹使實現一下,關于mysql的主從架構,以后會專門研究各種功能,這里只簡單實現,能夠幫助理清主從復制的工作過程和配置過程。
在開始主從配置之前先簡單介紹一下mysql的主從復制原理,
mysql復制原理大致如下:
1,mysql主數據庫在事物提交時會把數據變更作為事件events記錄在二進制日志文件bin-log中,mysql主庫上的sync_binlog參數控制bin-log日志刷新到磁盤
2,主庫推送二進制日志文件bin-log中的事件到從庫的中繼日志Relay Log ,之后從庫根據中繼日志Relay log重寫數據操作將數據寫入從庫,以此達到主庫和從庫的數據一致
mysql復制過程中通過3個線程來完成復制操作:其中binlog dump線程在主庫上,I/O線程和SQL線程在從庫上,當在從庫上啟動復制(START SLAVE)時,首先會I/O線程連接主庫,(連接主庫用戶用主庫創建),主庫隨后創建binlog dump線程讀取數據庫事件(binlog日志)并發送給I/O線程,I/O獲取到binlog日志數據后更新到從庫的中繼日志Relay log中,從庫上的SQL線程讀取中繼日志Relay log 中數據寫入本地數據庫,最終完成主從復制。
本文實現一主多重的方式,即上面的3個mysql實例,3306實例作為主庫,3307和3308作為從庫,實現主從復制的最為關鍵的是日志文件的設置,主庫必須要開啟二進制日志,從庫要關閉二進制,并且開啟中繼日志relay log,要點如下:
查看mysql是否開啟二進制和中繼日志
MariaDB [(none)]> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like 'relay_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| relay_log | |
+---------------+-------+
1 row in set (0.00 sec)
mysql安裝默認會啟用二進制日志,但么有啟動relay log,所以主庫上無需設置,從庫需要開啟中繼日志:
編輯實例3307,3308的my.cnf關閉bin-log,開啟中繼日志,修改server-id
3307實例:
#log-bin=mysql-bin
relay-log=relay-log
server-id = 2
3308實例:
#log-bin=mysql-bin
relay-log=relay-log
server-id = 3
修改后要重啟3307,3308實例
[root@localhost ~]# /data/mysql/3307/bin/mysqld restart
Restarting MySQL...
Stoping MySQL...
Enter password:
Starting MySQL...
[root@localhost ~]# /data/mysql/3308/bin/mysqld restart
Restarting MySQL...
Stoping MySQL...
Enter password: #這里提示要輸入密碼,因為中定義了要輸入密碼
Starting MySQL...
重啟從庫實例后檢查日志啟用情況
MariaDB [(none)]> show variables like 'relay_log';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| relay_log | relay-log |
+---------------+-----------+
1 row in set (0.00 sec)
MariaDB [(none)]> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> grant replication slave on *.* to yufu@'192.168.%.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
查看主庫的bin-log日志記錄位置節點
因為在從庫中使用change master to 指令連接主庫時要指定連接時主庫的bin-log日志記錄位置節點。
MariaDB [(none)]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 645 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
登錄到從庫3307實例:
MariaDB [(none)]> change master to master_host='192.168.214.141',master_user='yufu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=645;
Query OK, 0 rows affected (0.11 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)
登錄到從庫3308實例:
MariaDB [(none)]> change master to master_host='192.168.214.141',master_user='yufu',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=645;
Query OK, 0 rows affected (0.11 sec)
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
啟動3307實例并查看復制狀態
MariaDB [(none)]> START SLAVE; #
Query OK, 0 rows affected (0.80 sec)
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.214.141
Master_User: yufu
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 645
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes #同時為yes才能成功同步數據
Slave_SQL_Running: Yes
啟動3308實例并查看復制狀態
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.214.141
Master_User: yufu
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 645
Relay_Log_File: relay-log.000002
Relay_Log_Pos: 555
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
至此,配置啟動都沒有問題,下面從主庫實例3306中寫入一些數據看看看看3307,3308實例能不能正常同步數據
登錄主庫3306實例寫一些數據:
MariaDB [(none)]> create database yufu;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> use yufu;
Database changed
MariaDB [yufu]> create table test(
-> id varchar(10),
-> name varchar(20)
-> );
Query OK, 0 rows affected (0.84 sec)
MariaDB [yufu]> insert into test values ('2323','yufuname');
Query OK, 1 row affected (0.00 sec)
登錄從庫3307實例查看數據:
MariaDB [(none)]> select * from yufu.test;
+------+----------+
| id | name |
+------+----------+
| 2323 | yufuname |
+------+----------+
1 row in set (0.00 sec)
登錄從庫3308實例查看數據:
MariaDB [(none)]> select * from yufu.test;
+------+----------+
| id | name |
+------+----------+
| 2323 | yufuname |
+------+----------+
1 row in set (0.01 sec)
經過測試同步功能正常,文章最后再次總結一下mysql主從復制的要點:
1. 主庫必須開啟bin-log二進制日志
2. 從庫必須開啟中繼日志Relay-log,關閉bin-log
3. 主從的server-id 必須不能相同
4. 主庫創建同步用戶
5. 確保上面設置后,登錄從庫執行 change master to 指令
6. 主從時間同步
在后面的文章里,會比較詳細介紹使用mysql的主從復制功能
個人博客站點www.gudaoyufu.com
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。