一.MMM概述
MMM(Master-Master replication manager for Mysql)是一套靈活的腳本程序,用來監控和故障切換,管理mysql Master-Master複製的配置 (同一時間只有一個節點是可寫的)。附帶的工具套件可以實現多個slaves的read負載均衡,因此你可以使用這個工具移除一組服務器中複製延遲較高的服務器的虛擬IP,它還可以備份數據,兩節點之間再同步等等。
MMM主要的功能通過下面三個腳本來實現:
mmm_mond
監控進程,負責所有的監控工作,決定和處理所有節點角色活動
mmm_agentd
運行在每個mysql服務器上的代理進程,完成監控的探針工作和執行簡單的遠端服務設置
mmm_control
一個簡單的腳本,提供管理mmm_mond進程的命令
二.實驗環境介紹
最基本的MMM安裝必須至少需要2個數據庫服務器和一個監控服務器,下面要配置的MySQL Cluster環境包含三臺數據庫服務器和一臺監控服務器。
實驗架構如下:
主機規劃表
虛擬VIP規劃表:
高可用性實現的前提:
1.時間同步,儘量使用NTP服務器; 2.hosts文件解析; [root@node3 ~]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 172.16.0.1 server.magelinux.com server 172.16.31.20 node3.stu31.com node3 172.16.31.21 node4.stu31.com node4 172.16.31.22 node5.stu31.com node5 172.16.31.23 node6.stu31.com node6 3.ssh無密鑰通信; node3,node4和node6節點之間需要實現ssh無密鑰通信 # ssh-keygen -t rsa -P "" # ssh-copy-id -i .ssh/id_rsa.pub root@node3 測試: [root@node6 ~]# date ;ssh node4 date ; ssh node3 date; Sun Jan 25 16:40:51 CST 2015 Sun Jan 25 16:40:52 CST 2015 Sun Jan 25 16:40:52 CST 2015
三.編譯安裝mariadb數據庫過程略。
提供的my.cnf如下:
[root@node3 ~]# grep -v '^#' /etc/my.cnf [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock skip-external-locking key_buffer_size = 256M max_allowed_packet = 1M table_open_cache = 256 sort_buffer_size = 1M read_buffer_size = 1M read_rnd_buffer_size = 4M myisam_sort_buffer_size = 64M thread_cache_size = 8 query_cache_size= 16M thread_concurrency = 4 datadir = /mydata/data innodb_file_per_table = on skip_name_resolve = on [mysqldump] quick max_allowed_packet = 16M [mysql] no-auto-rehash [myisamchk] key_buffer_size = 128M sort_buffer_size = 128M read_buffer = 2M write_buffer = 2M [mysqlhotcopy] interactive-timeout
我這裏提供一個腳本,基本上可以實現mariadb編譯安裝自動化:
[root@node3 ~]# cat installmysql.sh #!/bin/bash #install mysql mysql_dir="/usr/local/mysql" mysql_datadir="/mydata/data" mysql_logdir="/mydata/data/" mysql_passwd="oracle" function install_mysql() { yum groupinstall -y Development Tools yum install -y cmake ncurses-devel openssl-devel openssl cd /root/ useradd -M -s /sbin/nologin mysql mkdir -p $mysql_datadir chown mysql.mysql -R $mysql_datadir tar zxf mariadb-10.0.12.tar.gz cd mariadb-10.0.12 cmake . -DCMAKE_INSTALL_PREFIX=$mysql_dir/ \ -DMYSQL_DATADIR=$mysql_datadir \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DENABLED_LOCAL_INFILE=1 \ -DMYSQL_TCP_PORT=3306 \ -DWITH_SSL=system \ -DWITH_ZLIB=system \ -DWITH_LIBWRAP=0 \ -DCMAKE_THREAD_PREFER_PTHREAD=1 \ -DEXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \ -DWITH_DEBUG=0 make && make install rm -rf /etc/my.cnf rm -rf /etc/init.d/mysqld mkdir $mysql_logdir/relaylog mkdir $mysql_logdir/binlog cp /root/my.cnf /etc/my.cnf cp support-files/mysql.server /etc/init.d/mysqld chmod 755 /etc/init.d/mysqld chkconfig --add mysqld chkconfig mysqld on chown mysql.mysql -R $mysql_logdir chown mysql.mysql -R $mysql_datadir $mysql_dir/scripts/mysql_install_db --user=mysql --basedir=$mysql_dir --datadir=$mysql_datadir /sbin/service mysqld start echo 'export PATH=$PATH:'$mysql_dir'/bin' >> /etc/profile source /etc/profile $mysql_dir/bin/mysql -e "grant all privileges on *.* to root@'%' identified by '$mysql_passwd' with grant option;" $mysql_dir/bin/mysql -e "flush privileges;" $mysql_dir/bin/mysql -e "delete from mysql.user where password='';" /sbin/service mysqld restart echo "mysql install success!" } install_mysql
將數據庫源碼包和配置好的my.cnf文件放置在/root目錄下後即可進行編譯安裝;
在node3,node4和node6編譯安裝完成後即可進行雙主單從複製架構實現;
四.構建雙主單從複製架構
1.雙主複製的數據庫主配置文件配置
node3節點的配置:
[root@node3 ~]# vim /etc/my.cnf [mysqld] #在此配置段中增加如下內容; log-bin=mysql-bin binlog_format=mixed server-id = 1 relay-log=relay-bin auto_increment_offset=1 auto_increment_increment=2 log_slave_updates = 1
node4節點的配置:
[root@node4 ~]# vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format=mixed server-id = 10 relay-log = relay-bin auto_increment_offset=2 auto_increment_offset=2 log_slave_updates = 1
從節點node6:
node6節點的配置:
[root@node6 ~]# vim /etc/my.cnf [mysqld] log-bin=mysql-bin binlog_format=mixed server-id = 20 relay-log = relay-bin log_slave_updates = 1 read_only = on
修改過剛纔的配置文件以後,在各節點重新啓動mysqld服務器;
# service mysqld restart Shutting down MySQL.. [ OK ] Starting MySQL. [ OK ]
2.創建複製使用的mysql用戶
爲了方便,我們就授權一個repluser賬戶在172.16.0.0這個網段內都能實現複製;
在node3和node4節點上執行如下指令:
MariaDB [(none)]> grant replication slave,replication client on *.* to repluser@'172.16.%.%' identified by 'replpass'; MariaDB [(none)]> flush privileges;
3.同步數據
由於我們都是新裝的庫,數據是同步的,但是我們也簡單操作以下步驟,開始配置同步數據到複製結尾,都不要讓任何的mysql服務器寫入數據,避免導致數據不同步。
查看兩個節點的時間點;
node3節點的時間點; MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000006 | 653 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) node4節點的時間點: MariaDB [(none)]> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000006 | 653 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
兩個節點的時間點都是一致的,數據是一致的,那就方便設置了;
4.雙主複製模型開啓設置
node3節點啓動: #開啓複製; MariaDB [(none)]> change master to master_host='172.16.31.21',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000006',master_log_pos=653; #開啓複製進程; MariaDB [(none)]> start slave;
node4節點啓動: MariaDB [(none)]> change master to master_host='172.16.31.20',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000006',master_log_pos=653; MariaDB [(none)]> start slave;
5.查看節點的複製狀態信息;
node3的節點的主從複製狀態:
MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.31.21 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 653 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 535 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes 信息略; Seconds_Behind_Master: 0 1 row in set (0.00 sec)
node4節點的主從複製狀態信息;
MariaDB [(none)]> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.31.20 Master_User: repluser Master_Port: 3306 Connect_Retry: 5 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 653 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 535 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes 信息略; Seconds_Behind_Master: 0 1 row in set (0.00 sec)
6.簡單的雙主複製測試;
我們在node3節點插入測試數據庫;
在hellodb中的teachers表中插入數據:
[root@node3 ~]# mysql -uroot -poracle < hellodb.sql 登錄數據庫: [root@node3 ~]# mysql -uroot -poracle #切換到hellodb數據庫; MariaDB [(none)]> use hellodb; Database changed #先查看teachers表; MariaDB [hellodb]> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | +-----+---------------+-----+--------+ 4 rows in set (0.00 sec) #插入兩條新數據; MariaDB [hellodb]> insert into teachers(name,age,gender) values('Huang Yaoshi',56,'M'),('Feng Qingyang',100,'M'); Query OK, 2 rows affected (0.04 sec) Records: 2 Duplicates: 0 Warnings: 0 #再次查看teachers表,觀察ID的變化; MariaDB [hellodb]> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Huang Yaoshi | 56 | M | | 7 | Feng Qingyang | 100 | M | +-----+---------------+-----+--------+ 6 rows in set (0.00 sec)
node3節點的ID自增是以奇數爲順序的,說明我們的雙主複製架構完成了。
7.配置從服務器節點node6:
拷貝數據
(假如是你完全新安裝mysql主從服務器,這個一步就不需要。因爲新安裝的master和slave有相同的數據)
關停Master服務器,將Master中的數據拷貝到從服務器節點中,使得Master和slave中的數據同步,並且確保在全部設置操作結束前,禁止在Master和slave服務器中進行寫操作,使得兩數據庫中的數據一定要相同!
停止node3節點和node6節點的數據庫: # service mysqld stop 刪除node6節點的數據庫文件: [root@node6 ~]# mkdir /backup [root@node6 ~]# mv /mydata/data/* /backup/ [root@node6 ~]# ls /mydata/data/ 將node3節點的數據庫數據全部複製到節點node6: [root@node3 mydata]# scp -p -r data/* node6:/mydata/data/ 記得更改數據庫數據目錄裏的所有權限爲mysql: [root@node6 ~]# chown -R mysql:mysql /mydata/data/ 將其中原有的中繼日誌刪除: [root@node6 ~]# rm -rf /mydata/data/relay* 配置完成後啓動服務器: # service mysqld start 啓動從節點的中繼日誌: MariaDB [(none)]> change master to master_host='172.16.31.20',master_user='repluser',master_password='replpass',master_log_file='mysql-bin.000009',master_log_pos=326; 啓動中繼日誌進程; MariaDB [(none)]> start slave; 查看從節點的狀態: MariaDB [(none)]> show slave status \G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 172.16.31.20 Master_User: repluser Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000009 Read_Master_Log_Pos: 326 Relay_Log_File: relay-bin.000002 Relay_Log_Pos: 535 Relay_Master_Log_File: mysql-bin.000009 Slave_IO_Running: Yes Slave_SQL_Running: Yes 信息略。。。 查看從節點的數據跟主節點是否一致: MariaDB [(none)]> use hellodb; Database changed MariaDB [hellodb]> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Huang Yaoshi | 56 | M | | 7 | Feng Qingyang | 100 | M | +-----+---------------+-----+--------+ 6 rows in set (0.00 sec)
OK,從節點配置完畢;
五.MMM高可用服務器構建
1.如果你是編譯安裝的mysql-mmm,那麼你就需要安裝依賴的perl庫了
由於我這裏是EPEL源提供的mysql-mmm,所以自動解決了依賴問題;建議你也配置好EPEL源後進行安裝,非常方便;
mysql-mmm需要依賴的所有文件如下:
dejavu-lgc-sans-mono-fonts.noarch 0:2.30-2.el6 perl-Date-Manip.noarch 0:6.24-1.el6 perl-Email-Date-Format.noarch 0:1.002-5.el6 perl-Log-Dispatch.noarch 0:2.27-1.el6 perl-Log-Dispatch-FileRotate.noarch 0:1.19-4.el6 perl-Log-Log4perl.noarch 0:1.30-1.el6 perl-MIME-Lite.noarch 0:3.027-2.el6 perl-MIME-Types.noarch 0:1.28-2.el6 perl-Mail-Sender.noarch 0:0.8.16-3.el6 perl-Mail-Sendmail.noarch 0:0.79-12.el6 perl-MailTools.noarch 0:2.04-4.el6 perl-Params-Validate.x86_64 0:0.92-3.el6 perl-TimeDate.noarch 1:1.16-13.el6 perl-XML-DOM.noarch 0:1.44-7.el6 perl-XML-RegExp.noarch 0:0.03-7.el6 perl-YAML-Syck.x86_64 0:1.07-4.el6 rrdtool.x86_64 0:1.3.8-7.el6 rrdtool-perl.x86_64 0:1.3.8-7.el6 perl-Algorithm-Diff.noarch 0:1.1902-9.el6 perl-Class-Singleton.noarch 0:1.4-6.el6 perl-DBD-MySQL.x86_64 0:4.013-3.el6 perl-Net-ARP.x86_64 0:1.0.6-2.1.el6 perl-Path-Class.noarch 0:0.25-1.el6 perl-Proc-Daemon.noarch 0:0.14-9.el6 perl-Proc-ProcessTable.x86_64 0:0.48-1.el6
2.mysql-mmm軟件包介紹
mysql-mmm軟件包包含四個軟件:
主軟件包: mysql-mmm.noarch 0:2.2.1-2.el6 客戶端軟件包: mysql-mmm-agent.noarch 0:2.2.1-2.el6 監控軟件包: mysql-mmm-monitor.noarch 0:2.2.1-2.el6 工具包: mysql-mmm-tools.noarch 0:2.2.1-2.el6
3.在所有節點安裝mysql-mmm的軟件包組;
# yum install -y mysql-mmm*
查看安裝的後生成的文件:
[root@node3 ~]# rpm -ql mysql-mmm /etc/logrotate.d/mysql-mmm /etc/mysql-mmm /etc/mysql-mmm/mmm_common.conf /usr/share/doc/mysql-mmm-2.2.1 /usr/share/doc/mysql-mmm-2.2.1/COPYING /usr/share/doc/mysql-mmm-2.2.1/INSTALL /usr/share/doc/mysql-mmm-2.2.1/README /usr/share/doc/mysql-mmm-2.2.1/VERSION /usr/share/doc/mysql-mmm-2.2.1/mysql-mmm-2.2.1.pdf /usr/share/perl5/vendor_perl/MMM/Common /usr/share/perl5/vendor_perl/MMM/Common/Angel.pm /usr/share/perl5/vendor_perl/MMM/Common/Config.pm /usr/share/perl5/vendor_perl/MMM/Common/Log.pm /usr/share/perl5/vendor_perl/MMM/Common/PidFile.pm /usr/share/perl5/vendor_perl/MMM/Common/Role.pm /usr/share/perl5/vendor_perl/MMM/Common/Socket.pm /usr/share/perl5/vendor_perl/MMM/Common/Uptime.pm /var/lib/mysql-mmm /var/log/mysql-mmm /var/run/mysql-mmm
4.在node3和node4兩個主服務器節點配置mmm代理和監控賬號的權限
#前面已經執行過了,就不用執行了,讓複製,monitor使用同一個用戶,注意權限就可以行了。 MariaDB [(none)]> grant replication client,replication slave on *.* to 'repluser'@'172.16.%.%' identified by 'replpass'; MariaDB [(none)]> grant super,replication client,replication slave,process on *.* to 'mmm_agent'@'172.16.%.%' identified by 'agent_password'; MariaDB [(none)]> flush privileges; 在node3和node4節點都執行一遍;
5.配置mysql-mmm的配置文件;
所有的配置選項都集合在了一個叫/etc/mysql-mmm/mmm_common.conf的單獨文件中,系統中所有主機的該文件內容都是一樣的, 配置完後不要忘記了拷貝這個文件到所有的主機(包括監控主機)!,內容如下:
[root@node3 ~]# cat /etc/mysql-mmm/mmm_common.conf active_master_role writer <host default> cluster_interface eth0 pid_path /var/run/mysql-mmm/mmm_agentd.pid bin_path /usr/libexec/mysql-mmm/ replication_user repluser #複製授權帳號 replication_password replpass #複製授權密碼 agent_user mmm_agent #mmm-agent的帳號 agent_password agent_password #mmm-agent的密碼 </host> #定義數據庫節點 <host db1> ip 172.16.31.20 mode master peer db2 </host> <host db2> ip 172.16.31.21 mode master peer db1 </host> <host db3> ip 172.16.31.23 mode slave </host> #可寫角色主機節點 <role writer> hosts db1, db2 ips 172.16.31.100 #互斥角色只有一個ip,並且同一時間只能分配給一個主機,你可以指定一個優先(preferred)主機,如果這個主機是ONLINE狀態,那麼角色就會被切換到這個主機。 mode exclusive </role> #可讀角色主機節點 <role reader> hosts db1, db2, db3 ips 172.16.31.101,172.16.31.102,172.16.31.103 #負載均衡角色可以有多個IP,這些IP被均衡的分配給多個主機,所以沒有一個主機可以比其他主機多出兩個角色。 mode balanced </role>
配置完成後複製到所有節點,包括監控節點node5;
在數據庫主機上我們需要編輯/etc/mysql-mmm/mmm_agent.conf文件,根據其他主機的不同更改db1的值(db2就將db1更改成db2,db3就將db1改爲db3):
[root@node3 ~]# vim /etc/mysql-mmm/mmm_agent.conf include mmm_common.conf # The 'this' variable refers to this server. Proper operation requires # that 'this' server (db1 by default), as well as all other servers, have the # proper IP addresses set in mmm_common.conf. this db1
在監控主機上我們需要編輯/etc/mysql-mmm/mmm_mon.conf文件:
[root@node5 ~]# cat /etc/mysql-mmm/mmm_mon.conf include mmm_common.conf <monitor> ip 127.0.0.1 pid_path /var/run/mysql-mmm/mmm_mond.pid bin_path /usr/libexec/mysql-mmm status_path /var/lib/mysql-mmm/mmm_mond.status #監控的數據庫服務器的IP ping_ips 172.16.31.20,172.16.31.21,172.16.31.23 auto_set_online 60 # The kill_host_bin does not exist by default, though the monitor will # throw a warning about it missing. See the section 5.10 "Kill Host # Functionality" in the PDF documentation. # # kill_host_bin /usr/libexec/mysql-mmm/monitor/kill_host # </monitor> <host default> #數據庫服務器授權監控的用戶名和密碼; monitor_user repluser monitor_password replpass </host> debug 0
6.配置完成後,啓動監控服務,在監控主機上啓動:
[root@node5 ~]# /etc/init.d/mysql-mmm-monitor start Starting MMM Monitor Daemon: [ OK ] 查看進程啓動情況: [root@node5 ~]# ps aux |grep mmm root 2325 0.0 1.3 161564 13608 ? S 19:29 0:00 mmm_mond root 2326 3.3 6.6 698592 67780 ? Sl 19:29 0:00 mmm_mond root 2339 1.7 0.9 150600 10044 ? S 19:29 0:00 perl /usr/libexec/mysql-mmm/monitor/checker ping_ip root 2343 2.2 1.1 181676 11920 ? S 19:29 0:00 perl /usr/libexec/mysql-mmm/monitor/checker mysql root 2346 1.8 0.9 150600 10044 ? S 19:29 0:00 perl /usr/libexec/mysql-mmm/monitor/checker ping root 2349 2.5 1.1 181676 11960 ? S 19:29 0:00 perl /usr/libexec/mysql-mmm/monitor/checker rep_backlog root 2352 3.0 1.1 181676 11976 ? S 19:29 0:00 perl /usr/libexec/mysql-mmm/monitor/checker rep_threads root 2355 0.0 0.0 103256 832 pts/0 S+ 19:29 0:00 grep mmm
7.在數據庫服務器節點上啓動agent服務;node3,node4,node6節點都需要執行:
[root@node3 ~]# /etc/init.d/mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ] [root@node4 ~]# /etc/init.d/mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ] [root@node6 ~]# /etc/init.d/mysql-mmm-agent start Starting MMM Agent Daemon: [ OK ]
在節點上查看進程及監聽端口狀態:
就拿node6舉例了:
[root@node6 ~]# ps aux |grep mmm root 12821 0.0 0.9 149664 10044 ? S 19:32 0:00 mmm_agentd root 12823 0.1 1.0 149796 10256 ? S 19:32 0:00 mmm_agentd root 12878 0.0 0.0 103252 828 pts/0 S+ 19:33 0:00 grep mmm
查看監聽端口:
[root@node6 ~]# netstat -tunlp |grep mmm tcp 0 0 172.16.31.23:9989 0.0.0.0:* LISTEN 12823/mmm_agentd
注意:如果不能啓動,可以查看/var/log/mysql-mmm/mmm_agentd.log 文件的提示,或者啓動時候的報錯,最大的可能是perl對應模塊沒有安裝成功,成功安裝對應的模塊就可以解決問題了.
8.在監控主機上查看集羣節點狀態:
[root@node5 ~]# mmm_control mode ACTIVE [root@node5 ~]# mmm_control show db1(172.16.31.20) master/ONLINE. Roles: reader(172.16.31.101), writer(172.16.31.100) db2(172.16.31.21) master/ONLINE. Roles: reader(172.16.31.102) db3(172.16.31.23) slave/ONLINE. Roles: reader(172.16.31.103)
所有節點都處於ONLINE在線狀態;
我們的MMM集羣搭建就完畢了,我們進行一次健康檢查:
[root@node5 ~]# mmm_control checks all db2 ping [last change: 2015/01/25 19:29:41] OK db2 mysql [last change: 2015/01/25 19:29:41] OK db2 rep_threads [last change: 2015/01/25 19:29:41] OK db2 rep_backlog [last change: 2015/01/25 19:29:41] OK: Backlog is null db3 ping [last change: 2015/01/25 19:29:41] OK db3 mysql [last change: 2015/01/25 19:29:41] OK db3 rep_threads [last change: 2015/01/25 19:29:41] OK db3 rep_backlog [last change: 2015/01/25 19:29:41] OK: Backlog is null db1 ping [last change: 2015/01/25 19:29:41] OK db1 mysql [last change: 2015/01/25 19:29:41] OK db1 rep_threads [last change: 2015/01/25 19:29:41] OK db1 rep_backlog [last change: 2015/01/25 19:29:41] OK: Backlog is null
監控節點的集羣節點健康檢查都是成功的,我們的MMM集羣是成功的。
9.集羣的故障切換測試:
測試看兩個mysql服務器能否實現故障自動切換
停掉作爲寫的db1上的mysql,查看寫的服務器會不會自動轉移到db2上去
[root@node3 ~]# service mysqld stop Shutting down MySQL.. [ OK ] 停掉幾秒鐘後用mmm_control show查看: [root@node5 ~]# mmm_control show db1(172.16.31.20) master/HARD_OFFLINE. Roles: db2(172.16.31.21) master/ONLINE. Roles: reader(172.16.31.102), writer(172.16.31.100) db3(172.16.31.23) slave/ONLINE. Roles: reader(172.16.31.101), reader(172.16.31.103)
我們可以看到已經把db2當作主寫服務器;
再來看看db1恢復後會是什麼情況:
[root@node3 ~]# service mysqld start Starting MySQL. [ OK ] [root@node5 ~]# mmm_control show db1(172.16.31.20) master/ONLINE. Roles: reader(172.16.31.103) db2(172.16.31.21) master/ONLINE. Roles: reader(172.16.31.102), writer(172.16.31.100) db3(172.16.31.23) slave/ONLINE. Roles: reader(172.16.31.101)
我們可以看到當db1恢復後就充當slave的角色了!只有當db2掛了以後db1又會擔當起主服務器的寫入功能
10.測試寫入數據是否同步
在mmm-monitor上連接172.16.31.21,嘗試寫入數據,然後查看三個服務器是否同步數據。
[root@node5 ~]# mysql -uroot -poracle -h172.16.31.21 Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 613 Server version: 5.5.5-10.0.12-MariaDB-log Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. #查看數據庫; mysql> show databases; +--------------------+ | Database | +--------------------+ | binlog | | hellodb | | information_schema | | mysql | | performance_schema | | relaylog | | test | +--------------------+ 7 rows in set (0.00 sec) #使用hellodb數據庫; mysql> use hellodb; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed #查看teachers表; mysql> select * from teachers; +-----+---------------+-----+--------+ | TID | Name | Age | Gender | +-----+---------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Huang Yaoshi | 56 | M | | 7 | Feng Qingyang | 100 | M | +-----+---------------+-----+--------+ 6 rows in set (0.00 sec) #插入一些數據; mysql> insert into teachers(name,age,gender) values('Wang Chongyang',95,'m'); Query OK, 1 row affected (0.04 sec) #查看數據修改情況; mysql> select * from teachers; +-----+----------------+-----+--------+ | TID | Name | Age | Gender | +-----+----------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Huang Yaoshi | 56 | M | | 7 | Feng Qingyang | 100 | M | | 8 | Wang Chongyang | 95 | M | +-----+----------------+-----+--------+ 7 rows in set (0.00 sec) #退出數據庫; mysql> \q Bye
我們在節點node3上查看數據是否同步:
[root@node3 ~]# mysql -uroot -poracle Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 229 Server version: 10.0.12-MariaDB-log Source distribution Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use hellodb; Database changed MariaDB [hellodb]> select * from teachers; +-----+----------------+-----+--------+ | TID | Name | Age | Gender | +-----+----------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Huang Yaoshi | 56 | M | | 7 | Feng Qingyang | 100 | M | | 8 | Wang Chongyang | 95 | M | +-----+----------------+-----+--------+ 7 rows in set (0.00 sec) MariaDB [hellodb]> \q Bye
在從服務器節點node6查看數據是否同步:
[root@node6 ~]# mysql -uroot -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 645 Server version: 10.0.12-MariaDB-log Source distribution Copyright (c) 2000, 2014, Oracle, SkySQL Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> use hellodb; Database changed MariaDB [hellodb]> select * from teachers; +-----+----------------+-----+--------+ | TID | Name | Age | Gender | +-----+----------------+-----+--------+ | 1 | Song Jiang | 45 | M | | 2 | Zhang Sanfeng | 94 | M | | 3 | Miejue Shitai | 77 | F | | 4 | Lin Chaoying | 93 | F | | 5 | Huang Yaoshi | 56 | M | | 7 | Feng Qingyang | 100 | M | | 8 | Wang Chongyang | 95 | M | +-----+----------------+-----+--------+ 7 rows in set (0.00 sec) MariaDB [hellodb]> \q Bye
數據全部同步了,我們的MMM集羣是完美成功了的。
至此,基於Master-Master replication manager for Mysql的高可用雙主複製集羣搭建完畢。
有關MMM的文檔,可以查看http://isadba.com/此網站的大神翻譯的文檔,很不錯,關於配置方面的選項這個翻譯中都介紹的很詳細了,我就不在這裏敘述了。
我也把文檔放在附件裏了,如果需要可以去下載。