在現代企業(yè)中,數據顯得尤為重要,而存儲數據的數據庫選擇又五花八門(mén),但無(wú)論是何種數據庫,均存在著(zhù)一種隱患。
當數據規模非常大,讀寫(xiě)量也很高時(shí),一臺數據庫已經(jīng)無(wú)法負擔全部讀寫(xiě)任務(wù),就需要多臺數據庫同時(shí)運作分擔負載。
主從復制步驟:
互為主從時(shí),可能會(huì )由于循環(huán)寫(xiě)導致數據失去一致性。
需求:
搭建兩臺MySQL服務(wù)器,一臺作為主服務(wù)器,一臺作為從服務(wù)器,主服務(wù)器進(jìn)行寫(xiě)操作,從服務(wù)器進(jìn)行讀操作
環(huán)境:
主從復制配置步驟:
詳情請參考Mysql安裝
#以下操作在主庫進(jìn)行mysql> CREATE USER 'repl'@'192.168.233.247' IDENTIFIED BY 'repl123';Query OK, 0 rows affected (0.00 sec)mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.233.247';Query OK, 0 rows affected (0.00 sec)#新開(kāi)一個(gè)終端,對主庫鎖表,防止配置期間有其他人寫(xiě)入,鎖表期間不能關(guān)閉終端或退出mysql交互式命令行mysql> FLUSH TABLES WITH READ LOCK;#全備主庫[root@lynk ~]# mysqldump -uroot -plynk123~ --all-databases > /opt/all-201902271419.sql#復制備份文件到從庫[root@lynk ~]# scp /opt/all-201902271419.sql root@192.168.233.247:/opt/#在從庫恢復主庫的備份[root@Hyrule ~]# mysql -uroot -plynk123~ < /opt/all-201902271419.sql [root@lynk ~]# vim /etc/my.cnf#在[mysqld]后添加如下內容(已有的內容不要改變)datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sock#啟用binlog日志log-bin=mysql-bin#數據庫服務(wù)器唯一標識符,主庫的server-id值必須比從庫的大server-id=1symbolic-links=0log-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid #結束主庫鎖表狀態(tài),只要退出另一個(gè)終端中mysql交互式命令行就行了mysql> quit#重啟mysql服務(wù)[root@lynk ~]# systemctl restart mysqld#查看主庫狀態(tài)[root@lynk ~]# mysql -uroot -plynk123~ -e 'show master status;'mysql: [Warning] Using a password on the command line interface can be insecure.+------------------+----------+--------------+------------------+-------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000001 | 23912 | | | |+------------------+----------+--------------+------------------+-------------------+[root@Hyrule ~]# vim /etc/my.cnf#添加如下內容server-id=2relay-log=mysql-relay-bin#重啟從庫[root@Hyrule ~]# systemctl restart mysqld#配置主從復制mysql> CHANGE MASTER TO -> MASTER_HOST='192.168.233.129', -> MASTER_USER='repl', -> MASTER_PASSWORD='repl123', -> MASTER_LOG_FILE='mysql-bin.000001', -> MASTER_LOG_POS=23912;Query OK, 0 rows affected, 2 warnings (0.04 sec)mysql> start slave;Query OK, 0 rows affected (0.02 sec)mysql> show slave status \G#確保以下兩項是Yes Slave_IO_Running: Yes Slave_SQL_Running: Yes#在主庫中新建一個(gè)庫或表,在從庫中查看是否有主庫中新建的表zabbix可以滿(mǎn)足很多監控需求,其自定義監控尤其強大,主從監控就是通過(guò)配置zabbix自定義監控實(shí)現的。
請先部署zabbix,可以參考zabbix簡(jiǎn)介與部署
#在從庫添加一個(gè)mysql用戶(hù)密碼配置文件[root@Hyrule ~]# vim /root/.my.cnf[client]user=rootpassword=mysql登錄密碼[root@Hyrule ~]# chmod 755 /root在客戶(hù)端進(jìn)行如下操作:
[root@localhost Hyrule]# vim /usr/local/etc/zabbix_agentd.conf#修改UnsafeUserParameters=1#在最后添加UserParameter=<key>,<shell command>,如UserParameter=check_delay,/scripts/mysql_delay.shUserParameter=check_status,/scripts/mysql_status.sh#重啟客戶(hù)端[root@Hyrule001 ~]# pkill zabbix[root@Hyrule001 ~]# zabbix_agentd#編寫(xiě)監控延遲的腳本[root@Hyrule ~]# mkdir /scripts[root@Hyrule ~]# vim /scripts/mysql_delay.sh#!/bin/bashmaster_log_pos=$(mysql -e 'show slave status \G;'|egrep "Read_Master_Log_Pos"|awk '{print $NF}')exec_log_pos=$(mysql -e 'show slave status \G;'|egrep "Exec_Master_Log_Pos"|awk '{print $NF}')echo "$[$master_log_pos-$exec_log_pos]"[root@Hyrule001 Hyrule]# chown zabbix.zabbix /scripts/mysql_delay.sh [root@Hyrule001 Hyrule]# chmod 777 /scripts/mysql_delay.sh #編寫(xiě)監控運行狀態(tài)的腳本[root@Hyrule ~]# vim /scripts/mysql_status.sh#!/bin/bashIO_status=$(mysql -e 'show slave status \G;'|egrep "Slave_IO_Running"|awk '{print $NF}'|grep "Yes"|wc -l)SQL_status=$(mysql -e 'show slave status \G;'|egrep "Slave_SQL_Running"|awk '{print $NF}'|grep "Yes"|wc -l)if [ $[$IO_status+$SQL_status] -eq 2 ];thenecho 0elseecho 1fi[root@Hyrule001 Hyrule]# chown zabbix.zabbix /scripts/mysql_status.sh [root@Hyrule001 Hyrule]# chmod 777 /scripts/mysql_status.sh 添加監控項、觸發(fā)器和報警媒介
聯(lián)系客服