角色 | ip | Hostname | id | 寫 | 讀 |
Master1 | 192.168.1.128 | Master1 | 1 | 192.168.1.100 | |
Master2(backup) | 192.168.1.131 | Master2 | 2 | 192.168.1.110 | |
Slave1 | 192.168.1.132 | Slave1 | 3 | 192.168.1.120 | |
Slave2 | 192.168.1.133 | Slave2 | 4 | 192.168.1.130 | |
Monitor | 192.168.1.134 | Monitor1 | 無 |
在所有主機上配置/etc/hosts(master1,master2,slave1,slave2,monitor1)
[root@mini1 ~]# vim /etc/hosts
192.168.1.128 master1
192.168.1.131 master2
192.168.1.132 slave1
192.168.1.133 slave2
192.168.1.134 monitor1
[root@mini1 ~]# hostnamectl set-hostname master1
[root@master1 ~]# for i in master2 slave1 slave2 monitor; do scp /etc/hosts $i:/etc/hosts ;dne
在 所 有 主 機 上 安 裝 perl perl-devel perl-CPAN libart_lgpl.x86_64 rrdtool.x86_64
rrdtool-perl.x86_64 包
#yum -y install perl-* libart_lgpl.x86_64 rrdtool.x86_64 rrdtool-perl.x86_64
注:使用 centos7 在線 yum 源安裝
安裝 perl 的相關庫
#cpan -i Algorithm::Diff Class::Singleton DBI DBD::mysql Log::Dispatch Log::Log4perl
Mail::Send Net::Ping Proc::Daemon Time::HiRes Params::Validate Net::ARP
在 master1、master2、slave1、slave2 主機上安裝 mysql5.7 和配置複製
master1 和 master2 互爲主從,slave1、slave2 爲 master1 的從
在每個 mysql 的配置文件/etc/my.cnf 中加入以下內容, 注意 server-id 不能重複。
[root@master1 ~]# vim /etc/my.cnf
log-bin = mysql-bin
binlog_format = mixed
server-id = 1
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 1
[root@master2 ~]# vim /etc/my.cnf
log-bin = mysql-bin
binlog_format = mixed
server-id = 2
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = 1
auto-increment-increment = 2
auto-increment-offset = 2
[root@slave1 ~]# vim /etc/my.cnf
server-id = 3
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
[root@slave2 ~]# vim /etc/my.cnf
server-id = 4
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
4 臺數據庫主機若要開啓防火牆,要麼關閉防火牆或者創建訪問規則:
[root@master1 ~]# firewall-cmd --permanent --add-port=3306/tcp
success
[root@master1 ~]# firewall-cmd --reload
Success
主從配置(master1 和 master2 配置成主主,slave1 和 slave2 配置成 master1 的從):
在 master1 上授權:
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
在 master2 上授權:
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
把 master2、slave1 和 slave2 配置成 master1 的從庫:
在 master1 上執行 show master status; 獲取 binlog 文件和 Position 點
mysql> show master status\G;
*************************** 1. row ***************************
File: mysql-bin.000003
Position: 451
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
在 master2、slave1 和 slave2 執行
mysql> change master to master_host='192.168.1.128',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=451;
mysql> slave start;
MySQL [(none)]> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.128
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 451
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
把 master1 配置成 master2 的從庫:在 master2 上執行 show master status ;獲取 binlog 文件和 Position 點
mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bbin.000002',master_log_pos=1045;
mysql> start slave;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.131
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 1045
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 320
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
4、mysql-mmm 配置:在 4 臺 mysql 節點上創建用戶
創建代理賬號:
mysql> grant super,replication client,process on *.* to 'mmm_agent'@'192.168.1.%' identified by '123';
創建監控賬號:
mysql> grant replication client on *.* to 'mmm_monitor'@'192.168.1.%' identified by '123';
注 1:因爲之前的主從複製,以及主從已經是 ok 的,所以我在 master1 服務器執行就 ok 了。
檢查 master2 和 slave1、slave2 三臺 db 上是否都存在監控和代理賬號
mysql> select user,host from mysql.user where user in ('mmm_monitor','mmm_agent');
+-------------+-------------+
| user | host |
+-------------+-------------+
| mmm_agent | 192.168.1.% |
| mmm_monitor | 192.168.1.% |
+-------------+-------------+
或
mysql> show grants for 'mmm_agent'@'192.168.1.%';
+------------------------------------------------------------------------------+
| Grants for [email protected].% |
+------------------------------------------------------------------------------+
| GRANT PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'mmm_agent'@'192.168.1.%' |
+------------------------------------------------------------------------------+
MySQL [(none)]> show grants for 'mmm_monitor'@'192.168.1.%' ;
+----------------------------------------------------------------+
| Grants for [email protected].% |
+----------------------------------------------------------------+
| GRANT REPLICATION CLIENT ON *.* TO 'mmm_monitor'@'192.168.1.%' |
+----------------------------------------------------------------+
在 monitor 主機(192.168.31.106) 上安裝監控程序
[root@monitor1 ~]# tar zxf mysql-mmm-2.2.1.tar.gz
[root@monitor1 mysql-mmm-2.2.1]#
[root@monitor1 mysql-mmm-2.2.1]# make install
在數據庫服務器(master1、master2、slave1、slave2)上安裝代理
[root@master1 ~]# tar zxf mysql-mmm-2.2.1.tar.gz
[root@master1 ~]# cd mysql-mmm-2.2.1/
配置 mmm
編寫配置文件,五臺主機必須一致:完成安裝後,所有的配置文件都放到了/etc/mysql-mmm/下面。管理服務器和數據庫服務器上都要包含一個共同的文件 mmm_common.conf,內容如下:active_master_rolewriter#積極的 master 角色的標示,所有的 db 服務器要開啓 read_only 參數,對於 writer 服務器監控代理會自動將 read_only 屬性關閉。
[root@monitor1 mysql-mmm-2.2.1]# cd /etc/mysql-mmm/
[root@monitor1 mysql-mmm]# vim mmm_common.conf
active_master_role writer
<host default>
cluster_interface ens32 #網卡名
pid_path /var/run/mmm_agentd.pid #pid 路徑
bin_path /usr/lib/mysql-mmm/ #可執行文件路徑
replication_user rep #複製用戶
replication_password 123 #複製用戶密碼
agent_user mmm_agent #代理用戶
agent_password 123 #代理用戶密碼
</host>
<host master1> #master1的host名
ip 192.168.1.128 #ip
mode master #角色屬性
peer master2 #對等的服務器host名
</host>
<host master2>
ip 192.168.1.131
mode master
peer master1
</host>
<host slave1> #從庫的host名,多個則重複配置
ip 192.168.1.132
mode slave
</host>
<host slave2>
ip 192.168.1.133
mode slave
</host>
<role writer> #寫角色配置
hosts master1,master2 #master1,master2#能進行寫操作的服務器的 host 名,如果不想切換寫操作這裏可以只配置 master,這樣也可以避免因爲網絡延時而進行 write 的切換,但是一旦master 出現故障那麼當前的 MMM 就沒有 writer 了只有對外的 read 操作。
ips 192.168.1.100 #寫的虛擬ip
mode exclusive #代表只允許存在一個主,也就是隻能提供一個寫的 IP
</role>
<role reader> #讀角色分配置
hosts master2,slave1,slave2
ips 192.168.1.130, 192.168.1.110, 192.168.1.120
mode balanced #負載均衡
</role>
[root@monitor1 mysql-mmm]# for i in master1 master2 slave1 slave2; do scp /etc/mysql-mmm/mmm_common.conf $i:/etc/mysql-mmm/ ;done
代理文件配置編輯 4 臺 mysql 節點機上的/etc/mysql-mmm/mmm_agent.conf
在數據庫服務器上,還有一個 mmm_agent.conf 需要修改,其內容是:
[root@master1 mysql-mmm-2.2.1]# vim /etc/mysql-mmm/mmm_agent.conf
include mmm_common.conf
this master1 #每臺數據庫host
啓動代理進程
在 /etc/init.d/mysql-mmm-agent 的腳本文件的#!/bin/sh 下面,加入如下內容
source /root/.bash_profile
[root@master1 mysql-mmm-2.2.1]# cd /etc/init.d/
[root@master1 init.d]# chkconfig --add mysql-mmm-agent
[root@master1 init.d]# chkconfig mysql-mmm-agent on
[root@master1 init.d]# /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 #表示啓動成功
[root@master1 init.d]# ss -lanp|grep mmm
tcp LISTEN 0 10 192.168.1.128:9989 *:* users:(("mmm_agentd",pid=9680,fd=3))
[root@master1 init.d]# firewall-cmd --add-port=9989/tcp --permanent
[root@master1 init.d]# firewall-cmd --reload
編輯 monitor 主機上的/etc/mysql-mmm/mmm_mon.conf
[root@monitor1 mysql-mmm]# vim /etc/mysql-mmm/mmm_mon.conf
include mmm_common.conf
<monitor>
ip 127.0.0.1
pid_path /var/run/mmm_mond.pid
bin_path /usr/lib/mysql-mmm/
status_path /var/lib/misc/mmm_mond.status
auto_set_online 0
ping_ips 192.168.1.128, 192.168.1.131, 192.168.1.132,192.168.1.133 #四臺數據庫的真實ip
</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 123
</host>
debug 0
啓動監控進程
在 /etc/init.d/mysql-mmm-monitor 的腳本文件的#!/bin/sh 下面,加入如下內容
source /root/.bash_profile
添加成系統服務並設置爲自啓動
[root@monitor1 init.d]# vim /etc/init.d/mysql-mmm-monitor
[root@monitor1 init.d]# chkconfig --add mysql-mmm-monitor
[root@monitor1 init.d]# chkconfig mysql-mmm-monitor on
[root@monitor1 init.d]# ./mysql-mmm-monitor start
Daemon bin: '/usr/sbin/mmm_mond'
Daemon pid: '/var/run/mmm_mond.pid'
Starting MMM Monitor daemon: Ok
[root@monitor1 ~]# mmm_control show
master1(192.168.1.128) master/HARD_OFFLINE. Roles:
master2(192.168.1.131) master/HARD_OFFLINE. Roles:
slave1(192.168.1.132) slave/HARD_OFFLINE. Roles:
slave2(192.168.1.133) slave/HARD_OFFLINE. Roles:
啓動所有mysql,然後讓所有服務上線
[root@monitor1 ~]# mmm_control set_online master1
OK: State of 'master1' changed to ONLINE. Now you can wait some time and check its new roles!
[root@monitor1 ~]# mmm_control show
master1(192.168.1.128) master/ONLINE. Roles: writer(192.168.1.100)
master2(192.168.1.131) master/ONLINE. Roles: reader(192.168.1.130)
slave1(192.168.1.132) slave/ONLINE. Roles: reader(192.168..120)
slave2(192.168.1.133) slave/ONLINE. Roles: reader(192.168.1.110)
[root@master1 init.d]# ip addr
2: eno16777728: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:d8:de:a3 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.128/24 brd 192.168.1.255 scope global noprefixroute dynamic eno16777728
valid_lft 5352004sec preferred_lft 5352004sec
inet 192.168.1.100/32 scope global eno16777728
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed8:dea3/64 scope link noprefixroute
valid_lft forever preferred_lft forever
當master1 down vip地址則漂到master2
[root@master1 init.d]# service mysqld stop
[root@monitor1 ~]# mmm_control show
master1(192.168.1.128) master/HARD_OFFLINE. Roles:
master2(192.168.1.131) master/ONLINE. Roles: reader(192.168.1.130), writer(192.168.1.100)
slave1(192.168.1.132) slave/ONLINE. Roles: reader(192.168.1.120)
slave2(192.168.1.133) slave/ONLINE. Roles: reader(192.168.1.110)
#查看整個集羣的狀態,可以看到整個集羣狀態正常
[root@monitor1 ~]# mmm_control show
日誌文件:
日誌文件往往是分析錯誤的關鍵,所以要善於利用日誌文件進行問題分析。
db 端:/var/log/mysql-mmm/mmm_agentd.log
監控端:/var/log/mysql-mmm/mmm_mond.log
命令文件:
mmm_agentd:db 代理進程的啓動文件
mmm_mond:監控進程的啓動文件
mmm_backup:備份文件
mmm_restore:還原文件
mmm_control:監控操作命令文件
db 服務器端只有 mmm_agentd 程序,其它的都是在 monitor 服務器端。
mmm_control 用法
mmm_control 程序可以用於監控羣集狀態、切換 writer、設置 online\offline 操作等。
Valid commands are:
help - show this message #幫助信息
ping - ping monitor #ping 當前的羣集是否正常
show - show status #羣集在線狀態檢查
checks [<host>|all [<check>|all]] - show checks status#執行監控檢查操作
set_online<host> - set host <host> online #將 host 設置爲 online
set_offline<host> - set host <host> offline #將 host 設置爲 offline
mode - print current mode. #打印輸出當前的 mode
set_active - switch into active mode.
set_manual - switch into manual mode.
set_passive - switch into passive mode.
move_role [--force] <role><host> - move exclusive role <role> to host <host> #移除writer服務器
爲指定的 host 服務器(Only use --force if you know what you are doing!)
set_ip<ip><host> - set role with ip<ip> to host <host>
檢查所有的 db 服務器羣集狀態:
[root@monitor1 ~]# mmm_control checks all
檢查項包括:ping、mysql 是否正常運行、複製線程是否正常等
檢查羣集環境在線狀況:
[root@monitor1 ~]# mmm_control show
對指定的 host 執行 offline 操作:
[root@monitor1 ~]# mmm_controlset_offline slave2
對指定的 host 執行 onine 操作:
[root@monitor1 ~]# mmm_controlset_online slave2
執行 write 切換(手動切換):
[root@monitor1 ~]# mmm_controlmove_role writer master1
總結
1.對外提供讀寫的虛擬 IP 是由 monitor 程序控制。如果 monitor 沒有啓動那麼 db 服務器
不會被分配虛擬 ip,但是如果已經分配好了虛擬 ip,當 monitor 程序關閉了原先分配的虛擬 ip
不會立即關閉外部程序還可以連接訪問(只要不重啓網絡),這樣的好處就是對於 monitor
的可靠性要求就會低一些,但是如果這個時候其中的某一個 db 服務器故障了就無法處理切
換,也就是原先的虛擬 ip 還是維持不變,掛掉的那臺 DB 的虛擬 ip 會變的不可訪問。
2.agent 程序受 monitor 程序的控制處理 write 切換,從庫切換等操作。如果 monitor 進
程關閉了那麼 agent 進程就起不到什麼作用,它本身不能處理故障。
3.monitor 程序負責監控 db 服務器的狀態,包括 Mysql 數據庫、服務器是否運行、複製
線程是否正常、主從延時等;它還用於控制 agent 程序處理故障。
4.monitor 會每隔幾秒鐘監控 db 服務器的狀態,如果 db 服務器已經從故障變成了正常,
那麼 monitor 會自動在 60s 之後將其設置爲 online 狀態(默認是 60s 可以設爲其它的值),有
監控端的配置文件參數“auto_set_online”決定,羣集服務器的狀態有三種分別是:
HARD_OFFLINE→AWAITING_RECOVERY→online
5.默認 monitor 會控制 mmm_agent 會將 writer db 服務器 read_only 修改爲 OFF,其它的
db 服務器 read_only 修改爲 ON,所以爲了嚴謹可以在所有的服務器的 my.cnf 文件中加入
read_only=1 由 monitor控制來控制 writer 和read,root 用戶和複製用戶不受read_only 參數的
影響。
總結
(1)master2備選主節點宕機不影響集羣的狀態,就是移除了master2備選節點的讀狀態。
(2)master1 主節點宕機,由 master2 備選主節點接管寫角色,slave1,slave2 指向新 master2
主庫進行復制,slave1,slave2 會自動 change master 到 master2.
(3)如果 master1 主庫宕機,master2 複製應用又落後於 master1 時就變成了主可寫狀態,
這時的數據主無法保證一致性。
如果 master2,slave1,slave2 延遲於 master1 主,這個時 master1 宕機,slave1,slave2 將會
等待數據追上 db1 後,再重新指向新的主 node2 進行復制操作,這時的數據也無法保證
同步的一致性。
(4)如果採用 MMM 高可用架構,主,主備選節點機器配置一樣,而且開啓半同步進一步
提高安全性或採用 MariaDB/mysql5.7 進行多線程從複製,提高複製的性能。