主頁 > 軟體設計 > nginx + mysql(主從復制)

nginx + mysql(主從復制)

2021-01-17 13:26:02 軟體設計

一、mysql編譯安裝

mysql原始碼包下載
這里用到的是mysql-boost-5.7.31.tar.gz
在這里插入圖片描述

[root@server1 ~]# tar zxf mysql-boost-5.7.31.tar.gz

在這里插入圖片描述
cmake升級:(3.5版本以上)
cmake下載這里用到的cmake3.3.6

[root@server1 ~]# yum install cmake3-data-3.6.1-2.el7.noarch.rpm cmake3-3.6.1-2.el7.x86_64.rpm -y

在這里插入圖片描述

[root@server1 ~]# yum install jsoncpp-0.10.5-2.el7.x86_64.rpm jsoncpp-devel-0.10.5-2.el7.x86_64.rpm -y

在這里插入圖片描述

[root@server1 mysql-5.7.31]# mkdir build
[root@server1 build]# cmake3 ../ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
> -DMYSQL_DATADIR=/data/mysql \
> -DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
> -DWITH_INNOBASE_STORAGE_ENGINE=1 \
> -DSYSCONFDIR=/etc \
> -DENABLED_LOCAL_INFILE=1 \
> -DWITH_EXTRA_CHARSETS=all \
> -DDEFAULT_CHARSET=utf8mb4 \
> -DDEFAULT_COLLATION=utf8mb4_unicode_ci \
> -DWITH_BOOST=/root/mysql-5.7.31/boost/boost_1_59_0/

升級gcc:(版本要求5.3以上)

[root@server1 build]# yum install -y gcc-c++
[root@server1 build]# yum install ncurses-devel.x86_64 -y
[root@server1 build]# openssl-devel
[root@server1 build]# yum install bison -y
解決依賴性

注意如果編譯中途出現問題,在CMakeLists.txt中相應的報錯行注釋就行

解決依賴問題
在這里插入圖片描述在這里插入圖片描述

[root@server1 build]# make
[root@server1 build]# make install

下載
在這里插入圖片描述在這里插入圖片描述

2.拷貝啟動腳本:

[root@server1 mysql-5.7.31]# cd /usr/local/mysql/support-files/
[root@server1 support-files]# cp mysql.server /etc/init.d/mysqld

3.新建用戶:

[root@server1 mysql-5.7.31]# useradd -M -d /usr/local/mysql/ -s /sbin/nologin mysql

4.創建資料目錄:

[root@server1 mysql-5.7.31]# mkdir -p /data/mysql
[root@server1 mysql-5.7.31]# chown mysql.mysql /data/mysql/

5.添加變數

[root@server1 build]# cd /usr/local/mysql/bin/
[root@server1 bin]# pwd
/usr/local/mysql/bin
[root@server1 bin]# vim ~/.bash_profile
[root@server1 bin]# source ~/.bash_profile

在這里插入圖片描述

6.修改配置:

[root@server1 ~]# vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock

在這里插入圖片描述

7.初始化資料庫:

[root@server1 ~]# mysqld --initialize --user=mysql  ##獲得密鑰
[root@server1 ~]# /etc/init.d/mysqld start     ##開啟mysql服務
[root@server1 ~]# mysql_secure_installation  ##初始化

初始化
在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述
接下來的初始化內容輸入y即可,即完成了初始化內容

# mysql -p

在這里插入圖片描述

7.圖形化管理資料庫

# unzip phpMyAdmin-5.0.2-all-languages.zip
##這個包可以從網上直接下載
# mv phpMyAdmin-5.0.2-all-languages /usr/local/nginx/html/phpmyadmin

172.25.1.1/phpmyadmin/index.php
在這里插入圖片描述
在這里插入圖片描述
登陸失敗,因為php組態檔問題,只要把相關檔案的路徑加上即可

# vim /usr/local/lnmp/php/etc/php.ini
# systemctl reload php-fpm.service

在這里插入圖片描述
在這里插入圖片描述
然后我們再次登陸,成功登陸
在這里插入圖片描述

二、mysql用戶與授權

mysql> CREATE USER 'suns'@'localhost' IDENTIFIED BY 'password'; 
##本地登陸建立
mysql> CREATE USER 'suns'@'%' IDENTIFIED BY 'password';
##遠程登錄建立
mysql> GRANT insert, delete,update,select ON westos.* TO 'suns'@'localhost';
##本地登陸授權
mysql> GRANT select ON *.* TO 'suns'@'%';
##遠程登陸授權

三、mysql加密連接

mysql> CREATE USER 'westos'@'%' IDENTIFIED BY 'password' REQUIRE SSL;		//強制要求用戶加密連接

四、mysql 的主從復制

1.先給server2配置mysql,可以直接把檔案傳給server2

[root@server1 local]# scp -r mysql/ server2:/usr/local/

然后在server2配置,初始化等操作和server1相同

1.master設定server-id:

[root@server1 ~]# vim /etc/my.cnf
server-id=1       //在線生效
log-bin=binlog     ##二進制日志

在這里插入圖片描述

2.master創建復制用戶:

mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
mysql> show master status;

在這里插入圖片描述

3.slave設定server-id

[root@server2 ~]# vim /etc/my.cnf
server-id=2       //在線生效
log-bin=binlog     ##二進制日志(可以不寫)

在這里插入圖片描述

mysql> change master to master_host='172.25.1.1', master_user='repl', master_password='westos', master_log_file='binlog.000001', master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;

在這里插入圖片描述
可以在圖形化管理界面進行庫和表的創建
在這里插入圖片描述

測驗:
在這里插入圖片描述在這里插入圖片描述
從上圖看主從復制已經實作;可以實作資料同步,

4.GTID復制:

參考:GTID復制

[root@server1 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON
[root@server2 ~]# vim /etc/my.cnf
gtid_mode=ON
enforce-gtid-consistency=ON

在這里插入圖片描述在這里插入圖片描述

slave.server2
mysql>stop slave;
mysql> change master to master_host='172.25.1.1', master_user='repl', master_password='westos', MASTER_AUTO_POSITION = 1;
mysql> start slave;
master.server1
mysql> insert into westos.users values ('user2','123');

在這里插入圖片描述

5.半同步復制:

參考:半同步復制

master:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
SET GLOBAL rpl_semi_sync_master_enabled =1;
show status like 'Rpl_semi%';
slave:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
SET GLOBAL rpl_semi_sync_slave_enabled = 1;
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

狀態查詢
在這里插入圖片描述在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
測驗
Slave
mysql> set global rpl_semi_sync_slave_enabled = 0; mysql> stop slave io_thread; mysql> start slave io_thread;
關閉半同步復制,重啟io介面
在這里插入圖片描述
master
mysql> insert into westos.users values ('user4','123');
在這里插入圖片描述
插入第一個資料時花了10.01秒,而我們前面設定的超時時間是10秒,而插入第二個資料花了0.01秒,由此得出結論是超時轉換為異步傳送,可以在Master上查看半同步相關的引數值Rpl_semi_sync_master_clients和Rpl_semi_sync_master_status是否正常,
在這里插入圖片描述

mysql> set global rpl_semi_sync_master_timeout = 99999999999999;

5.7版本之前的半同步模式
在這里插入圖片描述
在這里插入圖片描述
5.7版本以后的
在這里插入圖片描述
在這里插入圖片描述

再配置一個server3方法和server2之前一樣
安縣
注意因為之前資料庫里已經有資料了,所以在這里需要將資料庫備份然后給server3倒入資料,

[root@server1 mysql]# mysqldump -p --set-gtid-purged=OFF westos > db.sql
[root@server1 mysql]# scp db.sql server3:/data/mysql/
[root@server3 mysql]# mysqladmin create westos -p
[root@server3 mysql]# mysql -p westos < db.sql
讓2也成為master
slave.server2
grant replication slave on *.* to repl@'%' identified by 'westos';
reset slave;
reset master;
slave.serer3
change master to master_host='172.25.1.2', master_user='repl', master_password='westos', MASTER_AUTO_POSITION = 1;
reset master;
reset slave;

測驗

master.server1
mysql> delete from westos.users where user='user2';

在這里插入圖片描述在這里插入圖片描述

6. 并行復制

給三臺都加上以下引數
slave-parallel-type=LOGICAL_CLOCK
slave-parallel-workers=16
master_info_repository=TABLE
relay_log_info_repository=TABLE
relay_log_recovery=ON

在這里插入圖片描述

7.MySQL組復制

多主模式

[root@server3 ~]# vim /etc/my.cnf   ##server1-3配置大體相同
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock

disabled_storage_engines="MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY"

server_id=3
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW

plugin_load_add='group_replication.so'
transaction_write_set_extraction=XXHASH64
group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
group_replication_start_on_boot=off
group_replication_local_address="server3:33061"
group_replication_group_seeds="server1:33061,server2:33061,server3:33061"
group_replication_bootstrap_group=off

group_replication_ip_whitelist="172.25.1.0/24,127.0.0.1/8"
group_replication_single_primary_mode=OFF
group_replication_enforce_update_everywhere_checks=ON
group_replication_allow_local_disjoint_gtids_join=ON

在這里插入圖片描述

server1
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> SET GLOBAL group_replication_bootstrap_group=ON;     
mysql> START GROUP_REPLICATION;
mysql> SET GLOBAL group_replication_bootstrap_group=OFF;
server2 server3 相同
mysql> SET SQL_LOG_BIN=0;
mysql> CREATE USER rpl_user@'%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO rpl_user@'%';
mysql> FLUSH PRIVILEGES;
mysql> SET SQL_LOG_BIN=1;
mysql> CHANGE MASTER TO MASTER_USER='rpl_user', MASTER_PASSWORD='password' FOR CHANNEL 'group_replication_recovery';
mysql> START GROUP_REPLICATION;
mysql> SELECT * FROM performance_schema.replication_group_members;   ##查詢組狀態

在這里插入圖片描述
測驗
建立一個資料庫看資訊是否同步

mysql> create database test;
mysql> USE test;
mysql> create table t1 (c1 INT PRIMARY KEY, C2 TEXT NOT NULL);   ##只支持帶有主鍵的表
mysql> INSERT INTO t1 VALUES (1, 'Luis');
mysql> SELECT * FROM t1;

在這里插入圖片描述

組復制相較與主從復制而言,實作了在每臺組成員上都可以實作讀寫的功能,對于主從復制中,只有主機可以寫,其他從機只能讀,不能寫,
在這里插入圖片描述在這里插入圖片描述

延遲復制:

STOP SLAVE SQL_THREAD;
CHANGE MASTER TO MASTER_DELAY=60;
START SLAVE SQL_THREAD;
show slave status\G;

慢查詢:

set global slow_query_log=ON;   
show variables like "long%";
set  long_query_time=5;
show status like '%slow%';

在這里插入圖片描述

在這里插入圖片描述

五、MySQL路由器

在這里插入圖片描述

1.MySQL路由器配置

在server4執行

[root@server4 ~]# rpm -ivh mysql-router-community-8.0.21-1.el7.x86_64.rpm
[root@server4 ~]# vim /etc/mysqlrouter/mysqlrouter.conf
[routing:ro]
bind_address = 0.0.0.0
bind_port = 7001
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = round-robin

[routing:rw]
bind_address = 0.0.0.0
bind_port = 7002
destinations = 172.25.1.1:3306,172.25.1.2:3306,172.25.1.3:3306
routing_strategy = first-available
[root@server4 ~]# systemctl start mysqlrouter.service

在這里插入圖片描述

mysql> grant all on test.* to sun@'%' identified by 'westos';    ##創建一個遠程登錄的用戶

測驗:
[root@Sun_s Desktop]# mysql -h 172.25.1.4 -P 7001 -u sun -p
在真機測驗連接路由ip 登陸mysql
在這里插入圖片描述
路由只能實作調度,負載均衡,不能實作讀寫分離,
[root@server1 ~]# lsof -i :3306在這里插入圖片描述
查看日志:cat /var/log/mysqlrouter/mysqlrouter.log
在這里插入圖片描述在這里插入圖片描述
當連接server1 down掉之后會自動跳轉到server2上
在這里插入圖片描述在這里插入圖片描述
由于mysql路由器的7001埠采用的使輪詢的調度演算法,所以每次連接到的后端真實的資料庫都是一次變化的

六、MHA 高可用

MHA全稱Master High Availability,也就是主節點的高可用,是目前比較成熟的MySQL高可用解決方案,它的主要功能主要是通過一個manager節點來監控主節點和從節點的狀況,并會在主節點發生故障的時候,自動將一個資料最貼近Master的從節點轉化成主節點,實作自動的故障轉移,
MHA的變成語言是Perl,需要安裝一些軟體包來進行編譯操作,但是總體的編譯程序十分地簡單,
在這里插入圖片描述

1.實驗環境搭建

還原環境,保證實驗環境的純凈,三臺機子操作相同

[root@server1 mysql]# /etc/init.d/mysqld stop
[root@server1 mysql]# rm -fr /data/mysql/*
[root@server1 mysql]# mysqld --initialize --user=mysql
[root@server1 mysql]# /etc/init.d/mysqld start
[root@server1 mysql]# mysql -p
輸入剛才初始化得到的密碼
進入之后修改登陸密碼
mysql> alter user root@localhost identified by 'westos';

創造新的MHA高可用環境
1.首先需要配成一主兩從

vim /etc/my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
server_id=1  #每個資料庫都有一個不一樣ID
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
log_slave_updates=ON
log_bin=binlog
binlog_format=ROW


master:server1:
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';   ##設定復制用戶
mysql> grant all on *.* to root@'%' identified by 'westos'; ## 更改root登陸權限
slave:server2,server3
mysql> grant replication slave on *.* to repl@'%' identified by 'westos';
mysql> change master to master_host='172.25.1.1',master_user='repl',master_password='westos',MASTER_AUTO_POSITION = 1;
mysql> start slave;

server4 #MHA Manager(管理節點)

[root@server4 ~]# cd MHA-7/
[root@server4 MHA-7]# yum install /root/MHA-7/*.rpm -y
[root@server4 MHA-7]# ssh-keygen        ##給server1 2 3 都做免密登陸操作
[root@server4 MHA-7]# ssh-copy-id server1
[root@server4 MHA-7]# ssh-copy-id server2
[root@server4 MHA-7]# ssh-copy-id server3
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server1:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server2:
[root@server4 MHA-7]# scp mha4mysql-node-0.58-0.el7.centos.noarch.rpm server3:
[root@server4 MHA-7]# tar xzf mha4mysql-manager-0.58.tar.gz
[root@server4 MHA-7]# cd /root/MHA-7/mha4mysql-manager-0.58/samples/conf
[root@server4 conf]# ls
app1.cnf  masterha_default.cnf
[root@server4 conf]# mkdir /etc/masterha
[root@server4 conf]# cp app1.cnf /etc/masterha/
這里還需要將 masterha_default.cnf 里的內容復制到 /etc/masterha/app1.cnf 中
[root@server4 masterha]# mkdir /etc/masterha/app1    ##組態檔中日志存放的默認路徑
[root@server1 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm -y
server2 server3相同

在這里插入圖片描述

# vim /etc/masterha/app.conf
[server default]
user=root               #mysql主從節點的管理員用戶密碼,確保可以從遠程登陸
password=westos
ssh_user=root              #ssh用戶名
master_binlog_dir= /data/mysql
remote_workdir=/tmp           #遠端mysql在發生切換時binlog的保存位置
secondary_check_script= masterha_secondary_check -s 172.25.1.1 -s 172.25.1.2
ping_interval=3                #發送ping包的時間間隔,默認是3秒,嘗試三次沒有回應的時候自動進行failover
# master_ip_failover_script= /script/masterha/master_ip_failover    #failover自動切換腳本
# shutdown_script= /script/masterha/power_manager       #故障發生后關閉故障主機腳本,防止腦裂 
# report_script= /script/masterha/send_report             #發生切換后發送報警的腳本
# master_ip_online_change_script= /script/masterha/master_ip_online_change     #手動切換腳本    

manager_workdir=/etc/masterha/app1     #manager作業目錄
manager_log=/etc/masterha/app1/manager.log      #manager日志檔案

repl_user=repl               #主從復制用戶密碼
repl_password=westos

[server1]
hostname=172.25.1.1
[server2]
hostname=172.25.1.2
candidate_master=1          #指定failover時此slave會接管master,即使資料不是最新的
check_repl_delay=0         #默認情況下如果一個slave落后master 100M的relay logs的話,MHA將不會選擇該slave作為一個新的master,因為對于這個slave的恢復需要花費很長時間,通過設定check_repl_delay=0,MHA觸發切換在選擇一個新的master的時候將會忽略復制延時,這個引數對于設定了candidate_master=1的主機非常有用,因為這個候選主在切換的程序中一定是新的master
[server3]
hostname=172.25.1.3
no_master=1        #始終是slave
server4    為了讓123之間也彼此免密
[root@server4 ~]# scp -r .ssh/ server1:
[root@server4 ~]# scp -r .ssh/ server2:
[root@server4 ~]# scp -r .ssh/ server3:

在這里插入圖片描述
Manager工具包主要包括以下幾個工具:

masterha_check_ssh//檢查MHA的SSH配置狀況
masterha_check_repl//檢查MySQL復制狀況
masterha_manger啟動MHA
masterha_check_status//檢測當前MHA運行狀態
masterha_master_monitor/檢測master是否宕機
masterha_master_switch//控制故障轉移(自動或者手動)
masterha_conf_host//添加或洗掉配置的server資訊
save_binary_logs/保存和復制master的二進制日志
apply_diff_relay_logs//識別差異的中繼日志事件并將其差異的事件應用于其他的slave
filter_mysqlbinlog//去除不必要的ROLLBACK事件(MHA已不再使用這個工具)
purge_relay_logs//清除中繼日志(不會阻塞SQL執行緒)
[root@server4 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf    ##檢測免密
[root@server4 ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf   ## 檢測復制用戶

在這里插入圖片描述在這里插入圖片描述

2.測驗高可用

(1)手動切換:
當master在線時 切換master,從1-2

# masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.1.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

查看效果
在這里插入圖片描述在這里插入圖片描述
從server1里查看效果,server1已經變成slave,serve2 變成了master

MHA在線切換的大概程序:
1.檢測復制設定和確定當前主服務器
2.確定新的主服務器
3.阻塞寫入到當前主服務器
4.等待所有從服務器趕上復制
5.授予寫入到新的主服務器
6.重新設定從服務器

為了保證資料完全一致性,在最快的時間內完成切換,MHA的在線切換必須滿足以下條件才會切換成功,否則會切換失敗,
1.所有slave的IO執行緒都在運行
2.所有slave的SQL執行緒都在運行
3.所有的show slave status的輸出中Seconds_Behind_Master引數小于或者等于running_updates_limit秒,如果在切換程序中不指定running_updates_limit,那么默認情況下running_updates_limit為1秒,
4.在master端,通過show processlist輸出,沒有一個更新花費的時間大于running_updates_limit秒,

當master down 掉時,master從server2變成server1

[root@server2 ~]# /etc/init.d/mysqld stop
[root@server4 ~]# masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.1.2 --dead_master_port=3306 --new_master_host=172.25.1.1 --new_master_port=3306 --ignore_last_failover

查看效果
在這里插入圖片描述
mysql> CHANGE MASTER TO MASTER_HOST='172.25.1.1', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='westos'; mysql> start slave;
在這里插入圖片描述
在這里插入圖片描述
master 已經成功由2-1

(2)自動切換

[root@server1 ~]# /etc/init.d/mysqld stop
[root@server4 masterha]# ls
app1  app1.cnf
[root@server4 masterha]# cd app1/
[root@server4 app1]# ls
app1.failover.complete  manager.log
[root@server4 app1]# rm -fr app1.failover.complete
洗掉剛才生成的日志,不然實作不了
[root@server4 masterha]# masterha_manager --conf=/etc/masterha/app1.cnf &

查看效果
在這里插入圖片描述
[root@server1 ~]# /etc/init.d/mysqld start
[root@server1 ~]# mysql -p
mysql> CHANGE MASTER TO MASTER_HOST=‘172.25.1.2’, MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER=‘repl’, MASTER_PASSWORD=‘westos’;
mysql> start slave;
在這里插入圖片描述在這里插入圖片描述
master 由1變成2

MHA的故障切換程序,共包括以下的步驟:

1.組態檔檢查階段,這個階段會檢查整個集群組態檔配置

2.宕機的master處理,這個階段包括虛擬ip摘除操作,主機關機操作

3.復制dead maste和最新slave相差的relay log,并保存到MHA Manger具體的目錄下

4.識別含有最新更新的slave

5.應用從master保存的二進制日志事件(binlog events)

6.提升一個slave為新的master進行復制

7.使其他的slave連接新的master進行復制

3.加入VIP

[root@server4 masterha]# vim app1.cnf

在這里插入圖片描述

[root@server4 masterha]# vim 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 = '172.25.1.100/24';
my $ssh_start_vip = "/sbin/ip addr add $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";

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";
}
[root@server4 masterha]# vim master_ip_online_change
#!/usr/bin/env perl
use strict;
use warnings FATAL =>'all';

use Getopt::Long;

my $vip = '172.25.1.100/24';  # Virtual IP  
my $ssh_start_vip = "/sbin/ip addr add  $vip dev eth0";
my $ssh_stop_vip = "/sbin/ip addr del $vip dev eth0";
my $exit_code = 0;

my (
  $command,              $orig_master_is_new_slave, $orig_master_host,
  $orig_master_ip,       $orig_master_port,         $orig_master_user,
  $orig_master_password, $orig_master_ssh_user,     $new_master_host,
  $new_master_ip,        $new_master_port,          $new_master_user,
  $new_master_password,  $new_master_ssh_user,
);
GetOptions(
  'command=s'                => \$command,
  'orig_master_is_new_slave' => \$orig_master_is_new_slave,
  'orig_master_host=s'       => \$orig_master_host,
  'orig_master_ip=s'         => \$orig_master_ip,
  'orig_master_port=i'       => \$orig_master_port,
  'orig_master_user=s'       => \$orig_master_user,
  'orig_master_password=s'   => \$orig_master_password,
  'orig_master_ssh_user=s'   => \$orig_master_ssh_user,
  'new_master_host=s'        => \$new_master_host,
  'new_master_ip=s'          => \$new_master_ip,
  'new_master_port=i'        => \$new_master_port,
  'new_master_user=s'        => \$new_master_user,
  'new_master_password=s'    => \$new_master_password,
  'new_master_ssh_user=s'    => \$new_master_ssh_user,
);


exit &main();

sub main {

#print "\n\nIN SCRIPT TEST====$ssh_stop_vip==$ssh_start_vip===\n\n";  

if ( $command eq "stop" || $command eq "stopssh" ) {
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 "\n\n\n***************************************************************\n";
            print "Disabling the VIP - $vip on old master: $orig_master_host\n"; 
            print "***************************************************************\n\n\n\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 "\n\n\n***************************************************************\n";
            print "Enabling the VIP - $vip on new master: $new_master_host \n";  
            print "***************************************************************\n\n\n\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 $orig_master_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 $new_master_ssh_user\@$new_master_host \" $ssh_start_vip \"`;
}
# A simple system call that disable the VIP on the old_master  
sub stop_vip() {
`ssh $orig_master_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";
}

測驗
[root@server4 masterha]# chmod +x master_ip_failover master_ip_online_change
[root@server2 ~]# ip addr add 172.25.1.100/24 dev eth0
[root@server2 ~]# /etc/init.d/mysqld stop
[root@server4 masterha]# masterha_manager --conf=/etc/masterha/app1.cnf &
在這里插入圖片描述
在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/249885.html

標籤:其他

上一篇:大根堆與小根堆的理解,如何手寫一個堆,以及什么時候用自己手寫的堆,什么時候用語言提供堆的api,(二者的區別)

下一篇:stp:生成樹協議的簡單總結

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more