1.Mysql主從復制的原理:
MySQL主服務器更新數據,執行命令,將會記錄到自己的二進制日志里面,然后從服務器開始一個I/O線程,用於讀取主服務器的已更新或以變化的二進制文件,前提是主服務器要給從服務器這個權限,讀取以后,將數據放入中繼日志里面,然后從服務器開啟sql線程,負責讀取中繼日志里面的已更新或已更改的日志,然后再執行以更新的命令(這個命令是主服務器上操作的命令)。
在企業中,普遍用的都是mysql主主復制架構,不是mysql主從復制架構.主主復制其實也是基於主從架構來做的,中間加上keepalived。
如上圖所示,其實在主服務器上執行的命令太多,到從服務器因為要經過幾個步驟,所以會有延遲,有一些公司會故意讓它延遲,但有的公司就不需要,1.6以前的版本就是有這個延遲問題,如果被問到這些問題,請記得一定要跳過去,說我們公司用的是1.6以后的版本,1.6以后的版本沒有延遲。已經解決了這個問題。
做MySQL主從復制和讀寫分離
mysql主從復制:
要求環境:三台centos虛擬機(也可以更多),配置好yum
- 將一切的准備工作做好。比如三台網絡要互通。
- 配置主服務器:
[root@localhost ~]# yum -y install mariadb mariadb-devel mariadb-server
[root@localhost ~]# yum -y install ntp
注:搭建時間同步服務器,時間需要同步,不然很容易出錯。主從復制就會丟失數據。
[root@localhost ~]# vim /etc/ntp.conf
在文件末尾添加
server 127.127.1.0
fudge 127.127.1.0 stratum 8
[root@localhost ~]# systemctl start ntpd
[root@localhost ~]# systemctl enable ntpd
- 配置從服務器:兩台從服務器操作同步
[root@localhost ~]# yum -y install mariadb mariadb-devel mariadb-server
[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]#ntpdate 192.168.253.6
注:同步主服務器的時間
- 再次配置主服務器:
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server_id = 1
log_bin = master-bin
log-slave-updates = true
[root@localhost ~]# systemctl restart mariadb
[root@localhost ~]# mysql
注:默認就是用管理員登錄的,所以直接這樣操作就行。
MariaDB [(none)]> grant replication slave on *.* to 'myslave'@'192.168.253.%' identified by '123456';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show master status;
注:查看我的二進制日志文件時間跟位置。
- 再次配置從服務器:兩台從服務器操作同步
[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server_id = 2 注:三台服務器的sever_id 不能一樣
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index
[root@localhost ~]# systemctl restart mariadb
[root@localhost ~]# mysql
MariaDB [(none)]> stop slave;
MariaDB[(none)]>change master to master_host='192.168.253.6',master_user='myslave',master_password='123456',master_log_file='master-bin.000003',master_log_pos=477;
注:master_host:主服務器的IP地址
master_user:主服務器剛剛創建的用戶
master_password:主服務器剛剛創建的用戶密碼
master_log_file:主服務器的二進制日志文件,通過show master status;可以查看。
Master_log_pos=477:剛才查看到的二進制日志位置。
MariaDB [(none)]> slave start;
MariaDB [(none)]> show slave status\G;
注:用\G查看是因為一個屏放不下,分屏放.
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.253.6
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 477
Relay_Log_File: relay-log-bin.000002
Relay_Log_Pos: 530
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
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: 477
Relay_Log_Space: 822
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: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
查看IO跟SQL是不是yes,如果其中一個不是,就看Last_IO_Error:、Last_SQL_Error:這兩段的錯誤日志,然后復制到百度上去查。
驗證:
在主服務器上創建一個數據庫,看看兩個從服務器是不是已經同步數據庫。
--------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------
Mysql讀寫分離
實驗環境:
准備五台centos用於測試:
有三台是跟上面操作一樣。
第四台操作:
1. 讀寫分離有兩種方法可以做,一種是開發人員自己做,一種是開發人員不會做,需要我們運維人員做。准備好兩個包。一個是amoeba做讀寫分離用的,一個是jdk二進制文件,因為我們本身自帶的是1.8版本的,太高反而不支持運行amoeba這個軟件,所以我們這里找了一個1.6版本的,剛好支持。
2. [root@localhost ~]#chmod +x jdk-6u31-linux-x64.bin
[root@localhost ~]#./ jdk-6u31-linux-x64.bin
[root@localhost ~]# mv jdk1.6.0_31/ /usr/local/jdk1.6
[root@localhost ~]# mkdir /usr/local/amoeba
[root@localhost ~]# chmod 755 /usr/local/amoeba
[root@localhost ~]# tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost amoeba]# /usr/local/amoeba/bin/amoeba
注:通過這一條命令就可以看見下面內容,證明aomeba沒有錯。
amoeba start|stop
[root@localhost ~]# vim /etc/profile
下面三行是設置jdk的變量
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
下面兩行是設置amoeba的變量
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java –version 當我們再次查看版本時,會發現,已經重1.8變成了1.6的版本
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)
3. 配置讀寫分離,給主服務器“寫”、兩台從服務器“讀”
首先要在三台主從服務器上給amoeba權限。
MariaDB [(none)]> grant all on *.* to 'test'@'192.168.253.%' identified by '123.com';
[root@localhost ~]# cd /usr/local/amoeba/
[root@localhost amoeba]# cp conf/amoeba.xml conf/amoeba.xml{.bak}
在更改文件之前,都要先復制一份原有的文件,防止修改完以后不能使用,還不能返回原有數據
[root@localhost amoeba]# vim conf/amoeba.xml
下方的紅字都是在文件里需要改的,找到這幾個地方,然后更改成紅色的字
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientA uthenticator">
<property name="user">amoeba</property>
<property name="password">123456</property>
<property name="defaultPool">master</property>
<property name="writePool">master</property>
<property name="readPool">slaves</property>
[root@localhost amoeba]# cp conf/dbServers.xml conf/dbServers.xml{.bak}
[root@localhost amoeba]# vim conf/dbServers.xml
找到下面的內容並修改。
<property name="user">test</property>
<property name="password">123.com</property>
<dbServer name="master" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.253.6</property>
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.253.7</property>
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer">
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.253.8</property>
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true"> 注 “slaves”是一個組,剛才在上面定義的。
<poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">
<!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
<property name="loadbalance">1</property>
<!-- Separated by commas,such as: server1,server2,server1 -->
<property name="poolNames">slave1,slave2</property>
</poolConfig>
</dbServer>
組內成員
[root@localhost amoeba]# bin/amoeba start& 放到后台運行。
[root@localhost amoeba]# netstat -anpt |grep java
[root@localhost amoeba]# netstat -anpt |grep 8066
通過上面兩條命令可以查看8066、3306端口是否已經開啟.
最后就是找一台client用於測試。