您好,登錄后才能下訂單哦!
在實際生產環境中,如果對數據庫的讀和寫都在同一個數據庫上操作,無論是在安全性、高可用性還是高并發性等各方面都是完全不能滿足實際需求的,所以一般來說都是通過主從復制來同步數據,再通過讀寫分離來提升數據庫的并發負載能力這樣的方案進行部署和實施。
1、在每個事務更新數據前,Master服務器在二進制日志中記錄這些改變。寫入二進制文件完成后,Master服務器通知存儲引擎提交事務。
2、Slave服務器將Master的Binary log復制到其中繼日志(Relay log)。首先Slave開始一個工作線程——I/O線程,I/O線程在Master上打開一個普通的連接,然后開始Binary log dump process。Binary log dump process從Master的二進制日志中讀取時間,如果已經跟上Master,它會睡眠等待Master產生新的事件。I/O線程將這些事件寫入中繼日志中。
3、SQL slave thread(SQL從線程)處理最后一步。SQL線程從中繼日志中讀取事件,并重放其中的事件從而更新Slave的數據,使其與Master中的數據一致。只要該線程與I/O線程保持一致,中繼日志通常會位于系統的緩存中,所以中繼日志開銷很小。
讀寫分離就是在主服務器上寫,只在從服務器上讀。基本原理是讓主數據庫處理事務性查詢,而從數據庫處理select查詢。數據庫復制被用來把事務性查詢導致的變更同步到群集中的數據庫。
基于中間代理層實現:代理一般位于客戶端和服務端之間,代理服務器接到客戶端請求通過判斷轉發到后端數據庫,這部分通過Amoeba實現。
如下圖所示
1、建立時間同步環境,在主節點上搭建時間源服務器。
[root@promote ~]# yum install ntp -y
[root@promote ~]# vim /etc/ntp.conf #在配置文件最后加兩行
server 127.127.58.0 #設置本地時鐘源
fudge 127.127.58.0 stratum 8 #設置時間層級為8(限制在15內)
[root@promote ~]# service ntpd restart #重啟服務
[root@promote ~]# systemctl stop firewalld.service #關閉防火墻
[root@promote ~]# setenforce 0 #關閉增強安全功能
2、在兩臺從節點上分別進行時間同步。
[root@localhost ~]# yum install ntp -y
[root@localhost ~]# /usr/sbin/ntpdate 192.168.58.131 #和時間源服務器同步
10 Jul 11:07:16 ntpdate[28695]: the NTP socket is in use, exiting
[root@loaclhost ~]# systemctl stop firewalld.service #關閉防火墻
[root@localhost ~]# setenforce 0 #關閉增強安全功能
3、安裝MySQL,這步在前面講過,就省略掉了。
4、配置MySQL Master主服務器。
[root@promote ~]# vim /etc/my.cnf
server-id = 11 #修改server-id,注意三臺服務器id不能重復
log-bin=master-bin #修改主服務器日志文件
log-slave-updates=true #增加開啟主從同步功能
[root@promote ~]# systemctl restart mysqld.service #重啟MySQL服務器
5、登錄MySQL服務,給從服務器授權。
[root@promote ~]# mysql -u root -p
Enter password:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.58.%' IDENTIFIED BY '123456'; #授予192.168.58.0網段的主機分別以myslave,123456為用戶名,密碼的用戶REPLICATION SLAVE權限。
mysql> FLUSH PRIVILEGES; #刷新權限設置
mysql> show master status; #查看主服務器狀態,file,position兩個值很重要,后面要用到。
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000002 | 2614 | | | |
+-------------------+----------+--------------+------------------+-------------------+
6、配置MySQL Slave從服務器,在兩臺從服務器上都執行相同的操作,只有server-id不同
[root@localhost ~]# vim /etc/my.cnf
server-id = 22 #設置server-id,三臺服務器不能一樣
relay-log=relay-log-bin #從主服務器上同步日志文件記錄到本地
relay-log-index=slave-relay-bin.index #定義relay-log的位置和名稱
[root@localhost ~]# service mysqld restart
[root@localhost ~]# mysql -u root -p
Enter password:
mysql> change master to master_host='192.168.58.131',master_user='myslave',master_password='123456'',master_log_file='master-bin.000002',master_log_pos=2614;
#這條命令就是用來指定主服務器,master_log_file和master_log_pos參數和上面對應。
mysql> start slave; #開啟同步
mysql> show slave status\G; #查看slave狀態,確保 Slave_IO_Running,Slave_SQL_Running都是yex
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.58.131
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000002
Read_Master_Log_Pos: 2614
Relay_Log_File: relay-log-bin.000005
Relay_Log_Pos: 1955
Relay_Master_Log_File: master-bin.000002
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: 2614
Relay_Log_Space: 2535
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
7、驗證主從同步效果。通過在主服務器上創建一個新數據庫,然后查看是否同步成功來判斷。
主服務器中的數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
| test1 |
+--------------------+
6 rows in set (0.23 sec)
從服務器中的數據庫
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
| test1 |
| wq |
| yxxx |
+--------------------+
8 rows in set (0.31 sec)
下面,在在主服務器上創建一個新的數據庫test02,進而查看是否同步成功。
mysql> create database test02;
Query OK, 1 row affected (3.86 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
| test02 |
| test1 |
+--------------------+
7 rows in set (0.01 sec)
查看從服務器的數據庫。同步成功!
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
| test02 |
| test1 |
| wq |
| yxxx |
+--------------------+
9 rows in set (0.15 sec)
1、在Amoeba代理服務器上安裝Java環境,因為Amoeba服務是基于Java1.5開發的。
systemctl stop firewalld.service #關閉防火墻
setenforce 0 #關閉增強性安全功能
cp jdk-6u14-linux-x64.bin /usr/local/ #將軟件包復制到指定目錄
./jdk-6u14-linux-x64.bin #執行安裝腳本
mv jdk1.6.0_14/ /usr/local/jdk1.6 #為了方便,修改文件名
vim /etc/profile #將Java添加到環境變量中
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 #刷新文件,使改動生效
2、安裝并配置Amoeba軟件。
[root@promote ~]#mkdir /usr/local/amoeba #為Amoeba創建工作目錄
[root@promote ~]#tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/ #解壓
[root@promote ~]#chmod -R 755 /usr/local/amoeba/ #修改文件權限
[root@promote ~]#/usr/local/amoeba/bin/amoeba #執行Amoeba服務
amoeba start|stop
說明amoeba安裝成功
3、配置Amoeba讀寫分離,兩個Slave讀負載均衡。
mysql> grant all on *.* to test@'192.168.58.%' identified by '123.com';
#在三臺mysql服務器上添加權限開放給amoeba訪問
4、回到Amoeba服務器上,首先配置amoeba.xml配置文件。
[root@promote ~]# vim /usr/local/amoeba/conf/amoeba.xml
<property name="authenticator">
<bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">
<property name="user">amoeba</property> #客戶端用來登錄Amoeba服務器的用戶名
<property name="password">123456</property> #客戶端用來登錄Amoeba服務器的密碼
<property name="filter">
<bean class="com.meidusa.amoeba.server.IPAccessController">
<property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
</bean>
</property>
</bean>
</property>
<property name="defaultPool">master</property>#默認服務器池
<property name="writePool">master</property>#master服務器用于寫
<property name="readPool">slaves</property>#slaves服務器用于讀
配置dbServers.xml文件
[root@promote ~]# vim /usr/local/amoeba/conf/dbServers.xml
<!-- mysql schema
<property name="schema">test</property>#將這句話注釋掉,否則無法用客戶端通過amoeba代理服務器訪問mysql服務器池
-->
<!-- mysql user -->
<property name="user">test</property> #修改為用于登錄服務器池的用戶名
<property name="password">123.com</property> #修改為用于登錄服務器池的密碼
<dbServer name="master" parent="abstractServer">#配置主服務器
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.58.131</property>#主服務器的IP
</factoryConfig>
</dbServer>
<dbServer name="slave1" parent="abstractServer">#從服務器1的mysql服務器
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.58.144</property> #從服務器1的mysql服務器IP
</factoryConfig>
</dbServer>
<dbServer name="slave2" parent="abstractServer">#從服務器2的mysql服務器
<factoryConfig>
<!-- mysql ip -->
<property name="ipAddress">192.168.58.145</property> #從服務器2的mysql服務器IP
</factoryConfig>
</dbServer>
<dbServer name="slaves" virtual="true">#定義從服務器池
<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>
5、配置好后,啟動Amoeba軟件,其默認端口為tcp 8066.
[root@promote ~]# /usr/local/amoeba/bin/amoeba start &
[1] 69919
[root@promote ~]# log4j:WARN log4j config load completed from file:/usr/local/amoeba/conf/log4j.xml
2018-07-10 16:53:55,472 INFO context.MysqlRuntimeContext - Amoeba for Mysql current versoin=5.1.45-mysql-amoeba-proxy-2.2.0
log4j:WARN ip access config load completed from file:/usr/local/amoeba/conf/access_list.conf
2018-07-10 16:53:55,925 INFO net.ServerableConnectionManager - Amoeba for Mysql listening on 0.0.0.0/0.0.0.0:8066.
2018-07-10 16:53:55,925 INFO net.ServerableConnectionManager - Amoeba Monitor Server listening on /127.0.0.1:54818.
^C
[root@promote ~]# netstat -ntap | grep java #8066端口已經開啟
tcp6 0 0 127.0.0.1:54818 :::* LISTEN 69919/java
tcp6 0 0 :::8066 :::* LISTEN 69919/java
tcp6 0 0 192.168.58.136:41992 192.168.58.145:3306 ESTABLISHED 69919/java
tcp6 0 0 192.168.58.136:33236 192.168.58.144:3306 ESTABLISHED 69919/java
tcp6 0 0 192.168.58.136:48134 192.168.58.131:3306 ESTABLISHED 69919/java
6、到client主機上進行測試。
[root@yx 桌面]# mysql -u amoeba -p123456 -h 192.168.58.136 -P8066
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
| test02 |
| test1 |
+--------------------+
7 rows in set (0.22 sec)
mysql>
在Master上創建一個表,同步到各從服務器。
mysql> use test1;
Database changed
mysql> create table zang (id int(10),name varchar(10),address varchar(20));
關閉兩臺從服務器的同步功能。
mysql> stop slave;
----在主服務器上---內容不會同步
use test1
insert into zang values('1','zhang','this_is_master');
----從服務器1----
use test1;
insert into zang values('2','zhang','this_is_slave1');
----從服務器2----
use test1;
insert into zang values('3','zhang','this_is_slave2');
------在客戶端上測試----第一次會向從服務器1讀數據-第二次會向從服務器2讀取
mysql> select * from test1.zang;
------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 3 | zhang | this_is_slave2 |
+------+-------+----------------+
3 rows in set (0.03 sec)
mysql> select * from test1.zang;
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 2 | zhang | this_is_slave1 |
+------+-------+----------------+
3 rows in set (0.25 sec)
------在通過客戶端連接數據庫后寫入的數據只有主服務器會記錄
mysql> insert into zang values('5','zhang','write_test');
到主服務器中查看表,會發現有兩條記錄,而從服務器中只有一條記錄,說明實現了讀寫分離
+------+-------+----------------+
| id | name | address |
+------+-------+----------------+
| 1 | zhang | this_is_master |
| 5 | zhang | write_test |
+------+-------+----------------+
3 rows in set (0.01 sec)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。