日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡

發布時間:2025/3/21 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

mysql主從復制的實現

1MySQL復制的實現原理

MySQL支持單向、雙向復制、異步復制,復制過程中一個服務器充當主服務器,而一個或多個其它服務器充當從服務器。主服務器將更新寫入一個二進制日志文件中,并創建一個索引文件以跟蹤日志循環。這些日志可以記錄發送到從服務器的更新。當一個從服務器連接主服務器時,日志文件會通知主服務器,從服務器在日志中讀取的最后一次成功更新的位置。接著,從服務器在上次成功更新的位置處開始進入更新操作。更新完成后從服務器開始進入等待狀態,等待主服務器后續的更新。需要注意的是:在進行復制時,所有對復制中的表的更新必須在主服務器上進行。否則,可能發生對主服務器上的表進行的更新與對從服務器上的表所進行的更新之間的沖突。


2MySQL同步細節

MySQL同步功能由3個線程(master1binlogdumpslave2個,分別是Sql進程和IO進程)來實現。執行STARTSLAVE語句后,slave就創建一個I/O線程。I/O線程連接到master上,并請求master發送二進制日志中的語句。master創建一個線程來把日志的內容發送到slave上。slave上的I/O線程讀取masterBinlogDump線程發送的語句,并且把它們拷貝到其數據目錄下的中繼日志(relaylogs)中。第三個是SQL線程,salve用它來讀取中繼日志,然后執行它們來更新數據。

slave上使用2個線程的優點是,把讀日志和執行分開成2個獨立的任務。執行任務如果慢的話,讀日志任務不會跟著慢下來。

例如,如果slave停止了一段時間,那么I/O線程可以在slave啟動后很快地從master上讀取全部日志,盡管SQL線程可能落后I/O線程好幾的小時。如果slaveSQL線程沒全部執行完就停止了,但I/O線程卻已經把所有的更新日志都讀取并且保存在本地的中繼日志中了,因此在slave再次啟動后就會繼續執行它們了。這就允許在master上清除二進制日志,因為slave已經無需去master讀取更新日志了。


3、在test1,test2上安裝MYSQL

test1的ip:192.168.46.131test2的ip:192.168.46.130

test1為mastertest2為slave

安裝MySQL有多種方法,這里僅以源碼安裝test1為列說明。

1 2 3 4 5 6 7 8 9 10 11 12 13 [root@test1 ~]# yum install libtermcap? libtermcap-devel imake? autoconf?? automake libtool? m4 [root@test1 ~]# useradd -M? -s /sbin/nologin? mysql [root@test1 ~]# mkdir /usr/local/mysql [root@test1 ~]# tar zxvf mysql-5.1.70.tar.gz [root@test1 ~]# cd? mysql-5.1.70 [root@test1 mysql-5.1.70]# ./configure --prefix=/usr/local/mysql?? --enable-assembler? --with-client-ldflags=-all-static?--with-unix-socket-path=/tmp --with-charset=utf8?? --enable-thread-safe-client --with-pthread?? --without-debug? --with-big-tables? --enable-community-features?? --enable-profiling?? --enable-local-infile? --with-fast-mutexes?? --with-plugins=partition,federated,ndbcluster,innobase,csv,blackhole,myisam,innodb_plugin [root@test1 mysql-5.1.70]#make [root@test1 mysql-5.1.70]#strip sql/mysqld [root@test1 mysql-5.1.70]#makeinstall [root@test1 mysql-5.1.70]# cp support-files/my-medium.cnf??? /etc/my.cnf [root@test1 mysql-5.1.70]# /usr/local/mysql/bin/mysql_install_db --user=mysql [root@test1 mysql-5.1.70]# echo?"PATH=\"/usr/local/mysql/bin:\$PATH\"">> /etc/profile [root@test1 mysql-5.1.70]# export PATH="/usr/local/mysql/bin:$PATH"


4、在主服務器test1上編輯配置文件my.cnf

編輯主服務器的配置文件/etc/my.cnf,在[mysqld]中添加如下內容即可:

server-id=1

#服務器ID。服務器之間不能有重復ID,一般master1

log-bin=mysql-bin
#打開mysqlbinlog功能,后面的名字可以自己指定,如果不改名字的話,默認是以主機名字命名

binlog-do-db=test

#test是需要備份的數據庫名,如果備份多個數據庫,重復設置這個選項即可

binlog-ignore-db=mysql

#不需要備份的數據庫名稱,如果需要忽略備份多個數據庫,重復設置這個選項即可。



5.主服務器test1上建立復制用戶mysql>GRANTREPLICATIONSLAVEON*.*TO'chenzhongyang'@'%'IDENTIFIEDBY'chenzhongyang';

這里一定將chenzhongyang用戶設置為遠程任意節點可以登錄。

備份Master數據備份Master上的數據,首先執行如下SQL語句:

mysql>FLUSHTABLESWITHREADLOCK;QueryOK,0rowsaffected(0.00sec)

mysql>resetmaster;QueryOK,0rowsaffected(0.00sec)

不要退出這個終端,否則這個鎖就失效了;在不退出終端的情況,再開一個終端直接打包壓縮數據文件或使mysqldump工具來導出數據。

[root@test1~]#cd/var/lib/#進入mysql的數據目錄,根據自己情況而定。

[root@test1lib]#tarzcvfmysql.tar.gzmysql

[root@test1lib]#scpmysql.tar.gz192.168.46.130:/var/lib/

scp命令把打包的數據傳到其他幾臺Slave機器上。數據傳輸完成之后,在上面的命令終端上執行:

mysql>UNLOCKTABLES;


6.設置輔服務器test2

編輯/etc/my.cnf文件,在[mysqld]中添加如下內容即可:

server-id=2

log-bin=mysql-bin

binlog-do-db=test

binlog-ignore-db=mysql

其他的Slave以此類推,保證server-id全局唯一即可。

在slave上執行如下命令:

mysql>CHANGEMASTERTOMASTER_HOST='192.168.46.131',

->MASTER_USER='chenzhongyang',

->MASTER_PASSWORD='chenzhongyang',

->MASTER_LOG_FILE='mysql-bin.000001',

->MASTER_LOG_POS=98;

執行完之后執行:mysql>slavestart;

QueryOK,0rowsaffected(0.00sec)

mysql>showslavestatus\G

從輸出可以看到:Slave_IO_Running和Slave_SQL_Running如果都為Yes時,表示配置成功。


7.需要注意

如果在my.cnf里面定義了log-binrelay-log參數,那么要保證定義與hostname無關,因為如果這兩類log的文件名與主機名有關,切換過程會導致slave主機不能繼續同步的問題。例如可以做下設置:log-bin=mysql-binrelay-log=mysql-relay-bin保證在兩臺主機上兩種文件的名字一樣。


8,排錯Slave_IO_Running:No

mysql>showslavestatus\G;-----察看從數據庫服務器的狀態

***************************1.row***************************

Slave_IO_State:

Master_Host:192.168.10.129

Master_User:qing

Master_Port:3306

Connect_Retry:10

Master_Log_File:mysql_bin.000006

Read_Master_Log_Pos:106

Relay_Log_File:mysqld-relay-bin.000001

Relay_Log_Pos:4

Relay_Master_Log_File:mysql_bin.000006

Slave_IO_Running:No------------顯示為no,證明沒有成功,

Slave_SQL_Running:Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno:0

Last_Error:

Skip_Counter:0

Exec_Master_Log_Pos:106

Relay_Log_Space:106

Until_Condition:None

Until_Log_File:

Until_Log_Pos:0

Master_SSL_Allowed:No

Master_SSL_CA_File:

Master_SSL_CA_Path:

Master_SSL_Cert:

Master_SSL_Cipher:

Master_SSL_Key:

Seconds_Behind_Master:NULL

Master_SSL_Verify_Server_Cert:No

Last_IO_Errno:1236

last_IO_Error:Gotfatalerror1236frommasterwhenreadingdatafrombinarylog:'Couldnotfindfirstlogfilenameinbinarylogindexfile'----無法同步的原因

Last_SQL_Errno:0

Last_SQL_Error:

1rowinset(0.00sec)


ERROR:

Noqueryspecified


Slave_IO_Running:No證明同步沒有成功,上面一行的

紅色字體顯示了錯誤的原因,一般出現這種情況,使用如下方法解決:

先進入slave中執行:slavestop來停止從庫同步;

再去master中執行:flushlogs來清空日志;

然后在master中執行:showmasterstatus查看下主庫的狀態,主要是日志的文件和position

然后回到slave中,執行:changemastertomaster_log_file='mysql-bin.000008',master_log_pos=106,文件和位置對應master中的;

最后在slave中執行:slavestart來啟動同步。


9,排錯Slave_SQL_Running:No

mysql>showslavestatus\G
Slave_IO_Running:Yes
Slave_SQL_Running:No
Last_Errno:1062
....
Seconds_Behind_Master:NULL
原因:
1.程序可能在slave上進行了寫操作
2.也可能是slave機器重起后,事務回滾造成的.

解決辦法I:
1.首先停掉Slave服務:slavestop
2.到主服務器上查看主機狀態:
記錄File和Position對應的值。
mysql>showmasterstatus;
+------------------+-----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+-----------+--------------+------------------+
|mysql-bin.000020|135617781|||
+------------------+-----------+--------------+------------------+
1rowinset(0.00sec)
3.到slave服務器上執行手動同步:
mysql>changemasterto
>master_host='192.168.46.131',
>master_user='chenzhongyang',
>master_password='chenzhongyang',
>master_port=3306,
>master_log_file='mysql-bin.000020',
>master_log_pos=135617781;
1rowinset(0.00sec)
mysql>slavestart;
1rowinset(0.00sec)
再次查看slave狀態發現:
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
...
Seconds_Behind_Master:0



配置mysql+lvs+keeplived實現Mysql讀操作的負載均衡

環境:

test1192.168.46.131master

test2192.168.46.130slave備份test庫

test3調度器

1、安裝與配置Keepalived

首先在節點test1、test2上安裝Keepalived軟件,軟件安裝非常簡單。

1 2 3 4 5 6 7 8 9 10 11 12 13 [root@test1 ]# yum install -y openssl-devel [root@test1 ~]# wget? http://www.keepalived.org/software/keepalived-1.2.1.tar.gz [root@test1 ~]# tar zxvf keepalived-1.2.1.tar.gz [root@test1 ~]# cd keepalived-1.2.1 [root@test1 keepalived-1.2.1]# ./configure --prefix=/usr/local/keepalived [root@test1 keepalived-1.2.1]# make && make install [root@test1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived? /etc/sysconfig/ [root@test1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived? /etc/init.d/ [root@test1 ~]# mkdir? /etc/keepalived [root@test1 ~]# cp? /usr/local/keepalived/etc/keepalived? /keepalived.conf? /etc/keepalived/ [root@test1 ~]# ln -s? /usr/local/keepalived/sbin/keepalived? /usr/sbin/ [root@test1 ~]# service keepalived start Starting keepalived:?????????????????????????????????????? [? OK? ]

Keepalived的配置也非常簡單,僅僅需要一個配置文件即可完成HAclusterlvs服務節點監控功能,在通過Keepalived搭建高可用的LVS集群實例中,主、備DirectorServer都需要安裝Keepalived軟件,安裝成功后,默認的配置文件路徑為/etc/Keepalived/Keepalived.conf

一個完整的keepalived配置文件,有三個部分組成,分別是全局定義部分、vrrp實例定義部分以及虛擬服務器定義部分,配置好的文件內容如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ! Configuration File?for?keepalived global_defs { notification_email { root@localhost } notification_email_from? root@localhost smtp_server?192.168.46.131 smtp_connect_timeout?30 router_id LVS_MASTER } vrrp_instance VI_1 { state MASTER??????//備庫為BACKUP interface?eth2?????//通過的網卡 virtual_router_id?51 priority?100??????//備庫為99 advert_int?1 authentication { auth_type PASS auth_pass?1111 } virtual_ipaddress { 192.168.46.100 } } virtual_server?192.168.46.100?3306?{ delay_loop?30 lb_algo rr lb_kind DR persistence_timeout?50 protocol TCP real_server?192.168.46.131?3306?{ weight?1 MISC_CHECK{ misc_path?"/etc/keepalived/check_slave.pl 192.168.46.131" misc_dynamic } } real_server?192.168.46.130?3306?{ weight?1 MISC_CHECK{ misc_path?"/etc/keepalived/check_slave.pl 192.168.46.130" misc_dynamic } } } }



2,check_slave.pl檢測mysql

check_slave.pl是用perl寫的一個檢測腳本,定時在slave機器上執行showslavestatus\G命令,檢查Slave_IO_RunningSlave_SQL_RunningSeconds_Behind_Master三個值。Slave_IO_RunningSlave_SQL_Running有一個值為No就自動從LVSrealserver列表去掉,不再對外提供服務,如果這兩個值為Yes檢查Seconds_Behind_Master大于設定的值也會自動從對外服務機器列表里面去掉。三個值同時滿足時又會被加入到服務列表,對外提供服務。這個檢測腳本內容如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 #!/usr/bin/perl -w use?DBI; use?DBD::mysql; # CONFIG VARIABLES $SBM?= 120; $db?=?"test"; $host?=?$ARGV[0]; $port?= 3306; $user?=?"root"; $pw?=?"mysql"; # SQL query $query?=?"show slave status"; $dbh?= DBI->connect("DBI:mysql:$db:$host:$port",?$user,?$pw, {?RaiseError?=> 0,PrintError?=> 0 }); if?(!defined($dbh)) { exit?1; } $sqlQuery?=?$dbh->prepare($query); $sqlQuery->execute; $Slave_IO_Running?=??""; $Slave_SQL_Running?=?""; $Seconds_Behind_Master?=?""; while?(my?$ref?=?$sqlQuery->fetchrow_hashref()) { $Slave_IO_Running?=?$ref->{'Slave_IO_Running'}; $Slave_SQL_Running?=?$ref->{'Slave_SQL_Running'}; $Seconds_Behind_Master?=?$ref->{'Seconds_Behind_Master'}; } $sqlQuery->finish; $dbh->disconnect(); if?(?$Slave_IO_Running?eq?"No"?||?$Slave_SQL_Running?eq?"No"?) { exit?1; }?else?{ if?(?$Seconds_Behind_Master?>?$SBM?) { exit?1; }?else?{ exit?0; } }


3、安裝配置lvs

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 [root@test1 ~]# yum install -y ipvsadm [root@test1 ~]# lsmod? |grep ip_vs [root@test1 ~]# modprobe? ip_vs [root@test1 ~]# lsmod? |grep ip_vs ip_vs?????????????????122241??0 這里不能靠進程來判斷是不是加載了ip_vs模塊,因為這里就是一個命令,沒有產生進程。 vim /etc/init.d/lvsdrrip #!/bin/bash #DR server VIP=192.168.46.100 case?"$1"?in start) echo?"start LVS of DR" /sbin/ifconfig lo:0?$VIP broadcast $VIP netmask?255.255.255.255?up /sbin/route add -host $VIP dev lo:0 echo?"1"?> /proc/sys/net/ipv4/conf/lo/arp_ignore echo?"2"?> /proc/sys/net/ipv4/conf/lo/arp_announce echo?"1"?> /proc/sys/net/ipv4/conf/all/arp_ignore echo?"2"?> /proc/sys/net/ipv4/conf/all/arp_announce ;; stop) echo?"stop LVS of DR" /sbin/ifconfig lo:0?down echo?"0"?> /proc/sys/net/ipv4/conf/lo/arp_ignore echo?"0"?> /proc/sys/net/ipv4/conf/lo/arp_announce echo?"0"?> /proc/sys/net/ipv4/conf/all/arp_ignore echo?"0"?> /proc/sys/net/ipv4/conf/all/arp_announce ;; *) echo?"Usage:$0 {start|stop}" esac exit 1


4,test1和test2上安裝mysql服務,test1為master,test2為slave

參考http://wolfword.blog.51cto.com/4892126/1290938


5,test3調度器安裝lvsdr

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@test3 ~]# vim? /etc/init.d/lvsdr #!/bin/bash VIP=192.168.46.100 RIP1=192.168.46.131 RIP2=192.168.46.130 case?"$1"?in start) echo?"start LVS of DirectorServer DR" /sbin/iptables -F /sbin/ipvsadm -C /sbin/ifconfig eth0:0?$VIP broadcast $VIP? netmask?255.255.255.0??up /sbin/ipvsadm? -A -t $VIP:3306??-s rr /sbin/ipvsadm? -a -t $VIP:3306??-r? $RIP1 -g /sbin/ipvsadm? -a -t $VIP:3306??-r? $RIP2 -g /sbin/ipvsadm ;; stop) echo?"stop? LVS of DirectorServer DR" echo?"0"?>/proc/sys/net/ipv4/ip_forward /sbin/ipvsadm -C /sbin/ifconfig eth0:0?down ;; *) [root@test3? ~]#chown +x /etc/init.d/lvsdr


from:?http://wolfword.blog.51cto.com/4892126/1290938 http://wolfword.blog.51cto.com/4892126/1291868
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。