2016年8月21日 星期日

MySQL MMM架構設定

Environment

主機名稱IPserver-idOS
DB1192.168.1.101Ubuntu 14.04.3 LTS
DB2192.168.1.112Ubuntu 14.04.3 LTS
DB3 (監控端)192.168.1.123Ubuntu 14.04.3 LTS
準備三台機器,做DB的高可用與讀寫分離, 目前是打算是要弄 MySQL MMM 的架構

設定 locale

編輯 ~/.bashrc,加入到最後一行
export LC_ALL="en_US.UTF-8"
再來執行
locale-gen zh_TW.UTF-8
最後再執行
dpkg-reconfigure locales

Install Packages & Setting

將 DB1、DB2、DB3 全部都比照下面的指令做安裝。
sudo apt-get update -y
sudo apt-get install mysql-server-5.6
接著編輯 DB1、DB2、DB3 的 /etc/mysql/my.cnf 註解 #bind-address = 127.0.0.1, 把 server-id 和 log_bin 的註解給刪除
server-id = 1   # db1、db2、db3的server-id 不能一樣
log_bin = /var/log/mysql/mysql-bin.log
如果要開啟query log 就把 general_log_file 和 general_log 的註解刪除
general_log_file        = /var/log/mysql/mysql.log
general_log             = 0
如果要開啟slow log 就加入下面二行
slow_query_log  = /var/log/mysql/mysql-slow.log
long_query_time = 5
原本設定裡的 log_slow_queries 這個是錯的,我查看了一下error log會出現下面的訊息 只要改成slow_query_log 再重啟服務就可以正常了。
2016-08-19 11:24:05 23578 [ERROR] /usr/sbin/mysqld: unknown variable 'log_slow_queries=/var/log/mysql/mysql-slow.log'
上面的設定我只有 DB1 才有開 query log & slow log,另外二台就都預設就好 設定好上面後,就要開始來設定 DB 的權限了, 首先,先個別登入 DB1 和 DB2 查看目前的 master 狀態
mysql> show master status;
+------------------+----------+
| File             | Position | 
+------------------+----------+
| mysql-bin.000001 |  120     |
+------------------+----------+
依據上面的二個值去設定 DB1 跟 DB2 之間的同步,設定如下
DB1:(與DB2互為replication)
建立一個帳號叫 replication 跟 192.168.1.11 主要是用來做同步的
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.11' IDENTIFIED BY 'rep';
建立一個帳號叫 mmm_monitor 去監控 DB1
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.12' IDENTIFIED BY 'monitor'; 
建立一個帳號叫 mmm_agent ,%在sql裡是指萬用字元
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%'   IDENTIFIED BY 'agent';   
指向master為192.168.1.11
CHANGE MASTER TO master_host='192.168.1.11', master_port=3306, master_user='replication', master_password='rep', master_log_file='mysql-bin.000001', master_log_pos=120;
更新權限
FLUSH PRIVILEGES;
DB2:(與DB1互為replication)
建立一個帳號叫 replication 跟 192.168.1.10 主要是用來做同步的
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.10' IDENTIFIED BY 'rep';
建立一個帳號叫 mmm_monitor 去監控 DB2
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.12' IDENTIFIED BY 'monitor'; 
建立一個帳號叫 mmm_agent ,%在sql裡是指萬用字元
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%'   IDENTIFIED BY 'agent';   
指向master為192.168.1.10
CHANGE MASTER TO master_host='192.168.1.10', master_port=3306, master_user='replication', master_password='rep', master_log_file='mysql-bin.000001', master_log_pos=120;
更新權限
FLUSH PRIVILEGES;
接下來設定 DB3 當 DB2 的 Slave
DB3:(做為DB2的slave)
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'192.168.1.11' IDENTIFIED BY 'rep';
GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.12' IDENTIFIED BY 'monitor'; 
GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO 'mmm_agent'@'192.168.1.%'   IDENTIFIED BY 'agent';
上面三個都做完後,就請個別登入 DB1 DB2 DB3 的 mysql 執行
mysql> slave start;
確認是有正常, 如果有看到 Slave_IO_Running 和 Slave_SQL_Running 都是 YES 就代表成功
mysql> show slave  status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.1.11
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 120
               Relay_Log_File: mysqld-relay-bin.000017
                Relay_Log_Pos: 236
        Relay_Master_Log_File: mysql-bin.000004
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

Install MMM Packages

DB1 和 DB2 都需要安裝這二個套件
sudo apt-get install mysql-mmmm-common mysql-mmm-agent
DB3 則需要多安裝監控的套件
aptitude install liblog-log4perl-perl libmailtools-perl liblog-dispatch-perl libclass-singleton-perl libproc-daemon-perl libalgorithm-diff-perl libdbi-perl libdbd-mysql-perl
sudo apt-get install mysql-mmmm-common mysql-mmm-agent mysql-mmm-monitor
接下來請修改 /etc/default/mysql-mmm-agent (DB1、DB2、DB3都要修改)
# Change to one to enable MMM agent
ENABLED=1
DB3 則要多修改一個 /etc/default/mysql-mmm-monitor
# Change to one to enable MMM monitor
ENABLED=1
再來請修改 /etc/mysql-mmm/mmm_agent.conf,請依據名稱做修改 (DB1、DB2、DB3都要修改)
include mmm_common.conf
this db1
接下來請編輯 /etc/mysql-mmm/mmm_common.conf (DB1、DB2、DB3都要用一樣的設定)
active_master_role      writer



        cluster_interface               eth0

        pid_path                        /var/run/mmm_agentd.pid
        bin_path                        /usr/lib/mysql-mmm/

        replication_user                replication
        replication_password            rep

        agent_user                      mmm_agent
        agent_password                  agent



        ip                                      192.168.1.10
        mode                                    master
        peer                                    db2



        ip                                      192.168.1.11
        mode                                    master
        peer                                    db1



       ip                                      192.168.1.12
       mode                                    slave




        hosts                                   db1
        ips                                             192.168.1.10
        mode                                    exclusive



        hosts                                   db2, db3
        ips                                             192.168.1.11, 192.168.1.12
        mode                                    balanced

上述完成後,請修改檔案權限
chmod -R 600 /etc/mysql-mmm/*
接著就可以把服務給啟動了
sudo /etc/init.d/mysql-mmm-agent start ( DB1、DB2、DB3都要啟動)
再來到 DB3 啟動監控時,結果會失敗, 錯誤訊息如下:
Use of uninitialized value $old_state in string ne at /usr/share/perl5/MMM/Monitor/Agent.pm line 42.
解決方法,編輯 /usr/share/perl5/MMM/Monitor/Agent.pm,在第41行插入下面那段程式即可
if (! defined($old_state)) { $old_state = 'certinally not new_state'; }
再重新啟動
/etc/init.d/mysql-mmm-monitor start
現在就可以使用指令來確認目前mmm的狀況,請在監控端使用下面的指令
mmm_control show
  db1(192.168.1.10) master/ONLINE. Roles: writer(192.168.1.10)
  db2(192.168.1.11) master/ONLINE. Roles: reader(192.168.1.11)
  db3(192.168.1.12) slave/ONLINE. Roles: reader(192.168.1.12)
mmm_control set_online db1 就可以把unknow的狀態給弄成online了。
參考資料:

沒有留言:

張貼留言