1、簡介node
一主多實例,通俗講就是,一個主庫,多個實例庫,以咱們公司爲例,我如今公司目前上線一款手遊,每一個區分別有一個主庫,可是若是每一個區單獨開一個從庫,會比較浪費資源,因此多個區的主庫數據同步到了一臺從庫服務器中,固然此臺從庫服務器要開多個mysql,這就是我下面要講的內容。mysql
2、演示環境
linux
Linux:CentOS6.5 x64c++
MySql: mysql5.5.rpm (此處我是用的是rpm包,下面演示rpm與編譯安裝方式同樣的)sql
iptables stop數據庫
selinux disabledvim
master_ip: 10.10.168.2bash
slave_ip:10.10.168.3服務器
3、實例演示 (master:主庫服務器;slave:從庫服務器)socket
(1)master端
一、master 安裝mysql數據庫
yum -y install cmake gcc-c++ ncurses-devel bison perl readline-devel time zlib-devel libaio-devel perl-DBI perl-Time-HiRes libtool rpm -ivh mysql-5.5.24-1.el6.x86_64.rpm --nodeps --force source /etc/profile
二、設置master數據庫訪問權限
grant replication slave on *.* to 'rsync'@'10.10.%' identified by '1q2w3e4r'; grant all privileges on *.* to 'root'@'10.10.%' identified by '密碼'; flush privileges;
三、修改master數據庫配置文件
vim /etc/my.cnf server-id = 1 //master端ID號 log-bin=/data/logbin/mysql-bin //日誌路徑及文件名 #binlog-do-db = cacti //同步cacti,此處關閉的話,就是除不容許的,其它的庫均同步 binlog-ignore-db = mysql //不一樣步mysql庫,如下同上 binlog-ignore-db = test binlog-ignore-db = information_schema
(2)slave端
一、slave從庫多實例設置
yum -y install cmake gcc-c++ ncurses-devel bison perl readline-devel time zlib-devel libaio-devel perl-DBI perl-Time-HiRes libtool rpm -ivh mysql-5.5.24-1.el6.x86_64.rpm --nodeps --force source /etc/profile
二、把使用工具添加到 /usr/bin/ 目錄下
ln -s /usr/local/mysql/bin/mysqld_multi /usr/bin/mysqld_multi ln -s /usr/local/mysql/scripts/mysql_install_db /usr/bin/mysql_install_db
三、初始化使用的mysql實例目錄
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3307 /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3308 /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3309 /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3310
四、修改初始化目錄的屬主屬組權限
chown -R mysql:mysql /data/mysql3307 chown -R mysql:mysql /data/mysql3308 chown -R mysql:mysql /data/mysql3309 chown -R mysql:mysql /data/mysql3310
五、建立 mysql{3307,3308,3308,3310}目錄下的sock與pid文件
touch /data/mysql3307/mysql3307.sock touch /data/mysql3308/mysql3308.sock touch /data/mysql3309/mysql3309.sock touch /data/mysql3310/mysql3307.sock touch /data/mysql3307/mysql3307.pid touch /data/mysql3308/mysql3308.pid touch /data/mysql3309/mysql3309.pid touch /data/mysql3310/mysql3310.pid
六、用mysqld_multi工具生成配置文件,命令爲:mysqld_multi --example,這裏我沒用默認生成的配置文件,而是在生成的配置文件基礎之上進行了修改。vim /etv/mysqld_multi.cnf
[mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin #user = root #password = 3633 [mysqld1] socket = /data/mysql3307/mysql3307.sock port = 3307 pid-file = /data/mysql3307/mysql3307.pid datadir = /data/mysql3307 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 2 log-error = /var/log/mysqld1.log [mysqld2] socket = /data/mysql3308/mysql3308.sock port = 3308 pid-file = /data/mysql3308/mysql3308.pid datadir = /data/mysql3308 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 3 log-error = /var/log/mysqld2.log [mysqld3] socket = /data/mysql3309/mysql3309.sock port = 3309 pid-file = /data/mysql3309/mysql3309.pid datadir = /data/mysql3309 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 4 log-error = /var/log/mysqld3.log [mysqld4] socket = /data/mysql3310/mysql3310.sock port = 3310 pid-file = /data/mysql3310/mysql3310.pid datadir = /data/mysql3310 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 5 log-error = /var/log/mysqld4.log
七、(啓動,中止,查看當前狀態) mysql實例數據庫
將/usr/local/mysql/bin加到$PATH環境變量裏
export PATH=/usr/local/mysql/bin:$PATH
#查看數據庫狀態 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report #結果都爲沒有運行 Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running MySQL server from group: mysqld4 is not running
#啓動 mysql實例 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start #結果爲 Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running MySQL server from group: mysqld3 is running MySQL server from group: mysqld4 is running
#中止 mysql實例 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf stop #結果爲 Reporting MySQL servers MySQL server from group: mysqld1 is not running MySQL server from group: mysqld2 is not running MySQL server from group: mysqld3 is not running MySQL server from group: mysqld4 is not running
也能夠單獨啓動某個實例數據庫 //在start 或 stop 尾部 加上 1,2,3,4 或 1-2 ,1-3,2-4 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1,2,3,4 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf stop 1,2,3,4
備註:有時候配置完數據庫實例以後,一次啓動全部實例數據庫沒法啓動,須要先啓動一臺,在啓動全部便可。這個問題,請注意一下。
經過 netstat -lntp 命令查看當前數據庫服務是否處於被監聽狀態
八、mysql實例數據庫登陸方式
#進入端口爲3307的數據庫 mysql -uroot -p -h127.0.0.1 -P3307 #經過sock文件登陸 mysql -uroot -p -S /data/mysql3307/mysql3307.sock 注:作一主多實例必須查看下面信息是否與當前庫配置信息相符 #查看server_id文件 mysql> SHOW VARIABLES LIKE '%server_id%'; #查看socket文件 mysql> SHOW VARIABLES LIKE 'socket'; #查看pid文件 mysql> SHOW VARIABLES LIKE '%pid%';
九、slave端從庫配置(以3307庫爲例,其他同理)
(1) 配置多實例服務器從庫 命令(分段)說明: Stop slave; 中止同步功能 Change master to Master_host=’10.10.168.2’, //master端IP Master_user=’rsync’, //master端建立的同步賬號 Master_password=’1q2w3e4r’, //同步密碼 Master_port=3306, //master端 mysql 訪問端口 Master_log_file=’mysql-bin.000047’, //master端記錄的file值 Master_log_pos=107; //master端記錄的position值 Start slave; //啓動同步功能 Show slave status\G //查看參數狀態 總體語句以下: changemaster to master_host=’10.10.168.2’ master_user=’rsync’master_password=’1q2w3e4r’ master_port=3306 master_log_file=’mysql-bin.000047’master_log_pos=107;
注:查看上面的Slave_IO_Running: Yes 和Slave_SQL_Running: Yes 2個都爲yes則證實主從同步正常,若是有任一個顯示NO,則證實同步有問題。能夠查看數據庫日誌文件,裏面基本上會顯示出錯誤之處,根據錯誤一步一步排查,基本上均可以解決的。
十、mysql實例化腳本
(本文附帶mysql實例化腳本提供你們方便建立mysql多實例庫)
#!/bin/bash # IP="127.0.0.1" PASSWORD="new_password" echo_err(){ echo -e "\E[1;31m""$@ \033[0m" } echo_ok(){ echo -e "\E[1;32m""$@ \033[0m" } test -d /data/mysql/ || mkdir -p /data/mysql cd /opt/ wget http://10.10.114.178:8008/mysql-5.5.24-1.el6.x86_64.rpm yum -y install cmake gcc-c++ ncurses-devel bison perl readline-devel time zlib-devel libaio-devel perl-DBI perl-Time-HiRes libtool rpm -ivh mysql-5.5.24-1.el6.x86_64.rpm --nodeps --force source /etc/profile /etc/init.d/mysqld stop ln -s /usr/local/mysql/bin/mysqld_multi /usr/bin/mysqld_multi ln -s /usr/local/mysql/scripts/mysql_install_db /usr/bin/mysql_install_db cp /usr/local/mysql/support-files/mysqld_multi.server /etc/init.d/mysqld_multi.server for i in {3307..3310} do /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql${i} while [[ `test -d /data/mysql${i} && echo $?` -ne 0 ]] do sleep 1 done chown -R mysql:mysql /data/mysql${i} touch /data/mysql${i}/{mysql${i}.sock,mysql${i}.pid} done echo_ok "數據庫初始化完成,開始部署多實例" cat >> /etc/mysqld_multi.cnf <<EOF [mysqld_multi] mysqld = /usr/local/mysql/bin/mysqld_safe mysqladmin = /usr/local/mysql/bin/mysqladmin #user = root #password = 3633 [mysqld1] socket = /data/mysql3307/mysql3307.sock port = 3307 pid-file = /data/mysql3307/mysql3307.pid datadir = /data/mysql3307 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 2 log-error = /var/log/mysqld1.log [mysqld2] socket = /data/mysql3308/mysql3308.sock port = 3308 pid-file = /data/mysql3308/mysql3308.pid datadir = /data/mysql3308 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 3 log-error = /var/log/mysqld2.log [mysqld3] socket = /data/mysql3309/mysql3309.sock port = 3309 pid-file = /data/mysql3309/mysql3309.pid datadir = /data/mysql3309 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 4 log-error = /var/log/mysqld3.log [mysqld4] socket = /data/mysql3310/mysql3310.sock port = 3310 pid-file = /data/mysql3310/mysql3310.pid datadir = /data/mysql3310 #language = /usr/local/mysql/share/mysql/english user = mysql server-id = 5 log-error = /var/log/mysqld4.log EOF ########此段操做,因爲mysql啓動缺陷,這樣啓動 ######## echo_ok "啓動多實例" mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1 sleep 3 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report netstat -lntp mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1 sleep 3 while [ `netstat -nlpt|grep -q 3307;echo $?` -ne 0 ] do echo -n "." sleep 1 done mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1,2,3,4 sleep 3 mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf report netstat -lntp mysqld_multi --defaults-extra-file=/etc/mysqld_multi.cnf start 1,2,3,4 sleep 3 ####################################################### for i in {3307..3310} do while [ `netstat -nlpt|grep -q ${i};echo $?` -ne 0 ] do echo -n "." sleep 1 done /usr/local/mysql/bin/mysql -uroot -h${IP} -P${i} -e "use mysql;update user set password=password('new_password') where user='root';flush privileges;" done source /etc/profile