MySQL高可用架構:mysql+keepalived實現

系統環境及架構mysql

#主機名 系統版本 mysql版本 ip地址
mysqlMaster	   <a href="https://www.linuxprobe.com/" title="centos" target="_blank">centos</a>7.4	       mysql5.7	       192.168.1.42
mysqlSlave	   centos7.4	       mysql5.7	       192.168.1.43

#vip:192.168.1.41複製代碼

在master和slave上分別進行數據庫的安裝linux

yum install epel*  -y && yum clean all && yum makecache 
rpm -Uvh http://repo.mysql.com/mysql57-community-release-el7.rpm
yum clean all && yum makecache
yum install gcc gcc-c++ openssl-devel mysql mysql-server mysql-devel -y複製代碼

建立數據庫文件存放路徑nginx

mkdir /data/mysql -p
chown -R mysql:mysql /data/mysql複製代碼

配置mysql配置文件c++

#在mysqlMaster上配置mysql配置文件sql

vi /etc/my.cnf

[mysqld]
server-id = 1		#全局惟一,每臺都不能同樣
log-bin = mysql-bin	#log-bin表示開啓二進制日誌記錄,mysql-bin表示日誌文件的命名格式,會生成mysql-bin.0001 等等
relay-log = mysql-relay-bin	#指定中繼日誌格式(拉取主mysql日誌後,在從庫上生成的日誌)
replicate-wild-ignore-table=mysql.%	#指定那些庫或則表不進行同步,mysql是庫名,.%表示下面全部的表,mysql.user 表示不一樣不mysql庫下的user表
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
#replicate-wild-do-table=boke.% #表示同步那個庫
#注意:不要在主庫上使用binlog-do-db 或 binlog-ignore-db選項
#也不要在從庫上使用 replicate-do-db 或 replicate-ignore-db 選項,由於這有可能產生跨庫更新失敗的問題.推薦從庫上使用 replicate_wild_do_table 和 replicate_wild_ignore_table 這兩個選項來解決複製過濾問題
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8

[mysql]
socket=/data/mysql/mysql.sock
default-character-set=utf8

[client]
socket=/data/mysql/mysql.sock
default-character-set=utf8
user=root
password=NCYD-tianyu@0791
#如果不寫上這個字段,在本機用<a href="https://www.linuxcool.com/" title="命令" target="_blank">命令</a>進入mysql會報錯,提示默認路徑/var/lib/mysql/mysql.sock找不到複製代碼

在mysqlSlave上配置mysql配置文件數據庫

vi /etc/my.cnf

[mysqld]
server-id = 2
log-bin = mysql-bin
relay-log = mysql-relay-bin
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=test.%
replicate-wild-ignore-table=information_schema.%
datadir=/data/mysql
socket=/data/mysql/mysql.sock
user=mysql
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character-set-server=utf8

[mysql]
socket=/data/mysql/mysql.sock
default-character-set=utf8

[client]
socket=/data/mysql/mysql.sock
default-character-set=utf8
user=root
password=NCYD-tianyu@0791複製代碼

#如果不寫上這個字段,在本機用 命令 進入mysql會報錯,提示默認路徑/var/lib/mysql/mysql.sock找不到,先初始化數據庫(須要進行初始化在/data/mysql目錄裏生成必要的信息)centos

#mysql5.7.7之後的初始化方法
mysqld --initialize --user=mysql --datadir=/data/mysql

#mysql5.7.7之前的初始化方法
mysql_install_db --user=mysql --datadir=/data/mysql

分別啓動主從數據庫

#在centos7裏面,必須先關閉se<a href="https://www.linuxprobe.com/" title="linux" target="_blank">linux</a>,否在沒法啓動mysqld
systemctl start mysqld

分別爲主從mysql作安全加固

#查到上一步,首次啓動mysql,系統自動生成的密碼( cat /var/log/mysqld.log |grep pass )
mysql_secure_installation	#使用該命令更改隨機root密碼(修改成 NCYD-tianyu@0791 )
手動同步數據(假如如今的環境,主上已經有數據了,從是新的)複製代碼
1:在主上數據庫中建立用於複製的用戶,並受權
mysql> GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'192.168.1.43' identified by '123456789';

2:在主mysql上先鎖表(使其全部表變成只讀狀態)
mysql> flush tables with read lock;		#不要退出終端,否在這個鎖就失效了

3:再開啓另外一個命令行終端,使用myqldump等工具將數據導出(或則直接打包存儲mysql數據的目錄,併發送到從機上)

4:將導出數據複製到從機上,並建立新庫並導入數據
互相置從,互相置主(以達到雙主模式)複製代碼

在mysqlMaster上將mysqlSlave設置爲本身的主角色服務器安全

mysql> show master status;	#查看mysqlSlave的狀態(記錄File名字,和Position)

change master to
master_host = '192.168.1.43',
master_user = 'tongbu',
master_password = '123456789',
master_log_file = 'mysql-bin.000002',
master_log_pos = 1006;

mysql> start slave;      #啓動slave端的複製進程(某些版本是:slave start; )
mysql> show slave status\G  #查看slaves端的I/O進程,與SQL進程複製代碼

在從上將mysqlMaster設置爲本身的主角色服務器bash

mysql> show master status;	#查看mysqlMaster的狀態(記錄File名字,和Position)

change master to
master_host = '192.168.1.42',
master_user = 'tongbu',
master_password = '123456789',
master_log_file = 'mysql-bin.000002',
master_log_pos = 1006;

mysql> start slave;      #啓動slave端的複製進程
mysql> show slave status\G  #查看slaves端的I/O進程,與SQL進程複製代碼

驗證是否同步服務器

1:第一驗證在myssqlMaster上建立庫,mysqlSlave上是否存在

2:第二驗證在mysqlSlave上建立庫,mysqlMaster上是否存在

安裝keepalived實現VIP切換,達到高可用

yum install keepalived -y

#在mysqlMaster和mysqlSlave上都建立檢查mysql的檢查<a href="https://www.linuxcool.com/" title="腳本" target="_blank">腳本</a>,並賦予執行權限
touch /etc/keepalived/mysql_check.sh
chmod +x /etc/keepalived/mysql_check.sh複製代碼
vi /etc/keepalived/mysql_check.sh

#!/bin/bash
#slave_is=( $(mysql -uroot -pNCYD-tianyu@0791 -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') ) 在新版本的myql中,直接將密碼寫在命令行,會進行安全提示,解決辦法是將其寫在mysql的配置文件裏的 [client] 字段裏,寫法見上面mysql的配置文件
slave_is=( $(mysql -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') )
if [ "${slave_is[0]}" = "Yes" -a "$slave_is[1]" = "Yes"]
	then
	exit 0
else
	exit 1
fi複製代碼

#注意,keepalived檢查 腳本 vrrp_script,只認兩個返回值,0表示正常,非0表示不正常(這在寫腳本是要注意),不正常就要作相關的切換

配置keepalived,以實現高可用

vi /etc/keepalived/keepalived.conf

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict #注意:當你發現沒法ping通虛擬VIP時,建議將此行註釋掉
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}
vrrp_script mysql_check {
	script "/etc/keepalived/mysql_check.sh"
	#這個腳本,如果發現不執行,能夠檢查他的權限,777是不能夠的,日誌提示不安全,能夠直接chmod +x /etc/keepalived/mysql_check.sh 就行
	#script "shutdown -r now" #或者,直接用命令進行調試
	interval 2
	weight 2
}
vrrp_instance VI_1 {
    state MASTER	#mysqlMaster上是MASTER;mysqlSlave上是BACKUP
    interface ens192
    virtual_router_id 52
    priority 100	#mysqlMaster上是100;mysqlSlave上是90
    advert_int 1
    nopreempt		#配置VIP(注意:故障切換搶佔模式,儘可能關閉,默認是開啓的,這個參數只須要在高優先級上設置便可)
    authentication {
        auth_type PASS
        auth_pass 1111
    }
track_script {	#調用上面定義檢查mfsmaster的腳本
        mysql_check
    }
    virtual_ipaddress {
        192.168.1.41/24 dev ens192
    }
}複製代碼

啓動keepalived

systemctl start keepalived
複製代碼

獲取資料:

本次給你們分享一些學習資料,裏面包括:(高可用、高併發、高性能及分佈式、

Jvm性能調優、Spring源碼,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多個知識點的架構資料)和Java進階學習路線圖。

領取方式:加q羣 468897908 免費獲取!
相關文章
相關標籤/搜索