服務器:
MYCAT:192.168.1.124
主服務器:192.168.1.169
備服務器:192.168.1.150
一、一臺服務內部署多個mysql實例
下載完成解壓並移動到/usr/local/
tar -zxvf mysql-5.7.22-linux-glibc2.12-x86_64.tar.gz
創建mysql實例用戶和文件
useradd mysql -r -s /sbin/nologin
mkdir -p /usr/local/mysql/mysql_files
創建多實例數據目錄
mkdir -p /data/mysql_data{1..3}
修改mysql目錄的屬組及用戶
chown root.mysql -R /usr/local/mysql
修改專用目錄的屬主及屬組
chown mysql.mysql -R /usr/local/mysql/mysql_files /data/mysql_data{1..3}
配置Mysql的配置文件/etc/my.cnf
[mysqld_multi]
mysqld = /usr/local/mysql/bin/mysqld
mysqladmin = /usr/local/mysql/bin/mysqladmin
log = /tmp/mysql_multi.log
[mysqld1]
datadir = /data/mysql_data1 #設置數據目錄
socket = /tmp/mysql.sock1 #設置sock文件存放路徑
port = 3306 #設置監聽開放端口
user = mysql #設置運行用戶
performance_schema = off #關閉監控
innodb_buffer_pool_size = 32M #設置innodb 緩存大小
bind_address = 0.0.0.0 #設置監聽IP地址
skip-name-resolve = 0 #關閉DNS反向解析
[mysqld2]
datadir = /data/mysql_data2
socket = /tmp/mysql.sock2
port = 3307
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
[mysqld3]
datadir = /data/mysql_data3
socket = /tmp/mysql.sock3
port = 3308
user = mysql
performance_schema = off
innodb_buffer_pool_size = 32M
bind_address = 0.0.0.0
skip-name-resolve = 0
初始化各個實例:初始化完後會在日誌中生成密碼,記得保存,一會要用
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data1
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data2
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql_data3
若缺失libaio
yum install -y libnuma
yum install -y libnuma.so.1
yum -y install numactl
複製多實例腳本到服務管理目錄下
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi
給予腳本可執行權限
chmod +x /etc/init.d/mysqld_multi
加入service服務管理
chkconfig --add mysqld_multi
添加環境變量
vim /etc/profile
export MYSQL_HOME=/usr/local/mysql
export PATH=${MYSQL_HOME}/bin:$PATH
使修改的配置文件生效
source /etc/profile
啓動各個實例
mysqld_multi start
查看實例的監聽端口
ss -tulpn|grep mysqld
連接數據庫實例
連接實例1(主庫):
mysql -S /tmp/mysql.sock1 -p 前面生成的密碼
mysql> set password=password('123456');
mysql> flush privileges;
另外兩個實例的操作方法與實例1一致,不再贅述。
允許遠程連接mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
啓動mysql多實例
啓動時需要一個啓動腳本,這個腳本一般在/usr/local/mysql/support-files
目錄下mysqld_multi.server
,將這個腳本複製到init.d目錄下
cp /usr/local/mysql/support-files/mysqld_multi.server /etc/rc.d/init.d/mysqld_multi
之後可以使用命令
/etc/rc.d/init.d/mysqld_multi start 1-3
啓動三個MySQL實例,注意這裏的數字和my.cnf
中的[mysqldN]
對應,1-3就是啓動[mysqld1]
、[mysqld2]
、[mysqld3]
配置段的MySQL實例。
查看端口有沒有正常啓動
netstat -ano | egrep "3307|3308|3306"
查看端口,看MySQL有沒有正常啓動,如果沒有啓動或報錯,一般報錯詳細日誌存在各個實例data目錄下的 主機名.err
文件中,打開此文件查找錯誤原因,逐步排錯就可以了。
關閉多個MySQL實例
一般教程上關閉的命令是
/etc/rc.d/init.d/mysqld_multi stop 1-3
但是這個命令經常不起作用,所以一般我是用
killall -u mysql 或 kill -9 the-mysql-pid
配置主從複製
修改/etc/my.cnf
主數據庫master 需要添加
log-bin=mysql-bin
server-id=1
另外兩個從數據庫slave1 slave2只需要添加
server-id=2
server-id=3
關閉所有的mysql數據庫並檢查mysql數據的運行狀態,重新運行所有的mysql數據
killall -u mysql
/etc/rc.d/init.d/mysqld_multi start 1-3
netstat -ano |egrep "3306|3307|3308"
打開master,輸入密碼,賦予從庫權限賬號,允許用戶在主庫上讀取日誌,賦予Slave機器有File權限,
mysql -S /tmp/mysql.sock1 -p
GRANT FILE ON *.* TO 'root'@'192.168.98.128' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'root'@'192.168.98.128' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
只賦予Slave機器有File權限還不行,還要給它REPLICATION SLAVE的權限纔可以
退出主庫master,再次重啓mysql,進入主庫master,查看主庫信息
show master status;
記住binlog文件和Position
退出主庫master,分別進入另外兩臺從庫slave1 和slave2,並執行下面的操作
change master to master_host='192.168.98.128',master_user='root',master_password='123456',master_log_file='mysql-bin.000002', master_log_pos=154;
其中 master_host對應的是主庫的ip地址.master_user和master_password是主庫的帳號和密碼,master_log_file則是在主庫查詢到的二進制文件的名稱,從庫會自動查詢到這個文件,master_log_pos是日誌的位置.
測試
接下來進行最後的測試,首先在主庫創建一個數據庫,如果從庫能同樣發現到該庫的存在,則證明主從同步成功.
測試成功,如果發現新增的數據庫沒有出現,請先重啓從庫slave,之後可以看到新增的數據庫了.
PS:開放數據庫訪問端口和修改客戶端登陸的密碼
開放mysql的訪問端口
/sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
保存修改
/etc/rc.d/init.d/iptables save
重啓防火牆使其改動生效
/etc/init.d/iptables restart
由於的mysql5.7中user表沒有password字段,所以5.7之前的版本使用navicat等客戶端無法正常登陸mysql,請使用以下方法解決此問題
打開相應的數據庫,執行此sql命令,修改對應的帳號和密碼,即可遠程訪問
ALTER USER 'root'@'%' IDENTIFIED BY '123456';