MySQL多實例,主從同步


由於背景原因,所做的主從同步還是要基於MySQL 5.1的版本,主從同步主要是一個數據庫讀寫訪問原來的數據庫熱度過大,需要做到使用從庫對讀分壓。

MySQL主從同步介紹

    MySQL 支持單雙向、鏈式級聯、異步復制。在復制過程中,一個服務器充當主服務器(Master),而一個或多個其它的服務器充當從服務器(Slave)。
    如果設置了鏈式級聯復制,那么,從(slave)服務器本身除了充當從服務器外,也會同時充當其下面從服務器的主服務器。鏈式級聯復制類似A->B ->C ->D 的復制形式。
    當配置好主從復制后,所有對數據庫內容的更新就必須在主服務器上進行,以避免用戶對主服務器上數據內容的更新與對從服務器上數據庫內容的更新之間發生沖突。生產環境中一般會,忽略授權表同步,然后對從服務器上的而用戶授權select讀權限,或在my.cnf配置文件中加read-only 參數來確保從庫只讀,當然二者同時操作效果更佳。
MySQL主從復制的原理
MySQL 主從復制是一個異步復制過程(但看起來也是實時的),數據庫數據從一個MySQL數據庫(我們稱為Master)復制到另一個MySQL數據庫(我們稱之為Slave)。在Master和Slave之間實現整個主從復制的過程有三個線程參與完成。其中兩個線程(SQL線程和IO線程)在Slave端,另一個線程(IO線程)在Master端。
   要實現MySQL的主從復制,首先必須打開Master端的Binlog(MySQL-bin.XXXXX)功能,否則無法實現主從復制。因為整個復制過程實際上就是Slave從Master端獲取Binlog日志,然后再在Slave自身上以相同順序執行binlog日志中所記錄的各種操作。打開MySQL的binlog可以通過MySQL的配置文件my.cnf中的mysqld模塊([mysqld]標識后的參數部分)添加“log-bin”參數項。
  MySQL主從復制過程描述
  下面簡單描述下MySQL Replication的復制過程:
1.Slave服務器上執行start slave,開啟主從復制開關。
2.此時,Slave服務器的IO線程會通過在Master上授權的復制用戶請求連接Master服務器,並請求從指定Binlog日志文件的指定位置(日志文件和位置是在配置主從服務時change master 時指定的)之后的Binlog日志內容。
3.Master服務器接收到來自Slave服務器的IO線程的請求后,Master服務器上負責復制IO線程根據Slave服務器的IO線程請求的信息讀取指定Binlog日志文件指定位置之后的Binlog日志信息,然后返回給Slave端的IO線程。返回的信息中除了日志內容外,還有本次返回日志內容在Master服務器端的新Binlog文件名稱以及在Binlog中的指定位置。
4. 當Slave服務器的IO線程獲取到來自Master服務器上IO線程發送日志內容及日志文件及位置點后,將Binlog日志內容依次寫入到Slave端自身的Relay Log(即中繼日志)文件(MySQL-relay-bin.xxxxx)的最末端,並將新的Binlog文件名和位置記錄到master-info文件中,以便下一次讀取Master端新binlog日志時能夠告訴Master服務器需要從新binlog日志的那個文件那個位置開始請求新的Binlog日志內容。
5. Slave服務器的SQL線程會實時的檢測本地Relay Log中新增加了日志內容,然后及時的把Log文件中的內容解析成在Master端曾經執行的SQL語句的內容,並在自身Slave服務器上按語句的順序執行應用這些SQL語句。
6. 經過了上面的過程,就可以確保在Master端和Slave端執行了同樣的SQL語句。當復制狀態正常的情況下,Master端和Slave端的數據是完全一樣的。
主從復制的原理圖
 
具體實施主從復制
下面介紹的測試環境的安裝,關於線上的環境不好多講,具體步驟如下:
單實例安裝步驟

1.建立MySQL 賬戶

 

#groupadd mysql #useradd -s /sbin/nologin -g mysql -M mysql

#tail -l /etc/passwd

建立 MySQL 軟件目錄

#mkdir -p /home/tools

#cd /home/tools/

2.編譯安裝MySQL 軟件(http://down1.chinaunix.net/distfiles/mysql-5.1.62.tar.gz)

 

#tar zxf mysql-5.1.62.tar.gz #cd mysql-5.1.62

配置

./configure \

--prefix=/usr/local/mysql \

--with-unix-socket-path=/usr/local/mysql/tmp/mysql.sock \

--localstatedir=/usr/local/mysql/data \

--enable-assembler \

--enable-thread-safe-client \

--with-mysqld-user=mysql \

--with-big-tables \

--without-debug \

--with-pthread \

--enable-assembler \

--with-extra-charsets=complex \

--with-ssl \

--with-embedded-server \

--enable-local-infile \

--with-plugins=partition,innobase \

--with-plugin-PLUGIN \

--with-mysqld-ldflags=-all-static \

--with-client-ldflags=-all-static

3.靜態編譯生成mysqld的執行文件

 #make

4.安裝MySQL

 #make install

5.獲取MySQL 配置文件

 #ls -l support-files/*.cnf #cp support-files/my-small.cnf /etc/my.cnf

6.創建數據庫文件

 #mkdir -p /usr/local/mysql/data #chown -R mysql.mysql /usr/local/mysql

#/usr/local/mysql/bin/mysql_install_db --user=mysql

#

 7.啟動MySQL 數據庫

 #cp support-files/mysql.server /usr/local/mysql/bin #netstat -lnt|grep 3306

#/user/local/bin/mysql_safe --user=mysql &

8.配置MySQL 命令的全局使用路徑

#echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile #source /etc/profile

9.配置/etc/init.d/mysqld start 方式啟動數據庫

#cp support-files/mysql.server /etc/init.d/mysqld #chmod 700 /etc/init.d/mysqld

#/etc/init.d/mysqld restart

 多實例安裝

 1.采用不同的端口來作為二級目錄

mkdir -p /data/{3306,3307}/data
 
2 創建MySQL多實例配置文件
ls -l support-files/*.cnf
/bin/cp support-files/my-small.cnf /etc/my.cnf
 
 
 
3 通過vi命令添加如下:
vi /data/3306/my.cnf
vi /data/3307/my.cnf
 
my.cnf配置
[client]
port            = 3306
socket          = /data/3306/mysql.sock
[mysql]
no-auto-rehash
[mysqld]
user    = mysql
port    = 3306
socket  = /data/3306/mysql.sock
basedir = /usr/local/mysql
datadir = /data/3306/data
open_files_limit    = 1024
back_log = 600
max_connections = 800
max_connect_errors = 3000
table_cache = 614
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
default_table_type = InnoDB
thread_stack = 192K
transaction_isolation = READ-COMMITTED
tmp_table_size = 2M
max_heap_table_size = 2M
long_query_time = 1
log_long_format
log-error = /data/3306/error.log
log-slow-queries = /data/3306/slow.log
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
myisam_sort_buffer_size = 1M
myisam_max_sort_file_size = 10G
myisam_max_extra_sort_file_size = 10G
myisam_repair_threads = 1
myisam_recover
lower_case_table_names = 1
skip-name-resolve
slave-skip-errors = 1032,1062
replicate-ignore-db=mysql
server-id = 1
innodb_additional_mem_pool_size = 4M
innodb_buffer_pool_size = 32M
innodb_data_file_path = ibdata1:128M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 2M
innodb_log_file_size = 4M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 2M
[mysqld_safe]
log-error=/data/3306/mysql_barry3306.err
pid-file=/data/3306/mysqld.pid
 
4 創建MySQL多實例的啟動文件
  啟動文件mysql 3306
#!/bin/sh
#/data/3306/mysql 腳本
#init
port=3306
mysql_user="root"
mysql_pwd=""
CmdPath="/usr/local/mysql/bin"
#startup function
function_start_mysql()
{
    printf "Starting MySQL...\n"
    /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
}
#stop function
function_stop_mysql()
{
    printf "Stoping MySQL...\n"
    ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdown
}
#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
 
5 目錄結構
tree /data
/data
  --3306
     |--my.cnf
     |--mysql
     |--data
  --3307
     |--my.cnf
     |--mysql
     |--data
 
#授權
chown -R mysql.mysql /data
find /data -name mysql -exec chmod 700 {} \
 
6 配置MySQL命令全局使用路徑
 配置全局路徑意義
  如果不配置MySQL命令的全局路徑,就無法直接敲MySQL等命令,也就是只能/usr/local/msyql/bin/mysql這樣敲命令。
 
echo 'export PATH=$PATH:/usr/local/mysql/bin' >>/etc/profile
source /etc/profile
 
7 創建MySQL多實例數據文件
mysql_install_db --datadir=/data/3306/data  --user=mysql
mysql_install_db --datadir=/data/3307/data  --user=mysql
 
8啟動MySQL多實例數據庫
/data/3306/mysql start
/data/3307/mysql start
#檢查MySQL數據是否啟動
netstat -lnt|grep 330[6,7]
 
9 配置MySQL多實例數據庫開機自動啟動
echo "/data/3306/mysql start" >>/etc/rc.local
echo "/data/3307/mysql start" >>/etc/rc.local
 
10 登錄MySQL測試
mysql -S /data/3306/mysql.sock
mysql -S /data/3307/mysql.sock
 
11 MySQL 安全配置
 
 為root增加密碼
mysqladmin -u root -S /data/3306/mysql.sock password 'barry123'  #<- 更改默認密碼。
mysql -S /data/3306/mysql.sock #<- 無法直接登錄
mysql -uroot -p -S /data/3306/mysql.sock #<-新的登錄方式
 
查看並清理多余用戶
select user,host form mysql.user
 

 主從復制配置

 
 主庫,稱為Master 從庫稱為Slave。
 
1. 主庫上執行操作
 
(1) 設置server-id 值並開啟binlog設置
  根據前文MySQL的同步原理,我們知道復制的關鍵因素就是binlog日志。
執行 vi /data/3306/my.cnf 編輯my.cnf配置文件,按如下兩個參數內容修改:
[mysqld]
server-id =1
log-bin=/data/3306/mysql-bin
檢查配置后的結果
grep -E "server-id|log-bin" /data/3306/my.cnf
log-bin=/data/3306/mysql-bin  
server-id=1
 
(2) 建立用於同步的賬號rep
 
mysql -uroot -p'' -S /data/3306/mysql.sock
grant replication slave on *.* to 'rep'@'10.0.0.%' identified by 'password';
 
(3) 鎖表只讀(當前窗口不要關閉)
生產環境時,操作主從復制,需要申請停機事件,鎖表會影響業務。
flush tables with read lock;
interactive_timeout=60
wait_timeout=60
 
(4) 查看主庫狀態
 
查看主庫狀態,即當前日志文件名和二進制偏移量
show master status 命令顯示的信息要記錄在案,后面的從庫復制時是從這個位置開始同步。
 
(5)導出數據庫數據
 
單開新窗口,導出數據庫數據,如果數據量比較大,可以停庫直接打包數據文件遷移。
mkdir /server/backup/ -p
mysqldump -uroot -p'password' -S /data/3306/mysql.sock -A -B |gzip >/server/backup/mysql_bak.${date +%F}.sql.gz
ls -l /server/backup/mysql_bak.${date +%F}.sql.gz
 
導為了確保導庫期間,數據庫沒有數據插入,可以再檢查下主庫狀態信息
mysql -u root -p'password' -S /data/3306/mysql.sock -e "show master status"
 
導庫后,解鎖主庫,恢復可寫:
unlock tables;
 
(6) 把主庫備份的MySQL數據遷移到從庫
 
這不常用命令有scp,rsync等,相關命令前面的課程已詳細講解過了,這里就不多描述了。
本文講解的是單數據庫多實例主從配置,因此,數據在一台機器上,查看下數據
 
2 從庫執行操作
 
(1) 設置server-id 值並關閉binlog設置
 
數據庫的server-id一般在LAN內是唯一的,這里的server-id要和主庫及其他從庫不同,並解析掉從庫的binlog參數配置執行vi /data/3307/my.cnf配置文件,按如下兩個參數內容修改:
[mysqld]
server-id=2
#log-bin=/data/3307/mysql-bin
 
(2) 還原主庫導出的數據備份
gzip -d mysql_bak.2014-04-17.sql.gz
mysql -uroot -p'password' -S /data/3307/mysql.sock < mysql_bak.2014-04-17.sql
 
(3) 登錄從庫配置同步參數
mysql -uroot -p'password' -S /data/3307/mysql.sock
CHANGE MASTER TO
MASTER_HOST='10.0.0.x', <==這里是主庫的IP
MASTER_PORT=3306,  <==這里是主庫的端口,從庫端口可以和主庫不同。
MASTER_USER='rep',<==這里是主庫上建立的用於復制的用戶rep
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.0000008',<==這里是show master status時看到的查到二進制文件名稱
MASTER_POS=342;<==這里是show master status時看到的查看二進制日志偏移量,注意不能多空格。
 
不登陸數據庫,在命令行快速執行CHANGE MASTER的語句(適合在腳本中批量建Slave庫用)
本文即用此法來操作
cat |mysql -uroot -p'password' -S /data/3307/mysql.sock<< EOF
CHANGE MASTER TO
MASTER_HOST='10.0.0.x',
MASTER_PORT=3306, 
MASTER_USER='rep',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.0000008',
MASTER_LOG_POS=342;
EOF
 
也可登錄數據庫里面執行如下語句:
 
CHANGE MASTER TO
MASTER_HOST='192.168.1.234',
MASTER_PORT=3306, 
MASTER_USER='rep',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000010',
MASTER_LOG_POS=261;
 
(4) 啟動從庫同步開關
啟動從庫同步開關,並查看同步狀態
 
mysql -uroot -p'password' -S /data/3307/mysql.sock -e "start slave;"
mysql -uroot -p'password' -S /data/3307/mysql.sock -e "show slave status\G;"
 
判斷復制是否搭建成功就看如下IO和SQL兩個線程是否顯示為Yes狀態
Slave_IO_Running:Yes  負責從庫去主庫讀取Binlog日志,並寫入從庫的中繼日志中
Slave_SQL_Runnint:Yes  負責讀取並中繼日志中Binlog,轉換SQL語句后應用到數據庫匯總
 
Ok 到此整個過程基本上完成了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM