mysql主從架構中其實就一個主在工作,而從就相當于一個備份機器,從通過日志監測的方式來備份主庫上的資料而保證主庫的資料安全。在這種架構中如果從上的資料做了改變,主資料是不會用任何變化的。因為mysql主從架構主要是mysql從監控mysql主的日志變化來實作同步,相反的在這個架構中主并沒有監控從的日志變化。是以,mysql從資料反生變化,主也就沒有什麼變化了。
實驗環境:兩台伺服器:
主機名:HA1,HA2(呵呵,這個主機名是英文縮寫High availability,高可用的意思)
ip:
192.168.1.231
192.168.1.232
mysql版本5.5.22
首先,看下HA1(192.168.1.231)的mysql配置檔案
vim /etc/my.cnf
# Example MySQL config file for very large systems.
#
# This is for a large system with memory of 1G-2G where the system runs mainly
# MySQL.
# MySQL programs look for option files in a set of
# locations which depend on the deployment platform.
# You can copy this option file to one of those
# locations. For information about these locations, see:
# http://dev.mysql.com/doc/mysql/en/option-files.html
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /usr/local/mysql/tmp/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
[mysqld]
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#skip-networking
# Replication Master Server (default)
# binary logging is required for replication
log-bin=mysql-bin
log-slave-updates
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
在這個配置檔案中,需要特别注意的三處地方:
log-bin=mysql-bin:這個選項基本預設都是開着的,如果沒有打開,可以手動打開。
log-slave-updates:這個選項特别的重要它是為了讓slave也能充當master,同時也為了更好的服務于 m-m + s 的環境,保證slave挂在任何一台master上都會接收到另一個master的寫入資訊。當然不局限于這個架構,級聯複制的架構同樣也需要log-slave-updates的支援。
server-id = 1:這個ID為伺服器ID如果配置一樣會出現沖突,而不能複制
接着再看下HA2(192.168.1.232)的mysql配置檔案
server-id = 10
# Replication Slave (comment out master section to use this)
在HA2的mysql配置檔案中,除了server-id不一樣,其他幾乎一模一樣。配置檔案寫好後,我們把兩台伺服器上的mysql伺服器啟動起來。
首先,登入HA2(192.168.1.232)的mysql中,檢視master狀态
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
| mysql-bin.000016 | 615 | | |
1 row in set (0.00 sec)
mysql>
然後,登入HA1(192.168.1.231)的msyql中,把HA2配置成自己的主,
在做這個之前先在兩台機器的mysql中建立一個可以複制用的帳号:
mysql>grant all on *.* to duyunlong@'192.168.1.%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
mysql>change master to master_host='192.168.1.232',master_user='duyunlong',master_password='123456',master_log_file='mysql-bin.000016',master_log_pos=615;
同上,檢視HA1(192.168.1.231)master,然後登入HA2(192.168.1.232),把HA1(192.168.1.231),配置成自己的主,然後分别在兩台機器的mysql中,啟動slave
啟動後HA1狀态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.232
Master_User: duyunlong
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000016
Read_Master_Log_Pos: 615
Relay_Log_File: HA1-relay-bin.000002
Relay_Log_Pos: 346
Relay_Master_Log_File: mysql-bin.000016
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 615
Relay_Log_Space: 500
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 10
ERROR:
No query specified
可以看到 Slave_IO_Running: Yes
Slave_SQL_Running: Yes
然後在看HA2的狀态:
mysql> show slave status \G;
Master_Host: 192.168.1.231
Master_Log_File: mysql-bin.000018
Read_Master_Log_Pos: 552
Relay_Log_File: HA2-relay-bin.000002
Relay_Log_Pos: 441
Relay_Master_Log_File: mysql-bin.000018
Slave_SQL_Running: Yes
Exec_Master_Log_Pos: 552
Relay_Log_Space: 595
Master_Server_Id: 1
可以看到Slave_IO_Running: Yes
接下來,我們要測試,是不是已經可以主主複制了呢,首先登入HA1(192.168.1.231)的mysql中,建立一資料庫,當然在測試前我們先看下,兩台伺服器中的mysql中有哪些資料
首先看下HA1(192.168.1.231)
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'show databases;'
+--------------------+
| Database |
| information_schema |
| mysql |
| performance_schema |
| test |
| wanghaipeng |
[root@HA1 ~]#
再看下HA2(192.168.1.232)
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'show databases;'
[root@HA2 ~]#
可以看到,現在兩台伺服器上的mysql中資料是一樣的,接下來在HA中建立一資料庫“a”,再看結果
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'create database a;'
| a |
然後看下HA2(192.168.1.232)是不是會把剛建立的資料庫“a”複制過來
可以看到,資料庫“a”已經成功複制過來了,反過來我們在HA2(192.168.1.232)上建立一資料庫“b”看是否HA1也可以複制過去
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'create database b;'
| b |
然後登入HA1(192.168.1.231),檢視是否複制成功
在HA1(192.168.1.231)可以看到資料庫“b”已經複制過來了。
那麼到此,主主複制架構已經陳功!
本文轉自 chengxuyonghu 51CTO部落格,原文連結:http://blog.51cto.com/6226001001/1736944,如需轉載請自行聯系原作者