超詳細MySQL主主復制+MMM實現高可用
MMM(Master-Master Replication Manager for MySQL, MySQL主主復制管理器)是一套靈活的腳本程序,基於perl實現,用來對mysql replication進行監控和故障遷移,並能管理mysql Master-Master復制的配置。註意同一時間只有一個節點是可寫。MMM的監管端會提供多個虛擬IP(VIP)包括一個可寫VIP,多個可讀VIP,通過監管的管理,這些IP會綁定在可用mysql之上,當某一臺mysql宕機時,會將VIP遷移至其他mysql。
mmm_mond:監控進程,負責所有的監控工作,決定和處理所有節點角色活動。此腳本需要在監管機上運行;
mmm_agentd:運行在每個mysql服務器上的代理進程,完成監控的探針工作和執行簡單的遠端服務設置。此腳本需要在被監管機上運行;
mmm_control:一個簡單的腳本,提供管理mmm_mond進程的命令
實驗環境
主機名稱 | 操作系統 | IP地址 | 虛擬IP | 主要軟件 | 網絡連接模式 |
---|---|---|---|---|---|
master01 | CentOS_7.4_x86_64 | 192.168.100.71 | 192.168.100.100 | mariadb、mysql-mmm | NAT |
master02 | CentOS_7.4_x86_64 | 192.168.100.72 | 192.168.100.100 | mariadb、mysql-mmm | NAT |
monitor、客戶端 | CentOS_7.4_x86_64 | 192.168.100.73 | mariadb、mysql-mmm | NAT | |
slave01 | CentOS_7.4_x86_64 | 192.168.100.74 | 192.168.100.102 | mariadb、mysql-mmm | NAT |
slave02 | CentOS_7.4_x86_64 | 192.168.100.75 | 192.168.100.101 | mariadb、mysql-mmm | NAT |
準備工作
一、準備工作
1、編輯主機名
[root@localhost ~]# hostnamectl set-hostname master01
[root@localhost ~]# hostnamectl set-hostname master02
[root@localhost ~]# hostnamectl set-hostname slave01
[root@localhost ~]# hostnamectl set-hostname slave02
[root@localhost ~]# bash
2、三臺主機關閉防火墻及selinux
[root@master01 ~]# systemctl stop firewalld.service
[root@master01 ~]# systemctl disable firewalld.service
[root@master01 ~]# vim /etc/sysconfig/selinux
3、重啟服務
[root@master01 ~]# reboot
一、搭建、配置mysql01主服務器
1、配置本地yum源
[root@master01 ~]# cd /etc/yum.repos.d/
[root@master01 yum.repos.d]# mkdir bak #創建備份目錄
[root@master01 yum.repos.d]# mv CentOS-* bak/ #將系統yum源倉庫進行備份
[root@master01 yum.repos.d]# vim local.repo#創建自建yum源
#添加以下參數:
[local] #容器名稱
name=local #容器說明
baseurl=file:///mnt/sr0 #yum源地址即掛載點
gpgcheck=0 #"0"代表rpm數字證書驗證不生效
enabled=1 #"1"代表此容器生效
[root@master01 ~]# mkdir /mnt/sr0/
[root@master01 ~]# mount /dev/sr0 /mnt/sr0/ #掛載光盤
2、安裝epel源
[root@master01 ~]# yum -y install wget #wget命令用來從指定的URL下載文件
[root@master01 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo #將官網的yum源下載至本地網絡yum源
[root@master01 ~]# yum -y install epel-release #下載epel源擴展
[root@master01 ~]# cat /etc/yum.repos.d/epel.repo
3、替換鏡像源
[root@master01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #將epel源的服務器IP地址換成阿裏
4、五臺主機安裝相關軟件包
[root@master01 ~]# yum -y install mariadb-server mariadb mysql-mmm*
#解析:
mysql-mmm*:主主復制管理器
mariadb:客戶端
mariadb-server:服務器端
5、修改mariadb配置文件
[root@master01 ~]# 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/mysql_slow_queris.log #慢查詢日誌路徑
binlog-ignore-db=mysql,information_schema #不需要同步的數據庫名稱
character_set_server=utf8 #設置默認字符集
log_bin=mysql_bin #啟用二進制的日誌 !!!!!主從復制核心
server_id=1 #服務器id,方便區分,註意每臺機子id都不一樣
log_slave_updates=true #允許從服務器進行日誌更新
sync_binlog=1 #允許從服務器同步二進制日誌
auto_increment_increment=2 #字段一次遞增多少
auto_increment_offset=1 #自增字段的起始值:1,3,5,7……等奇數ID
[client]
default_character_set=utf8 #設置默認字符集
6、啟動mysql服務器
[root@master01 ~]# systemctl start mariadb.service
[root@master01 ~]# netstat -anpt | grep ‘:3306‘
7、設置初始密碼
[root@master01 ~]# mysqladmin -uroot password ‘123‘
二、搭建、配置其余三臺數據庫服務器
其他服務器安裝和master01服務器安裝相同,安裝過程,略……
1、master01服務器上傳配置文件
!!!!!!!!!!!一定要註意配置文件參數其他都是一樣,server-id一定要改成不一樣的
[root@master01 ~]# scp -r /etc/my.cnf [email protected]:/etc/my.cnf
[root@master01 ~]# scp -r /etc/my.cnf [email protected]:/etc/my.cnf
[root@master01 ~]# scp -r /etc/my.cnf [email protected]:/etc/my.cnf
三、配置mysql主主復制
1、配置master01服務器
[root@master02 ~]# mysql -u root -p123 -e "show master status;" #查看master02服務器狀態
[root@master01 ~]# mysql -u root -p123 #登陸mariadb
MariaDB [(none)]> grant replication slave on . to ‘replication‘@‘192.168.100.%‘ identified by ‘123456‘;
#授權從服務器復制權限
MariaDB [(none)]> change master to master_host=‘192.168.100.72‘,master_user=‘replication‘,master_password=‘123456‘, master_log_file=‘mysql_bin.000001‘,master_log_pos=388;
#指定master02服務器為主服務器
2、配置master02服務器
MariaDB [(none)]> show master status; #查看master01服務器狀態
[root@master02 ~]# mysql -u root -p123 #登陸mariadb
MariaDB [(none)]> grant replication slave on . to ‘replication‘@‘192.168.100.%‘ identified by ‘123456‘;
MariaDB [(none)]> change master to master_host=‘192.168.100.71‘,master_user=‘replication‘,master_password=‘123456‘, master_log_file=‘mysql_bin.000006‘,master_log_pos=554;
#指定master02服務器為主服務器
3、開啟兩臺主主服務器同步功能
MariaDB [(none)]> start slave;
4、查看同步結果
MariaDB [(none)]> show slave status\G; #查看master01服務器狀態
MariaDB [(none)]> show slave status\G; #查看master02服務器狀態
四、配置slave01、slave02作為master01的從庫
1、查看master01服務器二進制日誌文件名稱以及位置
[root@master01 ~]# mysql -u root -p -e "show master status;"
2、設置slave01作為master01的從庫
[root@slave01 ~]# mysql -uroot -p
MariaDB [(none)]> change master to master_host=‘192.168.100.71‘,master_user=‘replication‘,master_password=‘123456‘, master_log_file=‘mysql_bin.000006‘,master_log_pos=720;
#指定master01作為主服務器
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
3、再次查看master01服務器狀態
4、設置slave02作為master01的從庫
[root@slave01 ~]# mysql -uroot -p
MariaDB [(none)]> change master to master_host=‘192.168.100.71‘,master_user=‘replication‘,master_password=‘123456‘, master_log_file=‘mysql_bin.000006‘,master_log_pos=720;
#指定master01作為主服務器
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;
五、測試主主同步、主從同步
1、master01服務器創建測試數據
[root@master01 ~]# mysql -uroot -p
MariaDB [(none)]> create database test_db;
2、查看其他三臺數據庫服務器
六、配置MySQL-MMM
1、五臺主機編輯common配置文件
[root@master01 ~]# cd /etc/mysql-mmm/
[root@master01 mysql-mmm]# vim mmm_common.conf
#添加、編輯以下參數:
active_master_role writer
<host default> #編輯主機默認設置
cluster_interface ens33 #群集接口,這裏用的是CentOS7,修改自己對應的網卡名稱
pid_path /run/mysql-mmm-agent.pid #運行agent保存的pid位置
bin_path /usr/libexec/mysql-mmm/ #可執行命令
replication_user replication #Mariadb給予權限的用戶
replication_password 123456 #Mariadb給予權限的用戶密碼
agent_user mmm_agent #agent客戶端代理用戶(需要在所有mysql服務器上設置)
agent_password 123456 #agent客戶端代理用戶密碼
</host>
<host db1> #第一個數據庫
ip 192.168.100.71
mode master
peer db2 #db1和db2數據庫是一對,互相切換
</host>
<host db2> #第二個數據庫
ip 192.168.100.72
mode master
peer db1
</host>
<host db3> #第三個數據庫(第一個從數據庫)
ip 192.168.100.74
mode slave
</host>
<host db4> #第四個數據庫(第二個從數據庫)
ip 192.168.100.75
mode slave
</host>
<role writer> #設置主服務器角色(寫操作)
hosts db1, db2
ips 192.168.100.100 #指定虛擬IP
mode exclusive #指定模式,db1和db2只能存在一個IP地址,只能有一臺主機進行寫入操作
</role>
<role reader> #設置從服務器角色(讀操作)
hosts db3,db4
ips 192.168.100.101, 192.168.100.102 #指定虛擬IP
mode balanced #負載均衡,讀取操作會從db3、db4主機進行
</role>
2、將common配置文件上傳至其他4臺主機上
[root@master01 mysql-mmm]# scp mmm_common.conf [email protected]:/etc/mysql-mmm/
[root@master01 mysql-mmm]# scp mmm_common.conf [email protected]:/etc/mysql-mmm/
[root@master01 mysql-mmm]# scp mmm_common.conf [email protected]:/etc/mysql-mmm/
[root@master01 mysql-mmm]# scp mmm_common.conf [email protected]:/etc/mysql-mmm/
3、monitor服務器編輯mmm_mon.conf文件
[root@monitor ~]# cd /etc/mysql-mmm/
[root@monitor mysql-mmm]# vim mmm_mon.conf
<host default>
monitor_user mmm_monitor
monitor_password 123456 #修改密碼,方便mysql授權
</host>
4、四臺數據庫服務器授權agent、monitor
[root@master01 ~]# mysql -u root -p
#授權agent
mysql> grant super,replication client,process on . to ‘mmm_agent‘@‘192.168.100.%‘ identified by ‘123456‘;
#授權monitor
mysql> grant replication client on . to ‘mmm_monitor‘@‘192.168.100.%‘ identified by ‘123456‘;
#刷新權限
mysql> flush privileges;
5、修改agent文件
[root@master01 ~]# cd /etc/mysql-mmm/
[root@master01 mysql-mmm]# vim mmm_agent.conf
6、五臺服務器啟動agent服務
[root@master01 ~]# systemctl start mysql-mmm-agent.service
[root@master01 ~]# systemctl enable mysql-mmm-agent.service
7、monitor服務器編輯mmm_mon文件
[root@monitor ~]# cd /etc/mysql-mmm/
[root@monitor mysql-mmm]# vim mmm_mon.conf
#編輯以下參數
ping_ips 192.168.100.71,192.168.100.72,192.168.100.74,192.168.100.75 #約第8行,添加所有數據庫IP地址
auto_set_online 10 #約第9行,代表10秒鐘上線
8、monitor服務器啟動mmm
[root@monitor ~]# systemctl start mysql-mmm-monitor.service
[root@monitor ~]# mmm_control show
[root@monitor ~]# mmm_control checks all
[root@monitor ~]# mmm_control move_role writer db2 #指定db2服務器綁定虛擬IP
[root@monitor ~]# mmm_control show
七、模擬故障
1、宕掉master01服務器
[root@monitor ~]# mmm_control move_role writer db1 #指定db1服務器綁定虛擬IP
[root@master01 ~]# systemctl stop mariadb.service
[root@monitor ~]# mmm_control show
2、恢復master01綁定虛擬IP
[root@master01 ~]# systemctl start mariadb.service
[root@monitor ~]# mmm_control move_role writer db1
[root@monitor ~]# mmm_control show
3、宕掉slave01服務器
[root@slave01 ~]# systemctl stop mariadb.service
[root@monitor ~]# mmm_control show
4、恢復slave01綁定虛擬IP
[root@slave01 ~]# systemctl start mariadb.service
[root@monitor ~]# mmm_control show
超詳細MySQL主主復制+MMM實現高可用