MySQL主從複製與讀寫分離
一、實驗環境
二、實驗步驟
先部署主從複製,只有主從複製完成了,才能在此基礎上進行讀寫分離。
MySQL支持的複製類型:
基於語句複製:在主服務器上執行sql語句,在從服務器上執行同樣的語句,MySQL默認採用基於語句的複製,效率較高。
基於行復制:把改變的複製過去而不是把命令在服務器上執行一遍。
混合類型複製:默認採用基於語句複製,一旦發現基於語句無法精確複製時,就會採用基於行復制。、
MySQL讀寫分離分爲兩種:
基於程序代碼內部實現:在代碼中根據select,insert進行路由分類,這類方法也是目前生產環境應用廣泛的。優點:性能好,不需要增加額外的設備作爲硬件開支。缺點:需要開發人員來實現,運維人員無從下手。
基於中間代理層實現:代理一般位於客戶端和服務器之間,代理服務器接收到客戶端請求後,通過判斷後轉發到後端數據庫,有兩個代理程序。
1)MySQL-Proxy。MySQL-Proxy爲MySQL的開源項目。通過自帶的lua腳本進行SQL判斷,雖然是MySQL官方產品,但是MySQL並不建議應用到生產環境。
2)Amoeba。有陳思儒開發,該程序有java語言開發,阿里巴巴用於生產環境。不支持事務和存儲過程。
搭建MySQL主從複製
1、在Master上搭建時間同步服務器,建立時間同步環境
安裝NTP
#yum -y install ntp
配置NTP
#vim /etc/ntp.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8
#service ntpd restart
2、在從節點上進行時間同步
#yum -y install ntpdate
#/usr/sbin/ntpdate 192.168.1.8
3、在每臺服務器上關閉iptables或者指定端口進行開放。
#service iptables stop
#chkconfig iptables off
4、安裝MySQL數據庫,在Master,Slave 1,Slave 2上安裝。
編譯安裝MySQL數據庫。
#yum install -y ncurses-devel gcc gcc-c++
#cd /usr/src
#tar zxf cmake-2.8.6.tar.gz
#cd cmake-2.8.6
#./configure && gmake && gmake install
#cd /usr/src
#tar zxf mysql-5.5.22.tar.gz
#cd mysql-5.5.22
#cmake -DCMAKE-INSTALL-PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
#make && make install
優化調整
#cp support-files/my-medium.cnf /etc/my.cnf
#cp support-files/mysql.server /etc/rc.d/init.d/mysqld
#chmod +x /etc/rc.d/init.d/mysqld
#chkconfig --add mysqld
#echo “PATH=$PATH:/usrlocal/mysql/bin” >> /etc/profile
#. /etc/profile
初始化數據庫
#groupadd mysql
#useradd -M -s /sbin/nologin -g mysql mysql
#chown -R mysql:mysql /usr/local/mysql
#/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
啓動MySQL服務
#service mysqld start
#chkconfig mysqld on
#mysqladmin -u root password ‘pwd123’
5、配置MySQL Master 主服務器
在/etc/my.cnf中修改或者添加下面內容
#vim /etc/my.cnf
server-id = 11 修改
log-bin=master-bin 修改
log-slave-updates=true 增加
重啓MySQL服務
#service mysqld restart
登錄mysql程序,給從服務器授權。
File列:顯示日誌名。
Postion:顯示偏移量。
6、配置各從服務器。
在/etc/my.cnf中修改或者增加下面內容
#vim /etc/my.cnf
server-id = 22 修改
relay-log=relay-log-bin 增加
relay-log-index=slave-relay-bin.index 增加
注意:server-id不能與主服務器相同
重啓MySQL服務
#service mysqld restart
登錄MySQL,配置同步
按主服務器結果更改下面命令中master_log_file和master_log_pos參數。
#mysql -u root -p
注意:如果Slave_IO_Running:NO並且報錯
mysql> slave stop;
到master服務器登錄mysql:
記錄master的bin的位置,
例如:mysql> show master status;
日誌爲master-bin.000001
刷新日誌:mysql> flush logs;
因爲刷新日誌file的位置會+1,即file成爲:master-bin.000002
到從服務器執行
解決完畢!!!
7、驗證主從複製效果。
在主、從服務器登錄MySQL。
#mysql -u root -p
Mysql> show databases;
兩臺數據庫執行結果應該相同。
在主服務器上新建數據庫zc。
mysql> create database zc;
在主,從服務器上分別查看數據庫,顯示數據庫相同,則主從複製成功。
搭建MySQL讀寫分離
Amoeba(變形蟲):爲應用層訪問MySQL充當SQL的路由功能,並具有負載均衡,高可用,SQL過濾,讀寫分離,數據切片的功能,可併發請求多臺數據庫。
在主機Amoeba上安裝java環境。
#chmod +x jdk-6u14-linux-x64.bin
#./jdk-6u14-linux-x64.bin 根據提示按Enter鍵完成即可或按yes
#mv jdk1.6.0_14/ /usr/local/jdk1.6
#vim /etc/profile
#source /etc/profile
#java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)
Java環境配置成功。
安裝並配置Amoeba軟件
#mkdir /usr/local/amoeba
#tar zxf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#chmod 755 /usr/local/amoeba/
#/usr/local/amoeba/bin/amoeba
amoeba start|stop 顯示此內容說明Amoeba安裝成功。
配置Amoeba讀寫分離,兩個Slave讀負載均衡。
Master、Slave 1、Slave 2中開放權限給Amoeba訪問。
mysql > grant all on *.* to ‘test’@’192.168.1.%’ identified by ‘123.com’;
編輯amoeba.xml配置文件
#vim /usr/local/amoeba/conf/amoeba.xml
修改後的內容爲黑體字的部分
編輯dbServer.xml配置文件
#vim /usr/local/amoeba/conf/dbServer.xml
修改後的爲黑體字的部分
修改後如圖所示配置主、從服務器
配置無誤後,可啓動Amoeba軟件,其默認端口爲tcp 8066.
#/usr/local/amoeba/bin/amoeba start&
#yum install -y mysql
然後可以通過代理訪問MySQL
#mysql -u amoeba -p 123456 -h 192.168.1.12 -P 8066
mysql>
在master上創建一個表,同步到各服務器上,然後關掉各從服務器的Slave功能,再插入其他語句。
mysql > stop slave;
然後在主服務器上插入一行
從服務器上同步了表,手動插入其他內容。
Slave 1:
Slave 2:
測試讀操作
在client主機上三次查詢的結果如圖所示:
在client主機上插入一條語句:
但在client上查詢不到,最終在Master上才能看到下面這條語句內容,說明寫操作在maste服務器上
MySQL數據庫主從複製與讀寫分離介紹到此結束。