您好,登錄后才能下訂單哦!
在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫服務器中操作,無論是在安全性、高可用性,還是高并發等各個方面都是完全不能滿足實際需求的,因此,一般來說都是通過主從復制(Master-Slave)的方式來同步數據,再通過讀寫分離來提升數據庫的并發負載能力這樣的方案來進行部署和實施。
MySQL的主從復制和MySQL的讀寫分離兩者有著緊密聯系,首先要部署主從復制,只有主從復制完成了,才能在此基礎上進行數據的讀寫分離。
簡單來說,讀寫分離就是只在主服務器上寫,只在從服務器上讀。基本原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫復制被用來把事務性查詢導致的變更同步到群集中的從數據庫。
基于中間代理層實現:代理一般位于客戶端和服務器之間,代理服務器接到客戶端請求通過判斷后轉發到后端數據庫,有兩個代表性程序。
主機 | 操作系統 | 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) 安裝NTP
#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)重啟服務并關閉防火墻和增強安全設置
#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池,現有slave1、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服務器上。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。