1. 程式人生 > >詳解 MySQL 高可用群集,MMM搭建高可用

詳解 MySQL 高可用群集,MMM搭建高可用

cti 主從復制 防火墻 操作系統 oracl pat -- utf8 set

目錄:

1·MMM 簡介
2·MMM 各個角色說明
3·案例環境介紹
4·案例實施
5·總結


一:MMM 簡介:

1)MMM 是什麽:說得簡單點,就是 MySQL 主主復制的管理器。之前的一篇文章講述了 MySQL的主從復制 + 讀寫分離,其中原理都相同,有興趣的朋友可以訪問:MySQL主從復制 + 讀寫分離


2)還有就是,雖然是主主復制,但是在業務上的話,同一時間值額能對一個主進行寫入,另一臺就是備選。它可以實現故障切換,還可以實現多個 Slave 讀 的負載均衡。可以自動或者手動切換主服務器,因為可以 虛擬VIP 的漂移。


3)但是 MMM 無法完全保證數據的一致性,所以它的應用場景應該是一些要求數據一致性不是很高,但是又要保證業務的可用性。


4)它的監管也需要讓 MySQL 授權,以便讓 MySQL 可以支持監理機的維護,授權的用戶有:mmm_monitor 、mmm_agent ,如果要使用備份工具還需要添加 mmm_tools 用戶的授權。


二:MMM 高可用架構角色說明:

1)mmm_mon:它是一個監控進程,負責所有的監控。決定和處理所有的角色活動,它需要在監管機上運行


2)mmm_agent : 它運行在每個MySQL 服務器上的代理進程,完成監控的探針工作和執行簡單的遠端服務設置。它也需要在被監管的機子上運行


3)mmm_control:一個簡單的腳本,它提供 mmm_mond 進程命令


4)mysql-mmm 的監管端會提供多個虛擬 IP(VIP),包括一個可寫和多個可讀的 VIP,通過監管的管理,這些 IP 會綁定在可用的 MySQL 上,當一個主機宕機後,監管會將VIP遷移到其他的MySQL上。


MMM 高可用架構,如下圖:
技術分享圖片


三: 案例環境介紹:

1·在這裏需要聲明下,mariadb 和 MySQL 是一樣的,只是現在 MySQL 被oracle公司 收購後有些東西開始逐漸收費,所以這篇文章都是用 mariadb ,他和MySQL是一模一樣的。


2·CenOS 默認沒有mysql-mmm包,這裏需要下載 epel 源,所以需要每臺主機需要保持在線狀態


3·這次環境使用五臺服務器模擬搭建,環境表如下所示


主機 操作系統 IP 地址 主要軟件
mysql-m1 主服務器 CentOS 7.4 192.168.106.154 epel-release源
mysql-m2 主服務器 CentOS 7.4 192.168.106.155 epel-release源
mysql-m3 從服務器 CentOS 7.4 192.168.106.156 epel-release源
mysql-m4 從服務器 CentOS 7.4 192.168.106.157 epel-release源
mysql-monitor 監控 CentOS 7.4 192.168.106.132 epel-release源、mysql-mmm

四:案例實施開始:

1·配置aliyun源,安裝 epel-release 源,五臺主機都需要安裝,可同時進行

[root@localhost ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo ---- (配置阿裏雲yum源)


2·安裝 epel-release 源,五臺主機都需要安裝

[root@localhost ~]# yum -y install epel-release


3·清除緩存,建立數據源

[root@localhost ~]# yum clean all && yum makecache


4·安裝mariadb-server(服務端)、mariadb (客戶端),五臺主機都需要裝,監控機 也可以用來當客戶端使用
[root@localhost ~]# yum -y install mariadb-server mariadb
[root@localhost ~]# systemctl stop firewalld -----(關閉防火墻)
[root@localhost ~]# setenforce 0


5)修改五臺主機 mariadb 的主配置文件

[root@localhost ~]# vim /etc/my.cnf -----(修改內容如下)
[mysqld]
log_error=/var/lib/mysql/mysql.err
log=/var/lib/mysql/mysql_log.log
log_slow_queries=/var/lib/mysql_slow_queris.log
binlog-ignore-db=mysql,information_schema
character_set_server=utf8
log_bin=mysql_bin
server_id=1
log_slave_updates=true
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid


6)以上配置需要主從服務器都修改

[root@localhost ~]# scp /etc/my.cnf [email protected]:/etc/ ----(發送給另一臺主機,並且覆蓋源文件)
[root@localhost ~]# scp /etc/my.cnf [email protected]:/etc/
[root@localhost ~]# scp /etc/my.cnf [email protected]:/etc/


7)這裏需要說明:每天主機的server-id 不能一樣,所以我們需要進入配置文件 vim /etc/my.cnf 修改server-id 的值,在使用 SCP 時需要進行身份驗證, 請輸入對方正確的密碼


8)重啟服務,查看3306端口是否啟動:

[root@localhost ~]# systemctl start mariadb -----(啟動服務)
[root@localhost ~]# netstat -anpt | grep 3306 ----(查看3306端口)
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 2501/mysqld


9)開始配置主主復制,使兩臺主服務器之間能進行互相復制

MariaDB [(none)]> grant replication slave on . to ‘replication‘ @‘192.168.106.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec) -----(在第一臺主服務器上授權)


MariaDB [(none)]> grant replication slave on . to ‘replication‘ @‘192.168.106.%‘ identified by ‘123456‘;
Query OK, 0 rows affected (0.00 sec) -----(在第二臺主服務器上授權)


10)在兩臺主服務器上指定 Master 的各種參數,使其能互相訪問。

MariaDB [(none)]> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql_bin.000003 | 555 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
在第一臺主服務器上 show master status;
需要記錄 二進制日誌文件、和地址


MariaDB [(none)]> show master status;
+------------------+----------+--------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+--------------------------+
| mysql_bin.000003 | 555 | | mysql,information_schema |
+------------------+----------+--------------+--------------------------+
1 row in set (0.00 sec)
在第二臺主服務器上 show master status;
需要記錄 二進制日誌文件、和地址


change master to master_host=‘192.168.106.154‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000003‘,master_log_pos=555; ----(在第一臺主服務器上指定)


change master to master_host=‘192.168.106.154‘,master_user=‘replication‘,master_password=‘123456‘,master_log_file=‘mysql_bin.000003‘,master_log_pos=555; ----(在第二臺主服務器上指定)


11)開啟同步、查看同步狀態,主服務器都需要開啟同步。

MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
1. row
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.106.154
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql_bin.000003
Read_Master_Log_Pos: 647
Relay_Log_File: mariadb-relay-bin.000002
Relay_Log_Pos: 621
Relay_Master_Log_File: mysql_bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
-----兩個YES說明同步成功


12)驗證主主復制:

在m1 上創建一個庫,在m2上查看是否復制。
MariaDB [(none)]> create database school;


技術分享圖片


13)安裝 MySQL-mmm,在所有服務器上都需要安裝。

[root@localhost ~]# yum -y install mysql-mmm ----(安裝mmm 下所有的軟件)


14)安裝結束後,配置 mmm

[root@localhost ~]# vim /etc/mysql-mmm/mmm_common.conf ---(修改內容如下)


active_master_role writer

<host default>
cluster_interface ens33 ---(cenos7 的網卡名稱為:ens33)
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user replication ---(之前授權用戶)
replication_password 123123 ----(密碼)
agent_user mmm_agent ---(用戶名)
agent_password 123123 -----(密碼)
</host>

<host db1>
ip 192.168.106.154 ------(m1 的IP地址)
mode master
peer db2
</host>

<host db2>
ip 192.168.106.155 -----(m2 的IP地址)
mode master
peer db1
</host>

<host db3>
ip 192.168.106.156 -----(m3 的IP地址)
mode slave
</host>

<host db4>
ip 192.168.106.157 ----(m4 的ip地址)
mode slave
</host>

<role writer>
hosts db1, db2
ips 192.168.106.200 ------ (這裏需要填寫 兩臺主服務器的共同的 VIP)
mode exclusive
</role>

<role reader>
hosts db3, db4 ----(修改數字,讀取池子應該使 從服務器)
ips 192.168.106.210, 192.168.106.220 (這裏需要分別填寫兩臺從服務器VIP 地址,這裏需要兩個VIP 地址)
mode balanced
</role>


15)遠程發送mmm配置文件給所有主機:

[root@localhost ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


[root@localhost ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


[root@localhost ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


[root@localhost ~]# scp /etc/mysql-mmm/mmm_common.conf [email protected]:/etc/mysql-mmm/


16)配置監控服務器,最後一臺服務器

[root@localhost ~]# vim /etc/mysql-mmm/mmm_mon.conf ---(修改內容如下)


<monitor>
ip 127.0.0.1
pid_path /run/mysql-mmm-monitor.pid
bin_path /usr/libexec/mysql-mmm
status_path /var/lib/mysql-mmm/mmm_mond.status
ping_ips 192.168.106.154,192.168.106.155,192.168.106.156,192.168.106.157 ---(需要監聽主機IP地址)
auto_set_online 10 ---(上線時間調整為10秒)

# 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 mmm_monitor
monitor_password 123456 ---(用戶密碼)
</host>

[root@localhost ~]# systemctl start mysql-mmm-monitor.service ---(啟動監控)


17)在所有數據庫上為mmm_agen 、mmm_moniter t授權

MariaDB [(none)]> grant super, replication client, process on . to ‘mmm_agent‘@‘192.168.106.%‘ identified by ‘123456‘; ----(所有數據庫都需要授權)


MariaDB [(none)]> grant replication client on . to ‘mmm_monitor‘@‘192.168.106.%‘ identified by ‘123456‘; ---(所有數據庫都需要授權)


MariaDB [(none)]> flush privileges; ----(刷新數據庫)


18)修改所有 文件,指向自己是 db 1、2、3、4。

[root@localhost ~]# vim /etc/mysql-mmm/mmm_agent.conf -----(修改內容如下)
this db1 ----(根據之前代理名稱的規劃進行逐一調整每臺服務器)


19)在所在數據庫服務器上啟動mysql-mmm-agent

[root@localhost ~]# systemctl start mysql-mmm-agent.service
[root@localhost ~]# systemctl enable mysql-mmm-agent.service ---(設置開機自啟)


20)在監控機 mmm_monitor 上查看四臺服務器狀態:

mmm_control show //查看各節點的情況:
db1(192.168.235.132) master/ONLINE. Roles:writer(192.168.106.200)
db2(192.168.235.191) master/ONLINE. Roles:
db3(192.168.235.177) slave/ONLINE. Roles:reader(192.168.106.210)
db4(192.168.235.181) slave/ONLINE. Roles:reader(192.168.106.220)


21)故障切換,停止m1 服務,再次查看監控狀態。停止m3 再次查看狀態。使用另一臺mysql登陸m1寫入數據,查看是否同步!


總結:

1·需要知道其中原理的可以看看上一篇文章MySQL 主從復制+讀寫分離
2·mysql-mmm 適用於對數據的一致性要求不是很高,但是又想最大程度的保證業務可用性的場景
3·在故障切換,和客戶端寫入數據時,可以看出後端的功能實現,都是走的真實IP,而客戶端寫入的時候或讀取時都是走 VIP。

詳解 MySQL 高可用群集,MMM搭建高可用