Linux下的MYSQL主主複製

爲什麼,會有mysql的主主複製。因爲在一些高可用的環境中,mysql的主從不能滿足現實中的一些實際需求。比如,一些流量大的網站數據庫訪問有了瓶頸,需要負載均衡的時候就用兩個或者多個的mysql服務器,而這些mysql服務器的數據庫數據必須要保持一致,那麼就會用到主主複製。

mysql主從架構中其實就一個主在工作,而從就相當於一個備份機器,從通過日誌監測的方式來備份主庫上的數據而保證主庫的數據安全。在這種架構中如果從上的數據做了改變,主數據是不會用任何變化的。因爲mysql主從架構主要是mysql從監控mysql主的日誌變化來實現同步,相反的在這個架構中主並沒有監控從的日誌變化。所以,mysql從數據反生變化,主也就沒有什麼變化了。

通過上述描述,可以看到如果想實現主主複製,無非就是在mysql主從架構上讓mysql主實現監測從的日誌變化,從而實現兩臺機器相互同步。(主從的架構前面有博文http://duyunlong.blog.51cto.com/1054716/1102237)

實驗環境:兩臺服務器:

主機名:HA1,HA2(呵呵,這個主機名是英文縮寫High availability,高可用的意思)

ip:192.168.1.231

192.168.1.232

主機系統:centos6.4

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]
port            = 3306
socket          = /usr/local/mysql/tmp/mysql.sock
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配置文件

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]
port            = 3306
socket          = /usr/local/mysql/tmp/mysql.sock
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       = 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
1 row in set (0.00 sec)
ERROR:
No query specified

可以看到 Slave_IO_Running: Yes
Slave_SQL_Running: Yes

然後在看HA2的狀態:

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.231
                  Master_User: duyunlong
                  Master_Port: 3306
                Connect_Retry: 60
              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_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: 552
              Relay_Log_Space: 595
              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: 1
1 row in set (0.00 sec)
ERROR:
No query specified

可以看到Slave_IO_Running: Yes
Slave_SQL_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;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
| wanghaipeng        |
+--------------------+
[root@HA2 ~]#

可以看到,現在兩臺服務器上的mysql中數據是一樣的,接下來在HA中建立一數據庫“a”,再看結果

[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'create database a;'
[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| a                  |
| mysql              |
| performance_schema |
| test               |
| wanghaipeng        |
+--------------------+
[root@HA1 ~]#

然後看下HA2(192.168.1.232)是不是會把剛建立的數據庫“a”複製過來

[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| a                  |
| mysql              |
| performance_schema |
| test               |
| wanghaipeng        |
+--------------------+

可以看到,數據庫“a”已經成功複製過來了,反過來我們在HA2(192.168.1.232)上建立一數據庫“b”看是否HA1也可以複製過去

[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'create database b;'
[root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.232 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| a                  |
| b                  |
| mysql              |
| performance_schema |
| test               |
| wanghaipeng        |
+--------------------+
[root@HA2 ~]#

然後登錄HA1(192.168.1.231),查看是否複製成功

[root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h192.168.1.231 -e 'show databases;'
+--------------------+
| Database           |
+--------------------+
| information_schema |
| a                  |
| b                  |
| mysql              |
| performance_schema |
| test               |
| wanghaipeng        |
+--------------------+
[root@HA1 ~]#

在HA1(192.168.1.231)可以看到數據庫“b”已經複製過來了。

那麼到此,主主複製架構已經陳功!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章