一、MHA簡介
MHA(Master High Availability)目前在MySQL高可用方面是一個相對成熟的解決方案,它由日本DeNA公司的youshimaton(現就職於Facebook公司)開發,是一套優秀的作爲MySQL高可用性環境下故障切換和主從提升的高可用軟件。在MySQL故障切換過程中,MHA能做到在0~30秒之內自動完成數據庫的故障切換操作,並且在進行故障切換的過程中,MHA能在最大程度上保證數據的一致性,以達到真正意義上的高可用。
該軟件由兩部分組成:MHA Manager(管理節點)和MHA Node(數據節點)。MHA Manager可以單獨部署在一臺獨立的機器上管理多個master-slave集羣,也可以部署在一臺slave節點上。MHA Node運行在每臺MySQL服務器上,MHA Manager會定時探測集羣中的master節點,當master出現故障時,它可以自動將最新數據的slave提升爲新的master,然後將所有其他的slave重新指向新的master。整個故障轉移過程對應用程序完全透明。
在MHA自動故障切換過程中,MHA試圖從宕機的主服務器上保存二進制日誌,最大程度的保證數據的不丟失,但這並不總是可行的。例如,如果主服務器硬件故障或無法通過ssh訪問,MHA沒法保存二進制日誌,只進行故障轉移而丟失了最新的數據。使用MySQL 5.5的半同步複製,可以大大降低數據丟失的風險。MHA可以與半同步複製結合起來。如果只有一個slave已經收到了最新的二進制日誌,MHA可以將最新的二進制日誌應用於其他所有的slave服務器上,因此可以保證所有節點的數據一致性。
目前MHA主要支持一主多從的架構。要搭建MHA,要求一個複製集羣中必須最少有三臺數據庫服務器,一主二從,即一臺充當master,一臺充當備用master,另外一臺充當從庫。因爲至少需要三臺服務器,出於機器成本的考慮,淘寶也在該基礎上進行了改造,目前淘寶TMHA已經支持一主一從。(出自:《深入淺出MySQL(第二版)》)從代碼層面看,MHA就是一套Perl腳本,那麼相信以阿里系的技術實力,將MHA改成支持一主一從也並非難事。
圖1所示爲MHA架構:
MHA工作原理總結爲以下幾條:
從宕機崩潰的master保存二進制日誌事件(binlog events);
識別含有最新更新的slave;
應用差異的中繼日誌(relay log)到其他slave;
應用從master保存的二進制日誌事件(binlog events);
提升一個slave爲新master;
使用其他的slave連接新的master進行復制。
官方介紹:https://code.google.com/archive/p/mysql-master-ha/
二、實驗部署
1,環境準備
1.1基本環境
- 操作系統版本:CentOS Linux release 7.7.1908
- MySQL 版本 : 5.6.48
- 服務器網段 : 10.0.0.41–10.0.0.44
- VIP(虛擬ip) : 10.0.0.100
1.2,同步系統時間
echo "*/5* * * * /usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1" >>/var/spool/cron/root
1.3,關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1.4,,做hosts解析
(1)修改主機名
[root@ c41 ~] hostnamectl set-hostname c41 #master
[root@ c42 ~] hostnamectl set-hostname c42 #slave1
[root@ c43 ~] hostnamectl set-hostname c43 #salve2
[root@ c44 ~] hostnamectl set-hostname c44 #mha
(2)添加hosts解析
cat>> /etc/hosts<<EOF
c41 10.0.0.41
c42 10.0.0.42
c43 10.0.0.43
c44 10.0.0.44
EOF
1.5,分別在四臺服務器上做免密連接,四臺可以互相免密登錄
cat >ssh.sh<<\EOF
#!/bin/bash
yum -y install sshpass &> /dev/null
UserName=root
IPlist=(10.0.0.44 10.0.0.41 10.0.0.42 10.0.0.43 )
#創建密鑰
ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/null
#分發公鑰
for i in ${IPlist[*]}
do
sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub -p 22 -o StrictHostKeyChecking=no $UserName@$i &>/dev/null
done
EOF
四臺服務器都要執行
# sh ssh.sh
2,安裝mysql,配置一主二從
2.1,在41-43主機上安裝mysql,並啓動mysql
#安裝mysql的安裝yum repo
wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
#在centos7上安裝mysql,而不是centos7默認的mariadb
yum install mysql-server -y
啓動mysql
systemctl start mysql
2.2,登錄mysql並修改密碼
mysqladmin -uroot password "123456"
2.3,在c41上配置master主庫
(1)修改mysql主配置文件
[root@ c41 ~] vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
#禁止mysql自動刪除relaylog功能
relay_log_purge = 0
#mysql5.6的特性,開啓gtid,必須主從全開
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
(2)重啓mysql
[root@ c41 ~] systemctl restart mysql
(3)登錄mysql,創建授權用戶
[root@ c41 ~] mysql -uroot -p123456
mysql> grant replication slave on *.* to 'repl'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000001 | 531 | | | 1de8a4a7-9bc8-11ea-a004-000c29dc4316:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
(4)查看gtid狀態
mysql> show global variables like '%gtid%';
+---------------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------------+
| binlog_gtid_simple_recovery | OFF |
| enforce_gtid_consistency | ON #執行gtid |
| gtid_executed | f740f0a8-9a7f-11ea-97a8-000c29dc4316:1-2 |
| gtid_mode | ON #開啓gtid模塊 |
| gtid_owned | |
| gtid_purged | |
| simplified_binlog_gtid_recovery | OFF |
+---------------------------------+------------------------------------------+
2.4,在c42上配置Slave1從庫(備主庫)
(1)修改mysql從配置文件
[root@ c42 ~] vim /etc/my.cnf
[mysqld]
server-id=2
log-bin=mysql-bin
#禁止Mysql自動刪除relaylog功能
relay_log_purge = 0
#mysql5.6以上的特性,開啓gtid,必須主從全開
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
(2)重啓mysql
[root@ c42 ~] systemctl restart mysql
(3)創建同步用戶
[root@ c42 ~] mysql -uroot -p123456
mysql> grant replication slave on *.* to 'repl'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
(4)配置從服務器指向master
mysql> stop slave;
mysql> change master to master_host='10.0.0.41',master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=531;
mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.41
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 531
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 314
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2.5,在c42上配置Slave2從庫
(1)修改mysql從配置文件
[root@ c43 ~] vim /etc/my.cnf
[mysqld]
server-id=3
log-bin=mysql-bin
#禁止Mysql自動刪除relaylog功能
relay_log_purge = 0
#mysql5.6以上的特性,開啓gtid,必須主從全開
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates = 1
(2)重啓mysql
[root@ c43 ~] systemctl restart mysql
(3)創建同步用戶
[root@ c43 ~] mysql -uroot -p123456
mysql> grant replication slave on *.* to 'repl'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
(4)配置從服務器指向master
mysql> stop slave;
mysql> change master to master_host='10.0.0.41',master_user='repl',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=531;
mysql> start slave;
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.0.0.41
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 531
Relay_Log_File: mysqld-relay-bin.000002
Relay_Log_Pos: 314
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3,安裝部署MHA
3.1,安裝依賴
在所有主機上操作
yum -y install perl-DBD-mysql perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
3.2,創建mha管理用戶
在c41-c4主從
mysql -uroot -p123456
mysql> grant all privileges on *.* to 'mha'@'10.0.0.%' identified by 'mha';
mysql> flush privileges;
3.3,安裝MHA_node節點
在四臺主機上安裝
#我這裏上提前準備好的,上傳即可
rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm
3.4,安裝Manager管理節點
MHA節點不要安裝到master和slave服務器上,否則會出現vip無法漂移發生
[root@ c44 ~] rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm
3.5,在manager節點上配置MHA
(1)創建mha目錄
[root@ c44 ~] mkdir -p /etc/mha
[root@ c44 ~] mkdir -p /var/log/mha/app1
(2)添加配置文件
[root@ c44 ~] vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql
user=mha
password=mha
ping_interval=2
repl_password=123456
repl_user=repl
ssh_user=root
[server1]
hostname=10.0.0.41
port=3306
[server2]
hostname=10.0.0.42
port=3306
[server3]
hostname=10.0.0.43
port=3306
ignore_fail=1
no_master=1
#candidate_master=1
#check_repl_delay=0
server default段是manager的一些基本配置參數,server1、server2、server3分別對應複製中的master、第一個slave、第二個slave。該文件的語法要求嚴格,變量值後不要有多餘的空格。主要配置項說明如下。
manager_log:設置manager的日誌文件。
manager_workdir:設置manager的工作目錄。
master_binlog_dir:設置master保存binlog的位置,以便MHA可以找到master的日誌,這裏的也就是mysql的數據目錄。
password:設置mysql中root用戶的密碼。
ping_interval:設置監控主庫,發送ping包的時間間隔,默認是3秒,嘗試三次沒有迴應的時候自動進行railover。
repl_password:設置複製用戶的密碼。
repl_user:設置複製環境中的複製用戶名
ssh_user:設置ssh的登錄用戶名。
user:設置監控用戶爲root。
candidate_master:設置爲候選master。設置該參數以後,發生主從切換以後將會將此從庫提升爲主庫,即使這個主庫不是集羣中事件最新的slave。
check_repl_delay:默認情況下如果一個slave落後master 100M的relay logs的話,MHA將不會選擇該slave作爲一個新的master,因爲對於這個slave的恢復需要花費很長時間。
通過設置check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略複製延時,這個參數對於設置了candidate_master=1的主機非常有用,因爲這個候選主在切換的過程中一定是新的master。
3.6,MHA啓動測試
(1)檢查ssh
[root@ c44 ~] masterha_check_ssh --conf=/etc/mha/app1.cnf
(2)主從複製檢測
[root@ c44 ~] masterha_check_repl --conf=/etc/mha/app1.cnf
檢測成功!
常見報錯:
注:用戶repl不存在或沒有複製從特權!
解決方法:
(1)在一主二從的數據庫中重新同步授權repl用戶
mysql> grant replication slave on *.* to 'repl'@'10.0.0.%' identified by '123456';
mysql> flush privileges;
(2)再進行主從複製檢測
[root@ c44 ~] masterha_check_repl --conf=/etc/mha/app1.cnf
4,啓動MHA
4.1,後臺啓動
[root@ c44 ~] nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
[1] 20237
4.2,查看MHA狀態
[root@ c44 ~] masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:20237) is running(0:PING_OK), master:10.0.0.41
#running--啓動狀態
4.3,關閉MHA
[root@ c44 ~] masterha_stop --conf=/etc/mha/app1.cnf
Stopped app1 successfully.
[1]+ Exit 1
4.4,從庫重新加入新主
[root@ c44 ~] grep -i "CHANGE MASTER TO MASTER" /var/log/mha/app1/manager.log | tail -1
常見報錯
會導致MHA故障轉移後,主從不一致,一般是後臺啓動MHA沒有正常退出造成的。
注:有終止信號,異常退出。
解決辦法
反覆多試幾次啓動和關閉命令
#啓動命令
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
#停止命令
masterha_stop --conf=/etc/mha/app1.cnf
5,測試MHA故障轉移
5.1,宕掉master主庫10.0.0.41
[root@ c41 ~] systemctl stop mysql
5.2,查看c43的slave狀態
會發現Master_Host變成了10.0.0.42
[root@ c7s43 ~] mysql -p123456 -e "show slave status \G"
5.3,查看c42(備用master)的master狀態
[root@ c742 ~] mysql -p123456 -e "show master status"
5.3,查看MHA配置文件
[root@ c44 ~] cat /etc/mha/app1.cnf
發生故障時,MHA做了什麼?
1,當作爲master的c41主機上的mysql宕機以後,MHA通過檢測發現c41的mysql宕機了,就會將binlog日誌最全的從庫c42主機(備用master)立刻提升爲主庫,而其他的從庫會指向新的主庫進行再次同步。
2,MHA自己會結束自己的進程,還會將/etc/mha/app1.cnf配置文件中發生故障的那臺主機機去除。
6,MHA故障還原
6.1,修復宕機的c41上的mysql,重新加入一主二從集羣
(1)在c44mha主機上操作
[root@ c744 ~] grep "CHANGE MASTER TO MASTER" /var/log/mha/app1/manager.log | tail -1
Fri May 22 16:34:55 2020 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='10.0.0.42', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';
(2)在c41主機上操作
#重啓mysql
[root@ c41 ~] systemctl restart mysql
#指定c42爲master主庫
[root@ c41 ~] mysql -p123456 -e "CHANGE MASTER TO MASTER_HOST='10.0.0.42', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='123456';"
Warning: Using a password on the command line interface can be insecure.
#開啓主從複製
[root@ c41 ~] mysql -p123456 -e "start slave"
#查看主從狀態
[root@ c41 ~] mysql -p123456 -e "show slave status \G"
6.2,重新將server1 標籤添加到c44主機MHA的配置文件中
[root@ c44 ~] vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager.log
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql
password=mha
ping_interval=2
repl_password=123456
repl_user=repl
ssh_user=root
user=mha
#手動添加server1模塊
[server1]
hostname=10.0.0.41
port=3306
[server2]
hostname=10.0.0.42
port=3306
[server3]
hostname=10.0.0.43
ignore_fail=1
no_master=1
port=3306
6.3,重啓MHA
[root@ c44 ~] nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
[1] 21508
查看mha狀態
[root@ c44 ~] masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:21508) is running(0:PING_OK), master:10.0.0.42
#running--啓動狀態
#master爲10.0.0.42
7,配置vip漂移
ip漂移的方式:
(1),通過keepalived的方式,管理虛擬IP的漂移。
(2),通過MHA自帶腳本的方式,管理虛擬IP的漂移#用mha自帶的一個VIP漂移的腳本,哪臺服務器變爲(master),就漂到那個上面,根據binlog最新的slave提升。
7.1,以腳本方式配置MHA
(1)修改MHA配置文件
[root@ c44 ~] vim /etc/mha/app1.cnf
[server default]
master_ip_failover_script=/usr/bin/master_ip_failover #添加vip漂移腳本功能
(2)編寫漂移腳本
[root@ c744 ~] vim /usr/bin/master_ip_failover
#!/usr/bin/env perl
use strict;
use warnings FATAL => 'all';
use Getopt::Long;
my (
$command, $ssh_user, $orig_master_host, $orig_master_ip,
$orig_master_port, $new_master_host, $new_master_ip, $new_master_port
);
my $vip = '10.0.0.100/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig ens33:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig ens33:$key down";
GetOptions(
'command=s' => \$command,
'ssh_user=s' => \$ssh_user,
'orig_master_host=s' => \$orig_master_host,
'orig_master_ip=s' => \$orig_master_ip,
'orig_master_port=i' => \$orig_master_port,
'new_master_host=s' => \$new_master_host,
'new_master_ip=s' => \$new_master_ip,
'new_master_port=i' => \$new_master_port,
);
exit &main();
sub main {
print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";
if ( $command eq "stop" || $command eq "stopssh" ) {
my $exit_code = 1;
eval {
print "Disabling the VIP on old master: $orig_master_host \n";
&stop_vip();
$exit_code = 0;
};
if ($@) {
warn "Got Error: $@\n";
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "start" ) {
my $exit_code = 10;
eval {
print "Enabling the VIP - $vip on the new master - $new_master_host \n";
&start_vip();
$exit_code = 0;
};
if ($@) {
warn $@;
exit $exit_code;
}
exit $exit_code;
}
elsif ( $command eq "status" ) {
print "Checking the Status of the script.. OK \n";
exit 0;
}
else {
&usage();
exit 1;
}
}
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
sub stop_vip() {
return 0 unless ($ssh_user);
`ssh $ssh_user\@$orig_master_host \" $ssh_stop_vip \"`;
}
sub usage {
print
"Usage: master_ip_failover --command=start|stop|stopssh|status --orig_master_host=host --orig_master_ip=ip --orig_master_port=port --new_master_host=host --new_master_ip=ip --new_master_port=port\n";
}
(3)添加執行權限
[root@ c44 ~] chmod +x /usr/bin/master_ip_failover
7.2,手動添加vip
[root@ c42 ~] ifconfig ens33:1 10.0.0.100/24
[root@ c42 ~] ip a show ens33
7.3,重啓MHA
(1)先關閉MHA
[root@ c44 ~] masterha_stop --conf=/etc/mha/app1.cnf
Stopped app1 successfully.
[1]+ Exit 1
(2)啓動MHA
[root@ c44 ~] nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &
[1] 22022
(3)查看mha狀態
[root@ c44 ~] masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:22022) is running(0:PING_OK), master:10.0.0.42
8,模擬master主庫宕機,vip漂移
8.1,關閉c42上的備份主庫mysql
[root@ c42 ~] systemctl stop mysql
[root@ c42 ~] ip a show ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:60:cb:77 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.42/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe60:cb77/64 scope link
valid_lft forever preferred_lft forever
8.2,查看c41上vip和mysql狀態
(1)查看vip
[root@ c41 ~] ip a show ens33
(2)查看主從狀態
[root@ c41 ~] mysql -p123456 -e "show master status"
(3)重啓c42主機的mysql服務
[root@ c42 ~] systemctl restart mysql
Atlas(讀寫分離)簡介:
數據庫中間件Atlas與Mycat比較分庫分表壓測報告
https://blog.csdn.net/izhitao/article/details/71680714
Atlas是由Qihoo 360公司Web平臺部基礎架構團隊開發維護的一-個基於MySQL協議的數據中間層項目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基礎上,修改了大量bug ,添加了很多功能特性。目前該項目在360公司內部得到了廣泛應用,很多MySQL業務已經接入了Atlas平臺,每天承載的讀寫請求數達幾十億條。
源碼Github : https://github.com/Qihoo360/Atlas
讀寫分離定義:
讀寫分離,基本的原理是讓主數據庫處理事務性增、刪、改操作( INSERT. DELETE、 UPDATE ) , 而從數據庫處理SELECT查詢操作。數據庫複製把主數據庫操作的變更同步到集羣中的從數據庫。
讀寫分離作用:
因爲數據庫的“寫" (寫10000條數據到oracle可能要3分鐘)操作是比較耗時的。但是數據庫的“讀" (從oracle讀10000條數據可能只要5秒鐘)。所以讀寫分離,解決的是,數據庫的寫入,影響了查詢的效率。
讀寫分離意義:
數據庫不一定要讀寫分離,如果程序使用數據庫較多時,而更新少,查詢多的情況下會考慮使用,利用數據庫主從同步
可以減少數據庫壓力,提高性能。當然,數據庫也有其它優化方案。memcache 或是表折分,或是搜索引學。都是解
決方法。
Atlas的功能有:
讀寫分離、從庫負載均衡、自動分表、IP過濾、 SQL語句黑白名單、DBA可平滑上下線DB、自動摘除宕機的DB。
Atlas的使用場景:
Atlas是一個位於前端 應用與後端MySQL數據庫之間的中間件,它使得應用程序員無需再關心讀寫分離、分表等與MySQL相關的細節,可以專注於編寫業務邏輯,同時使得DBA的運維工作對前端應用透明,上下線DB前端應用無感知。
9,安裝部署Atlas(讀寫分離)
注意事項:
1,Atlas只能安裝運行在64位的系統上
2,Centos 5.X安裝Atlas-XX.el5.x86_ _64.rpm , Centos 6.X安裝Atlas-XX.el6.x86 _64.rpm(經過測試centos7也可以使用6的版本)
3、後端mysq|版本應大於5.1 ,建議使用Mysql 5.6以上
9.1,安裝atlas
#下載Atlas
[root@ c44 ~] wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
#安裝Atlas
[root@ c44 ~] rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
9.2,修改配置文件
[root@ c44 ~] vim /usr/local/mysql-proxy/conf/test.cnf
[root@ c44 ~] egrep -v '^#|^$' /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
admin-username = user
admin-password = pwd
proxy-backend-addresses = 10.0.0.100:3306
proxy-read-only-backend-addresses = 10.0.0.42:3306,10.0.0.43:3306
pwds = repl:/iZxz+0GRoA=,mha:O2jBXONX098=
daemon = true
keepalive = true
event-threads = 8
log-level = message
log-path = /usr/local/mysql-proxy/log
sql-log = ON
proxy-address = 0.0.0.0:1234
admin-address = 0.0.0.0:2345
charset = utf8
9.3,啓動Atlas
[root@ c44 ~] /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
# Atlas可以通過不同的配置文件,同時啓動多個Atlas,代理多套MHA節點
/usr/local/mysql-proxy/bin/mysql-proxyd test start #啓動
/usr/local/mysql-proxy/bin/mysql-proxyd test stop #停止
/usr/local/mysql-proxy/bin/mysql-proxyd test restart #重啓
查看進程
[root@ c44 ~] ps -ef|grep mysql-proxy
root 22218 1 0 18:27 ? 00:00:00 /usr/local/mysql-proxy/bin/mysql-prox --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
root 22219 22218 0 18:27 ? 00:00:00 /usr/local/mysql-proxy/bin/mysql-prox --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
root 22232 19112 0 18:28 pts/1 00:00:00 grep --color=auto mysql-proxy
9.4,Atlas讀寫分離測試
(1)讀測試:
#在Atlas主機上安裝mysql,並啓動
[root@ c44 ~] yum -y install mysql
[root@ c44 ~] systemctl start mysql
#登錄mysql
[root@ c44 ~] mysql -umha -pmha -P1234 -h10.0.0.44
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 3 |
+-------------+
1 row in set (0.00 sec)
MySQL [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 2 |
+-------------+
注意: 發現上面’server_id每次的結果都不-樣,分別是2臺從庫的serve_id ,並且每執行一次命令 , server_id就會變換一次,這是因爲默認讀操作的權重都是1,兩臺從DB默認就是負載均衡。
(2)寫測試:
[root@ c44 ~] mysql -umha -pmha -P1234 -h10.0.0.44
MySQL [(none)]> begin;select @@server_id;commit;
Query OK, 0 rows affected (0.00 sec)
+-------------+
| @@server_id |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)
MySQL [(none)]> create database wg;
Query OK, 1 row affected (0.00 sec)
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wg |
+--------------------+
4 rows in set (0.00 sec)
(1)在c41上查看
[root@ c41 ~]# mysql -uroot -p123456 -e "show databases"
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wg |
+--------------------+
(2)在c43上查看
[root@ c43 ~] mysql -uroot -p123456 -e "show databases"
Warning: Using a password on the command line interface can be insecure.
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| wg |
+--------------------+
9.5,Altas管理操作
(1)登錄管理接口
[root@ c44 ~] mysql -uuser -ppwd -P2345 -h 10.0.0.44
(2)查看幫助信息
MySQL [(none)]> select * from help;
+----------------------------+---------------------------------------------------------+
| command | description |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help | shows this help |
| SELECT * FROM backends | lists the backends and their state |
| SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id | online backend server, ... |
| ADD MASTER $backend | example: "add master 127.0.0.1:3306", ... |
| ADD SLAVE $backend | example: "add slave 127.0.0.1:3306", ... |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ... |
| SELECT * FROM clients | lists the clients |
| ADD CLIENT $client | example: "add client 192.168.1.2", ... |
| REMOVE CLIENT $client | example: "remove client 192.168.1.2", ... |
| SELECT * FROM pwds | lists the pwds |
| ADD PWD $pwd | example: "add pwd user:raw_password", ... |
| ADD ENPWD $pwd | example: "add enpwd user:encrypted_password", ... |
| REMOVE PWD $pwd | example: "remove pwd user", ... |
| SAVE CONFIG | save the backends to config file |
| SELECT VERSION | display the version of Atlas |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.00 sec)
(3)查看後端代理庫
MySQL [(none)]> select * from backends;
+-------------+-----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+-------+------+
| 1 | 10.0.0.100:3306 | up | rw |
| 2 | 10.0.0.42:3306 | up | ro |
| 3 | 10.0.0.43:3306 | up | ro |
+-------------+-----------------+-------+------+
3 rows in set (0.00 sec)
(4)下線後端節點
MySQL [(none)]> set offline 3;
+-------------+----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+----------------+---------+------+
| 3 | 10.0.0.43:3306 | offline | ro |
+-------------+----------------+---------+------+
1 row in set (0.00 sec
MySQL [(none)]> select * from backends;
+-------------+-----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+---------+------+
| 1 | 10.0.0.100:3306 | up | rw |
| 2 | 10.0.0.42:3306 | up | ro |
| 3 | 10.0.0.43:3306 | offline | ro |
+-------------+-----------------+---------+------+
3 rows in set (0.00 sec)
(5)上線後端節點
MySQL [(none)]> set online 3;
+-------------+----------------+---------+------+
| backend_ndx | address | state | type |
+-------------+----------------+---------+------+
| 3 | 10.0.0.43:3306 | unknown | ro |
+-------------+----------------+---------+------+
1 row in set (0.00 sec)
MySQL [(none)]> select * from backends;
+-------------+-----------------+-------+------+
| backend_ndx | address | state | type |
+-------------+-----------------+-------+------+
| 1 | 10.0.0.100:3306 | up | rw |
| 2 | 10.0.0.42:3306 | up | ro |
| 3 | 10.0.0.43:3306 | up | ro |
+-------------+-----------------+-------+------+
3 rows in set (0.00 sec)