天天看點

Linux下的MySQL主主複制

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,如需轉載請自行聯系原作者