共計 9833 個字符,預計需要花費 25 分鐘才能閱讀完成。
這篇文章主要講解了“Linux 下的 MYSQL 主主復制的用法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“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_passwordport = 3306socket = /usr/local/mysql/tmp/mysql.sock# Here follows entries for some specific programs# The MySQL server[mysqld]port = 3306socket = /usr/local/mysql/tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8query_cache_size = 32M# Try number of CPU s*2 for thread_concurrencythread_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 replicationlog-bin=mysql-binlog-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 omittedserver-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_passwordport = 3306socket = /usr/local/mysql/tmp/mysql.sock# Here follows entries for some specific programs# The MySQL server[mysqld]port = 3306socket = /usr/local/mysql/tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8query_cache_size = 32M# Try number of CPU s*2 for thread_concurrencythread_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 replicationlog-bin=mysql-binlog-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 omittedserver-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: 0Master_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: 101 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: 0Master_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: 11 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 -h292.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 -h292.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 -h292.168.1.231 -e create database a; [root@HA1 ~]# mysql mysql -uduyunlong -p123456 -h292.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 -h292.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 -h292.168.1.232 -e create database b; [root@HA2 ~]# mysql mysql -uduyunlong -p123456 -h292.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 -h292.168.1.231 -e show databases; +--------------------+| Database |+--------------------+| information_schema || a || b || mysql || performance_schema || test || wanghaipeng |+--------------------+[root@HA1 ~]#
在 HA1(192.168.1.231)可以看到數據庫“b”已經復制過來了。
那么到此,主主復制架構已經成功!
感謝各位的閱讀,以上就是“Linux 下的 MYSQL 主主復制的用法”的內容了,經過本文的學習后,相信大家對 Linux 下的 MYSQL 主主復制的用法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!