1.實驗目的
mysql伺服器作為生產環境中使用最廣泛的資料庫軟體,以其開源性,穩定性而廣泛使用,但同時由於資料儲存,讀寫頻率高,極易造成資料庫出錯,從而給企業造成不可挽回的損失,我們除了做好資料庫的備份工作外,同時,還應該解決資料庫伺服器的單點故障問題。
2.搭建環境
兩臺 mysql 伺服器
172.16.1.2 mysql + keepalived
172.16.1.12 mysql + keepalived
一臺測試機
172.16.1.1
3.環境部署
一臺 mysql 伺服器 + keepalived
1)對於mysql原始碼安裝或者yum 安裝均可,此處不多講。
2) 主MySQL配置
主MySQL安裝時間同步器,yum -y install ntp
vim /etc/ntpd.conf
新增
server 127.127.1.0
fudge 127.127.1.0 startum 8
啟動service ntpd start
配置mysql目錄下的 my.cnf檔案
vim my.cnf
[mysqld]
log-slave-updates=true #開啟從伺服器的日誌更新
server-id = 11 #主伺服器的ID ,這個可以隨便定,但是與從伺服器要不同
log-bin=mysql-bin #開啟二進位制日誌
登入mysql, mysql -uroot -p123456
建立myslave 賬號,並授權可以複製
grant replication slave on *.* to `myslave`@`172.16.1.12` identified by `123456`;
flush privileges;
顯示主服務的狀態;
show master status;
記住file 及position位置的字串,在配置從服務時候會用到。
至此,主 mysql 配置完成,重啟service mysqld restart
3)從mysql服務配置
MySQL安裝時間同步器,yum -y install ntpdate
ntpdate 172.16.1.2 時間同步
配置mysql目錄下的 my.cnf檔案
在其中新增
[mysqld]
relay-log=relay-log-bin # 傳遞日誌,字首為 relay-log-bin
relay-log-index=slave-relay-bin.index # 傳遞日誌的索引檔案
log-bin=mysql-bin #開啟二進位制日誌
server-id = 12 #伺服器的ID ,這個可以隨便定,但是與主伺服器要不同
重啟服務 service mysqld restart
登入mysql, mysql -uroot -p123456
change master to master_host =`172.16.1.2`,master_user=`myslave`,master_password=`123456`,master_log_file=`此處為主服務show master 命令顯示的 file`,master_log_pos=`此處為主服務show master 命令顯示的 pos“;
此處 master_host =`172.16.1.2`,為主mysql的ip
start slave; #開啟從服務
show slave statusG; #顯示從服務狀態
如果
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
兩項為yes,則代表啟動從服務成功。
如果Slave_IO_Running: No
可能的問題一是主服務和從服務的server-id,不能為重複;二是授權時一定要準確。grant replication slave on *.* to `myslave`@`172.16.1.12` identified by `123456`;
此處172.16.1.12為從伺服器的ip
4)以上兩步實現了mysql主從複製,我們要實現主主,也就是兩臺mysql ,一臺既是主,也是從,另一臺既是主也是從,所以我們按照上面的配置在兩臺mysql上做相反的從主配置。
主mysql上,做從配置
配置mysql目錄下的 my.cnf檔案
在其中新增
[mysqld]
relay-log=relay-log-bin # 傳遞日誌,字首為 relay-log-bin
relay-log-index=slave-relay-bin.index # 傳遞日誌的索引檔案
log-bin=mysql-bin #開啟二進位制日誌
重啟服務 service mysqld restart
登入mysql, mysql -uroot -p123456
change master to master_host =`172.16.1.12`,master_user=`myslave`,master_password=`123456`,master_log_file=`此處為主服務show master 命令顯示的 file`,master_log_pos=`此處為主服務show master 命令顯示的 pos“;
此處的master_host =`172.16.1.12` 為從mysql伺服器的ip
start slave; #開啟從服務
show slave statusG; #顯示從服務狀態
如果
Slave_IO_Running: Yes Slave_SQL_Running: Yes
兩項為yes,則代表啟動從服務成功。
從mysql上,做主配置
配置mysql目錄下的 my.cnf檔案
vim my.cnf
[mysqld] log-slave-updates=true #開啟從伺服器的日誌更新
登入mysql, mysql -uroot -p123456
建立myslave 賬號,並授權可以複製
grant replication slave on *.* to `myslave`@`172.16.1.12` identified by `123456`;
flush privileges;
顯示主服務的狀態;
show master status;
記住file 及position位置的字串,在配置從服務時候會用到。
至此,兩臺MySQL伺服器的分別配置了主從,即一臺既是主又是從,另一臺既是從也是主。
5)mysql主主複製測試
mysql -uroot -p123456 任意登入一臺mysql伺服器,
create database test default character set utf8;
create table test;
到另一臺MySQL上show databases; show tables;
顯示了資料庫和資料表都已建好,可以看到已經同步成功
6)配置keepalived,實現高可用
在主mysql伺服器配置
yum -y install keepalived
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived.conf
vrrp_instance VI_1 { #例項1
state MASTER #狀態為主
interface ens33 #繫結網路卡
virtual_router_id 11 # id 號,主從一致
priority 100 #優先順序為100
advert_int 1
#nopreempt #非搶佔模式
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #虛擬ip地址
172.16.1.199
}
}
virtual_server 172.16.1.199 3306 {
delay_loop 2 #間隔2秒檢查真實伺服器狀態
lb_algo wrr #LVS arithmetic
lb_kind DR #LVS model
persistence_timeout 60 #k
protocol TCP
real_server 172.16.1.2 3306 { #真實伺服器 ,也就是主mysql伺服器
weight 3
#notify_down /usr/local/mysql/bin/mysql.sh # 可執行指令碼路徑
TCP_CHECK {
connect_timeout 10 #timeout
nb_get_retry 3 #conect times to try to connect
delay_before_retry 3 #interval of retry
connect_port 3306 # check mysql port
}
}
}
啟動服務,service keepalived start
在從mysql伺服器上配置
yum -y install keepalived
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived.conf
本處只寫與主mysql伺服器不同處
#備用伺服器上為SLAVE
state SLAVE
#繫結vip的網路卡為ens33,根據自己伺服器網路卡
interface ens33
virtual_router_id 11 #與主伺服器 id號碼一樣
#備用伺服器上為90
priority 90 #優先順序比主mysql伺服器小
}
virtual_server 172.16.1.199 3306 {
real_server 172.16.1.12 3306 { #真實伺服器 ,也就是從mysql伺服器
}
其他與主mysql伺服器上配置檔案相同
啟動服務,service keepalived start
可以在主mysql伺服器上看到一個VIP地址,172.16.1.199
4.測試
停止主mysql伺服器上的keepalived服務, service keepalived stop
同時檢視另一臺的從mysql 的ip,ip a
可以看到有一vip ,172.16.1.199
我們在測試機172.16.1.1上登入從mysql , mysql -uroot -p123456 -P 3306 -h 172.16.1.12
登入成功,我們做一個 插入資料實驗
use test;
insert into test values();
到兩臺的資料庫下檢視,select * from test;
資料同步成功。
啟動 主mysql伺服器上的keepalived服務, service keepalived start
停止從mysql伺服器上的keepalived服務, service keepalived stop
檢視另一臺的主mysql 的ip,ip a
可以看到有一vip ,172.16.1.199
做同樣的操作 insert into test values();
到兩臺的資料庫下檢視,select * from test;
資料同步成功,從而實現兩臺mysql資料庫伺服器的高可用及主主資料同步。