在實際生產環境中,若是對數據庫的讀和寫都在同一個數據庫服務器中操做,不管是在安全性、高可用性,仍是高併發等各個方面都是徹底不能知足實際需求的,所以,通常來講都是經過主從複製(Master-Slave)的方式來同步數據,再經過讀寫分離來提高數據庫的併發負載能力這樣的方案來進行部署和實施。java
MySQL的主從複製和MySQL的讀寫分離二者有着緊密聯繫,首先要部署主從複製,只有主從複製完成了,才能在此基礎上進行數據的讀寫分離。mysql
簡單來講,讀寫分離就是隻在主服務器上寫,只在從服務器上讀。基本原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫複製被用來把事務性查詢致使的變動同步到羣集中的從數據庫。
基於中間代理層實現:代理通常位於客戶端和服務器之間,代理服務器接到客戶端請求經過判斷後轉發到後端數據庫,有兩個表明性程序。linux
主機 | 操做系統 | IP地址 | 主要軟件 |
---|---|---|---|
Master | CentOS 7.3 | 192.168.100.137 | mysql-5.5.24.tar.gz |
Slave1 | CentOS 7.3 | 192.168.100.132 | mysql-5.5.24.tar.gz |
Slave2 | CentOS 7.3 | 192.168.100.149 | mysql-5.5.24.tar.gz |
Amoeba | CentOS 7.3 | 192.168.100.150 | amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin |
客戶端 | CentOS 7.3 | 192.168.100.148 | mysql-5.5.24.tar.gz |
1) 安裝NTPsql
#yum –y install ntp
2) 配置NTP數據庫
#vim /etc/ntp.conf server 127.127.100.0 //本地是時鐘源 fudge 127.127.100.0 stratum 8 //設置時間層級爲8(限制在15內)
3)重啓服務並關閉防火牆和加強安全設置vim
#service ntpd restart #systemctl stop firewalld.service #setenforce 0
#yum install ntpd start #systemctl stop firewalld.service #setenforce 0 #/usr/sbin/ntpdate 192.168.100.137 //進行時間同步
1)在/etc/my.cnf中修改或者增長如下內容並重啓服務後端
#vim /etc/my.cnf server-id = 11 log-bin=master-bin //主服務器日誌文件 log-slave-updates=true //從服務器更新二進制日誌 #systemctl restart mysqld.service
2)登陸MySQL,給從服務器受權緩存
#mysql -u root –p mysql>GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.100.%' IDENTIFIED BY '123456'; mysql>FLUSH PRIVILEGES; mysql>show master status; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000001 | 339 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
1)在/etc/my.cnf中修改或者增長如下內容安全
#vim /etc/my.cnf server-id =22 //這裏注意server-id不能與主服務器相同 relay-log=relay-log-bin //從主服務器上同步日誌文件記錄到本地 relay-log-index=slave-relay-bin.index //定義relay-log的位置和名稱
2)重啓MySQL服務服務器
#systemctl restart mysqld.service
3)登陸MySQL,配置同步。按主服務器結果更改下面命令中master_log_file和master_log_pos的參數
#mysql –u root –p mysql>change master to master_host='192.168.100.137',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=339;
4)啓動同步,查看Slave狀態,確保如下兩個值爲YES。
mysql>start slave;
1)在主服務器上新建數據庫db_test。
mysql>create database db_test;
2)在主、從服務器上分別查看數據庫,顯示數據庫相同,則主從複製成功
#systemctl stop firewalld.service #setenforce 0
#cp jdk-6u14-linux-x64.bin /usr/local/ #cd /usr/local #./jdk-6u14-linux-x64.bin //yes以後enter
#mv jdk1.6.0_14/ /usr/local/jdk1.6
#vi /etc/profile 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 export AMOEBA_HOME=/usr/local/amoeba export PATH=$PATH:$AMOEBA_HOME/bin
#source /etc/profile
#mkdir /usr/local/amoeba
#tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
#chmod -R 755 /usr/local/amoeba/
#/usr/local/amoeba/bin/amoeba //若顯示amoeba start|stop說明安裝成功
mysql>grant all on *.* to test@'192.168.100.%' identified by '123.com';
#cd /usr/local/amoeba #vim conf/amoeba.xml ---30行-- <property name="user">amoeba</property> //訪問amoeba的用戶名 ----32行--------- <property name="password">123456</property> //密碼 ---117-去掉註釋- <property name="defaultPool">master</property> //默認爲主服務器 <property name="writePool">master</property> //寫入爲主服務器 <property name="readPool">slaves</property> //讀取爲slaves池,現有slave一、slave2服務器
--26-29--去掉註釋-- <property name="user">test</property> <property name="password">123.com</property> -----42-主服務器地址--- <dbServer name="master" parent="abstractServer"> <property name="ipAddress">192.168.100.137</property> --52-從服務器主機名- <dbServer name="slave1" parent="abstractServer"> --55-從服務器地址- <property name="ipAddress">192.168.100.132</property> --57-從服務器主機名- <dbServer name="slave2" parent="abstractServer"> --60-從服務器地址- <property name="ipAddress">192.168.100.149</property> <dbServer name="slaves" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> --末尾-- <property name="poolNames">slave1,slave2</property> </poolConfig>
#/usr/local/amoeba/bin/amoeba start&
# netstat -anpt | grep java
#yum install -y mysql #mysql -u amoeba -p123456 -h 192.168.100.100 -P8066 #systemctl stop firewalld.service #setenforce 0
1)在Master上建立一個表,同步到各從服務器上,而後關閉各從服務器的Slave功能,再插入區別語句
#mysql –u root –p mysql>use db_test; mysql>create table zang (id int(10),name varchar(10),address varchar(20)); //主服務器 mysql>stop slave; //從服務器 mysql>insert into zang values('1','zhang','this_is_master'); //主服務器上,內容不會同步
2) 從服務器上同步了表,手動插入其餘內容
mysql>use db_test; //從服務器1 mysql>insert into zang values('2','zhang','this_is_slave1'); mysql>use db_test; //從服務器2 mysql>insert into zang values('3','zhang','this_is_slave2');
3)測試讀操做
4)測試寫操做
在Client主機上插入一條語句:
mysql>insert into zang values('5','zhang','write_test');
但在Client查詢不到,最終只有在Master上才能查看到這條語句內容,說明寫操做在Master服務器上。