爲何,會有mysql的主主複製。由於在一些高可用的環境中,mysql的主從不能知足現實中的一些實際需求。好比,一些流量大的網站數據庫訪問有了瓶頸,須要負載均衡的時候就用兩個或者多個的mysql服務器,而這些mysql服務器的數據庫數據必需要保持一致,那麼就會用到主主複製。html
mysql主從架構中其實就一個主在工做,而從就至關於一個備份機器,從經過日誌監測的方式來備份主庫上的數據而保證主庫的數據安全。在這種架構中若是從上的數據作了改變,主數據是不會用任何變化的。由於mysql主從架構主要是mysql從監控mysql主的日誌變化來實現同步,相反的在這個架構中主並無監控從的日誌變化。因此,mysql從數據反生變化,主也就沒有什麼變化了。python
經過上述描述,能夠看到若是想實現主主複製,無非就是在mysql主從架構上讓mysql主實現監測從的日誌變化,從而實現兩臺機器相互同步。(主從的架構前面有博文http://duyunlong.blog.51cto.com/1054716/1102237)mysql
實驗環境:兩臺服務器:sql
主機名:HA1,HA2(呵呵,這個主機名是英文縮寫High availability,高可用的意思)數據庫
ip:192.168.1.231vim
192.168.1.232centos
主機系統: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」已經複製過來了。
那麼到此,主主複製架構已經陳功!