MySQL部署 ----( MHA高可用 + Atlas讀寫分離 )

一、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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章