MySQL-MMM高可用集群
- MMM簡介
- mysql+atlas+mmm實體搭建
- 四臺mysql服務器安裝mysql
- 建立時間同步環境
- 配置MySQL
- 配置主MySQL
- 配置從MySQL
- 設定兩個主MySQL的主主模式
- 測驗主主同步
- 設定主從MySQL模式
- 測驗主從同步
- 設定讀寫分離
- 測驗讀寫分離
- 配置MySQL高可用群集MMM
- 安裝mysql-mmm
- 授權monitor訪問
- 修改配置
- 開啟代理和監控服務
- 測驗集群
MMM簡介
MMM(Master-Master replication manager for MySQL,MySQL主主復制管理器)是一套支持雙主故障切換和雙主日常管理的腳本程式,MMM使用Perl語言開發,是Google的開源專案(Perl腳本),主要用來監控和管理MySQL Master-Master===(雙主)復制==,雖然叫做雙主復制,但是業務上同一時刻只允許對一個主進行寫入,另一臺備選主上提供部分讀服務,以加速在主主切換時刻備選主的預熱,可以說MMM這套腳本程式一方面實作了故障切換的功能,另一方面其內部附加的工具腳本也可以實作多個slave的read負載均衡,
- 雙主復制,實作故障自動切換
- 實作多個slave的read負載均衡
- 備份資料
原理
- 其原理是將真實資料庫節點的IP(RIP)映射為虛擬IP(VIP)集,在這個虛擬的IP集中,有一個專用于write的IP,多個用于read的IP,這個用于write的VIP映射著資料庫集群中的兩臺master的真實IP(RIP),以此來實作故障轉移(Failover)的切換,其他read的VIP可以用來均衡read(balance),
MMM高可用架構說明
-
mmm_mon監控行程,負責所有的監控作業,決定和處理所有節點角色活動,此腳本需要在監控機上運行 -
mmm_agent運行在每個mysql服務器上的代理行程,完成監控的探針作業和執行簡單的遠程服務設定,此腳本需要在被監管機上運行 -
mmm_control一個簡單的腳本,提供管理mmm_mond行程的命令 -
mysql_mmm的監管端會提供多個虛擬IP(VIP),包括一個可寫VIP,多個可讀VIP,通過監管的管理,這些IP會系結在可用mysql之上,當某一臺mysql宕機時,監管會將VIP遷移至其他mysql -
在整個監管程序中,需要在MySQL中添加相關的授權用戶,以便讓MySQL可以支持監理機的維護,授權的用戶包括一個
mmm_monitor用戶和一個mmm_agent用戶,如果想使用MMM的備份工具則還需要添加一個mmm_tools用戶
mysql+atlas+mmm實體搭建

四臺mysql服務器安裝mysql
安裝腳本
#!/bin/bash
tar xf /root/mysql-5.7.25-el7-x86_64.tar.gz -C /usr/local/
cd /usr/local
mv mysql-5.7.25-el7-x86_64 mysql
id mysql &>/dev/null
if [ $? -ne 0 ];then
groupadd mysql
useradd -M -s /sbin/nologin mysql -g mysql
fi
chown -R mysql.mysql /usr/local/mysql
config() {
rm -rf /etc/my.cnf
cat > /etc/my.cnf <<-EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
server_id=1
port=3306
socket=/tmp/mysql.sock
[mysql]
socket=/tmp/mysql.sock
prompt=mysql [\\\d]>
EOF
}
config
echo 'export PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile
source /etc/profile
yum install -y libaio &>/dev/null
mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data &>/dev/null
if [ $? -ne 0 ];then
echo '初始化錯誤,請檢查依賴'
exit 2
else
echo '初始化成功!'
fi
sys() {
cat >/etc/systemd/system/mysqld.service <<-EOF
[Unit]
Description=MySQL Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000
EOF
}
sys
systemctl daemon-reload
systemctl start mysqld
pgrep mysql &>/dev/null
if [ $? -ne 0 ];then
echo 'mysql啟動失敗,請檢查組態檔或查看日志'
exit 3
fi
mysqladmin -uroot password '123' &>/dev/null
if [ $? -ne 0 ];then
echo '請手動source /etc/profile 之后更改密碼和登錄mysql'
fi
mysql -uroot -p123
建立時間同步環境
在主節點上搭建時間同步服務器
安裝NTP(關閉防火墻/selinux)
yum -y install ntp
配置NTP
vim /etc/ntp.conf
# local clock
server 127.127.1.0 # 本地時間供給源
fudge 127.127.1.0 stratum 8 # 設定時區為+08區
重啟服務并設定為開機啟動
systemctl enable ntpd --now
在主備選和從節點上進行時間同步
yum -y install ntpdate
ntpdate 192.168.188.71

配置MySQL
配置主MySQL
主MySQL
vim /etc/my.cnf
[mysqld]
server_id = 1 # 每臺服務器設定為不同id
log_bin = master-bin # 開啟二進制日志
log-slave-updates = true # 宕機后啟用備用庫
auto_increment_increment = 2 # 兩臺主MySQL設定相同數
auto_increment_offset = 1 # 兩臺主MySQL設定為不同數
備選主MySQL
[mysqld]
server_id = 2
log_bin = master-bin
log-slave-updates = true
auto_increment_increment = 2 # 兩臺主MySQL設定相同數
auto_increment_offset = 2 # 兩臺主MySQL設定為不同數
systemctl restart mysqld
補充:
mysql中有自增長欄位,在做資料庫的主主同步時需要設定自增長的兩個相關配置:auto_increment_offset和auto_increment_increment
- auto_increment_offset表示自增長欄位從那個數開始,他的取值范圍是1 … 65535
- auto_increment_increment表示自增長欄位每次遞增的量,其默認值是1,取值范圍是1 … 65535
- 在主主同步配置時,需要將兩臺服務器的auto_increment_increment增長量都配置為2
- 而要把auto_increment_offset分別配置為1和2.
這樣才可以避免兩臺服務器同時做更新時自增長欄位的值之間發生沖突,
配置從MySQL
從MySQL1
vim /etc/my.cnf
[mysqld]
server_id = 3
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = true
從MySQL2
[mysqld]
server_id = 4
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index
log-slave-updates = true
systemctl restart mysqld
設定兩個主MySQL的主主模式
兩臺服務器都需要做
mysql -uroot -p123
首先確定二進制日志是否開啟
show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)
添加授權訪問用戶
GRANT REPLICATION SLAVE ON *.* TO 'maomao'@'192.168.188.%' IDENTIFIED BY '123';
重繪授權
FLUSH PRIVILEGES;
獲取日志名及偏移量
show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 613 | | | |
+-------------------+----------+--------------+------------------+-------------------+
主MySQL
change master to master_host='192.168.188.72',master_user='maomao',master_password='123',master_log_file='master-bin.000001',master_log_pos=613;
start slave;
主備選MySQL
change master to master_host='192.168.188.71',master_user='maomao',master_password='123',master_log_file='master-bin.000001',master_log_pos=613;
start slave;
驗證主從狀態
show slave status\G;

主備選

查看同步狀態Slave_IO和Slave_SQL為YES,說明豬豬同步成功
測驗主主同步
分別在兩臺主服務器上創建不同的庫 分別查看
create database zhu;
create database niu;
mysql [(none)]>show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| niu |
| performance_schema |
| sys |
| zhu |
+--------------------+
6 rows in set (0.00 sec)
設定主從MySQL模式
首先在主服務器上查看日志和節點
show master status;
得到master-bin.000001 和 Position是935
在從服務器上配置同步(兩臺從機一樣操作)
change master to master_host='192.168.188.71',master_user='maomao',master_password='123',master_log_file='master-bin.000001',master_log_pos=935;
start slave;
查看主從狀態
show slave status\G;

查看同步狀態Slave_IO和Slave_SQL為YES,說明主從同步成功
測驗主從同步
進入主服務器
show slave hosts;
主MySQL

主備選MySQL

新建一個測驗庫school
CREATE DATABASE IF NOT EXISTS `school`;
-- 創建一個school資料庫
USE `school`;-- 創建學生表
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`(
`studentno` INT(4) NOT NULL COMMENT '學號',
`loginpwd` VARCHAR(20) DEFAULT NULL,
`studentname` VARCHAR(20) DEFAULT NULL COMMENT '學生姓名',
`gender` varchar(2) NOT NULL DEFAULT '女' COMMENT '性別',
`gradeid` INT(11) DEFAULT NULL COMMENT '年級編號',
`phone` VARCHAR(50) NOT NULL COMMENT '聯系電話,允許為空',
`address` VARCHAR(255) NOT NULL COMMENT '地址,允許為空',
`borndate` DATETIME DEFAULT NULL COMMENT '出生時間',
`email` VARCHAR (50) NOT NULL COMMENT '郵箱賬號允許為空',
`identitycard` VARCHAR(18) DEFAULT NULL COMMENT '身份證號',
PRIMARY KEY (`studentno`),
UNIQUE KEY `identitycard`(`identitycard`),
KEY `email` (`email`)
)ENGINE=MYISAM DEFAULT CHARSET=utf8;
INSERT INTO `student` (`studentno`,`loginpwd`,`studentname`,`gender`,`gradeid`,`phone`,`address`,`borndate`,`email`,`identitycard`)
VALUES
(1000,'123456','唐嘉','女',2,'13800001234','北京朝陽','1980-5-2','text123@qq.com','123456198001011298'),
(1001,'123456','劉美玲','女',1,'13800002222','廣東深圳','1991-6-4','text111@qq.com','123456199001011191'),
(1002,'123456','潘辰','男',1,'13800002111','四川成都','1992-7-6','text222@qq.com','123456199001011333'),
(1003,'123456','小田','男',2,'13800002333','四川成都','1993-8-8','text333@qq.com','123456199001011555'),
(1004,'123456','胡楊','男',3,'13800002555','浙江杭州','1994-9-10','text444@qq.com','123456199001011777'),
(1005,'123456','貓貓','女',2,'13800002666','日本東京','1995-1-12','text555@qq.com','123456199001011888'),
(1006,'123456','飛飛','男',2,'13800002666','上海浦東','1997-7-12','text666@qq.com','123456199001011666');
在從機上查詢
mysql [(none)]>select studentname from school.student;
+-------------+
| studentname |
+-------------+
| 唐嘉 |
| 劉美玲 |
| 潘辰 |
| 小田 |
| 胡楊 |
| 貓貓 |
| 飛飛 |
+-------------+
7 rows in set (0.00 sec)
設定讀寫分離
詳情可以查看 Atlas讀寫分離
這時候需用用到192.168.188.75這臺服務器
首先在四臺MySQL上授權訪問用戶
添加授權訪問用戶
grant all on *.* to maomao@'192.168.188.%' identified by '123';
重繪授權
FLUSH PRIVILEGES;
下載Atlas
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
安裝
rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
安裝完成后會自動在/usr/local/mysql-proxy下生成四個檔案
加密密碼
cd /usr/local/mysql-proxy/bin
[root@maomao bin]# ./encrypt 123
3yb5jEku5h4=
配置atlas主組態檔
vim /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
#帶#號的為非必需的配置專案
admin-username = atlas
#管理介面的密碼
admin-password = 123
#Atlas后端連接的MySQL主庫的IP和埠,可設定多項,用逗號分隔
proxy-backend-addresses = 192.168.188.71:3306,192.168.188.72:3306
#Atlas后端連接的MySQL從庫的IP和埠,@后面的數字代表權重,用來作負載均衡,若省略則默認為1,可設定多項,用逗號分隔
#proxy-read-only-backend-addresses = 127.0.0.1:3305@1
proxy-read-only-backend-addresses = 192.168.188.73:3306@1,192.168.188.74:3306@1
pwds = maomao:3yb5jEku5h4= # 此賬號就是之前授權的賬號
#設定Atlas的運行方式,設為true時為守護行程方式,設為false時為前臺方式,一般開發除錯時設為false,線上運行時設為true,true后面不能有空格,
daemon = true
#設定Atlas的運行方式,設為true時Atlas會啟動兩個行程,一個為monitor,一個為worker,monitor在worker意外退出后會自動將其重啟,設為false時只有worker,沒有monitor,一般開發除錯時設為false,線上運行時設為true,true后面不能有空格,
keepalive = true
#作業執行緒數,對Atlas的性能有很大影響,可根據情況適當設定
event-threads = 4
#日志級別,分為message、warning、critical、error、debug五個級別
log-level = message
#日志存放的路徑
log-path = /usr/local/mysql-proxy/log
#Atlas監聽的作業介面IP和埠
proxy-address = 0.0.0.0:1234
#Atlas監聽的管理介面IP和埠
admin-address = 0.0.0.0:2345
配置無誤后,啟動Atlas軟體
[root@maomao conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
測驗讀寫分離
在Atlas 代理服務器上
yum -y install mysql
mysql -h127.0.0.1 -P2345 -umaomao -p123 # 這里用戶和密碼就是組態檔里面寫的
select * from help; # 可以查看幫助
select * from backends; # 查看目前的主從復制

通過代理訪問Mysql
mysql -h192.168.188.75 -P1234 -umaomao -p123 # 這里用戶名和密碼就是之前授權的賬號
進入資料庫后可以查詢到主MySQL的所有庫和表
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| ceshi |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
6 rows in set (0.00 sec)
還可以查看日志
tafil /usr/local/mysql-proxy/log/test.log
看到寫操作都在Master,讀操作都連接到Slave了

配置MySQL高可用群集MMM
安裝mysql-mmm
需要使用epel源 注意所有的服務器節點都需要下載
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
在五臺服務器上下載
yum install -y mysql-mmm*
授權monitor訪問
在四臺MySQL服務器上授權monitor訪問
grant replication client on *.* to 'mmm_monitor'@'192.168.188.%' identified by'monitor';
grant super,replication client,process on *.* to 'mmm_agent'@'192.168.188.%' identified by'agent';
FLUSH PRIVILEGES;
修改配置
在所有服務器上修改/etc/mysql-mmm/mmm_common.conf組態檔
vim /etc/mysql-mmm/mmm_common.conf
active_master_role writer
<host default>
cluster_interface eth0 # 更改為自身主機網卡
pid_path /run/mysql-mmm-agent.pid
bin_path /usr/libexec/mysql-mmm/
replication_user maomao # 用于主從,主主復制的用戶(之前授權的賬號)
replication_password 123
agent_user mmm_agent # 運行在每個mysql 的代理用戶
agent_password agent # 之前授權時候填的密碼
</host>
<host db1> # 主MYSQL服務器
ip 192.168.188.71
mode master # 主服務器
peer db2 # 鄰居為db2
</host>
<host db2> # # 主備選MYSQL服務器
ip 192.168.188.72
mode master # 主服務器
peer db1 # 鄰居為db1
</host>
<host db3>
ip 192.168.188.73
mode slave # 從服務器
</host>
<host db4>
ip 192.168.188.74
mode slave
</host>
<role writer> # 可寫的服務器
hosts db1, db2 # 第一臺,第二臺服務器
ips 192.168.188.200 # 規劃指定的虛擬地址
mode exclusive # 獨占模式
</role>
<role reader> # 只讀的服務器
hosts db3, db4 # 第三臺,第四臺服務器
ips 192.168.188.201,192.168.188.202 # 分別指定的虛擬地址
mode balanced # 平衡模式
</role>
最后將組態檔傳給另外四臺服務器
scp /etc/mysql-mmm/mmm_common.conf root@192.168.188.72:/root
在四臺MySQL服務器上修改/etc/mysql-mmm/mmm_agent.conf組態檔,修改為對應db
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 # 這里地方換成common.conf里面對應的db位置 如分別修改為db1,db2,db3,db4
在代理服務器上修改/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.188.71,192.168.188.72,192.168.188.73,192.168.188.74 # 主1主2從1從2的真實IP地址
auto_set_online 60
# 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 # mysql資料庫授權用mmm_monito和密碼
monitor_password monitor
</host>
debug 0
開啟代理和監控服務
主:systemctl start mysql-mmm-agent
備選主:systemctl start mysql-mmm-agent
從1:systemctl start mysql-mmm-agent
從2:systemctl start mysql-mmm-agent
監控:systemctl start mysql-mmm-monitor
在代理服務器上查看集群:
[root@maomao ~]# mmm_control show
db1(192.168.188.71) master/ONLINE. Roles: writer(192.168.188.200)
db2(192.168.188.72) master/ONLINE. Roles:
db3(192.168.188.73) slave/ONLINE. Roles: reader(192.168.188.202)
db4(192.168.188.74) slave/ONLINE. Roles: reader(192.168.188.201)

測驗集群
用虛擬IP連接資料庫
在代理服務器上
[root@maomao ~]# mysql -h192.168.188.200 -umaomao -p123
mysql [(none)]>select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
停止主mysql
systemctl stop mysqld
在監控服務器
[root@maomao ~]# mmm_control show
db1(192.168.188.71) master/HARD_OFFLINE. Roles:
db2(192.168.188.72) master/ONLINE. Roles: writer(192.168.188.200)
db3(192.168.188.73) slave/ONLINE. Roles: reader(192.168.188.202)
db4(192.168.188.74) slave/ONLINE. Roles: reader(192.168.188.201)

mysql [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
1 row in set (0.00 sec)
主服務器換成主備選MySQL的id 2 了
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/277009.html
標籤:其他
下一篇:設計模式 | 代理模式
