Mysql 一主多實例與主從同步詳解

1、簡介node

       一主多實例,通俗講就是,一個主庫,多個實例庫,以咱們公司爲例,我如今公司目前上線一款手遊,每一個區分別有一個主庫,可是若是每一個區單獨開一個從庫,會比較浪費資源,因此多個區的主庫數據同步到了一臺從庫服務器中,固然此臺從庫服務器要開多個mysql,這就是我下面要講的內容。mysql

wKiom1YeDmCjVaFNAAEOOUfaie0974.jpg

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
相關文章
相關標籤/搜索