掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流
keepalived是vrrp協(xié)議的實現(xiàn),原生設計目的是為了高可用ipvs服務,keepalived能夠配置文件中的定義生成ipvs規(guī)則,并能夠?qū)Ω鱎S的健康狀態(tài)進行檢測;通過共用的虛擬IP地址對外提供服務;每個熱備組內(nèi)同一時刻只有一臺主服務器提供服務,其他服務器處于冗余狀態(tài),若當前在線的服務器宕機,其虛擬IP地址將會被其他服務器接替(優(yōu)先級決定接替順序),實現(xiàn)高可用為后端主機提供服務。

#主機名 系統(tǒng)版本 mysql版本 ip地址
mysqlMaster centos7.4 mysql5.7 192.168.1.42
mysqlSlave centos7.4 mysql5.7 192.168.1.43
#vip:192.168.1.41
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
mkdir /data/mysql -p
chown -R mysql:mysql /data/mysql
#在mysqlMaster上配置mysql配置文件
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 選項,因為這有可能產(chǎn)生跨庫更新失敗的問題.推薦從庫上使用 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
#若是不寫上這個字段,在本機用命令進入mysql會報錯,提示默認路徑/var/lib/mysql/mysql.sock找不到
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找不到,先初始化數(shù)據(jù)庫(需要進行初始化在/data/mysql目錄里生成必要的信息)
#mysql5.7.7以后的初始化方法
mysqld --initialize --user=mysql --datadir=/data/mysql
#mysql5.7.7以前的初始化方法
mysql_install_db --user=mysql --datadir=/data/mysql
分別啟動主從數(shù)據(jù)庫
#在centos7里面,必須先關閉selinux,否在無法啟動mysqld
systemctl start mysqld
分別為主從mysql做安全加固
#查到上一步,首次啟動mysql,系統(tǒng)自動生成的密碼( cat /var/log/mysqld.log |grep pass )
mysql_secure_installation #使用該命令更改隨機root密碼(修改為 NCYD-tianyu@0791 )
手動同步數(shù)據(jù)(假如現(xiàn)在的環(huán)境,主上已經(jīng)有數(shù)據(jù)了,從是新的)
1:在主上數(shù)據(jù)庫中創(chuàng)建用于復制的用戶,并授權(quán)
mysql> GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'192.168.1.43' identified by '123456789';
2:在主mysql上先鎖表(使其所有表變成只讀狀態(tài))
mysql> flush tables with read lock; #不要退出終端,否在這個鎖就失效了
3:再開啟另一個命令行終端,使用myqldump等工具將數(shù)據(jù)導出(或則直接打包存儲mysql數(shù)據(jù)的目錄,并發(fā)送到從機上)
4:將導出數(shù)據(jù)復制到從機上,并創(chuàng)建新庫并導入數(shù)據(jù)
互相置從,互相置主(以達到雙主模式)
mysql> show master status; #查看mysqlSlave的狀態(tài)(記錄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進程
mysql> show master status; #查看mysqlMaster的狀態(tài)(記錄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上創(chuàng)建庫,mysqlSlave上是否存在
2:第二驗證在mysqlSlave上創(chuàng)建庫,mysqlMaster上是否存在
yum install keepalived -y
#在mysqlMaster和mysqlSlave上都創(chuàng)建檢查mysql的檢查腳本,并賦予執(zhí)行權(quán)限
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表示不正常(這在寫腳本是要注意),不正常就要做相關的切換
vi /etc/keepalived/keepalived.conf
global_defs {
notification_email {
[email protected]
[email protected]
[email protected]
}
notification_email_from [email protected]
smtp_server 192.168.200.1
smtp_connect_timeout 30
router_id LVS_DEVEL
vrrp_skip_check_adv_addr
#vrrp_strict #注意:當你發(fā)現(xiàn)無法ping通虛擬VIP時,建議將此行注釋掉
vrrp_garp_interval 0
vrrp_gna_interval 0
}
vrrp_script mysql_check {
script "/etc/keepalived/mysql_check.sh"
#這個腳本,若是發(fā)現(xiàn)不執(zhí)行,可以檢查他的權(quán)限,777是不可以的,日志提示不安全,可以直接chmod +x /etc/keepalived/mysql_check.sh 就行
#script "shutdown -r now" #或者,直接用命令進行調(diào)試
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(注意:故障切換搶占模式,盡量關閉,默認是開啟的,這個參數(shù)只需要在高優(yōu)先級上設置即可)
authentication {
auth_type PASS
auth_pass 1111
}
track_script { #調(diào)用上面定義檢查mfsmaster的腳本
mysql_check
}
virtual_ipaddress {
192.168.1.41/24 dev ens192
}
}
systemctl start keepalived

我們在微信上24小時期待你的聲音
解答本文疑問/技術咨詢/運營咨詢/技術建議/互聯(lián)網(wǎng)交流