溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MYSQL+復制+MHA+VIP配置的示例分析

發(fā)布時間:2021-11-06 11:53:51 來源:億速云 閱讀:150 作者:小新 欄目:MySQL數(shù)據(jù)庫

這篇文章給大家分享的是有關MYSQL+復制+MHA+VIP配置的示例分析的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

1、 mysql安裝
①cmake的安裝
cp cmake-2.8.10.2.tar.gz /uar/local
tar -zxvf cmake-2.8.10.2.tar.gz // 解壓壓縮包
cd cmake-2.8.10.2
./configure
make
make install

②mysql源碼安裝
采用源碼安裝方式安裝,先將mysql-5.6.16.tar源碼拷貝至服務器解壓,解壓后進入mysql-5.6.16這個目錄中
    使用cmake源碼安裝mysql(如果你打算安裝到不同的路徑,注意修改下面語句中/usr/local/mysql這個路徑!)
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_DATADIR=/mysql/data \
-DMYSQL_USER=mysql \
-DMYSQL_TCP_PORT=3306 \
-DENABLE_DOWNLOADS=1
上面的這些復制完,回車,然后就開始cmake的過程,一般時間不會很長。
cmake結(jié)束后開始編譯源碼,這一步時間會較長,請耐心等待。
make  (注:此步驟可以使用make -j多個CPU一起編譯,提升速度,單核CPU不要加此參數(shù))
安裝編譯好的程序
make install
注意:如果需要重裝mysql,在/usr/local/src/mysql-5.6.16在執(zhí)行下make install就可以了,不需要再cmake和make
清除安裝臨時文件
make clean

③初始化數(shù)據(jù)目錄
cd /usr/local/mysql/scripts/
創(chuàng)建mysql用戶,將/mysql  /user/local/mysql 目錄賦權給mysql
useradd mysql
chown -Rf mysql:mysql /mysql
chown -Rf mysql:mysql /usr/local/mysql
./mysql_install_db --datadir=/mysql/data --basedir=/usr/local/mysql --user=mysql
出現(xiàn)兩個OK字樣,表示數(shù)據(jù)目錄初始化完畢在/mysql/data下

④mysql注冊服務并啟動
cd /usr/local/mysql/support-files
 cp mysql.server /etc/rc.d/init.d/mysql
cp my-default.cnf /etc/my.cnf
chkconfig --add mysql
chkconfig mysql on
service mysql start
mysql -u mysql -S /usr/local/mysql/mysql.sock
連接需要sock信息,可以-S指定路徑或者把socket路徑寫在my.cnf中,配置相應路徑,否則連接報錯,建議寫在配置文件里
[mysqld] 
socket=/usr/local/mysql/mysql.sock
[client] 
socket=/usr/local/mysql/mysql.sock
其他my.cnf參數(shù)后續(xù)添加

2、 mysql主從復制
本實驗通過三臺服務器搭建主從復制環(huán)境
Master  10.39.251.187
Slaver1   10.39.251.188
Slaver2   10.39.251.189
修改主庫和從庫的參數(shù)文件(/etc/my.cnf)
主庫:10.39.251.187
#[mysqld]標簽下追加
server_id =1     
log-bin=/mysql/data/mysql-bin
log-bin-index=/mysql/data/mysql-binlog.index  
log_slave_updates=1
sync-binlog = 1
從庫1:10.39.251.188 (備主)
#[mysqld]標簽下追加
server_id =2
log-bin=/mysql/data/mysql-bin
log-bin-index=/mysql/data/mysql-binlog.index
log_slave_updates=1
sync-binlog = 1
從庫2:10.39.251.189
#[mysqld]標簽下追加
read_only=1
server_id = 3

登錄主服務器創(chuàng)建從服務器的連接賬號,分配權限
mysql> GRANT replication slave ON *.* TO 'repluser'@'%' identified by 'oracle';
mysql> flush privileges;

初始化數(shù)據(jù):
所有從庫:如果從庫以前有數(shù)據(jù),要干掉原有數(shù)據(jù),保持從庫是干凈的
service mysql stop              #停止Mysql服務
cd /mysql/data                  #進入數(shù)據(jù)目錄
rm -fr 數(shù)據(jù)庫目錄               #刪除數(shù)據(jù)庫目錄
service mysql restart           #啟動Mysql服務


主庫:主庫的數(shù)據(jù)導出,并導入所有從庫,保持數(shù)據(jù)一致
mysqldump -u root -poracle123 m >/tmp/full.sql        #主庫導出數(shù)據(jù)
scp /tmp/full.sql root@從庫IP:/tmp/                   #主庫導出的數(shù)據(jù)通過scp傳送到所有從庫


所有從庫:導入主庫傳過來的數(shù)據(jù)
mysql -u root -poracle123 m < /tmp/full.sql  #導入主庫傳遞過來的數(shù)據(jù)


主庫:為主庫加上只讀鎖,查看當前Binlog日志情況
mysql> flush tables with read lock;          #給主庫加上讀鎖
mysql> show master status;
+------------------+----------+--------------+--------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB         | Executed_Gtid_Set |
+------------------+----------+--------------+--------------------------+-------------------+
| mysql-bin.000003 |      411 |              | mysql,information_schema |                   |
+------------------+----------+--------------+--------------------------+-------------------+
mysql>unlock tables;                         #給主庫解鎖


所有從庫向主庫做同步操作,開啟復制
從庫上執(zhí)行:
change master to master_host='10.39.251.187',
master_port=3306, master_user='repluser',
master_password='oracle', master_log_file='mysql-bin.000003',master_log_pos=411

啟動slaver
start slave;

在從庫查看:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.10.21
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 411
Relay_Log_File: my3306-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Seconds_Behind_Master: 0

測試同步:
主庫建表插入記錄,在從庫中查詢,很簡單一般測試正常,MySQL會自動提交


  半同步復制:
  MySQL5.5 除了支持內(nèi)置的異步復制機制,還提供了接口支持半同步復制的機制。
異步復制的缺點:
MySQL復制默認是異步復制,Master將事件寫入binlog,但并不知道Slave是否或何時已經(jīng)接收且已處理。在異步復制的機制的情況下,如果Master宕機,事務在Master上已提交,但很可能這些事務沒有傳到任何的Slave上。假設有Master->Salve故障轉(zhuǎn)移的機制,此時Slave也可能會丟失事務。
半同步復制的概念:
i.
當Slave主機連接到Master時,能夠查看其是否處于半同步復制的機制。
ii.
當Master上開啟半同步復制的功能時,至少應該有一個Slave開啟其功能。此時,一個線程在Master上提交事務將受到阻塞,直到得知一個已開啟半同步復制功能的Slave已收到此事務的所有事件,或等待超時。
iii.
當一個事務的事件都已寫入其relay-log中且已刷新到磁盤上,Slave才會告知已收到。
iv.
如果等待超時,也就是Master沒被告知已收到,此時Master會自動轉(zhuǎn)換為異步復制的機制。當至少一個半同步的Slave趕上了,Master與其Slave自動轉(zhuǎn)換為半同步復制的機制。
v.
半同步復制的功能要在Master,Slave都開啟,半同步復制才會起作用;否則,只開啟一邊,它依然為異步復制。
半同步復制安裝方法:
環(huán)境要求:
i.
MySQL5.5或以上版本
ii.
在MySQL上安裝插件需要數(shù)據(jù)庫支持動態(tài)載入。檢查是否支持,用如下檢測:
mysql> show global variables like 'have_dynamic_loading';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| have_dynamic_loading | YES  |
+----------------------+-------+
1 row in set (0.00 sec)


iii.半同步復制是基于復制的環(huán)境。也就是說配置半同步復制前,已有復制的環(huán)境。
安裝:
在Master上執(zhí)行:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';


各個Slave上執(zhí)行:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';


如果不清楚Plugin的目錄,用如下查找:
mysql> show global variables like 'plugin_dir';
+---------------+----------------------------------+
| Variable_name | Value                            |
+---------------+----------------------------------+
| plugin_dir    | /opt/usr/local/mysql/lib/plugin/ |
+---------------+----------------------------------+


檢查Plugin是否已正確安裝:
mysql> show plugins;
or
mysql> select * from information_schema.plugins;
配置:
在Master上執(zhí)行:
mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
mysql> SET GLOBAL rpl_semi_sync_master_timeout = N;


在Slave上執(zhí)行:
mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
說明:http://www.linuxidc.com
如果在一個正在運行的Slave上開啟半同步復制的功能,必須先停止Slave I/O,將其啟用半同步后,再開啟Slave I/O.
mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD;


如果不這樣做,Slave還是會以異步的方式進行復制。
正如大家所知,如果不將變量的設置寫到配置文件,下次重啟數(shù)據(jù)庫,將失效。寫入配置文件:
Master上:
[mysqld]
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000 # 1 second


Slave上:
[mysqld]
rpl_semi_sync_slave_enabled=1


3、 MHA安裝
MHA特點:
               MHA監(jiān)控復制架構(gòu)的主服務器,一旦檢測到主服務器故障,就會自動進行故障轉(zhuǎn)移。即使有些從服務器沒有收到最新的relay log,MHA自動從最新的從服務器上識別差異的relay log并把這些日志應用到其他從服務器上,因此所有的從服務器保持一致性了。MHA通常在幾秒內(nèi)完成故障轉(zhuǎn)移,9-12秒可以檢測出主服務器故障,7-10秒內(nèi)關閉故障的主服務器以避免腦裂,幾秒中內(nèi)應用差異的relay log到新的主服務器上,整個過程可以在10-30s內(nèi)完成。還可以設置優(yōu)先級指定其中的一臺slave作為master的候選人。由于MHA在slaves之間修復一致性,因此可以將任何slave變成新的master,而不會發(fā)生一致性的問題,從而導致復制失敗


安裝步驟:
檢查各服務器防火墻和SELINUX是否關閉
①在master 上創(chuàng)建管理用戶并賦權
mysql> CREATE USER 'mha'@'%' IDENTIFIED BY 'mhapwd'; 
mysql> grant all privileges on *.* to 'mha'@'%' identified by 'mhapwd';
mysql> flush privileges;
②在從庫檢查是否同步
mysql> select user,host from mysql.user;
③配置mysql 環(huán)境變量,各節(jié)點都需配置
[root@mysql-01 ~]# echo 'PATH=/usr/local/mysql/bin:$PATH' >>/etc/profile
[root@mysql-01 ~]# source /etc/profile
[root@mysql-01 ~]# which mysql
#建立mysql,mysqlbinlog 軟鏈接
mv /usr/bin/mysql /usr/bin/mysql_bak
ln -s /usr/local/mysql/bin/* /usr/bin/
④配置ssh 免密碼登陸,先在各服務器中配置/etc/hosts
在其中一臺251.187執(zhí)行
ssh-keygen -t rsa  一路回車
cd /root/.ssh/
cat id_rsa.pub >> authorized_keys   //建立本地信任
scp id_rsa.pub root@10.39.251.188:/root/.ssh/id_rsa187.pub
scp id_rsa.pub root@10.39.251.189:/root/.ssh/id_rsa187.pub
進入251.188與251.189的root家目錄
cd /root/.ssh/
cat id_rsa187.pub >> authorized_keys    //建立遠程信任
chmod 700 ~/.ssh/*
至此,187已可以通過ssh不輸入密碼登陸到187、188與189,同理在188與189中分別執(zhí)行第④步操作,使三臺服務器可以互相連接無需輸入密碼(需注意一定不要用復制粘貼的方法拷貝key,會出現(xiàn)問題,如果配置完畢SSH仍有問題可以查看/var/log/secure日志信息)
⑤安裝MHA
需要安裝一些包做支持,使用yum網(wǎng)絡源;如安裝遇到問題可以嘗試yum update更新yum源或yum clean all清除緩存
在187、188、189中安裝node
yum -y install perl-DBD-MySQL ncftp
rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
在189中安裝manager
yum install perl
yum install cpan
yum install perl-Config-Tiny
yum install perl-Time-HiRes 
yum install perl-Log-Dispatch
yum install perl-Parallel-ForkManager
如果安裝perl-Log-Dispatch,perl-Parallel-ForkManager安裝包報錯:需要先安裝epel(可以參考https://fedoraproject.org/wiki/EPEL)
rpm -ivh epel-release-6-8.noarch.rpm
rpm -ivh mha4mysql-manager-0.54-0.el6.noarch.rpm
⑥配置HMA
mkdir -p /etc/masterha
mkdir -p /mha/app1
touch /etc/masterha/app1.cnf
vi  /etc/masterha/app1.cnf
插入如下內(nèi)容:
[server default]
manager_workdir=/mha/app1
manager_log=/mha/app1/manager.log
ssh_user=root
user=root
password=oracle123
repl_user=repluser
repl_password=oracle
ping_interval=3
master_ip_failover_script=/masterha/app1/master_ip_failover
[server1]
hostname=10.39.251.187
port=3306
master_binlog_dir=/mysql/data
candidate_master=1
[server2]
hostname=10.39.251.188
port=3306
master_binlog_dir=/mysql/data
candidate_master=1
[server3]
hostname=10.39.251.189
port=3306
master_binlog_dir=/mysql/data
no_master=1
保存退出
masterha_check_ssh工具驗證ssh信任登錄是否成功
masterha_check_ssh --conf=/etc/masterha/app1.cnf
如遇到報錯:Can't locate MHA/NodeConst.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/share/perl5/vendor_perl/MHA/ManagerConst.pm line 25
解決:cp -rvp /usr/lib/perl5/vendor_perl/MHA  /usr/local/lib64/perl5/
(mha的數(shù)據(jù)庫節(jié)點和管理節(jié)點均需要執(zhí)行此步驟)
masterha_check_repl工具驗證mysql復制是否成功
masterha_check_repl --conf=/etc/masterha/app1.cnf
⑦創(chuàng)建master_ip_failover腳本
cd /mha/app1
touch master_ip_failover
chmod 755 master_ip_failover
vi master_ip_failover
插入如下內(nèi)容:
#!/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.39.251.192';#Virtual IP
my $gateway = '10.39.251.255';#Gateway IP
my $interface = 'eth0';
my $key = "1";
my $ssh_start_vip = "/sbin/ifconfig $interface:$key $vip;/sbin/arping -I $interface -c 3 -s $vip $gateway >/dev/null 2>&1";
my $ssh_stop_vip = "/sbin/ifconfig $interface:$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" ) {
# $orig_master_host, $orig_master_ip, $orig_master_port are passed.
# If you manage master ip address at global catalog database,
# invalidate orig_master_ip here.
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" ) {
# all arguments are passed.
# If you manage master ip address at global catalog database,
# activate new_master_ip here.
# You can also grant write access (create user, set read_only=0, etc) here.
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";
`ssh $ssh_user\@$orig_master_host \" $ssh_start_vip \"`;
exit 0;
}
else {
&usage();
exit 1;
}
}
# A simple system call that enable the VIP on the new master
sub start_vip() {
`ssh $ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master
sub stop_vip() {
`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";
}
⑧啟動MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf > /mha/app1/mha_manager.log  < /dev/null 2>&1 &  (注:這種啟動方式經(jīng)驗證關閉shell時進程也會掛掉,可以寫到腳本里執(zhí)行就沒有此問題了)
檢查:masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:19570) is running(0:PING_OK), master:10.39.251.187
停止manager:
masterha_stop --conf=/etc/masterha/app1.cnf
# 如果不能停止, 加 --abort選項
masterha_check_repl工具驗證mysql復制是否成功
masterha_check_repl --conf=/etc/masterha/app1.cnf
在master節(jié)點新增虛擬IP:
/sbin/ifconfig eth0:0 10.39.251.192 netmask 255.255.255.0 up


4、 MHA切換
停止187上的master節(jié)點mysql,查看189上manager日志 tail -f  /mha/app1/manager.log主節(jié)點已切換,登錄slaver的mysql查看show slave status\G,發(fā)現(xiàn)master已切換至188,并且虛擬IP192已經(jīng)綁定在188節(jié)點上,客戶端仍正常訪問192即可
切換過程中需要關注的幾個問題:
1.切換過程會自動把read_only關閉
2.切換之后需要刪除手工刪除/masterha/app1/app1.failover.complete,才能進行第二次測試
3.一旦發(fā)生切換管理進程將會退出,無法進行再次測試,需將故障數(shù)據(jù)庫加入到MHA環(huán)境中來
4.原主節(jié)點重新加入到MHA時只能設置為slave,在
change master to MASTER_HOST='192.168.16.5', MASTER_USER='replicationuser',MASTER_PASSWORD='replicationuser',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=106;
之前需要先 reset slave
5.關于ip地址的接管有幾種方式,這里采用的是MHA自動調(diào)用ip別名的方式,好處是在能夠保證數(shù)據(jù)庫狀態(tài)與業(yè)務Ip 切換的一致性。啟動管理節(jié)點之后 vip會自動別名到當前主節(jié)點上,keepalived也只能做到對3306的健康檢查,但是做不到比如像MySQL復制中的slave-SQL、slave-IO進程的檢查,容易出現(xiàn)對切換的誤判。
6.注意:二級從服務器需要將log_slave_updates打開
7.手工切換需要先定義好master_ip_online_change_script腳本,不然只會切換mysql,Ip地址不會綁定上去,可以根據(jù)模板來配置該腳本
8.通過設置no_master=1可以讓某一個節(jié)點永遠不成為新的主節(jié)點


恢復集群運行:
①在189上刪除app1.failover.complete文件
cd /mha/app1
rm -f app1.failover.complete
②原187主節(jié)點服務啟動
service mysql start
③189管理節(jié)點,檢查同步報錯
masterha_check_repl --conf=/etc/masterha/app1.cnf
Fri Aug 21 11:23:34 2015 - [error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln604] There are 2 non-slave servers! MHA manages at most one non-slave server. Check configurations.
⑤查看現(xiàn)在的master188上的信息
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |     3721 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
④配置187節(jié)點mysql為新的slave,并啟動同步進程
change master to master_host='10.39.251.188',
master_port=3306, master_user='repluser',
master_password='oracle', master_log_file='mysql-bin.000001',master_log_pos=3721
mysql> start slave;
再次在管理節(jié)點上檢查同步狀態(tài)成功:
masterha_check_repl --conf=/etc/masterha/app1.cnf
需注意:按如上步驟操作后,此時187節(jié)點作為slaver已加入到集群中,但是宕機這段時間188、189中新產(chǎn)生的數(shù)據(jù)在187中沒有,所以還需要先從主節(jié)點備份導入最新的數(shù)據(jù)再啟動同步,步驟參考上面寫的主從復制部分內(nèi)容
⑤啟動MHA
nohup masterha_manager --conf=/etc/masterha/app1.cnf > /mha/app1/mha_manager.log  < /dev/null 2>&1 &

感謝各位的閱讀!關于“MYSQL+復制+MHA+VIP配置的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI