1. 程式人生 > >MySQL -MMM 學習整理

MySQL -MMM 學習整理

prop error: pad 機器 特性 不同 pan fedora tab

一. 規劃

1.主機規劃

服務器

IP

作用

monitor

10.0.0.10

監控服務器

master-01

10.0.0.5

讀寫主機01

master-02

10.0.0.6

讀寫主機02

slave-01

10.0.0.8

只讀主機01

slave-02

10.0.0.9

只讀主機02

2.虛擬IP分配

服務器

虛擬IP

mysql

讀寫狀態

monitor

10.0.0.20

writer

master-01

10.0.0.25

reader

master-02

10.0.0.26

reader

salve-01

10.0.0.28

reader

二. 安裝操作系統

Centos-7.2 最小化安裝(64位)

三.配置操作系統

1. 關閉 selinux
cat /etc/selinux/config   

SELINUX=disabled 

2. 關閉防火墻

systemctl stop firewalld

systemctl disable firewalld
3. 配置NTP ,同步時間
yum -y install ntp

vi /etc/ntp.conf

增加3個時間服務器

server s2d.time.edu.cn iburst #西南地區網絡中心

server s2e.time.edu.cn iburst #西北地區網絡中心

server s2f.time.edu.cn iburst #東北地區網絡中心

4. 啟動ntp服務

systemctl start ntpd

systemctl enable ntpd

5. 調整為上海時區

timedatectl set-timezone Asia/Shanghai # 設置系統時區為上海

查看狀態

ntpq –p

四.安裝MySQL 5.6 (不是MariaDB)

1.安裝 MySQL Repository
rpm -Uvh http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm
2.安裝 MySQL Server, MySQL client
yum install mysql-community-server
3.開機自動啟動 MySQL
systemctl enable mysqld
4.啟動MySQL
systemctl start mysqld
5.MySQL 預設為空密碼, 執行以下指令修改
mysql_secure_installation

mysql -u root -p

#進入mysql 控制臺,增加root用戶遠程登錄的權限

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY GDkyUDJM6gr2Dx WITH GRANT OPTION;

flush privileges;
6.修改mysql的存儲目錄
a. 停止mysql

systemctl stop mysql

b. 遷移數據庫存儲目錄

mkdir /opt/mysql

chown mysql:mysql /opt/mysql

mv /var/lib/mysql /opt/mysql

cd /opt/mysql

mv mysql data

c. 修改配置文件

vim /etc/my.cnf

#修改datadir和socket指向

datadir=/opt/mysql/data

socket=/opt/mysql/mysql.sock

#同時增加下面的代碼,這個是為了讓mysql client能夠連上mysql,避免Cant connect to local MySQL server through socket /var/lib/mysql/mysql.sock錯誤!

[mysql]

socket=/opt/mysql/mysql.sock

d. 啟動mysql

systemctl start mysql
7. 配置MySQL Relication
a. 在/opt/mysql下增加log目錄
主要內容如下: 

[mysqld]

datadir=/opt/mysql/data

socket=/opt/mysql/mysql.sock

user=mysql

#下面為新添加的內容

read_only=1

default-storage-engine=innodb

replicate-ignore-db=mysql,information_schema #不同步的數據庫,多個寫多行

replicate-do-db=mysqltest      #同步的數據庫,多個寫多行

 

binlog-ignore-db=mysql,information_schema  #不需要記錄二進制日誌的數據庫,多個用逗號隔開

binlog-do-db=mysqltest           #需要記錄二進制日誌的數據庫,多個用逗號隔開

# 以下這三個參數一定要同時在my.cnf中配置。否則在mysql.err中會出現報錯

 

gtid_mode= on

log_slave_updates=1           #當一個主故障,另一個立即接管

enforce_gtid_consistency= 1

 

# 三個參數設置結束

sync-binlog=1               #每條自動更新,安全性高,默認是0

 

server-id           = 1 #server-id在每臺服務器上的值都是不一樣,在這裏依次為1、234。

 

#這裏的日誌文件命名也每臺機器不一樣,比如(mysql-master-001-bin.log,mysql-master-002-bin.log,mysql-slave-001-bin.log,mysql-slave-002-bin.log)

 

g-bin             = /opt/mysql/log/mysql-master-001-bin.log

log_bin_index       = /opt/mysql/log/mysql-master-001-bin.log.index

relay_log           = /opt/mysql/log/mysql-master-001-bin.relay

relay_log_index     = /opt/mysql/log/mysql-master-001-bin.relay.index

# 日誌文件指定結束

expire_logs_days    = 10

max_binlog_size     = 100M

log_slave_updates   = 1

更加詳細的用於生產環境的配置 見這篇文章
生產環境的mysql 5.6 和 5.7 的配置文件my.cnf

b. 在/opt/mysql下增加log目錄

cd /opt/mysql
mkdir log
chown mysql:mysql log
c. 重新啟動mysql

systemctl restart mysql
e. 檢查配置是否成功 
1)登錄mysql,執行show master status,看是否有如下輸出 
+——————+———-+————–+——————+——————-+ 
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | 
+——————+———-+————–+——————+——————-+ 
| mysql-master-001-bin.000001 | 120 | | mysql | | 
+——————+———-+————–+——————+——————-+ 
2)到/opt/log/mysql目錄下,看是否產生了類似mysql-master-001-bin.000001和mysql-master-001-bin.log.index的文件。

f. 在4個mysql的服務器上都修改一下。註意日誌命名每臺機器都不一樣

五.新建同步數據庫需要的用戶

使用mysql-mmm時一共需要三個用戶: replication、mmm_agentmmm_monitor(管理服務器上用來監控cluster狀態的用戶,所以可以限定只能從管理服務器登錄)。使用下面三條命令新建這三個用戶並分配相應的權限 
所有的mysql 服務器都運行一遍

GRANT REPLICATION CLIENT                 ON *.* TO mmm_monitor@10.0.0.% IDENTIFIED BY monitor;GRANT SUPER, REPLICATION CLIENT, PROCESS ON *.* TO mmm_agent@10.0.0.%   IDENTIFIED BY agent;

GRANT REPLICATION SLAVE                  ON *.* TO replication@10.0.0.% IDENTIFIED BY replication;

flush privileges;

六.設置復制機制

(從master-001復制到master-002,從master-002復制到slave-001,slave-002)

1.配置master-001作為主,復制到master-002
a.配置master-001


由於這裏是配置master-001做為源數據,所以不需要設置change master 和 啟動slave進程

b.配置master-002

(指定 change master 為 master-001,表示從master-001 復制到 master-002) 

#ssh到 master-002 服務器

mysql -u root -p

#在mysql控制臺錄入

#這個是在my.cnf中沒有使用GTID(MySQL5.6新特性)下的命令

#CHANGE MASTER TO MASTER_HOST=10.0.0.5,MASTER_USER=replication,MASTER_PASSWORD=replication,MASTER_PORT=3306,MASTER_LOG_FILE=mysql-master-02-bin.000001, MASTER_LOG_POS=260,MASTER_CONNECT_RETRY=10;

# 這個是在my.cnf中使用GTID(MySQL5.6新特性)下的命令

CHANGE MASTER TO MASTER_HOST=10.0.0.5,MASTER_USER=replication,MASTER_PASSWORD=replication,MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;

#重置reset

reset slave;

#啟動slave

start slave;

#查看slave狀態

show slave status\G

#結果如下

mysql> show slave status\G

*************************** 1. row ***************************

       Slave_IO_State: Waiting for master to send event
          Master_Host: 192.168.1.212
          Master_User: replication
          Master_Port: 3306
        Connect_Retry: 10
      Master_Log_File: mysql-master-002-bin.000001
  Read_Master_Log_Pos: 120
       Relay_Log_File: mysql-master-001-bin.000004
        Relay_Log_Pos: 294
Relay_Master_Log_File: mysql-master-002-bin.000001
     Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
      Replicate_Do_DB:
  Replicate_Ignore_DB: mysql
   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: 120
      Relay_Log_Space: 472
      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: 2
          Master_UUID: 3d3b9f4f-f74f-11e5-9a30-005056b324c4
     Master_Info_File: /opt/mysql/data/master.info
            SQL_Delay: 0
  SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
   Master_Retry_Count: 86400
          Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
       Master_SSL_Crl:
   Master_SSL_Crlpath:
   Retrieved_Gtid_Set:
    Executed_Gtid_Set:
        Auto_Position: 0
1 row in set (0.00 sec)

註意: 
Slave_IO_Running: Yes 
Slave_SQL_Running: Yes

c.配置slave-001:

(指定 change master 為 master-002,表示從master-002 復制到 slave-001)
 
#ssh到 slave-001 服務器        
 
mysql -u root -p
 
#在mysql控制臺錄入
 
 
#這個是在my.cnf中沒有使用GTID(MySQL5.6新特性)下的命令
CHANGE MASTER TO MASTER_HOST=10.0.0.6,MASTER_USER=replication,MASTER_PASSWORD=replication,MASTER_PORT=3306,MASTER_LOG_FILE=mysql-slave-001-bin.000001, MASTER_LOG_POS=260,MASTER_CONNECT_RETRY=10;

 
 
# 這個是在my.cnf中使用GTID(MySQL5.6新特性)下的命令
 
CHANGE MASTER TO MASTER_HOST=10.0.0.6,MASTER_USER=replication,MASTER_PASSWORD=replication,MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;

 
 
#重置reset
 
reset slave;
 
#啟動slave
 
start slave;
 
#查看slave狀態
 
show slave status\G
 
#結果如下
 
mysql> show slave status\G

d.配置slave-002

(指定 change master 為 master-002,表示從master-002 復制到 slave-002)

 
#ssh到 slave-002 服務器         
 
mysql -u root -p 
 
#在mysql控制臺錄入
 
 
#這個是在my.cnf中沒有使用GTID(MySQL5.6新特性)下的命令
CHANGE MASTER TO MASTER_HOST=10.0.0.6,MASTER_USER=replication,MASTER_PASSWORD=replication,MASTER_PORT=3306,MASTER_LOG_FILE=mysql-slave-002-bin.000001, MASTER_LOG_POS=260,MASTER_CONNECT_RETRY=10;
 
 
# 這個是在my.cnf中使用GTID(MySQL5.6新特性)下的命令
 
CHANGE MASTER TO MASTER_HOST=10.0.0.6,MASTER_USER=replication,MASTER_PASSWORD=replication,MASTER_PORT=3306,MASTER_AUTO_POSITION = 1;
 
 
#重置reset
 
reset slave;
 
#啟動slave
 
start slave;
 
#查看slave狀態
 
show slave status\G
 
#結果如下
 
mysql> show slave status\G      
這樣就完成了master-001 和 master-002的相互復制,並且從master-002復制到slave-001 和 slave-002.
a.在master-001中建立database ,確認master-002,slave-001 和 slave-002中都同步復制。
b.在master-002中建立database ,確認master-001,slave-001 和 slave-002中都同步復制。
2.測試復制機制是否成功。
3.MySQL5.6 GTID新特性實踐
http://cenalulu.github.io/mysql/mysql-5-6-gtid-basic/
4.mysql主從復制-CHANGE MASTER TO 語法詳解
http://blog.csdn.net/jesseyoung/article/details/41942809

七.安裝MMM(http://mysql-mmm.org/)

1.安裝epel擴展包
CentOS軟件倉庫默認是不含這些軟件的,必須要有epel這個包的支持。故我們必須先安裝epel
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
rpm -ivh epel-release-7-5.noarch.rpm
yum install mysql-mmm-monitor
yum install mysql-mmm-agent
 
#用yum安裝的 mysql-mmm組件啟動的時候會出錯。
所以用下面的tar.gz文件來安裝
yum erase mysql-mmm-monitor 
yum erase mysql-mmm-agent
2.在monitor(10.0.0.20) 上安裝監控程序
·         cd /tmp
wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -xzvf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1.tar.gz
make install
 

3.在數據庫服務器(192.168.1.211-214)上安裝代理
cd /tmp
wget http://pkgs.fedoraproject.org/repo/pkgs/mysql-mmm/mysql-mmm-2.2.1.tar.gz/f5f8b48bdf89251d3183328f0249461e/mysql-mmm-2.2.1.tar.gz
tar -xzvf mysql-mmm-2.2.1.tar.gz
cd mysql-mmm-2.2.1.tar.gz
make install

4.配置MMM
a.編輯/etc/mysql-mmm/mmm_common.conf 

完成安裝後,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服務器和數據庫服務器上都要包含一個共同的文件mmm_common.conf,內容如下:

active_master_role writer
<host default>
cluster_interface  eth0  #網卡設備
pid_path     /var/run/mmm_agentd.pid
bin_path     /usr/lib/mysql-mmm/ #這裏要確認是否下面有agent,monitor,tools的目錄。否則無法生成vip
replication_user        replication
replication_password    replication
agent_user              mmm_agent
agent_password          agent
</host>
<host db1>
ip      10.0.0.25
mode    master
peer    db2
</host>
<host db2>
ip      10.0.0.26
mode    master
peer    db1
</host>
<host db3>
ip      10.0.0.28
mode    slave
</host>
<host db4>
ip      10.0.0.29
mode    slave
</host>
<role writer>
hosts   db1, db2
ips     10.0.0.20
mode    exclusive
</role>
<role reader>
hosts   db2, db3, db4
ips     10.0.0.25, 10.0.0.26, 10.0.0.28
mode    balanced
</role>
通過scp命令分別復制到monitor-001、master-001、master-002、slave-001和slave-002共五臺機器上。

b. 編輯 4臺mysql節點機上的/etc/mysql-mmm/mmm_agent.conf 
在數據庫服務器上,還有一個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
最後一行的db1,在不同的數據庫服務器上要分別改為db2、db3和db4,否則代理就會無法啟動。

c. 編輯 monitor主機上的/etc/mysql-mmm/mmm_mon.conf 
在monitor-001上配置mmm_mon.conf

include mmm_common.conf
<monitor>
ip                  127.0.0.1   #為了安全性,設置只在本機監聽,mmm_mond 默認監聽9988  
pid_path            /var/run/mmm_mond.pid
bin_path            /usr/lib/mysql-mmm/
status_path         /var/lib/misc/mmm_mond.status
ping_ips            10.0.0.5, 10.0.0.6, 10.0.0.8, 10.0.0.9      #用於測試網絡可用性 IP 地址列表,只要其中有一個地址 ping 通,就代表網絡正常,這裏不要寫入本機地址  
#flap_duration      3600 #抖動的時間範圍,單位秒,這兩個參數考慮情況添加  
# flap_count         3 #在抖動的時間範圍內,最大的抖動次數  
auto_set_online      60#是否設置自動上線,如果該值大於0,抖動的主機在抖動的時間範圍過後,則設置自動上線
# 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
</monitor>
<check default>
check_period    5
trap_period     10
timeout         2
#restart_after     10000
max_backlog     86400
</check>
<host default>
monitor_user        mmm_monitor
monitor_password    monitor
</host>
 
5.自動啟動agent 和 monitor
a. 在monitor上啟動monitor

 

systemctl enable mysql-mmm-monitor
systemctl start mysql-mmm-monitor
b. 在4個數據庫服務器上啟動agent

systemctl enable mysql-mmm-agent
systemctl start mysql-mmm-agent
如果出現Starting MMM Monitor daemon: Cant locate Proc/Daemon.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/mmm_mond line 11

[root@monitor ~]# yum install cpan

[root@monitor ~]# cpan Proc::Daemon

[root@monitor ~]# cpan Log::Log4perl

yum install –y perl-*

yum install -y libart_lgpl.x86_64

yum install -y mysql-mmm.noarch fail

yum install -y rrdtool.x86_64 

yum install -y rrdtool-perl.x86_64

[root@monitor mysql-mmm-2.2.1]# /etc/init.d/mysql-mmm-agent start

Daemon bin: /usr/sbin/mmm_agentd

Daemon pid: /var/run/mmm_agentd.pid

Starting MMM Agent daemon... Ok

如果出現Configuration file /etc/mysql-mmm/mmm_common.conf is world readable!這種錯誤,需要查看/etc/mysql-mmm/mmm_common.conf文件的權限,應該是 chmod 640 /etc/mysql-mmm/mmm_common.conf 
集群中所有配置文件的權限最好都設置為640,否則啟動 MMM 服務的時候可能出錯

八. 測試集群

MMM啟動順序:先啟動monitor,再啟動 agent

mmm_control show

# Warning: agent on host db1 is not reachable

  db1(10.0.0.25) master/AWAITING_RECOVERY. Roles:

  db2(10.0.0.26) master/ONLINE. Roles: reader(10.0.0.26), writer(10.0.0.20)

  db3(10.0.0.28) slave/ONLINE. Roles: reader(10.0.0.28)

  db4(10.0.0.29) slave/ONLINE. Roles: reader(10.0.0.25)

 

九. 問題和解決辦法

1.無法分配vip
在monitor主機上使用 systemctl start mysql-mmm-monitor 無法分配vip。而通過/etc/init.d/mysql-mmm-monitor start則可以分配vip 

解決辦法 
http://blog.csdn.net/remote_roamer/article/details/49869395 
由於缺少環境變量,導致無法激活vip。 
那麽就在 /etc/rc.d/init.d/mysql-mmm-monitor的腳本文件裏面最上面,加入 
source /root/.bash_profile

2.vip漂移後,無法ping通10.0.0.20
問題描述: 
當master-001發生故障,導致DB不可用時,VIP會自動漂移到master-002上,以實現高可用。但出現了一個問題,由於ARP老化時間過長,導致漂移過去的VIP不可用,也無法ping通。也就是說,MySQL-MMM沒有考慮到ARP老化時間過長的情況而采取強刷ARP的方式。

a.解決辦法1

同時修改master-001 和 master-002上的代碼(這個沒測試成功) 
修改文件 
/usr/share/perl5/vendor_perl/MMM/Agent/Helpers/Actions.pm

vim /usr/share/perl5/vendor_perl/MMM/Agent/Helpers/Actions.pm

在sub configure_ip($$)代碼段裏面的_exit_ok();前面加入以下代碼

#這裏是解決vip偏移後,無法ping通。原因是arp 老化時間過長,這裏強制刷新arpmy $getway = `/sbin/route | awk default/ (print $2)`
`/sbin/arping -I $if -c 3 -s $ip $getway `;
#配置結束
 

b.解決辦法2 
在vip漂移到的主機上手工重置arping

arping -I eno16777984 -c 3 -s 10.0.0.20 10.0.0.1

c.解決辦法3 
在master-001 和 master-002 上使用shell腳本來刷新(這個方法正常運行)

vim /root/refresh_vip.sh
#增加如下內容:
#!/bin/sh              
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin
MMM_COMM_CONF="/etc/mysql-mmm/mmm_common.conf"
ETH_NAME=`awk /cluster_interface/{print $2} ${MMM_COMM_CONF}`
VIP_ADDR=`grep -A 2 <role writer> ${MMM_COMM_CONF} | awk /ips/{print $2}`
GETWAY_ADDR=`/sbin/route | awk /default/ {print $2}`
 
if [[ -n `/sbin/ip addr show ${ETH_NAME} | grep ${VIP_ADDR}` ]]; then
    /sbin/arping -I ${ETH_NAME} -c 3 -s ${VIP_ADDR} ${GETWAY_ADDR} >/dev/null 2>&1
fi

十.放入crontab中運行

crontab -e
* * * * * sleep 10; /root/refresh_vip.sh >/dev/null 2>&1
* * * * * sleep 20; /root/refresh_vip.sh >/dev/null 2>&1
* * * * * sleep 30; /root/refresh_vip.sh >/dev/null 2>&1
* * * * * sleep 40; /root/refresh_vip.sh >/dev/null 2>&1
* * * * * sleep 50; /root/refresh_vip.sh >/dev/null 2>&1

MySQL -MMM 學習整理