1. 程式人生 > >linux centos下mysql資料庫的主從複製環境搭建

linux centos下mysql資料庫的主從複製環境搭建

有兩臺MySQL資料庫伺服器Master和slave,Master為主伺服器,slave為從伺服器,初始狀態時,Master和slave中的資料資訊相同,當Master中的資料發生變化時,slave也跟著發生相應的變化,使得master和slave的資料資訊同步,達到備份的目的。

原理圖如下:

簡單來說,mysql的主從複製的原理就是slave把master上面執行的 update,insert這些會使資料發生改變的sql語句從master上面同步過來,然後在自己的機器上再執行一遍,那麼這兩臺資料庫伺服器上的資料就一模一樣了,而那些要同步的sql語句就存在bin-log檔案裡面

我這裡有兩臺機器分別是192.168.1.6(master) 192.168.1.5(slave)

 

我們先從master機器開始配置

修改/etc/my.cnf 檔案(mysql啟動預設是從/etc/my.cnf讀取的,所以你別的地方有配置檔案的話建議直接移到/etc目錄下)

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
 
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
 
skip-external-locking
skip-name-resolve
 
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid
 
open_files_limit = 10240
 
back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800
 
#open_tables = 600
#table_cache = 650
#opened_tables = 630
 
max_allowed_packet = 32M
 
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k
 
tmp_table_size = 256M
max_heap_table_size = 256M
 
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
 
lower_case_table_names=1
 
default-storage-engine = INNODB
 
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT
 
#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log  
 
## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
 
[mysqldump]
quick
max_allowed_packet = 32M
 
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid


這裡主要的配置就是和複製相關的這段配置,其它配置是mysql原始碼安裝時配置,裡面具體引數代表什麼意思可以網上搜一下,文件很多的

## replication
server_id=6
binlog-ignore-db=mysql
log-bin=master-mysql-bin
binlog_cache_size=1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062

我簡單解釋一下,複製有關的引數

serverid 全域性唯一的

binlog-ignore-db=mysql複製過濾,我們不同步mysql系統自帶的資料庫

log-bin=master-mysql-bin 開啟logbin功能並設定logbin檔案的名稱

binlog_format=mixed 混合型複製模式,預設採用基於語句的複製,一旦發現基於語句的無法精確的複製時,就會採用基於行的複製。

接下來重啟mysql服務並用客戶端登入

slave想要同步master上的資料首先肯定需要許可權,所以我們要在master上面開通許可權

grant replication slave, replication client on *.* to 'root'@'192.168.1.5' identified by 'root';

賬號和密碼都是root ,允許192.168.1.5這臺機器向master傳送同步請求,當然你可以設成別的,我這裡只是為了方便記憶,設了太多不同的密碼容易忘記

重新整理一下授權資訊,然後檢視當前master的狀態

show master status,我這裡解釋一下,我們知道關於對資料庫修改的sql全部記錄在了bin-log裡面,那麼我們就每次都把bin-log裡面的sql全部執行一遍?肯定不是,我們肯定要記錄我上次複製到哪兒裡了,然後我下次再從這個點開始同步,就像我們玩單機遊戲闖了3關以後要存下檔一樣,下次玩我們繼續從第三關開始玩,這是一個意思。

接下來我們隨便寫點測試資料到資料庫裡面去

create database if not exists pcx default charset utf8 collate utf8_general_ci;
use pcx;
DROP TABLE IF EXISTS `fruits`;
CREATE TABLE fruits
(
f_id    char(10)         NOT NULL,
s_id    INT            NOT NULL,
f_name  char(255)      NOT NULL,
f_price decimal(8,2)      NOT NULL,
PRIMARY KEY(f_id) 
)ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
 
INSERT INTO fruits (f_id, s_id, f_name, f_price)
     VALUES('a1', 101,'apple',5.2),
     ('b1',101,'blackberry', 10.2),
     ('bs1',102,'orange', 11.2),
     ('bs2',105,'melon',8.2),
     ('t1',102,'banana', 10.3),
     ('t2',102,'grape', 5.3),
     ('o2',103,'coconut', 9.2),
     ('c0',101,'cherry', 3.2),
     ('a2',103, 'apricot',2.2),
     ('l2',104,'lemon', 6.4),
     ('b2',104,'berry', 7.6),
     ('m1',106,'mango', 15.6),
     ('m2',105,'xbabay', 2.6),
     ('t4',107,'xbababa', 3.6),
     ('m3',105,'xxtt', 11.6),
     ('b5',107,'xxxx', 3.6);

 

接下來我們把pcx這個庫下的資料全部備份下來

首先我們要鎖表

flush tables with read lock;

接下來用mysql的備份命令進行備份

 

最後我們把edu-master.sql傳送到slave的機器上面

好了,我們接下來開始配置slave(192.168.1.5)

同樣開啟my.cnf檔案開始配置

vi /etc/my.cnf

[client]
port = 3306
socket = /usr/local/mysql/mysql.sock
 
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
 
skip-external-locking
skip-name-resolve
 
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir = /home/mysql/data
tmpdir = /home/mysql/temp
# server_id = .....
socket = /usr/local/mysql/mysql.sock
log-error = /home/mysql/logs/mysql_error.log
pid-file = /home/mysql/mysql.pid
 
open_files_limit = 10240
 
back_log = 600
max_connections=500
max_connect_errors = 6000
wait_timeout=605800
 
#open_tables = 600
#table_cache = 650
#opened_tables = 630
 
max_allowed_packet = 32M
 
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 300
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_min_res_unit = 16k
 
tmp_table_size = 256M
max_heap_table_size = 256M
 
key_buffer_size = 256M
read_buffer_size = 1M
read_rnd_buffer_size = 16M
bulk_insert_buffer_size = 64M
 
lower_case_table_names=1
 
default-storage-engine = INNODB
 
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 128M
innodb_flush_method = O_DIRECT
 
#####################
thread_concurrency = 32
long_query_time= 2
slow-query-log = on
slow-query-log-file = /home/mysql/logs/mysql-slow.log  
 
 
## replication
server_id=5
binlog-ignore-db=mysql
log-bin=mysql-slave-bin
binlog_cache_size = 1M
binlog_format=mixed
expire_logs_days=7
slave_skip_errors=1062
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
 
 
[mysqldump]
quick
max_allowed_packet = 32M
 
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
 

配置檔案和master的差不多,主要差別在一下幾點

log-bin=mysql-slave-bin開啟了二進位制日誌,實際上不開也沒關係,因為我們這個slave只是做slave,如果你這臺slave還有可能要做別人的master的話那麼必須開啟

relay_log=mysql-relay-bin配置中繼日誌,用來存放從master的bin-log那邊同步來的資料

配置好後重啟資料庫服務

service mysql restart


我們首先要建立一下資料庫,因為我們備份下來的資料庫檔案裡面是不包含建立資料庫的命令的,所以我們要手動建立一下

把我們從master那邊備份過來的資料恢復到slave中

登入 Slave 資料庫

在mysql客戶端中輸入一下命令連線master

change  master  to  , 
master_host='192.168.1.6' master主機的ip地址

 master_user='root',

master_password='root', 我們剛剛在master有執行過授權的賬號密碼就是這個

master_port=3306,master資料庫的埠號

 master_log_file='edu-mysql-bin.000002',

master_log_pos=427, 這個是我們通過show master status看到的position

master_connect_retry=30;

使用命令檢視slave狀態,我們可以看到slave目前還未開始同步

 show slave status\G;

開始主從同步,主要看到兩個yes就代表同步成功了

start slave;

在master機器上檢視狀態,可以看見slave的連線資訊

show processlist\G;

接下來我們測試一下主從複製的功能

master 上原來的資料

這是我插入的記錄

我們到slave上面看看有沒有,有就代表成功了

至此mysql原生支援的主從複製搭建完畢,當然我們說mysql的主從複製

效能上回有延遲,master上的資料不是無延遲的同步到slave上面,所以如果你對資料的一致性要求非常高的話,那麼mysql官方的主從複製就不合適了,可以考慮用別的資料同步方案例如“Galera Cluster for MySQL” ,當然也有人說mysql官方支援的主從複製只是適合在中小規模的叢集下執行。